1366 Commits

Author SHA1 Message Date
dependabot[bot]
81c9c23862 [upd] github-actions: Bump actions/setup-node from 6.4.0 to 7.0.0 (#6423)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.4.0 to 7.0.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](48b55a011b...8207627860)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-17 14:27:38 +02:00
dependabot[bot]
6913fba208 [upd] pypi: Bump the minor group with 2 updates (#6425)
Bumps the minor group with 2 updates: [typer](https://github.com/fastapi/typer) and [selenium](https://github.com/SeleniumHQ/Selenium).


Updates `typer` from 0.26.8 to 0.27.0
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.26.8...0.27.0)

Updates `selenium` from 4.45.0 to 4.46.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.45.0...selenium-4.46.0)
2026-07-17 14:24:17 +02:00
Bnyro
2daa4d4815 [fix] qwant: can't fetch engine traits because engine.about is no longer a dict 2026-07-17 12:27:46 +02:00
Bnyro
de8f73f434 [fix] cache: maintenance period comment duration 2h instead of 1h 2026-07-17 12:24:47 +02:00
Bnyro
9f9c00819e [fix] tiger: remember auth cookie for 2 months, not 1 day 2026-07-16 23:31:59 +02:00
Bnyro
b72a87676f [fix] public domain image archive: crashes upon response
The code used here has always been "bad" because `about` shouldn't be used
as data source, but the engine probably broke when type checks / dataclasses
for the about parameter in engines has been added with
<https://github.com/searxng/searxng/pull/6258>.

Error log:
```
WARNING searx.engines.public domain im: ErrorContext('searx/engines/public_domain_image_archive.py', 143, '\'url\': _clean_url(f"{about[\'website\']}/images/{result[\'objectID\']}"),', 'TypeError', None, ("'EngineAbout' object is not subscriptable",)) False
ERROR   searx.engines.public domain im: exception : 'EngineAbout' object is not subscriptable
Traceback (most recent call last):
  File "/home/bnyro/Projects/searxng/searx/search/processors/online.py", line 253, in search
    search_results = self._search_basic(query, params)
  File "/home/bnyro/Projects/searxng/searx/search/processors/online.py", line 239, in _search_basic
    return self.engine.response(response)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/home/bnyro/Projects/searxng/searx/engines/public_domain_image_archive.py", line 143, in response
    'url': _clean_url(f"{about['website']}/images/{result['objectID']}"),
                         ~~~~~^^^^^^^^^^^
TypeError: 'EngineAbout' object is not subscriptable
```
2026-07-16 15:50:58 +02:00
Bnyro
f2432e33d6 [fix] engine cache: return default value when cache entry expired
It's possible that it's expired but has not yet been automatically deleted
by the periodic maintenance because that, by default, runs only every 2 hours.

Related:
- see https://github.com/searxng/searxng/pull/6409#discussion_r3584712601
2026-07-16 12:37:26 +02:00
vojkovic
7b2199ecdf [fix] autocomplete suggestrelevance scores for chromium 2026-07-15 23:45:25 +08:00
Bnyro
4a9c19d7bf [mod] images.html: display all engines that found the result, not only the first one 2026-07-15 17:44:11 +02:00
Bnyro
5cb4cb2bc5 [fix] qwant: engine blocked with captcha
Qwant now requires a `datadome` cookie that it returns
in the first search response as a `Set-Cookie`.

This cookie has to be sent for all requests, otherwise they
will be blocked.

This means that now, the first search request is blocked (results in CAPTCHA),
and only the subsequent searches work (same happens on the Qwant website for me).

However, I don't think it's worth repeating the same
search request multiple times very quickly because
that also makes us more suspicious.
2026-07-15 17:39:10 +02:00
Bnyro
5a448596ab [feat] engines: add avalw.org (general)
The index is very small, so it often doesn't find anything.

It also has news support, but the results are unusable.
2026-07-15 17:38:46 +02:00
Bnyro
9c49b7e0d7 [fix] results: display internationalized domain names human-friendly
Some search engines encode domains that contain special characters
in the IDN format, i.e. by using Punycode (https://en.wikipedia.org/wiki/Punycode).

This means that domains formatted like that are not human readable
and thus very unintuive.

Also, as only some engines use Punycode, this often causes a result
to appear multiple times, once with a Punycode domain (e.g. xn--allestrungen-9ib.de),
and once with a normal domain (e.g. allestörungen.de).

Always formatting the domains nicely has the caveat that the official sites
are harder to distinguish from malicious clones that just swapped out some
characters by using Punycode, e.g. replaced `a` with `á`. I don't think
that will be much of an issue though - I don't think Punycode results
previously stopped users from clicking the link, and I also think that
most search engines filter out such bad results or don't even have them
indexed.
2026-07-15 17:38:04 +02:00
Bnyro
58e02a01ae [fix] tusksearch: fix engine blocked by bot protection
Changes:
- the `embed.js` request now requires a user agent header
- we include a user agent in the "actual" request (I dropped it by accident)
- we only send the first 4 decimal places of the location
  instead of 7+ (not required, but harder to detect)
2026-07-14 20:32:31 +02:00
Bnyro
7fa9f16225 [fix] heexy: blocked by cloudflare 2026-07-14 20:32:18 +02:00
Onev
9e25585aec [refactor] engines: use datetime.fromisoformat instead of datetime.strptime where possible (#6394)
Refactor engines that parse ISO 8601 dates with strptime to use
fromisoformat instead. In most cases this is a direct replacement of
strptime(text, "format") with fromisoformat(text).

For engines where the source has a trailing "Z" that strptime consumed
as a literal (e.g. "%Y-%m-%dT%H:%M:%S.%fZ" in huggingface.py), add
rstrip("Z") to keep the output naive and preserve the existing behavior.

In sogou.py the date is extracted with a regular expression, which can
yield strings like "2026-7-11". strptime accepts this via its format
string, but fromisoformat does not. To preserve the existing behavior
and satisfy the format fromisoformat expects, add zero-padding for the
month and day.

Closes: #6098
---------
Signed-off-by: OneVth <onebrotravel@gmail.com>
2026-07-13 17:46:56 +02:00
Ivan Gabaldon
c19d86faa3 [mod] ci: remove security (#6400)
Manage alerts directly from Docker Hub
2026-07-12 13:09:19 +02:00
Ivan Gabaldon
21fa7b0be1 [mod] ci: rework workflows (#6401)
* [mod] ci: rework workflows

mod: ubuntu 26.04 runners
mod: remove podman-static
mod: longer container cache
mod: remove useless pr information
mod: sort steps
fix: use commit ref on workflow_run children
fix: missing container workflow_run check
fix: nodejs cache

* [fix] ci: apply suggestions

https://github.com/searxng/searxng/pull/6401#discussion_r3566147961
https://github.com/searxng/searxng/pull/6401#discussion_r3566147970
2026-07-12 13:04:11 +02:00
dependabot[bot]
74b4e7c8d1 [upd] web-client (simple): Bump the minor group across 1 directory with 5 updates (#6399)
Bumps the minor group with 5 updates in the /client/simple directory:

| Package | From | To |
| --- | --- | --- |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.5.2` | `2.5.3` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.0` | `26.1.1` |
| [browserslist](https://github.com/browserslist/browserslist) | `4.28.4` | `4.28.6` |
| [svgo](https://github.com/svg/svgo) | `4.0.1` | `4.0.2` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.1.3` | `8.1.4` |

Updates `@biomejs/biome` from 2.5.2 to 2.5.3
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.5.3/packages/@biomejs/biome)

Updates `@types/node` from 26.1.0 to 26.1.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `browserslist` from 4.28.4 to 4.28.6
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.28.4...4.28.6)

Updates `svgo` from 4.0.1 to 4.0.2
- [Release notes](https://github.com/svg/svgo/releases)
- [Commits](https://github.com/svg/svgo/compare/v4.0.1...v4.0.2)

Updates `vite` from 8.1.3 to 8.1.4
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.4/packages/vite)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.5.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 26.1.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.28.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: svgo
  dependency-version: 4.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite
  dependency-version: 8.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-12 08:56:35 +02:00
dependabot[bot]
39f4dd24a5 [upd] web-client (simple): Bump typescript in /client/simple (#6391)
Bumps [typescript](https://github.com/microsoft/TypeScript) from 6.0.3 to 7.0.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/commits)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-12 08:44:34 +02:00
dependabot[bot]
62a1ab7edd [upd] pypi: Bump granian from 2.7.8 to 2.7.9 in the minor group (#6392)
Bumps the minor group with 1 update: [granian](https://github.com/emmett-framework/granian).


Updates `granian` from 2.7.8 to 2.7.9
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.8...v2.7.9)

---
updated-dependencies:
- dependency-name: granian
  dependency-version: 2.7.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-11 09:13:34 +02:00
github-actions[bot]
4abac08de5 [l10n] update translations from Weblate (#6393)
493c1d2a7 - 2026-07-07 - lukisko <lukisko@noreply.codeberg.org>
a67b467e5 - 2026-07-06 - marc-lopez <marc-lopez@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-07-10 23:19:38 +02:00
dependabot[bot]
6a4d5148d6 [upd] github-actions: Bump github/codeql-action/upload-sarif (#6389)
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.36.3 to 4.37.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](54f647b7e1...99df26d4f1)

---
updated-dependencies:
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-10 14:17:57 +02:00
dependabot[bot]
799086874d [upd] github-actions: Bump docker/login-action from 4.3.0 to 4.4.0 (#6387)
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](c99871dec2...af1e73f918)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-10 14:15:21 +02:00
dependabot[bot]
83139c26b3 [upd] github-actions: Bump docker/scout-action from 1.23.0 to 1.23.1 (#6388)
Bumps [docker/scout-action](https://github.com/docker/scout-action) from 1.23.0 to 1.23.1.
- [Release notes](https://github.com/docker/scout-action/releases)
- [Commits](ce97ec1bb8...2688993af7)

---
updated-dependencies:
- dependency-name: docker/scout-action
  dependency-version: 1.23.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-10 14:14:09 +02:00
Markus Heiser
8456831a04 [mod] show img_load_error.svg if thumbnail fails to load (#6368)
* [mod] show img_load_error.svg if thumbnail fails to load (#6368)

Brave and a few other engines occasionally provide dead URLs for the thumbnails,
which looks pretty ugly in the UI.  As already with the image search, in case of
an error img_load_error.svg should be displayed here.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>

* [build] /static (#6368)

---------

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-07-09 18:37:41 +02:00
Bnyro
b512eaa272 [feat] engines: add kovunka.net (general) 2026-07-09 12:11:41 +02:00
Jayant Sharma
1412926f5c [fix] braveapi: strip HTML tags and filter favicon thumbnails (#6381) 2026-07-08 21:19:11 +02:00
Bnyro
3b573e0f89 [fix] heexy: use cookies for cacheft token
Heexy now passes the cacheft token via cookies and no
longer via HTTP headers.

Hence, the engine is broken without that change.
2026-07-08 21:01:11 +02:00
Bnyro
da6a230413 [fix] autocomplete: google autocompleter crashes
`engines` only contains active engines. Since `google` was set to
inactive, it's no longer part of the , making the engine crash.

With this workaround, we directly load the engine traits from the data
dictionary instead of going the intermediate step with the Google engine.
2026-07-08 20:48:15 +02:00
Bnyro
f69b22c45c [fix] kagi: crashes when there are no results 2026-07-07 10:49:54 +02:00
Patrick Evans
f930443726 [fix] kagi: safely access unpromised result properties
I was testing the new Kagi engine and found for some queries I was getting a
`KeyError` exception from the result parsing.

This PR ensures we only assumes the `url` key exists, and we use `.get()` to
retrieve values for keys that may not be present.

Their API documentation [1] clarifies that only the `url` and `title` properties
are required/guaranteed in the search result object, but this is not correct:

    File "/home/patrick/code/searxng/searx/engines/kagi.py", line 161, in response
        title=html.unescape(result["title"]),
                            ~~~~~~^^^^^^^^^
    KeyError: 'title

Heard back from Kagi support:

> The image results "title' should be marked as optional, as many images likely
> don't have titles - as you've noticed.  The only required field there should be
> the "url" field.

[1] https://kagi.redocly.app/api/docs/openapi/search/search#search/search/t=response&c=200&path=data/search
[2] https://github.com/searxng/searxng/issues/2247#issuecomment-4692976877
2026-07-07 10:49:54 +02:00
Bnyro
d58ced8f71 [fix] kagi: results contain HTML tags 2026-07-07 10:35:06 +02:00
Markus Heiser
556d08c395 [fix] google CSE - leftover from PR #6364 (#6369)
The `ZZ` issue has been fixed in the google.py and the default lang_code is
already `en`:

- https://github.com/searxng/searxng/pull/6364#discussion_r3524461287

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-07-06 09:23:28 +02:00
Bnyro
1017631800 [chore] make data.traits (#6369) 2026-07-06 09:23:28 +02:00
Bnyro
b64e6ee44a [feat] google CSE engine: add support for images (#6369)
Add support for Google CSE images, the normal google images engine doesn't work
anymore, so this is a good workaround for now.
2026-07-06 09:23:28 +02:00
Austin-Olacsi
a6438586a5 [feat] engine: add neocities.org 2026-07-05 13:15:29 +02:00
Markus Heiser
fd5eb84a37 [chore] Google (HTML) engine: remove obsolete GSA User-Agents (#6366)
The GSA headers that were introduced in PR #5644 unfortunately no longer
work (#6359).

The Google engines

- google.py
- google_videos.py

do not work anymore either, but we'll leave it in the code for now:

- In google.py, central functions like get_google_info(..) are provided, which
  are also used by other modules.
- We will probably need a Google HTML (and video) engine again very soon.

Related:

- https://github.com/searxng/searxng/issues/6359
- https://github.com/searxng/searxng/pull/6364

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-07-05 12:07:23 +02:00
vojkovic
888364c1ce [chore] update traits for google cse (#6364) 2026-07-05 11:50:23 +02:00
vojkovic
1cdf01a719 [feat] engines: add google cse engine (#6364)
Adds a new google cse engine as an alternative to the currently broken html
google engine.

It works by generating a token which is cached for 1 hour and it only uses the
public CSE id from blackle.com.  We do have two others but I think just
hardcoding one will be enough.

Will be broken in 2027 due to google deprecating it but I it will be good while
it lasts.

I found I can get up to 20 results per page. Setting safesearch and language
works and I just copied the traits from the google engine.

Also set old google engine as inactive as it is completely broken for now.
2026-07-05 11:50:23 +02:00
Ivan Gabaldon
747cec4c23 [mod] container: docker.io base source (#6344) 2026-07-03 16:10:04 +02:00
dependabot[bot]
4ef70e9451 [upd] web-client (simple): Bump the minor group across 1 directory with 7 updates (#6318)
Bumps the minor group with 7 updates in the /client/simple directory:

| Package | From | To |
| --- | --- | --- |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.5.0` | `2.5.2` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.0.0` | `26.1.0` |
| [browserslist](https://github.com/browserslist/browserslist) | `4.28.2` | `4.28.4` |
| [less](https://github.com/less/less.js) | `4.6.6` | `4.6.7` |
| [sharp](https://github.com/lovell/sharp) | `0.35.1` | `0.35.3` |
| [stylelint](https://github.com/stylelint/stylelint) | `17.13.0` | `17.14.0` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.0.16` | `8.1.3` |

Updates `@biomejs/biome` from 2.5.0 to 2.5.2
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.5.2/packages/@biomejs/biome)

Updates `@types/node` from 26.0.0 to 26.1.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `browserslist` from 4.28.2 to 4.28.4
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.28.2...4.28.4)

Updates `less` from 4.6.6 to 4.6.7
- [Release notes](https://github.com/less/less.js/releases)
- [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/less/less.js/compare/v4.6.6...v4.6.7)

Updates `sharp` from 0.35.1 to 0.35.3
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.35.1...v0.35.3)

Updates `stylelint` from 17.13.0 to 17.14.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.13.0...17.14.0)

Updates `vite` from 8.0.16 to 8.1.3
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.3/packages/vite)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.5.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 26.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.28.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: less
  dependency-version: 4.6.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: sharp
  dependency-version: 0.35.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 17.14.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: vite
  dependency-version: 8.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-03 16:09:38 +02:00
github-actions[bot]
80c9806de1 [l10n] update translations from Weblate (#6357)
f29d35e7c - 2026-06-27 - Anonymous104 <anonymous104@noreply.codeberg.org>
e574b7601 - 2026-06-27 - nebras <nebras@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-07-03 15:50:52 +02:00
dependabot[bot]
9d7ca4febc [upd] github-actions: Bump docker/setup-qemu-action from 4.1.0 to 4.2.0 (#6355)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](06116385d9...96fe6ef7f3)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-03 15:50:27 +02:00
dependabot[bot]
c5cd510d82 [upd] github-actions: Bump actions/cache from 6.0.0 to 6.1.0 (#6353)
Bumps [actions/cache](https://github.com/actions/cache) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](2c8a9bd745...55cc834586)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-03 15:35:29 +02:00
dependabot[bot]
73a0219ab8 [upd] github-actions: Bump docker/scout-action from 1.22.0 to 1.23.0 (#6352)
Bumps [docker/scout-action](https://github.com/docker/scout-action) from 1.22.0 to 1.23.0.
- [Release notes](https://github.com/docker/scout-action/releases)
- [Commits](7520205ff6...ce97ec1bb8)

---
updated-dependencies:
- dependency-name: docker/scout-action
  dependency-version: 1.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-03 15:35:07 +02:00
dependabot[bot]
7ed7adfb05 [upd] github-actions: Bump github/codeql-action/upload-sarif (#6354)
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.36.2 to 4.36.3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](8aad20d150...54f647b7e1)

---
updated-dependencies:
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.36.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-03 15:33:41 +02:00
dependabot[bot]
d7367e0897 [upd] github-actions: Bump docker/login-action from 4.2.0 to 4.3.0 (#6351)
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](650006c6eb...c99871dec2)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-03 15:30:16 +02:00
dependabot[bot]
21773bbb2d [upd] pypi: Bump the minor group with 5 updates (#6356)
Bumps the minor group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [granian](https://github.com/emmett-framework/granian) | `2.7.7` | `2.7.8` |
| [typer](https://github.com/fastapi/typer) | `0.26.7` | `0.26.8` |
| [typing-extensions](https://github.com/python/typing_extensions) | `4.15.0` | `4.16.0` |
| [wlc](https://github.com/WeblateOrg/wlc) | `2.0.0` | `2.1.0` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.39.8` | `1.39.9` |


Updates `granian` from 2.7.7 to 2.7.8
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.7...v2.7.8)

Updates `typer` from 0.26.7 to 0.26.8
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.26.7...0.26.8)

Updates `typing-extensions` from 4.15.0 to 4.16.0
- [Release notes](https://github.com/python/typing_extensions/releases)
- [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md)
- [Commits](https://github.com/python/typing_extensions/compare/4.15.0...4.16.0)

Updates `wlc` from 2.0.0 to 2.1.0
- [Release notes](https://github.com/WeblateOrg/wlc/releases)
- [Changelog](https://github.com/WeblateOrg/wlc/blob/main/CHANGES.rst)
- [Commits](https://github.com/WeblateOrg/wlc/compare/2.0.0...2.1.0)

Updates `basedpyright` from 1.39.8 to 1.39.9
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.39.8...v1.39.9)
2026-07-03 10:09:55 +02:00
Markus Heiser
67973783de [fix] typo in utils/lib.sh
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-07-02 14:48:03 +02:00
Markus Heiser
0f9e30e3f9 [fix] docs.live (sphinx-autobuild) - watch .rst, .py, .yml and .conf (#6348)
So far, any change to any file triggered a new build, and changes to the
doc-strings (in ./searx) were not taken into account. With this patch, a build
is only triggered when files with the specified file extensions change.

The watch has been expanded to ./searx so that changes to doc strings also
trigger a new build.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-07-02 13:22:12 +02:00
Markus Heiser
640f88c9bd [fix] API docs: remove doc of not existing parameters (#6346)
TBH: Some of the parameters such as engines or plugins still theoretically exist
in SearXNG, but we will no longer support them.  They are usually accessed via
cookies and should not pollute the API / it is these supposed features that
hinder SearXNG in further development.

Closes: https://github.com/searxng/searxng/issues/6003

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-07-02 11:48:53 +02:00
Bnyro
c5d8d05f03 [fix] searchzee: circumvent botblocking 2026-07-01 15:35:46 +02:00
Markus Heiser
d115c61a70 [fix] clarify the mess of Engine.setup and Engine.init (#6343)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-30 19:22:23 +02:00
Zhijie He
c5b1d066e5 [feat] engines: add sina engine
Apply suggestions from code review

Co-authored-by: Bnyro <bnyro@tutanota.com>
2026-06-30 16:59:55 +02:00
Bnyro
774616ada6 [fix] heexy: circumvent botblocking 2026-06-30 15:46:58 +02:00
Bnyro
6b2ec018e2 [fix] qwant: access denied due to mismatching query order
We're now shuffling the order of query arguments, as
it seems that Qwant actively blocks the query order of
SearXNG.

tgp seems to be short for "test group" (look at the XHR requests the
browser sends to "https://www.qwant.com/action/ui") - its actual value
doesn't matter, as long as it's sent and at the correct position in the
query params and doesn't change too frequently
2026-06-30 15:23:09 +02:00
dependabot[bot]
bfeaad6c37 [upd] pypi: Bump granian from 2.7.6 to 2.7.7 in the minor group (#6319)
Bumps the minor group with 1 update: [granian](https://github.com/emmett-framework/granian).


Updates `granian` from 2.7.6 to 2.7.7
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.6...v2.7.7)

---
updated-dependencies:
- dependency-name: granian
  dependency-version: 2.7.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-30 08:18:49 +02:00
Sisyphus
28d3885764 [fix] naver: update HTML parsing for redesigned Naver search results page
Naver redesigned their search results page, replacing the old CSS classes
(lst_total, link_tit, total_dsc_wrap, api_txt_lines) with a new layout
using fds-web-doc-root containers and sds-comps design system.

Updated parse_general():
- Result container: fds-web-doc-root + fds-web-normal-doc-root
- Title: sds-comps-text-type-headline1 span
- URL: first external http link (with try/except guard)
- Content: sds-comps-text-type-body1 span
- Thumbnail: profile-thumbnail img src
- Added guard: skip results without title or URL
2026-06-29 20:25:23 +02:00
Hu Butui
b084194c09 [fix] engine baidu: fix image search blocked by antiFlag
Baidu image search returns antiFlag=1 when the acjson API is called
without session cookies from image.baidu.com.

Warm up cookies with a GET to the image homepage, cache them for one
hour via EngineCache, and pass them to image search requests. Raise
SearxEngineAccessDeniedException when antiFlag is still returned.

Signed-off-by: Hu Butui <hot123tea123@gmail.com>
2026-06-29 19:54:10 +02:00
Hu Butui
8c4df4cf3f [feat] bilibili engine: add time range support
Signed-off-by: Hu Butui <hot123tea123@gmail.com>
2026-06-29 19:53:20 +02:00
Bnyro
a0e594e16e [fix] neosearch: crashes when result has no url 2026-06-29 18:54:01 +02:00
Bnyro
cb4bfbe129 [chore] data.traits: update traits for neosearch 2026-06-29 13:05:01 +02:00
Bnyro
a5660bcc4f [feat] engines: add support for neosearch.org (general) 2026-06-29 13:05:01 +02:00
Bnyro
1396265774 [feat] engines: add magnific images engine 2026-06-29 10:19:19 +02:00
Bnyro
0fd40d5f29 [feat] engines: add shopify stock images engine 2026-06-29 10:02:16 +02:00
Bnyro
13a5ace8b5 [feat] engines: add stocksnap images engine 2026-06-29 10:02:04 +02:00
Bnyro
a6831797ba [feat] engines: add support for picjumbo.com 2026-06-29 10:01:43 +02:00
github-actions[bot]
0e990f78a3 [data] update searx.data - update_gsa_useragents.py (#6329) 2026-06-29 08:03:21 +02:00
github-actions[bot]
990c63b709 [data] update searx.data - update_currencies.py (#6333) 2026-06-29 07:09:12 +02:00
github-actions[bot]
e535e4c61a [data] update searx.data - update_firefox_version.py (#6332) 2026-06-29 07:08:32 +02:00
github-actions[bot]
79506441c5 [data] update searx.data - update_wikidata_units.py (#6330) 2026-06-29 07:08:02 +02:00
github-actions[bot]
6cb1c077e9 [data] update searx.data - update_ahmia_blacklist.py (#6331) 2026-06-29 07:07:28 +02:00
Bnyro
8605230eb8 [fix] resulthunter: images in search results are not clickable 2026-06-28 22:31:01 +02:00
Bnyro
a54722e692 [feat] tiger: add support for related search terms / suggestions 2026-06-28 22:30:48 +02:00
Bnyro
7e9a6c2861 [fix] tiger: captcha paths have changed 2026-06-28 22:30:48 +02:00
dependabot[bot]
357662d86d [upd] github-actions: Bump docker/scout-action from 1.21.0 to 1.22.0 (#6317)
Bumps [docker/scout-action](https://github.com/docker/scout-action) from 1.21.0 to 1.22.0.
- [Release notes](https://github.com/docker/scout-action/releases)
- [Commits](cd72f264be...7520205ff6)

---
updated-dependencies:
- dependency-name: docker/scout-action
  dependency-version: 1.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:19:29 +02:00
dependabot[bot]
bfa76e4cd9 [upd] github-actions: Bump actions/cache from 5.0.5 to 6.0.0 (#6316)
Bumps [actions/cache](https://github.com/actions/cache) from 5.0.5 to 6.0.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](27d5ce7f10...2c8a9bd745)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:19:14 +02:00
dependabot[bot]
a9d49a3349 [upd] github-actions: Bump actions/setup-python from 6.2.0 to 6.3.0 (#6315)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](a309ff8b42...ece7cb06ca)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-28 09:18:54 +02:00
github-actions[bot]
f8ffbf36f9 [l10n] update translations from Weblate (#6320)
6de4d96dd - 2026-06-23 - code_gremlin <code_gremlin@noreply.codeberg.org>
2026-06-26 10:24:36 +02:00
Markus Heiser
e3126b89e6 [mod] update_engine_descriptions.py - revision of the script (#6309)
* [mod] update_engine_descriptions.py - revision of the script (#6309)

The script was a bit outdated, type hints were missing, and the strings were
converted to double quotation marks

The `descriptions.items()` are sorted to avoid assigning the references to
seen_descriptions randomly (should reduce unnecessary diffs in the future).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>

* [data] update searx.data - update_engine_descriptions.py (#6309)

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>

---------

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-24 12:10:28 +02:00
Markus Heiser
f9f3d089ec [fix] engine anaconda - add missing about configuration (#6308)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-24 10:45:40 +02:00
Hu Butui
e3713717f2 [fix] engines: remove terminated chinaso media engines
Signed-off-by: Hu Butui <hot123tea123@gmail.com>
2026-06-23 18:20:04 +02:00
Bnyro
952896d29e [feat] image results: automatically guess mimetype based on path 2026-06-22 12:46:22 +02:00
Bnyro
4cc32b2457 [fix] kozmonavt: remove pagination and set to inactive by default
Pagination requires a different nextpage query parameter each
day as it seems, so it's not possible to implement this in the Xpath
engine.
2026-06-22 10:06:09 +02:00
Bnyro
cce0957f54 [feat] engines: add support for iseek.com (general) 2026-06-22 09:51:57 +02:00
Bnyro
9375c0a6b6 [feat] engines: add netherlands startpagina (general, videos, images, news) 2026-06-22 09:50:19 +02:00
Bnyro
a702741e4e [feat] engines: add giphy (images/videos) 2026-06-22 09:49:47 +02:00
Bnyro
aeced67249 [feat] engines: add findfiles.net file search engine
FindFiles.net is a specialized file search engine designed to help you search
files online with precision. Unlike traditional search engines that mainly index
web pages, FindFiles focuses on finding real files on the internet - including
PDFs, documents, archives, videos, datasets, and more. [1]

[1] https://findfiles.net
2026-06-22 09:44:27 +02:00
Bnyro
199e03de1d [feat] engines: add kozmonavt.su (general) 2026-06-22 09:42:55 +02:00
Bnyro
9cd2439e5e [feat] engines: add kukei.eu (general) 2026-06-22 09:42:45 +02:00
Bnyro
9f4d8bca02 [feat] engines: add xonaly.com (general) 2026-06-22 09:41:29 +02:00
Bnyro
de76a4a39b [feat] engines: add cl0q.com (foss domain search) 2026-06-22 09:41:18 +02:00
Bnyro
a85a5e2794 [feat] engines: add unobtanium.rocks (personal websites search) 2026-06-22 09:41:07 +02:00
Bnyro
92abd98a55 [feat] engines: add tusksearch (web, news, videos, images) (#6267)
The code that reads the value of variable `x` from `embed.js`, decodes
it to ASCII and based on that sets `window["tuskheader"]` and `window["tuskkey"]`
is attached below. The only real way to figure out what this is doing is
by stepping through it with the debugger, otherwise it's almost hopeless.

```js
function fe() {
  const B = pe => pe.map(_e => String.fromCharCode(_e)).join(''),
  ae = window,
  o = ae.x;
  if (o?.length) {
    const pe = o.length / 2;
    for (let _e = 0; _e < pe; _e++) ae[B(o[_e])] = B(o[pe + _e]);
    ae.x = void 0
  }
}
```

Minimal script for testing the engine:

```py
import random
from json import loads
import requests

resp = requests.get("https://api.tusksearch.com/revcontent/embed.js")
data = loads(resp.text[6:])

def _decode(text: list[int]) -> str:
    return "".join([chr(x) for x in text])

header = _decode(data[3])
value = _decode(data[4])

resp = requests.get(
    "https://api.tusksearch.com/Search/Web?q=test&p=1&l=center&nextArgs=&prevArgs=",
    # "https://api.tusksearch.com/Search/Image?q=test&p=1&l=center",
    headers={
        header: value,
        'x-lon': str(random.random() * 90),
        'x-lat': str(random.random() * 90),
    },
)
print(resp.text)
```
2026-06-22 09:40:32 +02:00
Bnyro
93e867c6b1 [feat] engine categories: add blogs category
Category for searching personal blogs and websites.
Useful if searching for interesting articles on a topic
rather than the mainstream Wikipedia etc. results.
2026-06-22 09:39:40 +02:00
dependabot[bot]
75c1b1dade [upd] web-client (simple): Bump less (#6289)
Bumps the minor group in /client/simple with 1 update: [less](https://github.com/less/less.js).


Updates `less` from 4.6.4 to 4.6.6
- [Release notes](https://github.com/less/less.js/releases)
- [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/less/less.js/commits/v4.6.6)

---
updated-dependencies:
- dependency-name: less
  dependency-version: 4.6.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-22 08:03:15 +02:00
Bnyro
097ab64c70 [del] aol: remove engine (eol) (#6299) 2026-06-22 07:32:23 +02:00
dependabot[bot]
0e9f513efc [upd] pypi: Bump the minor group with 5 updates (#6291)
Bumps the minor group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [certifi](https://github.com/certifi/python-certifi) | `2026.5.20` | `2026.6.17` |
| [pylint](https://github.com/pylint-dev/pylint) | `4.0.5` | `4.0.6` |
| [selenium](https://github.com/SeleniumHQ/Selenium) | `4.44.0` | `4.45.0` |
| [sphinxcontrib-programoutput](https://github.com/OpenNTI/sphinxcontrib-programoutput) | `0.19` | `0.20` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.39.7` | `1.39.8` |
2026-06-22 07:30:41 +02:00
Bnyro
fd42d4fda1 [fix] chatnoir: don't re-use/cache session keys
They're invalidated very quickly, so even caching them for
60 seconds results in a lot of unauthorized access errors.
2026-06-20 21:52:14 +02:00
dependabot[bot]
5c38d2feab [upd] web-client (simple): Bump @types/node in /client/simple (#6290)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.3 to 26.0.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 16:58:47 +02:00
dependabot[bot]
38b678c493 [upd] github-actions: Bump actions/checkout from 6.0.3 to 7.0.0 (#6288)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](df4cb1c069...9c091bb21b)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-19 16:58:27 +02:00
github-actions[bot]
fe1848673f [l10n] update translations from Weblate (#6293)
0f1c1d570 - 2026-06-18 - lugged9922 <lugged9922@noreply.codeberg.org>
81d208307 - 2026-06-18 - Raithlin <raithlin@noreply.codeberg.org>
bf09069e8 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
c010ba929 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
f92ba4e98 - 2026-06-17 - M Alif fadlan <maliffadlan@gmail.com>
442e504e2 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
e2ffb2275 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
cc26d0794 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
9639f4e84 - 2026-06-17 - return42 <return42@noreply.codeberg.org>
63059d4e7 - 2026-06-15 - AndersNordh <andersnordh@noreply.codeberg.org>
460c5260f - 2026-06-15 - kratos <makesocialfoss32@keemail.me>
b212184d9 - 2026-06-16 - ghose <ghose@noreply.codeberg.org>
c9ac8e6d7 - 2026-06-15 - AndersNordh <andersnordh@noreply.codeberg.org>
cc1f5ab59 - 2026-06-15 - Fjuro <fjuro@noreply.codeberg.org>
84f985a9f - 2026-06-14 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
bdb7e25bc - 2026-06-13 - SomeTr <sometr@noreply.codeberg.org>
c3eac4c37 - 2026-06-14 - Stephan-P <stephan-p@noreply.codeberg.org>
d94ab494b - 2026-06-13 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
3387bab27 - 2026-06-13 - gallegonovato <gallegonovato@noreply.codeberg.org>
2026-06-19 15:11:48 +02:00
Bnyro
8b10095e8a [fix] settings.yml: explicitely set category for xpath engines (ayo, gabanza, zapmeta, abcnyheter) (#6282) 2026-06-19 09:10:27 +02:00
Jayant Sharma
b5ef7ec8f3 [fix] calculator: move math.parse inside try-catch (#6278) (#6280)
* [fix] calculator: move math.parse inside try-catch (#6278)

* build static

---------

Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2026-06-18 17:36:47 +02:00
Bnyro
bd73cc09ea [feat] engines: add support for search.ch/web (Swiss) 2026-06-18 14:02:52 +02:00
Butui Hu
4dfdc822cf [fix] engines: chinaso: handle empty upstream results gracefully (#6266)
Signed-off-by: Hu Butui <hot123tea123@gmail.com>
2026-06-17 19:36:22 +02:00
Ivan Gabaldon
502c820a25 [fix] container: setup minimal (#6268)
Start minimal, use defaults, and extend later on. The templates are no longer
checked for changes, which was confusing and annoying after a while.

See: https://github.com/searxng/searxng/issues/6261#issuecomment-4716008282
2026-06-16 15:32:47 +02:00
Markus Heiser
4fb49b4498 [chore] add DeprecationWarning for obsolete engine.about.language property (#6265)
The old property should still be supported for a transitional period; the
reasons for this can be seen from the discussion in [1] / the further procedure
is also discussed there.

[1] https://github.com/searxng/searxng/issues/6261

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-16 10:31:21 +02:00
Markus Heiser
cf1410af8d [fix] set language_support for engines with languages in traits (#6258)
In the past, the engine option ``language_support`` was not consistently
maintained; with this patch, a ValueError is now thrown if an engine has
languages in its traits but language_support is not set to True.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-15 10:52:00 +02:00
Markus Heiser
6c9dcd4242 [chore] complete and normalize the attributes of engine objects (#6258)
Drop outdated engine attributes: supported_languages, language_aliases

Complete, normalize and document the type definitions for the engine-module and
engine-class.

For the ``engine.about`` section of the configuration, a type check is performed
based on structure ``searx.enginelib.EngineAbout``.

The property ``engine.about.language`` no longer exists; existing values have
been migrated to ``engine.language``.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-15 10:52:00 +02:00
Bnyro
b3e08f2a44 [feat] engines: add searchzee engine (general, news)
The results seem to be from Brave (i.e. they are exactly
the same). But it doesn't have any strict rate-limits,
so that's nice.

News support time ranges, but apart from that, unfortunately it doesn't
support any advanced features like safesearch or languages.
2026-06-14 09:59:39 +02:00
Bnyro
a857041afc [feat] engines: add support for search.ayo.de 2026-06-14 09:32:58 +02:00
Bnyro
31a8a22aa6 [feat] engines: add German tonline engine (general, news, images, videos) (#6250)
T-Online_ is a German news portal.

It gets its web results from Google, image results from Flickr and videos results
from YouTube.

For images and videos, it additionally returns result from its
news catalog. However, for pagination we have to specify the result
type (e.g. either videos from YouTube or from T-Online), so we use
flickr/youtube there instead of tonline because the tonline results
are usually irrelevant.
2026-06-14 08:46:07 +02:00
Bnyro
a29cda858c [feat] engines: add luxxle (general, news, images, videos)
Add support for https://luxxle.com

Localization is not yet supported because it doesn't seem to work on their
website either, no matter which language I select, it only returns English web
results
2026-06-13 20:39:31 +02:00
Bnyro
2e10a2f614 [feat] engines: add rawweb engine (foss, hand-indexed blogs) (#6234)
RawWeb is a search engine for personal websites / blog posts.
It has its own index and the personal websites were selected
by hand. Results are quite good for what it is imo. [^1]

[^1]: https://github.com/0x2E/RawWeb.org
2026-06-13 19:09:58 +02:00
Bnyro
2100eb04e1 [feat] engines: add reloado engine (general, german) (#6233)
- adds support for https://reloado.com (german)
- as it has its own index, the results are hit or miss and mostly German, 
  but still worth integrating imo
2026-06-13 19:06:18 +02:00
Bnyro
c58391d673 [feat] engines: add fastbot engine (general) (#6232)
- adds support for https://fastbot.de
- the results are really fast and mostly in English (even though it's a German
  engine)
2026-06-13 19:04:39 +02:00
Bnyro
c3284c8238 [chore] make data.traits (#6211) 2026-06-13 18:37:57 +02:00
Bnyro
290d3e0c6a [feat] engines: add privacywall engine (#6211)
- add https://privacywall.org support
- the engine seems to use the Bing index, but not 100% sure
- it claims to be privacy friendly, but it's not really by itself [1]

[1]: https://discuss.privacyguides.net/t/how-is-privacy-wall-search-engine/29486
2026-06-13 18:37:57 +02:00
Bnyro
0608dfa4d1 [feat] autocomplete: add privacywall autocompleter (#6211) 2026-06-13 18:37:57 +02:00
Bnyro
1184b3212f [feat] engines: add podchaser podcast engine (#6202)
- add podchaser podcast engine
- the motivation is that podcastindex had to be removed, see #6140
2026-06-13 18:04:21 +02:00
Bnyro
65e0e4c069 [feat] engines: add vuhuv engine (#6196) 2026-06-13 17:52:43 +02:00
Bnyro
d14fa1f6e2 [chore] data: add resulthunter engine traits 2026-06-13 17:21:52 +02:00
Bnyro
2d248704fa [feat] engines: add resulthunter 2026-06-13 17:21:52 +02:00
Markus Heiser
3096b1218f [mod] add type definitions for engine's "about" section (#6231)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-13 17:05:59 +02:00
Bnyro
82a8a90230 [feat] engines: add abcnyheter engine (general, norway) (#6231)
Add support for https://startsiden.abcnyheter.no, a netherlandish search engine
that probably uses Google or Bing? idk it also returns English results, but
e.g. ``test`` returns mostly results from netherlands.
2026-06-13 17:05:59 +02:00
Bnyro
e3d4fbe570 [feat] engines: add s1search general engine (#6186)
S1Search provides various different search services, which all seem
to be somewhat based on Google and Yahoo. The site looks kinda suspicious,
but the results are fine.

You can find a list of their engines by using a subdomain finder like
https://web-toolbox.dev/en/tools/subdomain-lookup and search for `s1search.co`.
2026-06-13 14:18:04 +02:00
Bnyro
031747f29e [feat] engines: add chatnoir general engine (#6183)
Chatnoir is an open source search engine developed by universities, based on
CommonCrawl (and others).  It's uncommented by default - we don't want to
overload the universities with bot traffic that targets SearXNG (sad truth why
we can't have nice things anymore)
2026-06-13 13:52:01 +02:00
Markus Heiser
e3bd7f5df1 [mod] image results: add list of alternative formats (#6153)
* [mod] template images.html: reformatted for readability (no func change)

In preparation for upcoming changes, the template is being reformatted for
better readability; no functional changes are being made.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>

* [mod] image results: add list of alternative formats

To test alternatives formats apply patch from below, query ``!flaticon bmw`` and
open the detail view for the image.

    diff --git a/searx/engines/flaticon.py b/searx/engines/flaticon.py
    index 06b6a8e25..d88388705 100644
    --- a/searx/engines/flaticon.py
    +++ b/searx/engines/flaticon.py
    @@ -8,7 +8,7 @@ from urllib.parse import urlencode

     import typing as t

    -from searx.result_types import EngineResults
    +from searx.result_types import EngineResults, ImageRef

     if t.TYPE_CHECKING:
         from searx.extended_types import SXNG_Response
    @@ -61,6 +61,14 @@ def response(resp: "SXNG_Response"):
                     thumbnail_src=_fix_url(result["png"]),
                     img_src=_fix_url(result["png512"]),
                     author=result["team_name"],
    +                formats=[
    +                    ImageRef(label="PNG 100x100", url="https://example.org/test.png", subtype="png"),
    +                    ImageRef(label="SVG", url="https://example.org/test.svg", subtype="svg+xml"),
    +                    ImageRef(url="https://example.org/test.jpg", subtype="jpeg"),
    +                    ImageRef(url="https://example.org/test.bmp", subtype="bmp"),
    +                    ImageRef(url="https://example.org/test.ico", subtype="x-icon"),
    +                    ImageRef(url="https://example.org/test.tif", subtype="tiff"),
    +                ],
                 )
             )

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>

---------

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-13 13:28:05 +02:00
Bnyro
b48205b384 [fix] tiger: crashes on empty result (#6251)
e.g. when searching for "!tiger pottering github", it crashes.
not really sure why - the problem is that the HTML doesn't
really uses descriptive classes or ids, only Tailwind,
so it's very hard to select only the results HTML.
2026-06-13 09:37:43 +02:00
Bnyro
8522638b00 [fix] duckduckgo web: result title contains html (#6253) 2026-06-13 09:35:14 +02:00
dependabot[bot]
ab81c77533 [upd] pypi: Bump the minor group with 2 updates (#6247)
Bumps the minor group with 2 updates: [granian](https://github.com/emmett-framework/granian) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `granian` from 2.7.5 to 2.7.6
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.5...v2.7.6)

Updates `basedpyright` from 1.39.6 to 1.39.7
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.39.6...v1.39.7)

---
updated-dependencies:
- dependency-name: granian
  dependency-version: 2.7.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.39.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 22:42:26 +02:00
dependabot[bot]
cc196f2a5b [upd] web-client (simple): Bump the minor group across 1 directory with 4 updates (#6249)
Bumps the minor group with 4 updates in the /client/simple directory: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [sharp](https://github.com/lovell/sharp) and [stylelint](https://github.com/stylelint/stylelint).

Updates `@biomejs/biome` from 2.4.16 to 2.5.0
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.5.0/packages/@biomejs/biome)

Updates `@types/node` from 25.9.1 to 25.9.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `sharp` from 0.34.5 to 0.35.1
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.34.5...v0.35.1)

Updates `stylelint` from 17.12.0 to 17.13.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.12.0...17.13.0)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.9.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: sharp
  dependency-version: 0.35.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 17.13.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 20:40:51 +02:00
dependabot[bot]
dd3022d680 [upd] web-client (simple): Bump sort-package-json in /client/simple (#6246)
Bumps [sort-package-json](https://github.com/keithamus/sort-package-json) from 3.6.1 to 4.0.0.
- [Release notes](https://github.com/keithamus/sort-package-json/releases)
- [Commits](https://github.com/keithamus/sort-package-json/compare/v3.6.1...v4.0.0)

---
updated-dependencies:
- dependency-name: sort-package-json
  dependency-version: 4.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-12 19:51:22 +02:00
Bnyro
de8a3de15a [feat] engines: add support for Kagi (requires API key) 2026-06-12 14:48:47 +02:00
Bnyro
4dd0bf4867 [fix] fireball: all results are shown in general category 2026-06-11 17:30:46 +02:00
Bnyro
1957876dd6 [feat] engines: add dogpile (general, news, images, videos)
Add support for the Dogpile search engine, found at:

https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/

It seems to use the same index as startpage because results are similar and they
share the ``qadf`` (Safe-Search) request parameter.
2026-06-11 16:09:13 +02:00
Bnyro
ab13451086 [mod] odysee: move format_duration helper into utils.py 2026-06-11 16:09:13 +02:00
Bnyro
a1490676e3 [mod] fireball: small fixup from code review (#6240)
Co-authored-by: Markus Heiser <markus.heiser@darmarIT.de>
2026-06-11 12:09:57 +02:00
Bnyro
3a382cb3f3 [chore] helix config: enable pyling and use black via pylsp 2026-06-11 11:03:38 +02:00
Ivan Gabaldon
9d9d605b15 [fix] ci: use install buildhost script (#6105) 2026-06-11 08:23:37 +02:00
Bnyro
de03f4eb11 [feat] engines: add fireball engine (general, news, videos) 2026-06-10 21:00:49 +02:00
Markus Heiser
00f7c68a6f [chore] drop emacs' obsolete .dir-locals template (#6236)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-10 17:38:19 +02:00
Bnyro
41c98b3b41 [chore] devops: add languages config for helix editor
The default Helix configuration for Python is different,
so the pylint warnings aren't shown and the formatter
re-formats files by accident when you edit an existing file.

Therefore, this commit adds `python` language configuration
to ease developing SearXNG with Helix Editor [^1].

[^1]: https://helix-editor.com
2026-06-10 17:38:01 +02:00
Bnyro
f4c63c8eb0 [feat] engines: add duckduckgo web engine as alternative to html.duckduckgo.com
html.duckduckgo.com captchas all my IPs very fast. I figured out that using
duckduckgo.com works even if html.duckduckgo.com is captcha-ed, hence adding
support for duckduckgo.com's general web search here.

This implementation fetches the link to the first API page
(i.e. ``links.duckduckgo.com/d.js?...``) from duckduckgo.com and uses the ``n``
parameter of the API to fetch all subsequent pages.

This also means that it's not possible to immediately search for the third
page - the first and the second page would need to be loaded first.

The reason why we can't just normally use the `vqd` value is that the API URLs
require an additional parameter `dp` which seems generated at server-side, so we
can't build it ourselves and must scrape it from the HTML pages.
2026-06-10 16:49:56 +02:00
Markus Heiser
26801e92af [fix] sqlitedb: create DB Schema (DDL) during app initialization (hardening) (#6187)
The initialization of the DB schema ("base schema") has so far been done on
demand, which causes race conditions with competing threads and processes.

The DDL statements for creating the "base schema" are now executed as part of
the initialization of the app.

Further improvements were made to harden the database applications:

- Wikidata & Radio-Browser engine perform their initialization only once (so far
  the initialization was carried out in each thread/process).

- If multiple processes try to set DB's WAL mode when opening the DB at the same
  time, this usually leads to another race condition, which is now also caught.

Related:

- https://github.com/searxng/searxng/issues/6181#issuecomment-4586705

Closes: #6181

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-10 15:48:49 +02:00
Bnyro
f3fab143be [feat] engines: add tiger.ch engine
Add support for https://tiger.ch (general, news)

It is disabled and inactive by default because it's just a metasearch engine
like SearXNG is, so it's mostly useful for bypassing rate-limits on other
engines: (it has its own German index, but it's not that great) in theory it
supports different locales, but I was too lazy to implement that (I only need
German and English results anyways, which are returned by default...)
2026-06-08 13:35:13 +02:00
Bnyro
72a827ae93 [fix] yep: send Sec-Fetch headers to bypass "access denied" (#6223)
Avoids yep's botblocking by sending Sec-Fetch-* headers (as the browser does).
2026-06-08 10:55:17 +02:00
Bnyro
6ca9d3784c [feat] engines: add seek-ninja general engine (#6217)
Add support for https://seek.ninja (general)

It's very slow because the engine uses Server-side events, that incrementally
send data in their HTTP response [1].

I.e. we wait for the end of the response (7+ seconds), even though the results
data arrives within a few seconds -> it's very slow, because SearXNG wants to
get the full response body before it calls the `response(resp)` method

We could use httpx-sse [2], but I'm not sure how to integrate this into SearXNG
and if it's worth it

[1] https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/
[2] https://github.com/florimondmanca/httpx-sse
2026-06-08 07:09:06 +02:00
Bnyro
63f264220b [feat] engines: add heexy engine (general, images) (#6218) 2026-06-08 05:54:35 +02:00
Austin-Olacsi
41fcf0be4b [fix] aol engine uses wikidata id for C++ (#6221) 2026-06-08 05:32:26 +02:00
Bnyro
86903a2c66 [fix] flaticon: crash if result tag has no name (#6219) 2026-06-07 14:16:44 +02:00
Markus Heiser
70de3cc561 Revert "[fix] no such table during engine init (#6185)" (#6215)
This reverts commit 9d49a9f344.
2026-06-07 09:23:35 +02:00
Bnyro
51b6fd4f23 [del] karmasearch: remove engine (cloudflared) (#6213)
The engine is using very aggressive Cloudflare blocking for
a while now, no matter if using a normal browser like Firefox
or not.

Closes: https://github.com/searxng/searxng/issues/5976
2026-06-07 06:49:09 +02:00
Brock Vojkovic
9d49a9f344 [fix] no such table during engine init (#6185) 2026-06-07 06:04:12 +02:00
Bnyro
e260a732c8 [fix] online engine processor: accept language headers doesn't get sent for 'all' language 2026-06-06 18:24:16 +02:00
Markus Heiser
0429198415 [mod] swisscows WEB: ignore video results from the first page
On the first page of the WEB search, there are, among other things, sections for
videos and news.  The video results from these sections should not be used as
results in the WEB search of SearXNG.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-06 18:04:19 +02:00
Markus Heiser
e7cf57e9ae [mod] swisscows engines: add language / region support
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-06-06 18:04:19 +02:00
Bnyro
ed369ac0ec [feat] engines: add support for swisscows general 2026-06-06 18:04:19 +02:00
Bnyro
94bdbb5c63 [feat] engines: add support for swisscows videos 2026-06-06 18:04:19 +02:00
Bnyro
465b5229c6 [feat] engines: add swisscows news engine 2026-06-06 18:04:19 +02:00
Bnyro
cbf97fd262 [feat] engines: add swisscows images engine
The implementation is basically a 1:1 port of the reverse engineered
swisscows JavaScript code. (it's been obfuscated, so I've restructured it
and made the variable names idiomatic instead of obfuscated var names like "a", "o", "i")

```js
/*
e: "/v5/images/search"
t: {
	itemsCount: "50"
	locale: "de-DE"
	offset: "50"
	query: "test"
	spellcheck: "true"
}
*/
// HASH library used: https://github.com/h2non/jshashes
function generateNonceAndSignature(queryParams, urlPath) {
  // urlPath = "/v5/images/search"
  // sort keys alphabetically and join to query string
  let queryStringSorted = '?' + U().stringify(queryParams, {
    arrayFormat: 'repeat',
    allowDots: !0
  }).split('&').map(e => {
    let[key, value] = e.split('=');
    return [key, decodeURIComponent(value)]
  }).sort((e, t) => e[0].localeCompare(t[0])).map(e => e.join('=')).join('&');

  function caesarShift(str, offset = 13) {
      const alphabet = 'abcdefghijklmnopqrstuvwxyz';
      let result = [];
      for (let a = 0; a < str.length; a++) {
        let c = str[a],
        alphabetIndex = alphabet.indexOf(c.toLowerCase());
        if ( - 1 !== alphabetIndex) {
          alphabetIndex += offset;
          while (alphabetIndex >= alphabet.length) alphabetIndex -= alphabet.length;
          c = c === c.toUpperCase() ? alphabet[alphabetIndex] : alphabet[alphabetIndex].toUpperCase()
        }
        result.push(c)
      }
      return result.join('')
    }
  const r = new (sha256Instance()).SHA256;
  const random = randomString(32);
  const randomShifted = caesarShift(random);
  let to_hash = [urlPath, queryStringSorted, randomShifted].join('');
  let signature = r.b64(to_hash);
  signature = signature.replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
  return {
    nonce: random,
    signature: signature
  }
}

function randomString(length) {
  let t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~',
  n = '';
  for (let r = 0; r < length; r++) n += t.charAt(Math.floor(Math.random() * t.length));
  return n
}
```
2026-06-06 18:04:19 +02:00
dependabot[bot]
37187dc2d8 [upd] web-client (simple): Bump the minor group across 1 directory with 5 updates (#6169)
Bumps the minor group with 5 updates in the /client/simple directory:

| Package | From | To |
| --- | --- | --- |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.4.15` | `2.4.16` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.8.0` | `25.9.1` |
| [edge.js](https://github.com/edge-js/edge) | `6.5.0` | `6.5.1` |
| [stylelint](https://github.com/stylelint/stylelint) | `17.11.1` | `17.12.0` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.0.13` | `8.0.16` |

Updates `@biomejs/biome` from 2.4.15 to 2.4.16
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.16/packages/@biomejs/biome)

Updates `@types/node` from 25.8.0 to 25.9.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `edge.js` from 6.5.0 to 6.5.1
- [Release notes](https://github.com/edge-js/edge/releases)
- [Changelog](https://github.com/edge-js/edge/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/edge-js/edge/compare/v6.5.0...v6.5.1)

Updates `stylelint` from 17.11.1 to 17.12.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.11.1...17.12.0)

Updates `vite` from 8.0.13 to 8.0.16
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.16/packages/vite)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.9.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: edge.js
  dependency-version: 6.5.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 17.12.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: vite
  dependency-version: 8.0.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-05 16:26:27 +02:00
dependabot[bot]
2f049cb037 [upd] github-actions: Bump actions/checkout from 6.0.2 to 6.0.3 (#6204)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](de0fac2e45...df4cb1c069)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-05 16:17:01 +02:00
dependabot[bot]
eb39bc0dc1 [upd] github-actions: Bump github/codeql-action from 4.36.0 to 4.36.2 (#6203)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.0 to 4.36.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](7211b7c807...8aad20d150)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-05 16:16:35 +02:00
dependabot[bot]
007a4e2155 [upd] pypi: Bump typer from 0.26.3 to 0.26.7 in the minor group (#6205)
Bumps the minor group with 1 update: [typer](https://github.com/fastapi/typer).


Updates `typer` from 0.26.3 to 0.26.7
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.26.3...0.26.7)
2026-06-05 11:54:28 +02:00
github-actions[bot]
13ce187e64 [l10n] update translations from Weblate (#6206)
19b2047a9 - 2026-05-30 - daemul72 <daemul72@noreply.codeberg.org>
2026-06-05 11:52:35 +02:00
Bnyro
26fa181b84 [feat] gmx: detect captchas 2026-06-05 08:07:30 +02:00
Bnyro
0f35ef7cd6 [feat] json engine: add option to not send page num on first page 2026-06-05 08:04:49 +02:00
Bnyro
b1ae576b2d [fix] xpath engine: add missing send_page_num_on_first_page docstring 2026-06-05 08:04:49 +02:00
Bnyro
e6559c9ad6 [fix] gabanza: result URLs are invalid 2026-06-04 08:55:19 +02:00
Bnyro
5bae05514b [feat] engines: add zapmeta general search engine 2026-06-03 22:38:59 +02:00
Bnyro
00ca5776f2 [feat] engines: add gabanza general engine 2026-06-03 22:38:23 +02:00
Bnyro
577f5f2f30 [fix] online engines: send_accept_language_header is sent even if disabled 2026-06-03 22:37:13 +02:00
Bnyro
253dc86c10 [fix] duckduckgo: image requests get blocked 2026-06-03 22:37:13 +02:00
Bnyro
3066bc19eb [fix] public domain image archive: fails to extract API url 2026-06-03 22:35:21 +02:00
Austin-Olacsi
e964708c00 [fix] bilibili engine: fix Referer and add Accept HTTP header (#6189) 2026-06-02 06:06:31 +02:00
Bnyro
7159b8aed3 [feat] marginalia: add support for pagination 2026-05-31 12:54:53 +02:00
Bnyro
246f5a5499 [mod] svgrepo: remove engine
- SVGRepo uses Cloudflare for every session, no matter
if you're opening it in a browser or not
2026-05-31 12:54:32 +02:00
vojkovic
300695de5c [fix] crash when lock is omitted 2026-05-31 01:37:37 +08:00
Markus Heiser
bd863f16b1 [build] /static 2026-05-30 22:43:50 +08:00
Markus Heiser
4ac822fd7f [mod] typification of the preference settings
no functional change / except the missing online doc which is now available::

    $ make docs.live
    $ xdg-open "http://127.0.0.1:8000/admin/settings/settings_preferences.html"

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-30 22:43:50 +08:00
vojkovic
e1d25c5078 [mod] enable image proxy for public instances 2026-05-30 22:43:50 +08:00
dependabot[bot]
01159b82fe [upd] pypi: Bump the minor group with 3 updates (#6164)
Bumps the minor group with 3 updates: [granian](https://github.com/emmett-framework/granian), [basedpyright](https://github.com/detachhead/basedpyright) and [typer](https://github.com/fastapi/typer).


Updates `granian` from 2.7.4 to 2.7.5
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.4...v2.7.5)

Updates `basedpyright` from 1.39.5 to 1.39.6
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.39.5...v1.39.6)

Updates `typer` from 0.25.1 to 0.26.3
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.25.1...0.26.3)
2026-05-30 11:33:10 +02:00
Bnyro
780ee32564 [fix] pexels: fix engine crashes with SearxEngineAccessDeniedException 2026-05-29 22:03:22 +02:00
github-actions[bot]
217c9a1597 [l10n] update translations from Weblate (#6170)
207f98ecc - 2026-05-26 - mustafa-phd <mustafa-phd@noreply.codeberg.org>
3b51fbca7 - 2026-05-25 - Amirkhandrend-Nicest-XII <amirkhandrend-nicest-xii@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-05-29 14:47:43 +02:00
dependabot[bot]
70e810bd7b [upd] github-actions: Bump docker/setup-qemu-action from 4.0.0 to 4.1.0 (#6166)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](ce360397dd...06116385d9)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-29 14:42:48 +02:00
dependabot[bot]
baab1c160a [upd] github-actions: Bump github/codeql-action from 4.35.5 to 4.36.0 (#6167)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.35.5 to 4.36.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](9e0d7b8d25...7211b7c807)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-29 14:42:28 +02:00
dependabot[bot]
dd4664e03a [upd] github-actions: Bump docker/login-action from 4.1.0 to 4.2.0 (#6168)
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](4907a6ddec...650006c6eb)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-29 14:41:49 +02:00
github-actions[bot]
4ea5c57a84 [data] update searx.data - update_firefox_version.py (#6161) 2026-05-29 06:25:18 +02:00
github-actions[bot]
6917395dc1 [data] update searx.data - update_wikidata_units.py (#6160) 2026-05-29 06:24:50 +02:00
github-actions[bot]
128e28fe3f [data] update searx.data - update_gsa_useragents.py (#6158) 2026-05-29 06:24:11 +02:00
github-actions[bot]
fb3ed5b081 [data] update searx.data - update_ahmia_blacklist.py (#6159) 2026-05-29 06:22:55 +02:00
github-actions[bot]
4ebe6b90d6 [data] update searx.data - update_currencies.py (#6162) 2026-05-29 06:21:55 +02:00
github-actions[bot]
0657217a3e [data] update searx.data - update_engine_descriptions.py (#6163) 2026-05-29 06:20:57 +02:00
Bnyro
0037d43d87 [fix] aol: disable http2 to prevent request fingerprinting (#6149) 2026-05-26 12:15:35 +02:00
Bnyro
f5be39e245 [mod] podcastindex: remove engine (#6140)
PodcastIndex.org started using a Proof-of-Work JavaScript
challenge whose results are sent as `X-Pow-*` request headers.
Although it is technically possible to re-implement the
PoW challenge in Python, it's likely impossible to maintain
because

- the actual Proof of Concept logic might change very often

- the whole idea of the Proof of Work challenge is to use
  a "big" amount of resources (about 1s on my PC); so executing the challenge
  would almost block all other work on the SearXNG instance

At first glance, the challenge looks very similar to what
Anubis does, because it also uses SHA256 hashes.
2026-05-26 11:53:20 +02:00
Bnyro
1574939441 [fix] json, xpath engine: rename safe_search_support option to safesearch (#6143) 2026-05-26 11:38:07 +02:00
Markus Heiser
f1a22dec9e [fix] disable qwant engine / the rate-limits are just very strict (#6148)
Qwant is set to inactive by default due to its strict rate-limits

Related:

- https://github.com/searxng/searxng/pull/6127

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-26 11:05:06 +02:00
Markus Heiser
3db8b424a8 [mod] engine flaticon: migrate from LegacyResult to Image (#6142)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-26 09:19:17 +02:00
Markus Heiser
a16a3dedb4 [build] /static (#6142) 2026-05-26 09:19:17 +02:00
Markus Heiser
c629dd4f3c [mod] typification of SearXNG: add new result type Image (#6142)
- Python class:   searx/result_types/image.py
- Jinja template: searx/templates/simple/result_templates/images.html
- CSS (less)      client/simple/src/less/result_types/image.less

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-26 09:19:17 +02:00
Markus Heiser
28ef4f7447 [mod] hardening of the Result.filter_urls() method (#6117)
Exceptions in the execution of the callback must be caught / ignored and logged
on the ERROR log.

To test, apply this patch to provoke a ValueError exception::

    diff --git a/searx/data/tracker_patterns.py b/searx/data/tracker_patterns.py
    index ed4415bce..695ed05d2 100644
    --- a/searx/data/tracker_patterns.py
    +++ b/searx/data/tracker_patterns.py
    @@ -114,6 +114,7 @@ class TrackerPatternsDB:
             Returns bool ``True`` to use URL unchanged (``False`` to ignore URL).
             If URL should be modified, the returned string is the new URL to use.
             """
    +        raise ValueError("test callback exceptions")

             new_url = url
             parsed_new_url = urlparse(url=new_url)

Start a `make run` instance and query for example `amazon` .. have a look at the
ERROR log:

    ERROR   searx.result_types: filter_urls (field 'url'): ignore ValueError('test callback exceptions') from callback searx/data/tracker_patterns.py:117

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-25 18:12:40 +02:00
Bnyro
cb4b70ac50 [fix] qwant news: results don't have any descriptions (#6135)
BTW: fix some typecast issues
2026-05-25 18:04:14 +02:00
Markus Heiser
e29e861e2c [fix] bing engines - geoblocking in China (#6134)
In regions like China, the domain must be adjusted to avoid a redirect.

- https://github.com/searxng/searxng/issues/5243
- https://github.com/searxng/searxng/pull/5324
- https://github.com/searxng/searxng/pull/6133

Suggested / tested by @hubutui in https://github.com/searxng/searxng/pull/6133#issuecomment-4534637069

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-25 17:05:08 +02:00
Markus Heiser
89b89a88fe [mod] engine: MyMemory Translated - typification and html to text (#6132)
The implementation is normalized, type annotations are applied, and the results
are freed from the HTML markup (which is partially present).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-25 16:38:06 +02:00
Bnyro
46071a011a [mod] qwant: remove web lite and improve request spoofing (#6127)
- https://lite.qwant.com seems to be dead.
- The request parameters were changed to match the ones from the Qwant website.
- Qwant is now set to inactive by default due to its strict rate-limits
2026-05-25 15:46:40 +02:00
Bnyro
b0d8af96bf [feat] engines: add flaticon icons engine (#6122) 2026-05-25 13:41:44 +02:00
Markus Heiser
dd27fce3b7 [unbload] drop meaningless field `number_of_results_xpath` from results (#6130)
In the result-list, the ``number_of_results`` indicate the number of hits in the
Index, they do not indicate how many results are in the answer.

In the past, search engines such as google or ddg had an indication on the first
page of a search term of how many hits there were for this term in total in
their index.

This info was added up in SearXNG and delivered under ``number_of_results``.
Nowadays the search engines no longer indicate how many hits there are in the
index and so this field in SearXNG is also superfluous.

- https://github.com/searxng/searxng/issues/2457#issuecomment-2566181574
- https://github.com/searxng/searxng/issues/2987
- https://github.com/searxng/searxng/issues/5034

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-25 12:43:02 +02:00
Markus Heiser
efc305b7f9 [mod] normalize variable name for the max number of results per request (#6131)
[mod] normalize variable name for the max number of results per request

In the past, we have used different names for the variable that specifies the
maximum number of hits in the outgoing request.

- ``page_size``
- ``number_of_results``
- ``nb_per_page``

Since *page_size* is the most accurate term and is also used in the XPath
engines, all other engines are adjusted accordingly within this
patch .. documentation adjusted accordingly.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-25 12:41:31 +02:00
Bnyro
323ce76004 [fix] startpage: all requests get blocked with CAPTCHA
Changes:
- Setting the "abp" query parameter causes instant blocks, it's no longer
used at Startpage
- The safesearch map changed for both the request form and the cookies. As
we were sending invalid values, that also made it easier to detect us
2026-05-23 09:43:17 +02:00
Bnyro
dfc2da707b [fix] mojeek: access denied because of wrong request parameters 2026-05-23 09:43:03 +02:00
Bnyro
fc90c5b09c [fix] yep: api path changed 2026-05-22 21:38:26 +02:00
dependabot[bot]
c57f772ad0 [upd] github-actions: Bump github/codeql-action from 4.35.4 to 4.35.5 (#6114)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.35.4 to 4.35.5.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](68bde559de...9e0d7b8d25)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.35.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-22 14:50:44 +02:00
dependabot[bot]
b8498d7891 [upd] github-actions: Bump docker/scout-action from 1.20.4 to 1.21.0 (#6112)
Bumps [docker/scout-action](https://github.com/docker/scout-action) from 1.20.4 to 1.21.0.
- [Release notes](https://github.com/docker/scout-action/releases)
- [Commits](bacf462e8d...cd72f264be)

---
updated-dependencies:
- dependency-name: docker/scout-action
  dependency-version: 1.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-22 14:50:31 +02:00
github-actions[bot]
d791a3906a [l10n] update translations from Weblate (#6116) 2026-05-22 14:29:10 +02:00
dependabot[bot]
295e0bffaf [upd] pypi: Bump the minor group with 3 updates (#6113)
Bumps the minor group with 3 updates: [certifi](https://github.com/certifi/python-certifi), [lxml](https://github.com/lxml/lxml) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `certifi` from 2026.4.22 to 2026.5.20
- [Commits](https://github.com/certifi/python-certifi/compare/2026.04.22...2026.05.20)

Updates `lxml` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-6.1.0...lxml-6.1.1)

Updates `basedpyright` from 1.39.4 to 1.39.5
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.39.4...v1.39.5)
2026-05-22 14:28:09 +02:00
Bnyro
b9340f50c2 [fix] preferences: opening preferences page is very slow (multiple seconds on bad hardware) (#6090)
I've been profiling the `/preferences` endpoint using werkzeug's
`ProfilerMiddleware` (i.e. just do `app.wsgi_app = ProfilerMiddleware(app.wsgi_app)`)
and look at the outputs in the terminal when doing `make run`.

It turns out that 95%+ of the time spent were inside babel's
Locale parsing (> 700ms on my machine). That's because, when opening the settings,
we loaded the full engine traits of each engine and checked if it matches
the user-defined search language. As we have 250+ engines, and babel is
very slow when parsing Locale's, this took a very long time.

By removing this feature that shows whether the selected search language
is supported by the engine, the load time went down from 800ms to 50ms
on my machine (which is still very slow, but well, that's future work on
optimizing).
2026-05-21 21:15:09 +02:00
Markus Heiser
d3deacc6d4 [mod] engine fyyd: typing added, no functional change (#6103)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-21 12:06:55 +02:00
Bnyro
d8f74af3d1 [mod] engine 500px: calc cursor instead of relying on pageInfo (#6091) 2026-05-21 07:31:13 +02:00
Bnyro
24b1a1b6a8 [feat] engines: add 500px.com engine (#6091) 2026-05-21 07:31:13 +02:00
Bnyro
d7e8b7cd18 [feat] engines: add cara.app engine (#6092) 2026-05-17 18:39:47 +02:00
Markus Heiser
f26e450778 [fix] engine: google-news - Google pushed a frontend update (#5984)
Around March 9 - 10, 2026, Google pushed a frontend update to Google News that
completely changed the HTML structure of search results.

This is a complete overhaul of the Google News engine.

- The real URL is encoded in the "jslog" attribute.
  @SeriousConcept1134: the attribute is a base64 encoded JSON
- CEID list is updated
- The typification was pushed forward

Related:

- https://github.com/searxng/searxng/issues/5852#issuecomment-4254438184
- https://github.com/searxng/searxng/issues/5852#issuecomment-4265598833

Closes: https://github.com/searxng/searxng/issues/5852
Suggested-by: SeriousConcept1134

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-17 15:27:00 +02:00
Bnyro
dce3bb69bb [chore] settings.yml: set broken engines yahoo and karmasearch to inactive 2026-05-16 16:04:36 +02:00
Bnyro
de49d27846 [fix] yandex images: crashes when parsing images without fallback source (#6084) 2026-05-16 15:53:23 +02:00
Bnyro
16a7537bfd [chore] engines: remove ask.com (service was discontinued) (#6083)
Source: https://www.ask.com/
2026-05-16 15:36:47 +02:00
Markus Heiser
afafca93f3 [fix] engine wikidata - fails to initialize with HTTP 403 (#6081)
In order not to be further blocked, the WIKIDATA_PROPERTIES are cached, which
drastically reduces the WD-SQL request.

BTW: improve type hints

Closes: https://github.com/searxng/searxng/issues/6051

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-15 16:21:47 +02:00
dependabot[bot]
240f403d93 [upd] web-client (simple): Bump the minor group (#6080)
Bumps the minor group in /client/simple with 4 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [stylelint](https://github.com/stylelint/stylelint) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).

Updates `@biomejs/biome` from 2.4.14 to 2.4.15
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.15/packages/@biomejs/biome)

Updates `@types/node` from 25.6.2 to 25.8.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `stylelint` from 17.11.0 to 17.11.1
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.11.0...17.11.1)

Updates `vite` from 8.0.11 to 8.0.13
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.13/packages/vite)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.8.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 17.11.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite
  dependency-version: 8.0.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-15 14:19:28 +02:00
dependabot[bot]
9b30ae005b [upd] pypi: Bump the minor group with 2 updates (#6079)
Bumps the minor group with 2 updates: [selenium](https://github.com/SeleniumHQ/Selenium) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `selenium` from 4.43.0 to 4.44.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.43.0...selenium-4.44.0)

Updates `basedpyright` from 1.39.3 to 1.39.4
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.39.3...v1.39.4)

---
updated-dependencies:
- dependency-name: selenium
  dependency-version: 4.44.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.39.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
2026-05-15 11:12:57 +02:00
Arnaud Jeannin
790683bbd7 [fix] google: improve CAPTCHA detection (#5922)
- Detect HTTP 302 responses (Google redirecting to /sorry/index
  without the HTTP client following the redirect)
- Detect short HTML responses (<2000 bytes) containing "/sorry/"
  links (meta-refresh or JS redirect variants)

Instances with rotating IPs can set the `suspended_times.SearxEngineCaptcha` to
0 in the search settings [1], the next request will typically use a different
outgoing IP when rotating proxies are configured

[1] https://docs.searxng.org/admin/settings/settings_search.html
2026-05-15 09:25:13 +02:00
Bnyro
52b446b4ad [make] update searx.data.traits (#6075) 2026-05-15 08:37:11 +02:00
Bnyro
6cee4b8947 [feat] yep: add support for selecting search language (#6075) 2026-05-15 08:37:11 +02:00
Markus Heiser
8e5aa9d394 [doc] Development Quickstart: documentation of the tools (dev.env)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-13 13:55:50 +02:00
Markus Heiser
cf4d7e31c4 [mod] update_engine_traits.py: improve type annotations
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-13 13:55:50 +02:00
Markus Heiser
471f2b205f [feat] update_engine_traits.py: add option to update engines selective
Previously, `update_engine_traits.py` would fetch traits for all engines, which
is very slow and by side-effect touches engine data that are unrelated to the
engine you're currently working on.

To be faster with developing `update_engine_traits.py` supports now engine
arguments.

To test, jump into the developer environment and run the script::

    $ ./manage dev.env
    (dev.env)$ ./searxng_extra/update/update_engine_traits.py --help

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-13 13:55:50 +02:00
Markus Heiser
09829b1ccc [fix] installation instructions - launch SearXNG by python -m (#6078)
[1] https://github.com/searxng/searxng/issues/126#issuecomment-4433874986

Suggested-by: @virtadpt in [1]
2026-05-13 11:34:31 +02:00
dependabot[bot]
df1f24fb7f [upd] web-client (simple): Bump the minor group (#6056)
Bumps the minor group in /client/simple with 4 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [stylelint](https://github.com/stylelint/stylelint) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).

Updates `@biomejs/biome` from 2.4.13 to 2.4.14
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.14/packages/@biomejs/biome)

Updates `@types/node` from 25.6.0 to 25.6.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `stylelint` from 17.9.1 to 17.11.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.9.1...17.11.0)

Updates `vite` from 8.0.10 to 8.0.11
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.11/packages/vite)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 17.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: vite
  dependency-version: 8.0.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-10 15:34:19 +02:00
dependabot[bot]
0cba32c15f [upd] pypi: Bump markdown-it-py from 4.0.0 to 4.2.0 in the minor group (#6054)
Bumps the minor group with 1 update: [markdown-it-py](https://github.com/executablebooks/markdown-it-py).


Updates `markdown-it-py` from 4.0.0 to 4.2.0
- [Release notes](https://github.com/executablebooks/markdown-it-py/releases)
- [Changelog](https://github.com/executablebooks/markdown-it-py/blob/master/CHANGELOG.md)
- [Commits](https://github.com/executablebooks/markdown-it-py/compare/v4.0.0...v4.2.0)

---
updated-dependencies:
- dependency-name: markdown-it-py
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
2026-05-09 08:43:28 +02:00
Tommaso Colella
849e17e431 [fix] 360search: improve empty results set management and increase engine timeout (#6058) 2026-05-09 08:35:21 +02:00
github-actions[bot]
d8ab61a9e0 [l10n] update translations from Weblate (#6057)
94e9ade46 - 2026-05-04 - Aindriú Mac Giolla Eoin <aindriu80@noreply.codeberg.org>
883cac081 - 2026-04-30 - alexgabi <alexgabi@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-05-08 14:27:49 +02:00
dependabot[bot]
7eb130b1a8 [upd] github-actions: Bump github/codeql-action from 4.35.2 to 4.35.4 (#6055)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.35.2 to 4.35.4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](95e58e9a2c...68bde559de)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.35.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-08 14:25:27 +02:00
Bnyro
ef6290c8cd [furo] add some project links to the online documentation (#3408)
- add button for editing docs source on GitHub
- add links to GitHub repository and public instances (searx.space)

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-07 16:19:28 +02:00
Markus Heiser
89aa588b27 [furo] customize CSS - code.literal nowrap & improve large table layout (#3408)
The readability can be improve with the following two changes:

Slightly increase the content width to make the engine list more readable::

    .content {
      width: 52em;    /*  instead of 46em */
    }

To avoid word wrap in bang::

    p code.literal {
      text-wrap: nowrap;
    }

Sugested-by: https://github.com/searxng/searxng/pull/3408#issuecomment-2094082144
2026-05-07 16:19:28 +02:00
Markus Heiser
50626ef150 [furo] remove .. contents:: directives (#3408)
The directive creates a table of contents for the page.  However, Furo includes
a table of contents already in the sidebar.  It is, thus, recommended to
removing the `.. contents::` directive.

[1] https://github.com/pradyunsg/furo/issues/88#issuecomment-803297274

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-07 16:19:28 +02:00
Markus Heiser
2f72fc4df2 [docs] switch sphinx theme from pallets to furo (#3408)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-07 16:19:28 +02:00
Markus Heiser
130cea600d [fix] Startpage engine fails when date field is string (not integer: TypeError) (#6053)
In order to avoid an abort with an error, type- and value- errors are catched,
the publishDate cannot then be determined, but the result item remains.

[1] https://github.com/searxng/searxng/pull/5980/changes#r3091479655

Replaces the PRs:

- https://github.com/searxng/searxng/pull/5980
- https://github.com/searxng/searxng/pull/6006

Closes: https://github.com/searxng/searxng/issues/5979

Suggested-by: @Bnyro [1]

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-07 14:56:14 +02:00
Markus Heiser
ea63c19b27 [doc] add "SearXNG BM25 Reranker" to the list of external plugins (#6052)
[1] https://github.com/searxng/searxng/issues/6039#issuecomment-4370220040

Suggested-by: @Oaklight [1]
2026-05-07 13:11:37 +02:00
Bnyro
a9909c4977 [fix] karmasearch: videos engine in wrong category 2026-05-06 22:23:09 +02:00
Fabian Freund
a480560371 [fix] wikidata: crashes when querying due to missing escaping of quotation marks 2026-05-06 21:13:27 +02:00
Bnyro
330d56bba9 [mod] result templates: move iframe to macro and fix page rendering for non-YouTube links (#5960)
This PR moves the `iframe` logic into a macro, so that `videos.html` and `general.html` both can benefit from the workaround to fix YouTube results by @return42 in https://github.com/searxng/searxng/pull/5858

It also fixes that only YouTube videos contained the closing `>` after `<iframe border="0" ...`, the regression has been caused by https://github.com/searxng/searxng/pull/5858

## Why is this change important?

Currently, the page breaks if there's any non-YouTube Iframe

Here, the page ends in the middle of the results and the footer and page number selector are not visible.
2026-05-06 09:29:20 +02:00
Markus Heiser
36bcd6b551 [fix] engine: wikidata - improvement of typing (#5993)
The type checker in my IDE shut down after over 500 errors / after this
patch there are still 125 criticisms, however its an improvement and a better
starting point.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-06 08:39:55 +02:00
Markus Heiser
8fabaf86b6 [fix] engine: wikidata - initialization fails with KeyError (#5993)
The response to QUERY_PROPERTY_NAMES has changed; fields without the `name`
field are now also returned.

Closes: https://github.com/searxng/searxng/issues/5982

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-06 08:39:55 +02:00
Bnyro
d501b0420a [mod] yep: fix engine due to new API layout (#6048)
Apparently, YEP no longer supports images and news search.

Also, the naming of the query parameters changed a bit.

Closes: https://github.com/searxng/searxng/issues/6047
2026-05-06 08:17:19 +02:00
Sai Asish Y
0ac5254b8e [fix] mwmbl: crash if there's no result description available 2026-05-05 21:40:20 +02:00
dependabot[bot]
d3566fe8a8 [upd] pypi: Bump wlc from 1.17.2 to 2.0.0 (#6011)
Bumps [wlc](https://github.com/WeblateOrg/wlc) from 1.17.2 to 2.0.0.
- [Release notes](https://github.com/WeblateOrg/wlc/releases)
- [Changelog](https://github.com/WeblateOrg/wlc/blob/main/CHANGES.rst)
- [Commits](https://github.com/WeblateOrg/wlc/compare/1.17.2...2.0.0)

---
updated-dependencies:
- dependency-name: wlc
  dependency-version: 2.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...
2026-05-05 10:04:14 +02:00
Markus Heiser
93fe8cac1e [doc] fix issues reported since Sphinx v9.1.0
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-05 09:57:42 +02:00
Markus Heiser
12b7fd341c [upd] pypi: Update docutils (0.22.4) and Sphinx (9.1.0)
Sphinx 9.1.0 dropped Python 3.11 support [1].

[1] https://www.sphinx-doc.org/en/master/changes/index.html#release-9-1-0-released-dec-31-2025

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-05-05 09:57:42 +02:00
dependabot[bot]
aefc3c3166 [upd] web-client (simple): Bump the minor group (#6041)
Bumps the minor group in /client/simple with 2 updates: [stylelint](https://github.com/stylelint/stylelint) and [vite-bundle-analyzer](https://github.com/nonzzz/vite-bundle-analyzer).


Updates `stylelint` from 17.9.0 to 17.9.1
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.9.0...17.9.1)

Updates `vite-bundle-analyzer` from 1.3.7 to 1.3.8
- [Release notes](https://github.com/nonzzz/vite-bundle-analyzer/releases)
- [Changelog](https://github.com/nonzzz/vite-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nonzzz/vite-bundle-analyzer/compare/v1.3.7...v1.3.8)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 17.9.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite-bundle-analyzer
  dependency-version: 1.3.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-02 22:59:57 +02:00
dependabot[bot]
cd75013c92 [upd] pypi: Bump typer from 0.25.0 to 0.25.1 in the minor group (#6040)
Bumps the minor group with 1 update: [typer](https://github.com/fastapi/typer).


Updates `typer` from 0.25.0 to 0.25.1
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.25.0...0.25.1)

---
updated-dependencies:
- dependency-name: typer
  dependency-version: 0.25.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
2026-05-02 06:12:35 +02:00
dependabot[bot]
cba0cffa8f [upd] pypi: Bump the minor group across 1 directory with 4 updates (#6037)
Bumps the minor group with 4 updates in the / directory: [certifi](https://github.com/certifi/python-certifi), [typer](https://github.com/fastapi/typer), [granian](https://github.com/emmett-framework/granian) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `certifi` from 2026.2.25 to 2026.4.22
- [Commits](https://github.com/certifi/python-certifi/compare/2026.02.25...2026.04.22)

Updates `typer` from 0.24.1 to 0.25.0
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.24.1...0.25.0)

Updates `granian` from 2.7.3 to 2.7.4
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.3...v2.7.4)

Updates `basedpyright` from 1.39.2 to 1.39.3
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.39.2...v1.39.3)
2026-04-29 07:32:28 +02:00
Markus Heiser
f96ac331ed [upd] pypi: Bump lxml from 6.0.4 to 6.1.0 (#6036)
Release 6.1.0 fixes a possible external entity injection (XXE) vulnerability in
``iterparse()`` and the ``ETCompatXMLParser``.

64ed06c1a0/CHANGES.txt (L42-L66)

- Closes https://github.com/searxng/searxng/issues/6025

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-04-29 07:11:13 +02:00
github-actions[bot]
616d6f4818 [data] update searx.data - update_ahmia_blacklist.py (#6026) 2026-04-29 06:49:10 +02:00
github-actions[bot]
6fbb24b32d [data] update searx.data - update_external_bangs.py (#6027) 2026-04-29 06:48:22 +02:00
github-actions[bot]
3674d915f5 [data] update searx.data - update_gsa_useragents.py (#6028) 2026-04-29 06:47:48 +02:00
github-actions[bot]
d4254d5e8f [data] update searx.data - update_firefox_version.py (#6030) 2026-04-29 06:46:59 +02:00
github-actions[bot]
9a394b41ee [data] update searx.data - update_wikidata_units.py (#6029) 2026-04-29 06:46:29 +02:00
github-actions[bot]
9240b38d8a [data] update searx.data - update_currencies.py (#6031) 2026-04-29 06:29:56 +02:00
github-actions[bot]
3880960471 [data] update searx.data - update_engine_descriptions.py (#6033) 2026-04-29 06:28:55 +02:00
github-actions[bot]
494a7575d3 [data] update searx.data - update_engine_traits.py (#6032)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-04-29 06:27:30 +02:00
Fabian Freund
ed5955a5c7 [fix] Result.defaults_from() inverted logic (#6019)
The bug was introduced in commit 8769b7c6d (typification of result items); this
patch fixes the bug and also addresses the peculiarity that fields can be set
but contain no *usable* value:

If a field is set (exists) but contains an empty string or the value ``None``,
it is also considered *not set*. This also ensures that an integer 0 is
evaluated *as set*!

Co-Authored: Markus Heiser <markus.heiser@darmarit.de>
2026-04-28 17:42:29 +02:00
github-actions[bot]
a7ac696b4a [l10n] update translations from Weblate (#6015)
54de6653b - 2026-04-15 - AndersNordh <andersnordh@noreply.codeberg.org>
e410bed58 - 2026-04-15 - AndersNordh <andersnordh@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-04-24 15:08:49 +02:00
dependabot[bot]
9504772f38 [upd] web-client (simple): Bump the minor group (#6013)
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [stylelint](https://github.com/stylelint/stylelint) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).

Updates `@biomejs/biome` from 2.4.12 to 2.4.13
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.13/packages/@biomejs/biome)

Updates `stylelint` from 17.8.0 to 17.9.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.8.0...17.9.0)

Updates `vite` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.10/packages/vite)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 17.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: vite
  dependency-version: 8.0.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-24 14:45:12 +02:00
dependabot[bot]
1e74a92419 [upd] github-actions: Bump actions/setup-node from 6.3.0 to 6.4.0 (#6009)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.3.0 to 6.4.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](53b83947a5...48b55a011b)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-24 14:29:44 +02:00
Bnyro
74f1ca203f [fix] gmx: crash when there are no related query suggestions 2026-04-22 09:56:52 +02:00
dependabot[bot]
e8299a4c37 [upd] web-client (simple): Bump the minor group across 1 directory with 7 updates (#5989)
Bumps the minor group with 7 updates in the /client/simple directory:

| Package | From | To |
| --- | --- | --- |
| [ol](https://github.com/openlayers/openlayers) | `10.8.0` | `10.9.0` |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.4.10` | `2.4.12` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.5.2` | `25.6.0` |
| [mathjs](https://github.com/josdejong/mathjs) | `15.1.1` | `15.2.0` |
| [stylelint](https://github.com/stylelint/stylelint) | `17.6.0` | `17.8.0` |
| [typescript](https://github.com/microsoft/TypeScript) | `6.0.2` | `6.0.3` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.0.5` | `8.0.8` |

Updates `ol` from 10.8.0 to 10.9.0
- [Release notes](https://github.com/openlayers/openlayers/releases)
- [Commits](https://github.com/openlayers/openlayers/compare/v10.8.0...v10.9.0)

Updates `@biomejs/biome` from 2.4.10 to 2.4.12
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.12/packages/@biomejs/biome)

Updates `@types/node` from 25.5.2 to 25.6.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `mathjs` from 15.1.1 to 15.2.0
- [Changelog](https://github.com/josdejong/mathjs/blob/develop/HISTORY.md)
- [Commits](https://github.com/josdejong/mathjs/compare/v15.1.1...v15.2.0)

Updates `stylelint` from 17.6.0 to 17.8.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.6.0...17.8.0)

Updates `typescript` from 6.0.2 to 6.0.3
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/compare/v6.0.2...v6.0.3)

Updates `vite` from 8.0.5 to 8.0.8
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.8/packages/vite)

---
updated-dependencies:
- dependency-name: ol
  dependency-version: 10.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: mathjs
  dependency-version: 15.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 17.8.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: typescript
  dependency-version: 6.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite
  dependency-version: 8.0.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-17 14:54:48 +02:00
dependabot[bot]
4c16b247d4 [upd] pypi: Bump the minor group with 3 updates (#5988)
Bumps the minor group with 3 updates: [lxml](https://github.com/lxml/lxml), [msgspec](https://github.com/jcrist/msgspec) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `lxml` from 6.0.3 to 6.0.4
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-6.0.3...lxml-6.0.4)

Updates `msgspec` from 0.21.0 to 0.21.1
- [Release notes](https://github.com/jcrist/msgspec/releases)
- [Changelog](https://github.com/jcrist/msgspec/blob/main/docs/changelog.md)
- [Commits](https://github.com/jcrist/msgspec/compare/0.21.0...0.21.1)

Updates `basedpyright` from 1.39.0 to 1.39.2
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.39.0...v1.39.2)
2026-04-17 14:31:40 +02:00
dependabot[bot]
871ed47f89 [upd] github-actions: Bump peter-evans/create-pull-request (#5987)
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 8.1.0 to 8.1.1.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](c0f553fe54...5f6978faf0)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-17 14:27:38 +02:00
dependabot[bot]
fc1e1e9c3e [upd] github-actions: Bump github/codeql-action from 4.35.1 to 4.35.2 (#5986)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.35.1 to 4.35.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](c10b8064de...95e58e9a2c)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.35.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-17 14:27:18 +02:00
dependabot[bot]
aad1ab5e56 [upd] github-actions: Bump actions/cache from 5.0.4 to 5.0.5 (#5985)
Bumps [actions/cache](https://github.com/actions/cache) from 5.0.4 to 5.0.5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](668228422a...27d5ce7f10)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-17 14:23:38 +02:00
Bnyro
8579974f5e [feat] engines: add GMX search engine (#5967)
Notes:
- Safesearch doesn't seem to work properly?
- In theory multiple languages are supported, but even in the web UI, they don't work properly
- Possibly, we could cache the request hashes (h query parameter), I'm not sure if it ever changes
2026-04-17 07:00:21 +02:00
Markus Heiser
ae0b0e56ac [mod] revision of the PR template
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-04-16 15:28:46 +02:00
Markus Heiser
4f9c80160f [mod] revision of the issue templates
BTW blank issues are now longer allowed.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-04-16 15:28:46 +02:00
Markus Heiser
ee66b070a9 [mod] aol engines: disable by default (#5975)
The AOL engines deliver no results or too many incorrect results; in #5972 it is
reported that the AOL-images do not work, and on AOL-web the language selection
seems to depend more on the IP than on the selected language / Locally, the
language selection works for me, on the public server only English results are
displayed, which significantly worsens the result list.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-04-13 11:04:11 +02:00
Markus Heiser
9e08a6771f [mod] GH workflow "update translations from Weblate" (area:i18n) (#5968)
Rename label of the Weblate updates (PR) from `translation` to `area:i18n`.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-04-11 11:48:45 +02:00
Bnyro
919aeae42a [mod] pexels: add default api key as fallback 2026-04-11 10:40:39 +02:00
Bnyro
20fc6fe80d [fix] pexels: circumvent botdetection by passing referer header
As a side effect, Cloudscraper is no longer needed.
It probably only ever worked by setting the correct request headers,
so we don't really need it since we can just set the right request
headers and ciphersuites ourselves.
2026-04-11 10:40:39 +02:00
Bnyro
fb68010f72 [fix] tagesschau: parse error when there's no first sentence (#5959)
Example:

```json
{
    "sophoraId" : "rbb-von-24-trockentoiletten-in-berliner-parks-bleiben-acht-im-betrieb-102",
    "externalId" : "tagesschau_fm-story-rbb_park-toilette-klimafreundlich",
    "title" : "Von 24 Trockentoiletten in Berliner Parks bleiben acht im Betrieb",
    "date" : "2026-04-09T19:16:51.000+02:00",
    "teaserImage" : {
      "title" : "402109255",
      "copyright" : "dpa/Paul Zinken",
      "alttext" : "\"Toilette\" steht auf dem Schild an einer neuen Parktoilette in einem Park in Berlin. (Quelle: dpa/Paul Zinken)",
      "imageVariants" : {
        "1x1-144" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStQvU/1x1-144.jpg",
        "1x1-256" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStSJ8/1x1-256.jpg",
        "1x1-432" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStTkw/1x1-432.jpg",
        "1x1-640" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStU_E/1x1-640.jpg",
        "1x1-840" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStWZo/1x1-840.jpg",
        "16x9-256" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvh0M/16x9-256.jpg",
        "16x9-384" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvjXw/16x9-384.jpg",
        "16x9-512" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvlIQ/16x9-512.jpg",
        "16x9-640" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvmjA/16x9-640.jpg",
        "16x9-960" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvpk8/16x9-960.jpg",
        "16x9-1280" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSveow/16x9-1280.jpg",
        "16x9-1920" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvgNE/16x9-1920.jpg"
      },
      "type" : "image"
    },
    "tags" : [ {
      "tag" : "rbb"
    }, {
      "tag" : "Berlin"
    } ],
    "updateCheckUrl" : "https://www.tagesschau.de/api2u/rbb-von-24-trockentoiletten-in-berliner-parks-bleiben-acht-im-betrieb-102.json?view=hasChanged&lastKnown=C168EFEC89F7D1C16BC08D8E641A0503",
    "content" : [ {
      "value" : "Von 24 kostenlosen Trockentoiletten in Berliner Parks sind 16 Anlagen im März wieder abgebaut worden. Acht Toiletten werden nach Auskunft der Senatsverwaltung für Klimaschutz und Umwelt weiterbetrieben.",
      "type" : "text"
    }, {
      "value" : "Die Toiletten waren laut den Angaben der Senatsverwaltung Teil eines Pilotprojekts. Es startete im März 2023 und war zunächst als einjähriger Test angelegt. Für den Fall einer positiven Nutzung und eines reibungslosen Betriebs wurden vertraglich zwei Verlängerungsoptionen von jeweils einem weiteren Jahr vorgesehen. Diese Optionen seien in Anspruch genommen worden und nun ausgeschöpft.",
      "type" : "text"
    }, {
      "value" : "<h2>Nutzer waren zufrieden</h2>",
      "type" : "headline"
    }, {
      "value" : "Dabei waren die Nutzerinnen und Nutzer offensichtlich recht zufrieden mit den Klos, wie aus Befragungsdaten der Senatsverwaltung hervorgeht. Die Befragten bewerteten die Toiletten weitgehend als attraktiv. Auch die Sauberkeit und der Geruch wurden überwiegend positiv bewertet. [<a href=\"https://www.berlin.de/sen/uvk/mobilitaet-und-verkehr/infrastruktur/oeffentliche-toiletten/klimafreundliche-parktoiletten/\" type=\"extern\">berlin.de</a>]",
      "type" : "text"
    }, {
      "box" : {
        "text" : "<ul><br/><li>Lichtenberg: Naturerfahrungsraum Herzberge (neuer Standort)</li><br/><li>Mitte: Kulturforum (neuer Standort)</li><br/><li>Steglitz-Zehlendorf: Stadtpark Steglitz und Spielplatz am Lauenburger Platz</li><br/><li>Tempelhof-Schöneberg: Cheruskerpark und Heinrich-Lassen-Park</li><br/><li>Friedrichshain-Kreuzberg: Engelwiese Alt-Stralau</li><br/><li>Treptow-Köpenick: Wuhlheide an der Treskowallee</li><br/></ul>",
        "title" : "Diese Trockentoiletten werden weiterbetrieben",
        "infobox" : false
      },
      "type" : "box"
    }, {
      "value" : "<h2>Neues Vergabeverfahren für Parktoiletten</h2>",
      "type" : "headline"
    }, {
      "value" : "Im Anschluss an das Pilotprojekt sei geplant, im Rahmen eines Vergabeverfahrens neue Parktoiletten zu beschaffen, teilte ein Sprecher der Senatsverwaltung rbb|24 mit. Wie genau diese Anlagen aussehen sollen, wurde nicht gesagt. Die Versorgung solle aber durch \"modernere Anlagen mit höheren Kapazitäten und einer besseren Barrierefreiheit\" verbessert werden.<br /> <br />Das Vergabeverfahren wird den Angaben zufolge derzeit vorbereitet, sodass die ersten neuen Anlagen möglichst ab 2027 errichtet werden können.",
      "type" : "text"
    }, {
      "value" : "Sendung: rbb|24, 09.04.2026, 19:16 Uhr<br /> <br />Video: rbb|24, 09.04.2026, Johanna Steinlen",
      "type" : "text"
    } ],
    "tracking" : [ {
      "sid" : "app.inland.regional.berlin.rbb-von-24-trockentoiletten-in-berliner-parks-bleiben-acht-im-betrieb-102",
      "src" : "rbb",
      "ctp" : "nicht-definiert",
      "pdt" : "20260409T1920",
      "otp" : "meldung",
      "cid" : "rbb-von-24-trockentoiletten-in-berliner-parks-bleiben-acht-im-betrieb-102",
      "pti" : "Von_24_Trockentoiletten_in_Berliner_Parks_bleiben_acht_im_Betrieb",
      "bcr" : "nein",
      "type" : "generic",
      "av_full_show" : false
    } ],
    "topline" : "Berlin",
    "images" : [ {
      "title" : "402109255",
      "copyright" : "dpa/Paul Zinken",
      "alttext" : "\"Toilette\" steht auf dem Schild an einer neuen Parktoilette in einem Park in Berlin. (Quelle: dpa/Paul Zinken)",
      "imageVariants" : {
        "1x1-144" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStQvU/1x1-144.jpg",
        "1x1-256" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStSJ8/1x1-256.jpg",
        "1x1-432" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStTkw/1x1-432.jpg",
        "1x1-640" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStU_E/1x1-640.jpg",
        "1x1-840" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSStWZo/1x1-840.jpg",
        "16x9-256" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvh0M/16x9-256.jpg",
        "16x9-384" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvjXw/16x9-384.jpg",
        "16x9-512" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvlIQ/16x9-512.jpg",
        "16x9-640" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvmjA/16x9-640.jpg",
        "16x9-960" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvpk8/16x9-960.jpg",
        "16x9-1280" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSveow/16x9-1280.jpg",
        "16x9-1920" : "https://images.tagesschau.de/image/5dad7c26-72b0-4c5c-9758-cf3e351d86ac/AAABnXNCEmI/AAABnSSvgNE/16x9-1920.jpg"
      },
      "type" : "image"
    } ],
    "brandingImage" : {
      "title" : "Logo Rundfunk Berlin-Brandenburg",
      "copyright" : "rbb24",
      "alttext" : "Logo Rundfunk Berlin-Brandenburg",
      "imageVariants" : {
        "original" : "https://images.tagesschau.de/image/e03b1ea1-c03d-4d50-bfb2-41c40808e93a/AAABlaqAiSQ/AAABnR8VW9w/original.png"
      },
      "type" : "image"
    },
    "details" : "https://www.tagesschau.de/api2u/inland/regional/berlin/rbb-von-24-trockentoiletten-in-berliner-parks-bleiben-acht-im-betrieb-102.json",
    "detailsweb" : "https://www.tagesschau.de/inland/regional/berlin/rbb-von-24-trockentoiletten-in-berliner-parks-bleiben-acht-im-betrieb-102.html",
    "shareURL" : "https://www.rbb24.de/panorama/beitrag/2026/04/park-toilette-klimafreundlich.html",
    "geotags" : [ ],
    "regionId" : 3,
    "regionIds" : [ 3 ],
    "breakingNews" : false,
    "type" : "story"
  }
```
2026-04-11 09:34:22 +02:00
dependabot[bot]
e90c036ed6 [upd] pypi: Bump the minor group with 4 updates (#5965)
Bumps the minor group with 4 updates: [lxml](https://github.com/lxml/lxml), [msgspec](https://github.com/jcrist/msgspec), [granian](https://github.com/emmett-framework/granian) and [selenium](https://github.com/SeleniumHQ/Selenium).


Updates `lxml` from 6.0.2 to 6.0.3
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-6.0.2...lxml-6.0.3)

Updates `msgspec` from 0.20.0 to 0.21.0
- [Release notes](https://github.com/jcrist/msgspec/releases)
- [Changelog](https://github.com/jcrist/msgspec/blob/main/docs/changelog.md)
- [Commits](https://github.com/jcrist/msgspec/compare/0.20.0...0.21.0)

Updates `granian` from 2.7.2 to 2.7.3
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.2...v2.7.3)

Updates `selenium` from 4.41.0 to 4.43.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.41.0...selenium-4.43.0)
2026-04-11 09:31:46 +02:00
github-actions[bot]
e094ed3976 [l10n] update translations from Weblate (#5966)
02aad3f5a - 2026-04-08 - AndersNordh <andersnordh@noreply.codeberg.org>
29686752b - 2026-04-05 - JanDziaslo <jandziaslo@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-04-11 09:01:18 +02:00
dependabot[bot]
7737a0da1a [upd] github-actions: Bump docker/scout-action from 1.20.3 to 1.20.4 (#5963)
Bumps [docker/scout-action](https://github.com/docker/scout-action) from 1.20.3 to 1.20.4.
- [Release notes](https://github.com/docker/scout-action/releases)
- [Commits](8910519cee...bacf462e8d)

---
updated-dependencies:
- dependency-name: docker/scout-action
  dependency-version: 1.20.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-10 16:02:22 +02:00
Esen
67af4894d4 [fix] google: switch to using "Google Go App" (NSTNWV) useragent 2026-04-10 10:09:02 +02:00
Ivan Gabaldon
08ef7a63d7 [enh] engine: rework lingva
lingva.thedaviddelta.com instance is dead, use lingva.ml
2026-04-07 15:49:46 +02:00
dependabot[bot]
346a467077 [upd] web-client (simple): Bump the minor group (#5946)
Bumps the minor group in /client/simple with 2 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) and [browserslist](https://github.com/browserslist/browserslist).

Updates `@biomejs/biome` from 2.4.9 to 2.4.10
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.10/packages/@biomejs/biome)

Updates `browserslist` from 4.28.1 to 4.28.2
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.28.1...4.28.2)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.28.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-07 08:19:56 +02:00
Markus Heiser
e12b722ddc [upd] pygments dependency - make themes.all (#5947)
PR #5947 upgraded the pygments dependency, this commit updates
the static files ::

    $ make themes.all

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-04-06 07:35:43 +02:00
dependabot[bot]
24948350f6 [upd] pypi: Bump the minor group with 2 updates (#5947)
Bumps the minor group with 2 updates: [pygments](https://github.com/pygments/pygments) and [basedpyright](https://github.com/detachhead/basedpyright).

Updates `pygments` from 2.19.2 to 2.20.0
- [Release notes](https://github.com/pygments/pygments/releases)
- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)
- [Commits](https://github.com/pygments/pygments/compare/2.19.2...2.20.0)

Updates `basedpyright` from 1.38.4 to 1.39.0
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.38.4...v1.39.0)
2026-04-06 07:35:43 +02:00
Aadniz
474b0a55b0 [fix] karmasearch engine: setting Referer header to bypass bot detection (#5953) 2026-04-05 03:59:39 +02:00
Ivan Gabaldon
69f04d59dc [fix] docs: container compose typo (#5952) 2026-04-04 21:57:32 +02:00
Markus Heiser
7adace694c [doc] add missing packages required for installation (#5951)
Related:

- https://github.com/searxng/searxng/pull/5763
- https://github.com/searxng/searxng/pull/5765
- https://github.com/searxng/searxng/pull/5346

Closes: https://github.com/searxng/searxng/issues/5937

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-04-04 19:02:44 +02:00
Nicolas Dato
e92f6b70a0 [mod] duckduckgo: restore Sec-Fetch-* headers to prevent rate limits 2026-04-04 17:44:35 +02:00
github-actions[bot]
c980fa1efc [l10n] update translations from Weblate (#5948)
81ade0dcf - 2026-03-31 - Linerly <linerly@noreply.codeberg.org>
6d96e9916 - 2026-03-30 - danilo-jlle <danilo-jlle@noreply.codeberg.org>
f2a7ef464 - 2026-03-29 - Maoyue_OUO <maoyue_ouo@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-04-03 23:02:03 +02:00
dependabot[bot]
53141be387 [upd] github-actions: Bump github/codeql-action from 4.34.1 to 4.35.1 (#5945)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.34.1 to 4.35.1.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](3869755554...c10b8064de)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.35.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-03 09:42:21 +02:00
dependabot[bot]
953933d472 [upd] github-actions: Bump docker/login-action from 4.0.0 to 4.1.0 (#5944)
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](b45d80f862...4907a6ddec)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-03 09:41:08 +02:00
Robert Clabough
bab3879cba [fix] tubearchivist engine: add trailing slash to API URL 2026-04-01 21:19:14 +02:00
github-actions[bot]
7ac4ff39fe [data] update searx.data - update_firefox_version.py (#5924)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-29 08:32:52 +02:00
github-actions[bot]
ea6f491c93 [data] update searx.data - update_external_bangs.py (#5925)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-29 08:32:26 +02:00
github-actions[bot]
5ecf7515dc [data] update searx.data - update_gsa_useragents.py (#5926)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-29 08:31:52 +02:00
github-actions[bot]
c8208fa8bb [data] update searx.data - update_ahmia_blacklist.py (#5927)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-29 08:05:41 +02:00
github-actions[bot]
40e5ba9fdc [data] update searx.data - update_currencies.py (#5930)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-29 08:04:15 +02:00
dependabot[bot]
cf5389afd4 [upd] web-client (simple): Bump the minor group (#5915)
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [stylelint](https://github.com/stylelint/stylelint) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).

Updates `@biomejs/biome` from 2.4.8 to 2.4.9
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.9/packages/@biomejs/biome)

Updates `stylelint` from 17.5.0 to 17.6.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.5.0...17.6.0)

Updates `vite` from 8.0.2 to 8.0.3
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@8.0.3/packages/vite)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 17.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: vite
  dependency-version: 8.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-28 18:12:01 +01:00
github-actions[bot]
ae51c349fd [l10n] update translations from Weblate (#5917)
b17f6ca00 - 2026-03-26 - bittin <bittin@noreply.codeberg.org>
e43bc66a4 - 2026-03-26 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
41cb62330 - 2026-03-26 - gallegonovato <gallegonovato@noreply.codeberg.org>
48308f385 - 2026-03-25 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
a91644d65 - 2026-03-25 - Stephan-P <stephan-p@noreply.codeberg.org>
af44a9e71 - 2026-03-25 - kratos <makesocialfoss32@keemail.me>
f5be3ecd0 - 2026-03-25 - ghose <ghose@noreply.codeberg.org>
7e4a2e0a5 - 2026-03-25 - return42 <return42@noreply.codeberg.org>
6768f2fbc - 2026-03-25 - Fjuro <fjuro@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-28 18:11:02 +01:00
Ivan Gabaldon
6b9856d643 [mod] container: rework compose (#5906)
* [mod] container: rework compose

See https://docs.searxng.org/admin/installation-docker.html#migrate-from-searxng-docker

* [mod] container: apply suggestions

https://github.com/searxng/searxng/pull/5906#discussion_r3004917087
https://github.com/searxng/searxng/pull/5906#discussion_r3004917090
https://github.com/searxng/searxng/pull/5906#discussion_r3004917084
2026-03-28 16:45:06 +01:00
dependabot[bot]
e58516daf5 [upd] pypi: Bump basedpyright from 1.38.3 to 1.38.4 in the minor group (#5916)
Bumps the minor group with 1 update: [basedpyright](https://github.com/detachhead/basedpyright).


Updates `basedpyright` from 1.38.3 to 1.38.4
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.38.3...v1.38.4)

---
updated-dependencies:
- dependency-name: basedpyright
  dependency-version: 1.38.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-28 07:46:23 +01:00
dependabot[bot]
265858ee2b [upd] github-actions: Bump docker/scout-action from 1.20.2 to 1.20.3 (#5913)
Bumps [docker/scout-action](https://github.com/docker/scout-action) from 1.20.2 to 1.20.3.
- [Release notes](https://github.com/docker/scout-action/releases)
- [Commits](1128f02d1e...8910519cee)

---
updated-dependencies:
- dependency-name: docker/scout-action
  dependency-version: 1.20.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-27 14:01:04 +01:00
dependabot[bot]
d7a83b8d8a [upd] github-actions: Bump github/codeql-action from 4.33.0 to 4.34.1 (#5914)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.33.0 to 4.34.1.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](b1bff81932...3869755554)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.34.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-27 14:00:14 +01:00
Markus Heiser
e734424006 [fix] engine - karmasearch crash when searching with long queries (#5912)
Karmasearch seem to crash when searching with long queries >= 100 characters.
The returned JSON is exactly this `["",[]]`, which will crash when trying to
access `resp.json()["results"]`

Close: https://github.com/searxng/searxng/issues/5911

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-26 15:54:32 +01:00
Bnyro
fe1d6d9c48 [fix] unsplash: fix engine due to anubis bot blocking (#5907)
Unsplash started using [Anubis](https://anubis.techaro.lol/)
for blocking crawlers. Therefore, requests using common
user agents (e.g. Firefox, Chrome) must pass a JavaScript
challenge.

However, other user agents seem unaffected for now, hence
settings the UA to something different does still work.
2026-03-25 20:36:17 +01:00
Markus Heiser
0dc032435a [chore] make data.traits - add regions from karmasearch
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-25 19:45:46 +01:00
Bnyro
bd8106e40e [feat] engines: add karmasearch engine (brave mirror) 2026-03-25 19:45:46 +01:00
Markus Heiser
541c6c3cb1 [chore] make data.traits - fix bing engine traits (#5903)
bing's traits.languages has been removed in #5793

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-25 12:09:43 +01:00
dependabot[bot]
02ba387865 [upd] web-client (simple): Bump the group (#5874)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-24 22:17:07 +01:00
dependabot[bot]
8c1570af1c [upd] pypi: Bump basedpyright from 1.38.2 to 1.38.3 in the minor group (#5876)
Bumps the minor group with 1 update: [basedpyright](https://github.com/detachhead/basedpyright).

Updates `basedpyright` from 1.38.2 to 1.38.3
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.38.2...v1.38.3)
2026-03-24 21:44:27 +01:00
Markus Heiser
c52d23f262 [fix] clean up and update python requirements (#5899)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-24 21:41:39 +01:00
dependabot[bot]
ae4b73039f [upd] pypi: Bump sphinx-issues from 5.0.1 to 6.0.0 (#5877)
Bumps [sphinx-issues](https://github.com/sloria/sphinx-issues) from 5.0.1 to 6.0.0.
- [Commits](https://github.com/sloria/sphinx-issues/compare/5.0.1...6.0.0)

---
updated-dependencies:
- dependency-name: sphinx-issues
  dependency-version: 6.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...
2026-03-24 20:58:30 +01:00
Bnyro
220c42c8e9 [feat] engines: add support for aol.com (#5882)
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-24 20:44:15 +01:00
Markus Heiser
99ec6f296e [mod] drop support for Python releases older than 4 years (#5895)
The end-of-life (EOL) of a Python release is reached after 5 years, with the
last three years dedicated to security fixes. [1]

Unfortunately, this doesn't apply to common libraries (dependencies): bug fixes
are often only included in major releases, and minor releases with corresponding
security fixes are rarely offered.

To make matters worse, these dependencies often prematurely discontinue their
support for older Python releases (because, for example, they want/need to use
new Python features).

If we want to offer secure software, we are faced with the dilemma of either
supporting old Python releases and accepting that there are security bugs in the
dependencies, or ending support for older Python versions before the actual EOL
of the Python release.

[1] https://devguide.python.org/versions/

Closes: https://github.com/searxng/searxng/issues/5869

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-24 20:26:34 +01:00
Markus Heiser
054174a19d [build] /static 2026-03-24 20:21:27 +01:00
Ruben D.
5e8255f28a [MOD] generate manifest PWA icons (#5859) 2026-03-24 20:21:27 +01:00
Ruben D.
3dc4d5daa8 [mod] add manifest.json template and route (#5859)
URLs, name and colors are automatically rendered into manifest.json.
Furthermore user preference of theme (light, dark, black) and theme colors are
respected.  Theme colors can be set in settings.yml
2026-03-24 20:21:27 +01:00
Markus Heiser
924fc52f54 [build] /static 2026-03-24 19:39:11 +01:00
Markus Heiser
8d44ff51e2 [mod] remove the "Submit a new issue on Github" form (#5896)
Submitting an issue on GitHub isn't a end user task .. most issue reports coming
from this form are not filled out, since end users are not familiar with the
needs of a developer community.

Closes: https://github.com/searxng/searxng/issues/5820
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-24 19:39:11 +01:00
Bnyro
f8056b5e44 [chore] make data.traits 2026-03-24 15:55:54 +01:00
Bnyro
71cea1d87f [feat] engines: add boardreader engine (#5881) 2026-03-24 15:55:54 +01:00
Markus Heiser
c4f51aa4ac [fix] google engine - don't set __Secure-ENID in the HTTP header (#5894)
PR #5892 only deepends on the UA and the __Secure-ENID is not needed [1].

[1] https://github.com/searxng/searxng/pull/5892#issuecomment-4114835195

Suggested-by: @yeyuchen198

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-24 15:16:47 +01:00
mg95
2c1ce3bd37 [fix] google: switch to using "Google App" for Android useragent (#5892)
I found a bypass using the Android Google App this time. However, unlike the iPhone GSA method, this one does have rate limits. Although it took a couple of hundred consecutive requests to trigger them.
2026-03-23 14:55:48 +01:00
dependabot[bot]
6c7e9c1976 [upd] github-actions: Bump actions/cache from 5.0.3 to 5.0.4 (#5873)
Bumps [actions/cache](https://github.com/actions/cache) from 5.0.3 to 5.0.4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](cdf6c1fa76...668228422a)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-20 22:00:17 +01:00
dependabot[bot]
8ad72872b5 [upd] github-actions: Bump github/codeql-action from 4.32.6 to 4.33.0 (#5872)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.6 to 4.33.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](0d579ffd05...b1bff81932)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.33.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-20 21:00:27 +01:00
Aadniz
2bf5f00e7d [build] /static 2026-03-20 16:31:32 +01:00
Aadniz
5ab3ef774b [feat] client/simple: show/hide autocomplete list on focus/blur
The autocomplete suggestion list is currently a bit hard to close if it has been spawned once. Sometimes you may write something in the input field, change your mind and then want to click the first result on the page. But since the dropdown cannot be closed, the dropdown is in the way to be able to click on the first result.
2026-03-20 16:31:32 +01:00
dependabot[bot]
3810dc9d1c [upd] web-client (simple): Bump vite in /client/simple (#5856)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.16 to 8.0.0.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@8.0.0/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 15:14:37 +01:00
dependabot[bot]
c589b56d69 [upd] web-client (simple): Bump the minor group (#5855)
Bumps the minor group in /client/simple with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [less](https://github.com/less/less.js).

Updates `@types/node` from 25.3.5 to 25.5.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `less` from 4.5.1 to 4.6.3
- [Release notes](https://github.com/less/less.js/releases)
- [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/less/less.js/compare/v4.5.1...v4.6.3)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: less
  dependency-version: 4.6.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-18 15:12:57 +01:00
Ivan Gabaldon
6521190bb4 [enh] engines: rework bing engine (#5793)
* [enh] engines: rework bing engine

Only Bing-Web has been reworked.

Some features now require JavaScript (paging and time-range results).
Cookies no longer work, parameters such as `cc`, `ui`, ... alter the results.

The engine only appears to use the locale from `Accept-Language` header properly.

The rest of Bing's child engines (Bing-Image, Bing-Video, ...) seem to benefit
from using `mkt` param in conjunction with the `Accept-Language` header
override, although Bing-Web does not (?)

* [enh] explicit mkt

* [fix] engines: bing_videos.py

https://github.com/searxng/searxng/pull/5793#pullrequestreview-3881883250
2026-03-18 14:55:25 +01:00
Markus Heiser
2bb8ac17c6 [fix] Youtube video - "Error 153" send HTTP Referrer (referrerpolicy) (#5858)
For videos from ``www.youtube.com`` this patch adds ``referrerpolicy`` and other
by YT required permission policies for the iframe.

API Clients that use the YouTube embedded player (including the YouTube IFrame
Player API) must provide identification through the HTTP ``Referer`` request
header[1].

If the error still occurs, check if server headers (e.g., in .htaccess or Nginx)
are overriding the referrer policy[2].

[1] https://developers.google.com/youtube/terms/required-minimum-functionality#embedded-player-api-client-identity
[2] hint comes from AI: https://chat.mistral.ai
[3] https://developers.google.com/youtube/player_parameters


Close: https://github.com/searxng/searxng/issues/5844

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-17 19:52:46 +01:00
Aadniz
4c4ed4b198 [fix] google engine: Result image thumbnails 2026-03-16 23:35:33 +01:00
dependabot[bot]
3c1f68c59e [upd] github-actions: Bump docker/scout-action from 1.18.2 to 1.20.2 (#5854)
Bumps [docker/scout-action](https://github.com/docker/scout-action) from 1.18.2 to 1.20.2.
- [Release notes](https://github.com/docker/scout-action/releases)
- [Commits](f8c7768240...1128f02d1e)

---
updated-dependencies:
- dependency-name: docker/scout-action
  dependency-version: 1.20.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-13 14:09:07 +01:00
Renaud Allard
23fb76f08f Fix XSS via unsafe rendering of untrusted external data in templates (#5826)
Remove |safe filter from 6 template locations where data from external
search engine APIs was rendered as raw HTML without sanitization. Jinja2
autoescape now properly escapes these fields.

The |safe filter was originally added in commit 213041adc (March 2021)
by copying the pattern from result.title|safe and result.content|safe.
However, title and content are pre-escaped via escape() in webapp.py
lines 704-706 before highlight_content() adds trusted <span> tags for
search term highlighting. The metadata, info.value, link.url_label,
repository, and filename fields never go through any escaping and flow
directly from external API responses to the template.

Affected templates and their untrusted data sources:
- macros.html: result.metadata from DuckDuckGo, Reuters, Presearch,
  Podcast Index, Fyyd, bpb, moviepilot, mediawiki, and others
- paper.html: result.metadata from academic search engines
- map.html: info.value and link.url_label from OpenStreetMap
  user-contributed extratags
- code.html: result.repository and result.filename from GitHub API

Example exploit: a search engine API returning
metadata='<img src=x onerror=alert(document.cookie)>' would execute
arbitrary JavaScript in every user's browser viewing that result.
2026-03-13 13:28:31 +01:00
github-actions[bot]
867a43ac1f [l10n] update translations from Weblate (#5857)
7bbad1a8d - 2026-03-10 - omeritzics <omeritzics@noreply.codeberg.org>
68a483eec - 2026-03-08 - Stephan-P <stephan-p@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-13 12:43:21 +01:00
Bnyro
3d3a78f3aa chore: add link to ai policy in issue/pr templates 2026-03-12 16:04:00 +01:00
Bnyro
3a032d63a9 docs: add AI policy 2026-03-12 16:04:00 +01:00
Bnyro
e30d490429 [mod] right dao: remove engine (#5849)
Since about a month, the website just says "temporarily unavailable", so it's safe to assume that it's just no longer working

Related:

- https://github.com/searxng/searxng/pull/3798
2026-03-12 15:20:53 +01:00
SeriousConcept1134
8b95b2058b [fix] google engines: update XPaths for modern mobile UI (#5836)
Google recently changed the DOM structure for mobile-centric responses, causing the `google_videos` engine to return zero results and the main `google` engine to drop the majority of its results (due to missing snippets or failed URL parsing). These changes restore the functionality and improve the result count for both engines.

This patch updates the parsing logic for both the `google` and `google_videos` engines to handle the modern HTML structure returned by Google when using GSA (Google Search App) User-Agents.

**Specific changes include:**

* **Google Videos (`gov`)**:
    * Updated title XPath to support `role="heading"`.
    * Improved URL extraction to correctly decode Google redirectors (`/url?q=...`) using `unquote`.
    * Added support for the `WRu9Cd` class to capture publication metadata (author/date).
    * Broadened thumbnail search and added a fallback to YouTube's `hqdefault.jpg`.

* **Google Web**:
    * Relaxed the strict snippet (`content`) requirement. Valid results are no longer discarded if a snippet is missing in the mobile UI.
    * Hardened URL extraction to handle both direct and redirected URLs safely.
    * Improved thumbnail extraction by searching the entire result block.
2026-03-10 09:05:54 +01:00
dependabot[bot]
d4954a0646 [upd] web-client (simple): Bump the minor group (#5818)
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [svgo](https://github.com/svg/svgo).


Updates `@biomejs/biome` from 2.4.4 to 2.4.6
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.6/packages/@biomejs/biome)

Updates `@types/node` from 25.3.2 to 25.3.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `svgo` from 4.0.0 to 4.0.1
- [Release notes](https://github.com/svg/svgo/releases)
- [Commits](https://github.com/svg/svgo/compare/v4.0.0...v4.0.1)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.3.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: svgo
  dependency-version: 4.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-09 14:25:05 +01:00
vojkovic
a563127a26 [fix] engines: remove google arc/async params 2026-03-08 23:22:32 +08:00
dependabot[bot]
0716de6bc8 [upd] github-actions: Bump github/codeql-action from 4.32.4 to 4.32.6 (#5814)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.4 to 4.32.6.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](89a39a4e59...0d579ffd05)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.32.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-06 23:00:07 +01:00
Brock Vojkovic
68ff08f224 [mod] drop fasttext-predict (#5795)
Removes the `fasttext-predict` dependency and the language detection code.

If a user now selects `auto` for the search language, the detected language now
falls back directly to the `Accept-Language` header sent by the browser (which was already the fallback when fasttext returned no result).

- fasttext's [language detection is unreliable](https://github.com/searxng/searxng/issues/4195) for some languages, especially short search queries, and in particular for queries containing proper names which is a common case.
- `fasttext-predict` consumes [significant memory](https://github.com/searxng/searxng/pull/1969#issuecomment-1345366676) without offering users much real value.
- the upstream fasttext project was archived by Meta in 2024
- users already have two better alternatives: the `Accept-Language` header and the search-syntax language prefix (e.g. `:fr` or `:de`).

Related: https://github.com/searxng/searxng/issues/4195
Closes: https://github.com/searxng/searxng/issues/5790
2026-03-06 15:40:44 +01:00
dependabot[bot]
c7ba2158f9 [upd] pypi: Bump the minor group with 2 updates (#5817)
Bumps the minor group with 2 updates: [nose2[coverage_plugin]](https://github.com/nose-devs/nose2) and [sphinx-tabs](https://github.com/executablebooks/sphinx-tabs).


Updates `nose2[coverage_plugin]` from 0.15.1 to 0.16.0
- [Changelog](https://github.com/nose-devs/nose2/blob/main/docs/changelog.rst)
- [Commits](https://github.com/nose-devs/nose2/compare/0.15.1...0.16.0)

Updates `sphinx-tabs` from 3.4.7 to 3.5.0
- [Release notes](https://github.com/executablebooks/sphinx-tabs/releases)
- [Changelog](https://github.com/executablebooks/sphinx-tabs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/executablebooks/sphinx-tabs/compare/v3.4.7...v3.5.0)
2026-03-06 15:15:08 +01:00
dependabot[bot]
c1b211aeea [upd] github-actions: Bump docker/login-action from 3.7.0 to 4.0.0 (#5816)
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.7.0 to 4.0.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](c94ce9fb46...b45d80f862)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-06 14:18:54 +01:00
dependabot[bot]
08d2b92b2a [upd] github-actions: Bump docker/setup-qemu-action from 3.7.0 to 4.0.0 (#5815)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.7.0 to 4.0.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](c7c5346462...ce360397dd)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-06 14:15:36 +01:00
dependabot[bot]
7cc4eedc1a [upd] github-actions: Bump actions/setup-node from 6.2.0 to 6.3.0 (#5813)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](6044e13b5d...53b83947a5)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-06 14:14:46 +01:00
github-actions[bot]
25e457c8d5 [l10n] update translations from Weblate (#5812)
5a33207b4 - 2026-03-03 - Linerly <linerly@noreply.codeberg.org>
b84870677 - 2026-03-01 - return42 <return42@noreply.codeberg.org>
8862bb219 - 2026-03-01 - return42 <return42@noreply.codeberg.org>
f64625f8b - 2026-03-01 - return42 <return42@noreply.codeberg.org>
5424e5190 - 2026-03-01 - return42 <return42@noreply.codeberg.org>
999ed9500 - 2026-03-01 - return42 <return42@noreply.codeberg.org>
55f674a81 - 2026-03-01 - return42 <return42@noreply.codeberg.org>
ccc5398f1 - 2026-03-01 - return42 <return42@noreply.codeberg.org>
eefcd7854 - 2026-02-28 - cdli <cdli@noreply.codeberg.org>
5985f8df0 - 2026-02-27 - boradog <boradog@noreply.codeberg.org>
cd0213e39 - 2026-02-28 - DeckPacker <deckpacker@noreply.codeberg.org>
94c0b5fc8 - 2026-02-28 - Serpensin <serpensin@noreply.codeberg.org>
a86b8d609 - 2026-02-28 - DeckPacker <deckpacker@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-06 08:56:15 +01:00
Bnyro
56e565a582 [feat] autocomplete: add bing autocompleter 2026-03-05 20:56:02 +01:00
Ivan Gabaldon
380f1c4a49 [upd] engines: sync "aa" mirrors (#5807) 2026-03-05 19:08:05 +01:00
github-actions[bot]
b5c1c28048 [data] update searx.data - update_engine_descriptions.py (#5791)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-03 22:36:53 +01:00
Ivan Gabaldon
fc53162eec [data] update searx.data - update_engine_traits.py 2026-03-03 20:31:25 +01:00
Ivan Gabaldon
2b03a61832 [enh] data: traits population
Job failing since October 2025.

enh: always raise and reuse data
fix: brave unknown locale
fix: startpage add "brazilian"
2026-03-03 20:31:25 +01:00
Markus Heiser
a9f3baefe6 [fix] unhandled Exceptions in radio_browser.py
Closes: https://github.com/searxng/searxng/issues/5439
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-03 20:31:25 +01:00
Markus Heiser
d1f9409afc [fix] remove base_url https://annas-archive.li
Related:

- https://github.com/searxng/searxng/issues/5773
- https://github.com/searxng/searxng/pull/5780

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-03 20:31:25 +01:00
Ivan Gabaldon
f6e360a134 [mod] engines: remove stract engine (#5800)
Engine probably dead, developer doesn't have time to maintain it anymore:

- https://github.com/StractOrg/stract/issues/267

Related:

- https://github.com/searxng/searxng/pull/3099
2026-03-03 11:47:15 +01:00
Ivan Gabaldon
bc31c29d8a [mod] engines: remove livespace engine (#5798)
Related:

- https://github.com/searxng/searxng/pull/3222
- https://web.archive.org/web/20240524174947/https://about.live.space/post/thank-you
2026-03-03 11:27:33 +01:00
Ivan Gabaldon
65ae6ad902 [mod] engines: remove searchcode engine
Microslop fault https://web.archive.org/web/20260111060432/https://boyter.org/posts/searchcode-is-being-rebooted/
2026-03-03 00:24:15 +01:00
Ivan Gabaldon
dd98f761ad [mod] ci: remove checker
Missed on https://github.com/searxng/searxng/pull/5767
2026-03-02 07:18:32 +01:00
github-actions[bot]
162c04a1c4 [data] update searx.data - update_wikidata_units.py (#5785)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-01 10:55:10 +01:00
Ivan Gabaldon
e084139ca9 [enh] data: uas to a set (#5789)
* [enh] data: uas to a set

* [data] update searx.data - update_gsa_useragents.py

Closes: https://github.com/searxng/searxng/pull/5786
2026-03-01 10:53:39 +01:00
Markus Heiser
8fc549574f [doc] fix minor issues in the DDG engine's doc-strings
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-03-01 10:05:19 +01:00
dependabot[bot]
0eb4970621 [upd] pypi: Bump the minor group with 10 updates
Bumps the minor group with 10 updates:

| Package | From | To |
| --- | --- | --- |
| [certifi](https://github.com/certifi/python-certifi) | `2026.1.4` | `2026.2.25` |
| [typer](https://github.com/fastapi/typer) | `0.24.0` | `0.24.1` |
| [whitenoise](https://github.com/evansd/whitenoise) | `6.11.0` | `6.12.0` |
| [pylint](https://github.com/pylint-dev/pylint) | `4.0.4` | `4.0.5` |
| [pallets-sphinx-themes](https://github.com/pallets/pallets-sphinx-themes) | `2.3.0` | `2.5.0` |
| [sphinxcontrib-programoutput](https://github.com/OpenNTI/sphinxcontrib-programoutput) | `0.18` | `0.19` |
| [granian[reload]](https://github.com/emmett-framework/granian) | `2.7.1` | `2.7.2` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.38.1` | `1.38.2` |
| [granian](https://github.com/emmett-framework/granian) | `2.7.1` | `2.7.2` |
| [granian[pname]](https://github.com/emmett-framework/granian) | `2.7.1` | `2.7.2` |


Updates `certifi` from 2026.1.4 to 2026.2.25
- [Commits](https://github.com/certifi/python-certifi/compare/2026.01.04...2026.02.25)

Updates `typer` from 0.24.0 to 0.24.1
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.24.0...0.24.1)

Updates `whitenoise` from 6.11.0 to 6.12.0
- [Changelog](https://github.com/evansd/whitenoise/blob/main/docs/changelog.rst)
- [Commits](https://github.com/evansd/whitenoise/compare/6.11.0...6.12.0)

Updates `pylint` from 4.0.4 to 4.0.5
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v4.0.4...v4.0.5)

Updates `pallets-sphinx-themes` from 2.3.0 to 2.5.0
- [Release notes](https://github.com/pallets/pallets-sphinx-themes/releases)
- [Changelog](https://github.com/pallets/pallets-sphinx-themes/blob/main/CHANGES.md)
- [Commits](https://github.com/pallets/pallets-sphinx-themes/compare/2.3.0...2.5.0)

Updates `sphinxcontrib-programoutput` from 0.18 to 0.19
- [Changelog](https://github.com/OpenNTI/sphinxcontrib-programoutput/blob/master/CHANGES.rst)
- [Commits](https://github.com/OpenNTI/sphinxcontrib-programoutput/compare/0.18...0.19)

Updates `granian[reload]` from 2.7.1 to 2.7.2
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.1...v2.7.2)

Updates `basedpyright` from 1.38.1 to 1.38.2
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.38.1...v1.38.2)

Updates `granian` from 2.7.1 to 2.7.2
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.1...v2.7.2)

Updates `granian[pname]` from 2.7.1 to 2.7.2
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.1...v2.7.2)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2026.2.25
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: typer
  dependency-version: 0.24.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: whitenoise
  dependency-version: 6.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: pylint
  dependency-version: 4.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: pallets-sphinx-themes
  dependency-version: 2.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: sphinxcontrib-programoutput
  dependency-version: '0.19'
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian[reload]
  dependency-version: 2.7.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.38.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: granian
  dependency-version: 2.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: granian[pname]
  dependency-version: 2.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 10:05:19 +01:00
github-actions[bot]
5a72560319 [data] update searx.data - update_currencies.py (#5788) 2026-03-01 09:22:40 +01:00
github-actions[bot]
5e7aae3f16 [data] update searx.data - update_ahmia_blacklist.py (#5784)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-01 09:20:55 +01:00
github-actions[bot]
62b153f5c1 [data] update searx.data - update_firefox_version.py (#5787)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-03-01 09:19:50 +01:00
Ivan Gabaldon
a2108ce2e5 [enh] engines: rework "aa" engine (#5780)
* [enh] engines: rework "aa" engine

fix: update mirror domains
enh: sync website layout
feat: add `type`, `tags` result fields

* [fix] engines: apply suggestions

https://github.com/searxng/searxng/pull/5780#discussion_r2866198969
https://github.com/searxng/searxng/pull/5780#discussion_r2866207218
https://github.com/searxng/searxng/pull/5780#discussion_r2866211874
https://github.com/searxng/searxng/pull/5780#discussion_r2866228648
https://github.com/searxng/searxng/pull/5780#discussion_r2866232545
https://github.com/searxng/searxng/pull/5780#discussion_r2866235830
2026-02-28 11:35:58 +01:00
github-actions[bot]
31cc7ef7f0 [l10n] update translations from Weblate (#5779)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-02-28 09:37:28 +01:00
mgcsysinfcat
2728331362 [fix] xpath.py: fix safesearch handling if safesearch set to disabled 2026-02-27 21:55:13 +01:00
mgcsysinfcat
ebb300424c [mod] fynd: add safe search support 2026-02-27 21:55:13 +01:00
Zhijie He
0c284b5b09 [mod] sogou: support published date, redirect URLs, ... 2026-02-27 21:45:02 +01:00
dependabot[bot]
8e9ed5f9be [upd] web-client (simple): Bump vite from 8.0.0-beta.15 to 8.0.0-beta.16 in /client/simple (#5777)
* [upd] web-client (simple): Bump vite in /client/simple

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.15 to 8.0.0-beta.16.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.16/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* [upd] themes: rebuild static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2026-02-27 09:51:42 +01:00
dependabot[bot]
d6c80e4dd1 [upd] web-client (simple): Bump the minor group (#5775)
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [edge.js](https://github.com/edge-js/edge).

Updates `@biomejs/biome` from 2.4.3 to 2.4.4
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.4/packages/@biomejs/biome)

Updates `@types/node` from 25.3.0 to 25.3.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `edge.js` from 6.4.0 to 6.5.0
- [Release notes](https://github.com/edge-js/edge/releases)
- [Changelog](https://github.com/edge-js/edge/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/edge-js/edge/compare/v6.4.0...v6.5.0)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.3.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: edge.js
  dependency-version: 6.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 09:38:54 +01:00
dependabot[bot]
2756341b21 [upd] github-actions: Bump github/codeql-action from 4.32.3 to 4.32.4 (#5774)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.3 to 4.32.4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](9e907b5e64...89a39a4e59)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.32.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-27 09:30:00 +01:00
Bnyro
c3e3d2d85d [feat] engines: add pexels engine 2026-02-26 11:35:10 +01:00
Bnyro
4964d664f0 [build] /static 2026-02-23 10:57:12 +01:00
Bnyro
845a78daf8 [feat] image results page: also display request statistics (i.e. engine response times)
Apparently the engine statistics have been hidden from the images page when
infinite scroll was added as a preference in 56e34947a6

However, now that we also display engine statistics in the results page,
I don't see any reason why this should still be hidden from the images tab.

For example, this is very useful for seeing which engines work and which ones are broken.
2026-02-23 10:57:12 +01:00
Markus Heiser
191818b865 [mod] drop SearXNG's checker (#5767)
To date, there is no analysis for the checker that could be evaluated in any
meaningful way.

- https://github.com/searxng/searxng/issues/3407
- https://github.com/searxng/searxng/pull/3312

The checker would need to be completely redesigned, but even then, its
usefulness and the maintenance required for it would be disproportionate.

TBH: In its current form, it is useless and only consumes resources and
causes the engines to be blocked, because these tests (query terms) come
from *hundreds* of instances and could be interpreted as bot attacks.

Related issues: [search.checker](https://github.com/searxng/searxng/issues?q=label%3A%22search.checker%22)

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-22 14:44:21 +01:00
Markus Heiser
5054e69844 [fix] searxng.sh fails: No module named 'pybind11' (#5765)
Related: https://github.com/searxng/searxng/discussions/5748#discussioncomment-15880660

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-22 10:23:59 +01:00
Markus Heiser
029b74e4f5 [fix] online engines: remove HTTP Sec-Fetch-* headers
The Sec-Fetch-* headers seem to cause more problems than they solve. They will
be removed for now.

Related:

- https://github.com/searxng/searxng/pull/5758#pullrequestreview-3834221131

Suggested-by: @Bnyro
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-22 09:30:16 +01:00
Markus Heiser
2e6eeb1d79 [fix] complete overhaul of the DuckDuckGo engines
DDG has reimplemented its bot protection, and the DDG engines "images", "news"
and "videos" no longer work in SearXNG and DDG-Web access often ends with a
CAPTCHA.

Related:

- issue 4824
- https://github.com/ggfevans/searxng/blob/mod-sidecar-harvester/docs/ddg-bot-detection-research.md

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-22 09:30:16 +01:00
Markus Heiser
490f28f0a6 [mod] online engines - set common HTTP headers
The online engines emulate a request as it would come from a web browser, which
is why the HTTP headers in the default settings should also be set the way a
standard web browser would set them.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-22 09:30:16 +01:00
Markus Heiser
cc39cf7df3 [mod] fix some minor type hint issues / add some type hints more
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-22 09:30:16 +01:00
Markus Heiser
76f0712319 [mod] settings.yml - adjust default suspended_times from hours to minutes
The default settings for the suspend times were previously 24 hours and 3 hours,
respectively. Based on my experience, these defaults are too high; most engines
handle suspend times of 3 minutes or 1 hour (captcha) without any problems.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-22 09:30:16 +01:00
Markus Heiser
89a63114c4 [fix] searxng.sh fails: No module named 'typing_extensions'
Closes: #5761

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-21 13:41:52 +01:00
Bnyro
9754e7b4e2 [mod] engines: remove seekr engine
Looks like https://www.seekr.com/ was sold to an other company
that does something with enterprise AI and no longer provides any
web search engine.
2026-02-21 11:26:53 +01:00
Ivan Gabaldon
93ac6ceb35 [fix] themes: run \#invoke after class constructor (#5757)
Move \#invoke into a microtask that will run after current call stack completes

Closes: https://github.com/searxng/searxng/issues/5756
2026-02-20 13:00:17 +01:00
dependabot[bot]
4e6e8425ca [upd] web-client (simple): Bump vite in /client/simple (#5751)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.14 to 8.0.0-beta.15.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.15/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-20 11:08:41 +01:00
dependabot[bot]
062b1320a2 [upd] web-client (simple): Bump the minor group (#5749)
Bumps the minor group in /client/simple with 2 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).

Updates `@biomejs/biome` from 2.3.15 to 2.4.3
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.4.3/packages/@biomejs/biome)

Updates `@types/node` from 25.2.3 to 25.3.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.4.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-20 11:08:32 +01:00
dependabot[bot]
95f95e96c4 [upd] pypi: Bump the minor group with 5 updates
Bumps the minor group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [flask](https://github.com/pallets/flask) | `3.1.2` | `3.1.3` |
| [typer](https://github.com/fastapi/typer) | `0.23.0` | `0.24.0` |
| [selenium](https://github.com/SeleniumHQ/Selenium) | `4.40.0` | `4.41.0` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.38.0` | `1.38.1` |
| [types-lxml](https://github.com/abelcheung/types-lxml) | `2026.1.1` | `2026.2.16` |


Updates `flask` from 3.1.2 to 3.1.3
- [Release notes](https://github.com/pallets/flask/releases)
- [Changelog](https://github.com/pallets/flask/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/flask/compare/3.1.2...3.1.3)

Updates `typer` from 0.23.0 to 0.24.0
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.23.0...0.24.0)

Updates `selenium` from 4.40.0 to 4.41.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.40.0...selenium-4.41.0)

Updates `basedpyright` from 1.38.0 to 1.38.1
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.38.0...v1.38.1)

Updates `types-lxml` from 2026.1.1 to 2026.2.16
- [Release notes](https://github.com/abelcheung/types-lxml/releases)
- [Changelog](https://github.com/abelcheung/types-lxml/blob/main/CHANGELOG.md)
- [Commits](https://github.com/abelcheung/types-lxml/compare/2026.01.01...2026.02.16)

---
updated-dependencies:
- dependency-name: flask
  dependency-version: 3.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: typer
  dependency-version: 0.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: selenium
  dependency-version: 4.41.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.38.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: types-lxml
  dependency-version: 2026.2.16
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-20 11:01:32 +01:00
dependabot[bot]
8f824d34a8 [upd] github-actions: Bump github/codeql-action from 4.32.2 to 4.32.3 (#5753)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.2 to 4.32.3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](45cbd0c69e...9e907b5e64)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.32.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-20 10:52:55 +01:00
searxng-bot
4027ff5699 [l10n] update translations from Weblate
97552c40b - 2026-02-17 - boradog <boradog@noreply.codeberg.org>
2026-02-20 08:54:50 +01:00
Ivan Gabaldon
17544140fb [fix] ci: cache keys (#5745)
YAML block (literal) scalar style also takes quotes into account:

Expected:
  `container-amd64-20260216-acbc0ea29f44f7fc7eeadcf91d421c66f26dbbdd48cc284691f8fd8982ab7323, container-amd64-20260216-, container-amd64-`

Got:
  `container-amd64-20260216-acbc0ea29f44f7fc7eeadcf91d421c66f26dbbdd48cc284691f8fd8982ab7323, "container-amd64-20260216-", "container-amd64-"`
2026-02-19 10:37:20 +01:00
Carsten Csiky
8e824017dc [feat] engines: add artstation engine (#5728)
- use proper Brave API with api_key for search

Co-authored-by: Bnyro <bnyro@tutanota.com>
2026-02-16 14:18:08 +01:00
dependabot[bot]
da9c0815ac [upd] web-client (simple): Bump the minor group (#5737)
Bumps the minor group in /client/simple with 4 updates: [ol](https://github.com/openlayers/openlayers), [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [mathjs](https://github.com/josdejong/mathjs).

Updates `ol` from 10.7.0 to 10.8.0
- [Release notes](https://github.com/openlayers/openlayers/releases)
- [Commits](https://github.com/openlayers/openlayers/compare/v10.7.0...v10.8.0)

Updates `@biomejs/biome` from 2.3.14 to 2.3.15
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.15/packages/@biomejs/biome)

Updates `@types/node` from 25.2.1 to 25.2.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `mathjs` from 15.1.0 to 15.1.1
- [Changelog](https://github.com/josdejong/mathjs/blob/develop/HISTORY.md)
- [Commits](https://github.com/josdejong/mathjs/compare/v15.1.0...v15.1.1)

---
updated-dependencies:
- dependency-name: ol
  dependency-version: 10.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.2.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: mathjs
  dependency-version: 15.1.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-15 11:30:35 +01:00
Markus Heiser
39ac4d4387 [upd] granian 2.7.0 -> 2.7.1 & basedpyright 1.37.4 -> 1.38.0
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-14 13:20:55 +01:00
Markus Heiser
51ded5e690 [fix] migrate from typer-slim to typer
Package typer-slim does nothing other than depend on typer. The only reason this
package exists is as a migration path for old projects that used to depend on
typer-slim, so that they can get the latest version of typer.

Install instead:

    pip install typer

Package typer-slimis deprecated and will stop receiving any updates and
published versions.

[1] https://pypi.org/project/typer-slim/

Closes: https://github.com/searxng/searxng/issues/5742
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-14 13:08:40 +01:00
dependabot[bot]
97e572728f [upd] web-client (simple): Bump vite in /client/simple (#5738)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.13 to 8.0.0-beta.14.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.14/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-13 10:49:31 +01:00
Ivan Gabaldon
a2db6f6500 Revert "[upd] pypi: ..."
This reverts commit 61d5456852

Related https://github.com/searxng/searxng/issues/5742
2026-02-13 10:30:04 +01:00
dependabot[bot]
61d5456852 [upd] pypi: Bump the minor group with 5 updates
Bumps the minor group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [typer-slim](https://github.com/fastapi/typer) | `0.21.1` | `0.23.0` |
| [granian[reload]](https://github.com/emmett-framework/granian) | `2.7.0` | `2.7.1` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.37.4` | `1.38.0` |
| [granian](https://github.com/emmett-framework/granian) | `2.7.0` | `2.7.1` |
| [granian[pname]](https://github.com/emmett-framework/granian) | `2.7.0` | `2.7.1` |


Updates `typer-slim` from 0.21.1 to 0.23.0
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.21.1...0.23.0)

Updates `granian[reload]` from 2.7.0 to 2.7.1
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.0...v2.7.1)

Updates `basedpyright` from 1.37.4 to 1.38.0
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.37.4...v1.38.0)

Updates `granian` from 2.7.0 to 2.7.1
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.0...v2.7.1)

Updates `granian[pname]` from 2.7.0 to 2.7.1
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.7.0...v2.7.1)

---
updated-dependencies:
- dependency-name: typer-slim
  dependency-version: 0.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian[reload]
  dependency-version: 2.7.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian
  dependency-version: 2.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: granian[pname]
  dependency-version: 2.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-13 08:42:54 +01:00
searxng-bot
0277ce9bca [l10n] update translations from Weblate
ca4353e2d - 2026-02-12 - greatdng <greatdng@noreply.codeberg.org>
2026-02-13 08:41:58 +01:00
Austin-Olacsi
970f2b8430 [feat] add nist.gov vulnerability search 2026-02-11 00:44:19 +01:00
Markus Heiser
b5bb27f231 [fix] test_locale_optimized_territory_1_fr (test_locales.TestLocales)
Unit test fails::

    Traceback (most recent call last):
      File "/share/searxng/local/py3/lib/python3.10/site-packages/parameterized/parameterized.py", line 620, in standalone_func
        return func(*(a + p.args), **p.kwargs, **kw)
      File "/share/searxng/tests/unit/test_locales.py", line 121, in test_locale_optimized_territory
        self.assertEqual(locales.match_locale(locale, locale_list), expected_locale)
    AssertionError: 'fr-CH' != 'fr-BE'
    - fr-CH
    + fr-BE

With the `babel` update from 2.17.0 to 2.18.0 the population DB has been
updated (the test was implemented for the old values).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-02-06 14:42:13 +01:00
dependabot[bot]
578e59a54e [upd] pypi: Bump the minor group with 5 updates
Bumps the minor group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [granian](https://github.com/emmett-framework/granian) | `2.6.1` | `2.7.0` |
| [granian[pname]](https://github.com/emmett-framework/granian) | `2.6.1` | `2.7.0` |
| [babel](https://github.com/python-babel/babel) | `2.17.0` | `2.18.0` |
| [granian[reload]](https://github.com/emmett-framework/granian) | `2.6.1` | `2.7.0` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.37.2` | `1.37.4` |


Updates `granian` from 2.6.1 to 2.7.0
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.6.1...v2.7.0)

Updates `granian[pname]` from 2.6.1 to 2.7.0
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.6.1...v2.7.0)

Updates `babel` from 2.17.0 to 2.18.0
- [Release notes](https://github.com/python-babel/babel/releases)
- [Changelog](https://github.com/python-babel/babel/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-babel/babel/compare/v2.17.0...v2.18.0)

Updates `granian[reload]` from 2.6.1 to 2.7.0
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.6.1...v2.7.0)

Updates `basedpyright` from 1.37.2 to 1.37.4
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.37.2...v1.37.4)

---
updated-dependencies:
- dependency-name: granian
  dependency-version: 2.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian[pname]
  dependency-version: 2.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: babel
  dependency-version: 2.18.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian[reload]
  dependency-version: 2.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.37.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-06 14:42:13 +01:00
dependabot[bot]
9ab8c36161 [upd] web-client (simple): Bump the minor group (#5722)
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [vite-bundle-analyzer](https://github.com/nonzzz/vite-bundle-analyzer).

Updates `@biomejs/biome` from 2.3.13 to 2.3.14
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.14/packages/@biomejs/biome)

Updates `@types/node` from 25.1.0 to 25.2.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `vite-bundle-analyzer` from 1.3.2 to 1.3.6
- [Release notes](https://github.com/nonzzz/vite-bundle-analyzer/releases)
- [Changelog](https://github.com/nonzzz/vite-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nonzzz/vite-bundle-analyzer/compare/v1.3.2...v1.3.6)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.2.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: vite-bundle-analyzer
  dependency-version: 1.3.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-06 11:57:12 +01:00
dependabot[bot]
bd69e9c7ab [upd] web-client (simple): Bump vite from 8.0.0-beta.11 to 8.0.0-beta.13 in /client/simple (#5723)
* [upd] web-client (simple): Bump vite in /client/simple

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.11 to 8.0.0-beta.13.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.13/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* [upd] themes: rebuild static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2026-02-06 11:43:12 +01:00
github-actions[bot]
aeb3c0e274 [l10n] update translations from Weblate (#5726)
3f24736b5 - 2026-02-03 - AndersNordh <andersnordh@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-02-06 11:20:06 +01:00
dependabot[bot]
9f5dedabba [upd] github-actions: Bump github/codeql-action from 4.32.0 to 4.32.2 (#5721)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.0 to 4.32.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](b20883b0cd...45cbd0c69e)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.32.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-06 11:18:26 +01:00
dependabot[bot]
f7a608703d [upd] web-client (simple): Bump the minor group (#5709)
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [sort-package-json](https://github.com/keithamus/sort-package-json).

Updates `@biomejs/biome` from 2.3.11 to 2.3.13
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.13/packages/@biomejs/biome)

Updates `@types/node` from 25.0.10 to 25.1.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `sort-package-json` from 3.6.0 to 3.6.1
- [Release notes](https://github.com/keithamus/sort-package-json/releases)
- [Commits](https://github.com/keithamus/sort-package-json/compare/v3.6.0...v3.6.1)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: sort-package-json
  dependency-version: 3.6.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-02-03 11:44:34 +01:00
Ivan Gabaldon
92d37152c2 [upd] ci: static podman v5.7.1 (#5714) 2026-02-02 22:40:33 +01:00
dependabot[bot]
ad42b553bf [upd] web-client (simple): Bump vite in /client/simple (#5711)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.9 to 8.0.0-beta.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-30 19:56:55 +01:00
dependabot[bot]
1c292dd9a4 [upd] github-actions: Bump docker/login-action from 3.6.0 to 3.7.0 (#5710)
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](5e57cd1181...c94ce9fb46)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 3.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-30 19:41:00 +01:00
dependabot[bot]
2ad404a3bf [upd] github-actions: Bump github/codeql-action from 4.31.10 to 4.32.0 (#5707)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.10 to 4.32.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](cdefb33c0f...b20883b0cd)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-30 19:40:15 +01:00
dependabot[bot]
ca67782626 [upd] github-actions: Bump actions/cache from 5.0.2 to 5.0.3 (#5708)
Bumps [actions/cache](https://github.com/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)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-30 19:39:55 +01:00
dependabot[bot]
0a4ea004cf [upd] pypi: Bump basedpyright from 1.37.1 to 1.37.2 in the minor group (#5712)
Bumps the minor group with 1 update: [basedpyright](https://github.com/detachhead/basedpyright).

Updates `basedpyright` from 1.37.1 to 1.37.2
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.37.1...v1.37.2)
2026-01-30 08:41:35 +01:00
github-actions[bot]
15133c2f25 [data] update searx.data - update_firefox_version.py (#5699)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-01-29 10:29:28 +01:00
github-actions[bot]
a7f15f4289 [data] update searx.data - update_wikidata_units.py (#5700)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-01-29 10:28:54 +01:00
github-actions[bot]
ac4b1275a3 [data] update searx.data - update_currencies.py (#5702)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-01-29 10:28:22 +01:00
github-actions[bot]
bf2e7f8fc5 [data] update searx.data - update_engine_descriptions.py (#5703)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-01-29 10:27:07 +01:00
github-actions[bot]
cdbf41bb9b [data] update searx.data - update_ahmia_blacklist.py (#5701)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-01-29 10:24:33 +01:00
Austin-Olacsi
966988e360 [feat] engines: add artstation engine (#5689) 2026-01-27 17:18:46 +01:00
Ivan Gabaldon
a9877aba3e [fix] themes: module resolution (#5694)
Vite should not pregen static paths on build, but rather compute the relative path at runtime.

- https://vite.dev/config/shared-options#base

Closes: https://github.com/searxng/searxng/issues/5561
2026-01-27 11:32:23 +01:00
Hu Butui
da6ab39049 [fix] iqiyi: Add support for multiple videos per album
Add support for albums containing multiple videos in iqiyi engine. When
albumInfo contains a "videos" list, process each video individually to
create separate search results for each episode/video instead of a single
result for the entire album.

Also get video length from `duration` instead of `subscriptContent`.

Signed-off-by: Hu Butui <hot123tea123@gmail.com>
2026-01-26 19:46:05 +01:00
Austin-Olacsi
5271c3b9e1 [fix] pixiv: update pixiv proxy docs URL in settings.yml 2026-01-26 19:31:10 +01:00
Markus Heiser
eea1892863 [fix] presearch - AttributeError: 'NoneType' object has no attribute 'territory' (#5687)
For unknown locales, the return value of::

    locales.get_locale(params['searxng_locale'])

is None which cuase the following issue::

    ERROR   searx.engines.presearch       : exception : 'NoneType' object has no attribute 'territory'
    Traceback (most recent call last):
      File "search/processors/online.py", line 256, in search
        search_results = self._search_basic(query, params)
      File "search/processors/online.py", line 231, in _search_basic
        self.engine.request(query, params)
        ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
      File "engines/presearch.py", line 153, in request
        request_id, cookies = _get_request_id(query, params)
                              ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
      File "engines/presearch.py", line 140, in _get_request_id
        if l.territory:
           ^^^^^^^^^^^
    AttributeError: 'NoneType' object has no attribute 'territory'

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2026-01-24 07:25:49 +01:00
dependabot[bot]
c97d4d9b6c [upd] pypi: Bump selenium from 4.39.0 to 4.40.0 in the minor group (#5684)
Bumps the minor group with 1 update: [selenium](https://github.com/SeleniumHQ/Selenium).


Updates `selenium` from 4.39.0 to 4.40.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.39.0...selenium-4.40.0)

---
updated-dependencies:
- dependency-name: selenium
  dependency-version: 4.40.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-23 10:57:27 +01:00
dependabot[bot]
38de71b3e0 [upd] web-client (simple): Bump vite in /client/simple (#5683)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.8 to 8.0.0-beta.9.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.9/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-23 10:45:21 +01:00
dependabot[bot]
a77d5d1258 [upd] web-client (simple): Bump @types/node (#5680)
Bumps the minor group in /client/simple with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 25.0.9 to 25.0.10
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.0.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-23 10:15:24 +01:00
dependabot[bot]
68944b4484 [upd] github-actions: Bump peter-evans/create-pull-request (#5681)
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 8.0.0 to 8.1.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](98357b18bf...c0f553fe54)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-23 10:14:17 +01:00
dependabot[bot]
c60f59609e [upd] github-actions: Bump actions/setup-python from 6.1.0 to 6.2.0 (#5682)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.1.0 to 6.2.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](83679a892e...a309ff8b42)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-23 10:13:22 +01:00
dependabot[bot]
8473b030c5 [upd] github-actions: Bump actions/cache from 5.0.1 to 5.0.2 (#5685)
Bumps [actions/cache](https://github.com/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/cache
  dependency-version: 5.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-23 10:10:38 +01:00
dependabot[bot]
9dd3baf45c [upd] github-actions: Bump actions/checkout from 6.0.1 to 6.0.2 (#5679)
Bumps [actions/checkout](https://github.com/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)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-23 10:10:14 +01:00
Hu Butui
410996df9e [fix] iqiyi: update album_info key
subscriptionContent -> subscriptContent

Signed-off-by: Hu Butui <hot123tea123@gmail.com>
2026-01-20 13:39:29 +01:00
Bnyro
313fda426c [fix] annas archive: rotate between available backup domains
- closes https://github.com/searxng/searxng/issues/5633
2026-01-20 13:39:19 +01:00
mg95
277be51bc0 [fix] google: decode urls before passing them onto results (#5674)
Fixes #5673
2026-01-19 21:21:22 +01:00
dependabot[bot]
2d9f213ca8 Bump wlc from 1.17.1 to 1.17.2 in the pip group across 1 directory (#5672)
Bumps the pip group with 1 update in the / directory: [wlc](https://github.com/WeblateOrg/wlc).


Updates `wlc` from 1.17.1 to 1.17.2
- [Release notes](https://github.com/WeblateOrg/wlc/releases)
- [Changelog](https://github.com/WeblateOrg/wlc/blob/main/CHANGES.rst)
- [Commits](https://github.com/WeblateOrg/wlc/compare/1.17.1...1.17.2)

---
updated-dependencies:
- dependency-name: wlc
  dependency-version: 1.17.2
  dependency-type: direct:development
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-16 19:42:07 +01:00
dependabot[bot]
97814c62a8 [upd] web-client (simple): Bump vite from 8.0.0-beta.7 to 8.0.0-beta.8 in /client/simple (#5668)
* [upd] web-client (simple): Bump vite in /client/simple

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.7 to 8.0.0-beta.8.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.8/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* [upd] theme: rebuild static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2026-01-16 10:58:36 +01:00
dependabot[bot]
ee4943ebd7 [upd] web-client (simple): Bump @types/node (#5667)
Bumps the minor group in /client/simple with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 25.0.3 to 25.0.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-16 10:22:50 +01:00
dependabot[bot]
086c1533a4 [upd] github-actions: Bump JamesIves/github-pages-deploy-action (#5666)
Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.6 to 4.8.0.
- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
- [Commits](9d877eea73...d92aa235d0)

---
updated-dependencies:
- dependency-name: JamesIves/github-pages-deploy-action
  dependency-version: 4.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-16 10:22:26 +01:00
dependabot[bot]
55c01c0757 [upd] github-actions: Bump github/codeql-action from 4.31.9 to 4.31.10 (#5665)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.9 to 4.31.10.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](5d4e8d1aca...cdefb33c0f)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-16 10:21:56 +01:00
dependabot[bot]
279e098168 [upd] github-actions: Bump actions/setup-node from 6.1.0 to 6.2.0 (#5664)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.1.0 to 6.2.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](395ad32622...6044e13b5d)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-16 10:21:32 +01:00
Bnyro
c4f1b216d1 [feat] brave: show related query suggestions (#5614) 2026-01-16 08:39:56 +01:00
Bnyro
b93a68bb48 [feat] engines: add fynd engine (#5616)
The engine is quite fast (< 30ms) and provides very
decent search results for most short queries.

More information:
- <https://fynd.com>
- <https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/>
2026-01-16 08:39:16 +01:00
dependabot[bot]
3f80eb80d0 [upd] pypi: Bump the minor group with 3 updates (#5670)
Bumps the minor group with 3 updates: [tomli](https://github.com/hukkin/tomli), [yamllint](https://github.com/adrienverge/yamllint) and [wlc](https://github.com/WeblateOrg/wlc).


Updates `tomli` from 2.3.0 to 2.4.0
- [Changelog](https://github.com/hukkin/tomli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hukkin/tomli/compare/2.3.0...2.4.0)

Updates `yamllint` from 1.37.1 to 1.38.0
- [Release notes](https://github.com/adrienverge/yamllint/releases)
- [Changelog](https://github.com/adrienverge/yamllint/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/adrienverge/yamllint/compare/v1.37.1...v1.38.0)

Updates `wlc` from 1.16.1 to 1.17.1
- [Release notes](https://github.com/WeblateOrg/wlc/releases)
- [Changelog](https://github.com/WeblateOrg/wlc/blob/main/CHANGES.rst)
- [Commits](https://github.com/WeblateOrg/wlc/compare/1.16.1...1.17.1)
2026-01-16 08:36:50 +01:00
github-actions[bot]
697f53ecde [l10n] update translations from Weblate (#5663)
9df66899a - 2026-01-12 - danilo-jlle <danilo-jlle@noreply.codeberg.org>
6152814e4 - 2026-01-10 - Maoyue_OUO <maoyue_ouo@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2026-01-16 08:24:58 +01:00
mg95
cf74e1d9e9 [fix] google: switch to using GSA for iPhone useragent 2026-01-11 16:21:01 +01:00
Bnyro
44405bd03c [fix] yep: fix 403 forbidden errors
Apparently, yep has been broken for a while. Measures to fix it:
- only use HTTP/1.1, because our HTTP2 client gets fingerprinted and blocked
- send the `Origin` HTTP header
2026-01-10 12:46:22 +01:00
Austin-Olacsi
26e275222b [feat] engines: add CachyOS Packages Search 2026-01-10 12:45:27 +01:00
Elvyria
ae48f50245 [mod] replace #suggestions list wrapper <div> with <ul> (#5575)
This PR removes the "dot" prefix value from the `#suggestions` list's entries and adds it back via CSS instead. It makes styling easier and less hacky for those who are interested, removing the dot with just styles is currently not as easy as I would like it to be.
2026-01-10 10:18:49 +01:00
dependabot[bot]
b83e88ea78 [upd] pypi: Bump the minor group with 5 updates (#5648)
Bumps the minor group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [granian](https://github.com/emmett-framework/granian) | `2.6.0` | `2.6.1` |
| [granian[pname]](https://github.com/emmett-framework/granian) | `2.6.0` | `2.6.1` |
| [typer-slim](https://github.com/fastapi/typer) | `0.21.0` | `0.21.1` |
| [granian[reload]](https://github.com/emmett-framework/granian) | `2.6.0` | `2.6.1` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.36.2` | `1.37.1` |


Updates `granian` from 2.6.0 to 2.6.1
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.6.0...v2.6.1)

Updates `granian[pname]` from 2.6.0 to 2.6.1
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.6.0...v2.6.1)

Updates `typer-slim` from 0.21.0 to 0.21.1
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.21.0...0.21.1)

Updates `granian[reload]` from 2.6.0 to 2.6.1
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.6.0...v2.6.1)

Updates `basedpyright` from 1.36.2 to 1.37.1
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.36.2...v1.37.1)

---
updated-dependencies:
- dependency-name: granian
  dependency-version: 2.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: granian[pname]
  dependency-version: 2.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: typer-slim
  dependency-version: 0.21.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: granian[reload]
  dependency-version: 2.6.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.37.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-09 11:17:12 +01:00
dependabot[bot]
a684b91fe7 [upd] web-client (simple): Bump vite from 8.0.0-beta.5 to 8.0.0-beta.7 in /client/simple (#5649)
* [upd] web-client (simple): Bump vite in /client/simple

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.5 to 8.0.0-beta.7.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* [fix] themes: rebuild static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2026-01-09 11:15:14 +01:00
dependabot[bot]
27d965234a [upd] web-client (simple): Bump @biomejs/biome (#5646)
Bumps the minor group in /client/simple with 1 update: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome).

Updates `@biomejs/biome` from 2.3.10 to 2.3.11
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.11/packages/@biomejs/biome)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-09 11:10:45 +01:00
dependabot[bot]
c769c194d6 [upd] web-client (simple): Bump stylelint-config-standard-less from 3.0.1 to 4.0.1 in /client/simple (#5647)
* [upd] web-client (simple): Bump stylelint-config-standard-less

Bumps [stylelint-config-standard-less](https://github.com/stylelint-less/stylelint-less/tree/HEAD/packages/stylelint-config-standard-less) from 3.0.1 to 4.0.1.
- [Release notes](https://github.com/stylelint-less/stylelint-less/releases)
- [Changelog](https://github.com/stylelint-less/stylelint-less/blob/main/packages/stylelint-config-standard-less/CHANGELOG.md)
- [Commits](https://github.com/stylelint-less/stylelint-less/commits/stylelint-config-standard-less@4.0.1/packages/stylelint-config-standard-less)

---
updated-dependencies:
- dependency-name: stylelint-config-standard-less
  dependency-version: 4.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* [fix] themes: rebuild static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2026-01-09 11:06:11 +01:00
searxng-bot
65186c3301 [l10n] update translations from Weblate
14c165051 - 2026-01-07 - Minami-o <minami-o@noreply.codeberg.org>
2026-01-09 10:39:57 +01:00
dependabot[bot]
f6a428b60d [upd] pypi: Bump certifi from 2025.11.12 to 2026.1.4
Bumps [certifi](https://github.com/certifi/python-certifi) from 2025.11.12 to 2026.1.4.
- [Commits](https://github.com/certifi/python-certifi/compare/2025.11.12...2026.01.04)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2026.1.4
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-09 10:37:06 +01:00
dependabot[bot]
3d88876a32 [upd] pypi: Bump types-lxml from 2025.11.25 to 2026.1.1 (#5622)
Bumps [types-lxml](https://github.com/abelcheung/types-lxml) from 2025.11.25 to 2026.1.1.

- [Release notes](https://github.com/abelcheung/types-lxml/releases)
- [Commits](https://github.com/abelcheung/types-lxml/compare/2025.11.25...2026.01.01)
2026-01-02 08:45:31 +01:00
github-actions[bot]
09bedef409 [l10n] update translations from Weblate (#5623)
0ebc2ba84 - 2025-12-30 - AndersNordh <andersnordh@noreply.codeberg.org>
012b6aa25 - 2025-12-26 - tace16 <tace16@noreply.codeberg.org>
2026-01-02 08:43:37 +01:00
github-actions[bot]
a5c946a321 [data] update searx.data - update_external_bangs.py (#5607) 2025-12-30 08:29:05 +01:00
Ivan Gabaldon
29042d8e5a [mod] docs: remove libera.chat channel (#5613)
Internal discussion (lack of time/moderation)
2025-12-30 08:21:39 +01:00
Tommaso Colella
c57db45672 [fix] 360search: fix engine by adding cookie caching
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-12-29 15:26:07 +01:00
searxng-bot
9491b514c9 [data] update searx.data - update_engine_descriptions.py 2025-12-29 15:24:06 +01:00
Tommaso Colella
320c317719 [mod] settings.yml: set engines that require an api key to inactive by default 2025-12-29 15:20:43 +01:00
Tommaso Colella
abae17e6fc [mod] docs: better explanation for search api usage and format support (#5574) 2025-12-29 15:04:33 +01:00
Austin-Olacsi
3baf5c38fc [fix] bilibili engine: send referer header 2025-12-29 14:59:08 +01:00
searxng-bot
ce46f30739 [data] update searx.data - update_currencies.py 2025-12-29 13:48:16 +01:00
searxng-bot
65a95539f1 [data] update searx.data - update_ahmia_blacklist.py 2025-12-29 13:47:12 +01:00
searxng-bot
874dc3f5ea [data] update searx.data - update_firefox_version.py 2025-12-29 13:46:57 +01:00
searxng-bot
7941719371 [data] update searx.data - update_wikidata_units.py 2025-12-29 13:46:46 +01:00
Aadniz
fa9729226b [fix] ahmia engine: increase timeout to 20 seconds 2025-12-26 18:22:15 +01:00
Aadniz
9df177af85 [fix] ahmia engine: Remove comment for EngineCache 2025-12-26 18:22:15 +01:00
Aadniz
f45123356b [fix] ahmia engine: requires rotating tokens to work
Ahmia recently implemented a 60 minute rotating token system when searching.

This fix uses the cache and updates the tokens on every request.
2025-12-26 18:22:15 +01:00
Aadniz
8851f4d6b1 [fix] searx.network: fix string concatenation of proxy error message 2025-12-26 18:07:51 +01:00
searxng-bot
f954423101 [l10n] update translations from Weblate
3a4b5f36f - 2025-12-24 - Stzyxh <stzyxh@noreply.codeberg.org>
e72be22b9 - 2025-12-23 - gallegonovato <gallegonovato@noreply.codeberg.org>
18a59dd67 - 2025-12-22 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
bf212eb3c - 2025-12-22 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
3525b547a - 2025-12-19 - MaiuZ <maiuz@noreply.codeberg.org>
2025-12-26 11:51:22 +01:00
dependabot[bot]
95e63ac32d [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.3 to 8.0.0-beta.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-26 11:47:23 +01:00
dependabot[bot]
fc6e59d3ec [upd] pypi: Bump the minor group with 2 updates (#5598)
Bumps the minor group with 2 updates: [typer-slim](https://github.com/fastapi/typer) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `typer-slim` from 0.20.0 to 0.21.0
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.20.0...0.21.0)

Updates `basedpyright` from 1.36.1 to 1.36.2
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.36.1...v1.36.2)

---
updated-dependencies:
- dependency-name: typer-slim
  dependency-version: 0.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.36.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
2025-12-26 10:03:42 +01:00
dependabot[bot]
da45859f32 [upd] pypi: Bump the minor group with 2 updates
Bumps the minor group with 2 updates: [selenium](https://github.com/SeleniumHQ/Selenium) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `selenium` from 4.38.0 to 4.39.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.38.0...selenium-4.39.0)

Updates `basedpyright` from 1.35.0 to 1.36.1
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.35.0...v1.36.1)

---
updated-dependencies:
- dependency-name: selenium
  dependency-version: 4.39.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.36.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-25 19:55:01 +01:00
Ivan Gabaldon
8bf600cc62 [fix] themes: rebuild static 2025-12-19 17:50:23 +00:00
dependabot[bot]
aa607a379a [upd] web-client (simple): Bump the minor group
Bumps the minor group in /client/simple with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.3.8` | `2.3.10` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.0.1` | `25.0.3` |
| [edge.js](https://github.com/edge-js/edge) | `6.3.0` | `6.4.0` |
| [less](https://github.com/less/less.js) | `4.4.2` | `4.5.1` |
| [sort-package-json](https://github.com/keithamus/sort-package-json) | `3.5.1` | `3.6.0` |
| [vite-bundle-analyzer](https://github.com/nonzzz/vite-bundle-analyzer) | `1.3.1` | `1.3.2` |

Updates `@biomejs/biome` from 2.3.8 to 2.3.10
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.10/packages/@biomejs/biome)

Updates `@types/node` from 25.0.1 to 25.0.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `edge.js` from 6.3.0 to 6.4.0
- [Release notes](https://github.com/edge-js/edge/releases)
- [Changelog](https://github.com/edge-js/edge/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/edge-js/edge/compare/v6.3.0...v6.4.0)

Updates `less` from 4.4.2 to 4.5.1
- [Release notes](https://github.com/less/less.js/releases)
- [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/less/less.js/commits)

Updates `sort-package-json` from 3.5.1 to 3.6.0
- [Release notes](https://github.com/keithamus/sort-package-json/releases)
- [Commits](https://github.com/keithamus/sort-package-json/compare/v3.5.1...v3.6.0)

Updates `vite-bundle-analyzer` from 1.3.1 to 1.3.2
- [Release notes](https://github.com/nonzzz/vite-bundle-analyzer/releases)
- [Changelog](https://github.com/nonzzz/vite-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nonzzz/vite-bundle-analyzer/compare/v1.3.1...v1.3.2)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 25.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: edge.js
  dependency-version: 6.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: less
  dependency-version: 4.5.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: sort-package-json
  dependency-version: 3.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: vite-bundle-analyzer
  dependency-version: 1.3.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-19 17:50:23 +00:00
dependabot[bot]
6ebd3f4d35 [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.2 to 8.0.0-beta.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-19 17:30:19 +00:00
searxng-bot
9072c77aea [l10n] update translations from Weblate
6fd00e66a - 2025-12-18 - dtalens <dtalens@noreply.codeberg.org>
037518f3b - 2025-12-17 - dtalens <dtalens@noreply.codeberg.org>
2025-12-19 08:37:40 +00:00
dependabot[bot]
c32b8100c3 [upd] github-actions: Bump actions/cache from 5.0.0 to 5.0.1
Bumps [actions/cache](https://github.com/actions/cache) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](a783357455...9255dc7a25)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-19 08:35:15 +00:00
dependabot[bot]
f93257941e [upd] github-actions: Bump github/codeql-action from 4.31.7 to 4.31.9
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.7 to 4.31.9.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](cf1bb45a27...5d4e8d1aca)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-19 08:34:32 +00:00
Guanzhong Chen
896863802e [fix] engine: brave - BrotliDecoderDecompressStream encoding issue (#5572)
For some reason, I keep getting this error from the brave engine:

    httpx.DecodingError: BrotliDecoderDecompressStream failed while processing the stream

Forcing the server to use either gzip or deflate fixes this issue.

This makes the brave engine work when the server seems to be encoding brotli incorrectly, or at least in a way incompatible with certain installs.

Related:

- https://github.com/searxng/searxng/pull/1787
- https://github.com/searxng/searxng/pull/5536
2025-12-17 09:39:03 +01:00
searxng-bot
920b40253c [l10n] update translations from Weblate
e23dc20f7 - 2025-12-11 - SomeTr <sometr@noreply.codeberg.org>
eb67f948f - 2025-12-11 - artnay <artnay@noreply.codeberg.org>
d4fdfc449 - 2025-12-10 - SomeTr <sometr@noreply.codeberg.org>
0f02ac7cd - 2025-12-10 - IcewindX <icewindx@noreply.codeberg.org>
533ae3947 - 2025-12-11 - return42 <return42@noreply.codeberg.org>
19fe65dc7 - 2025-12-11 - return42 <return42@noreply.codeberg.org>
bca557cea - 2025-12-09 - Hangry-Studios <hangry-studios@noreply.codeberg.org>
e43e9a299 - 2025-12-10 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
c98083cef - 2025-12-09 - eudemo <eudemo@noreply.codeberg.org>
316225017 - 2025-12-08 - aindriu80 <aindriu80@noreply.codeberg.org>
1b827e5a4 - 2025-12-08 - Aadniz <aadniz@noreply.codeberg.org>
68e760f9b - 2025-12-09 - kratos <makesocialfoss32@keemail.me>
99945ac31 - 2025-12-07 - lucasmz.dev <lucasmz.dev@noreply.codeberg.org>
56602eb75 - 2025-12-07 - Fjuro <fjuro@alius.cz>
df092e811 - 2025-12-06 - c2qd <c2qd@noreply.codeberg.org>
12c25cd85 - 2025-12-06 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
081243428 - 2025-12-05 - SomeTr <sometr@noreply.codeberg.org>
66362c02d - 2025-12-06 - ghose <ghose@noreply.codeberg.org>
2025-12-12 20:23:43 +00:00
dependabot[bot]
07440e3332 [upd] web-client (simple): Bump the minor group
Bumps the minor group in /client/simple with 2 updates: [sort-package-json](https://github.com/keithamus/sort-package-json) and [vite-bundle-analyzer](https://github.com/nonzzz/vite-bundle-analyzer).

Updates `sort-package-json` from 3.5.0 to 3.5.1
- [Release notes](https://github.com/keithamus/sort-package-json/releases)
- [Commits](https://github.com/keithamus/sort-package-json/compare/v3.5.0...v3.5.1)

Updates `vite-bundle-analyzer` from 1.2.3 to 1.3.1
- [Release notes](https://github.com/nonzzz/vite-bundle-analyzer/releases)
- [Changelog](https://github.com/nonzzz/vite-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nonzzz/vite-bundle-analyzer/compare/v1.2.3...v1.3.1)

---
updated-dependencies:
- dependency-name: sort-package-json
  dependency-version: 3.5.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite-bundle-analyzer
  dependency-version: 1.3.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 20:22:48 +00:00
dependabot[bot]
1827dfc071 [upd] web-client (simple): Bump @types/node in /client/simple
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.10.1 to 25.0.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 20:13:11 +00:00
dependabot[bot]
c46aecd4e3 [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.0-beta.0 to 8.0.0-beta.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.0-beta.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.0-beta.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 19:59:31 +00:00
dependabot[bot]
21bf8a6973 [upd] github-actions: Bump peter-evans/create-pull-request
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.9 to 8.0.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](84ae59a2cd...98357b18bf)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 19:56:18 +00:00
dependabot[bot]
f5475ba782 [upd] github-actions: Bump JamesIves/github-pages-deploy-action
Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.4 to 4.7.6.
- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
- [Commits](4a3abc783e...9d877eea73)

---
updated-dependencies:
- dependency-name: JamesIves/github-pages-deploy-action
  dependency-version: 4.7.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 19:52:52 +00:00
dependabot[bot]
265f15498c [upd] github-actions: Bump github/codeql-action from 4.31.6 to 4.31.7
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.6 to 4.31.7.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](fe4161a26a...cf1bb45a27)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 19:51:40 +00:00
dependabot[bot]
666409ec7e [upd] github-actions: Bump actions/cache from 4.3.0 to 5.0.0
Bumps [actions/cache](https://github.com/actions/cache) from 4.3.0 to 5.0.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0057852bfa...a783357455)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 19:51:17 +00:00
Viktor
b719d559b6 [feat] marginalia: switch to the new, improved API version 2025-12-09 18:18:37 +01:00
Austin-Olacsi
9d3ec9a2a2 [feat] pixiv engine: add filter for AI generated images 2025-12-07 23:34:16 +01:00
Ivan Gabaldon
74ec225ad1 [fix] themes: clear search input (#5540)
* [fix] themes: clear search input

Closes https://github.com/searxng/searxng/issues/5539

* [fix] themes: rebuild static
2025-12-07 13:26:01 +00:00
Markus Heiser
b5a1a092f1 [debug] partial revert of 5e0e1c6b3 (#5535)
Issue #5490 was caused by a regression of GH action in v6.0.0, updating to
v6.0.1 [2] fixed our workflow and debug messages are no longer needed.

[1] https://github.com/searxng/searxng/issues/5490#issuecomment-3616230451
[2] https://github.com/searxng/searxng/pull/5530

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-12-06 09:15:56 +01:00
dependabot[bot]
ddc6d68114 [upd] pypi: Bump the minor group with 2 updates (#5527)
Bumps the minor group with 2 updates: [pylint](https://github.com/pylint-dev/pylint) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `pylint` from 4.0.3 to 4.0.4
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v4.0.3...v4.0.4)

Updates `basedpyright` from 1.34.0 to 1.35.0
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.34.0...v1.35.0)
2025-12-05 15:39:35 +01:00
github-actions[bot]
32eb84d6d3 [l10n] update translations from Weblate (#5532) 2025-12-05 15:38:35 +01:00
Ivan Gabaldon
da6c635ea2 [upd] themes: update vite 2025-12-05 11:14:26 +00:00
dependabot[bot]
e34c356e64 [upd] web-client (simple): Bump the minor group
Bumps the minor group in /client/simple with 2 updates: [browserslist](https://github.com/browserslist/browserslist) and [mathjs](https://github.com/josdejong/mathjs).

Updates `browserslist` from 4.28.0 to 4.28.1
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.28.0...4.28.1)

Updates `mathjs` from 15.0.0 to 15.1.0
- [Changelog](https://github.com/josdejong/mathjs/blob/develop/HISTORY.md)
- [Commits](https://github.com/josdejong/mathjs/compare/v15.0.0...v15.1.0)

---
updated-dependencies:
- dependency-name: browserslist
  dependency-version: 4.28.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: mathjs
  dependency-version: 15.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-05 10:42:18 +00:00
dependabot[bot]
7017393647 [upd] github-actions: Bump actions/setup-node from 6.0.0 to 6.1.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](2028fbc5c2...395ad32622)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-05 10:26:25 +00:00
dependabot[bot]
aa49f5b933 [upd] github-actions: Bump github/codeql-action from 4.31.5 to 4.31.6
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.5 to 4.31.6.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](fdbfb4d275...fe4161a26a)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-05 10:25:37 +00:00
dependabot[bot]
3f91ac47e6 [upd] github-actions: Bump actions/checkout from 6.0.0 to 6.0.1
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.0 to 6.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](1af3b93b68...8e8c483db8)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-05 10:14:41 +00:00
Markus Heiser
8c631b92ce [mod] setup.py package_data - use recursive globs for package_data
To test this patch build a python wheel::

    $ make clean py.build

and llok out if you are missing any files in the wheel::

    $ unzip -l dist/searxng-*-py3-none-any.whl

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-12-04 15:04:36 +01:00
leaty
0ebac144f5 [fix] py: sxng wheel build still broken
Directories chunk and img were not included

Signed-off-by: leaty <dev@leaty.net>
2025-12-04 15:04:36 +01:00
Markus Heiser
5e0e1c6b31 [debug] CI - add debug to trace issue #5490 (#5519)
The error only occurs in the CI action, which is why we need to commit the coded
debug.  As soon as the bug is identified and fixed, this commit can be reverted
/ the ``set -x`` can be removed from the code.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-12-04 14:07:22 +01:00
Markus Heiser
3c7545c6ce [fix] plugin unit-converter - remove leftovers (#5517)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-12-04 07:51:48 +01:00
Austin-Olacsi
aba839195b [fix] findthatmeme: hardening the response against KeyErrors (#5516) 2025-12-04 07:13:05 +01:00
Bnyro
1f6ea41272 [fix] mojeek: first search page is rate-limited
Mojeek blocks all requests where the page offset parameter `s`
is set to 0, hence we may not set it for fetching the first results page.
2025-12-03 17:03:27 +01:00
Ivan Gabaldon
5450d22796 [fix] py: sxng wheel build broken (#5510)
Include everything inside `static/themes/` on SearXNG wheel creation.

```
2025-12-03 10:40:43,509 INFO🛞 adding
'searx/static/themes/simple/manifest.json' 2025-12-03 10:40:43,509
INFO🛞 adding 'searx/static/themes/simple/sxng-core.min.js'
2025-12-03 10:40:43,509 INFO🛞 adding
'searx/static/themes/simple/sxng-core.min.js.map' 2025-12-03
10:40:43,510 INFO🛞 adding
'searx/static/themes/simple/sxng-ltr.min.css' 2025-12-03 10:40:43,510
INFO🛞 adding 'searx/static/themes/simple/sxng-rss.min.css'
2025-12-03 10:40:43,511 INFO🛞 adding
'searx/static/themes/simple/sxng-rtl.min.css' 2025-12-03 10:40:43,511
INFO🛞 adding 'searx/static/themes/simple/chunk/13gvpunf.min.js'
2025-12-03 10:40:43,511 INFO🛞 adding
'searx/static/themes/simple/chunk/13gvpunf.min.js.map' 2025-12-03
10:40:43,516 INFO🛞 adding
'searx/static/themes/simple/chunk/BAcZkB_P.min.js' 2025-12-03
10:40:43,548 INFO🛞 adding
'searx/static/themes/simple/chunk/BAcZkB_P.min.js.map' 2025-12-03
10:40:43,551 INFO🛞 adding
'searx/static/themes/simple/chunk/CHkLfdMs.min.js' 2025-12-03
10:40:43,561 INFO🛞 adding
'searx/static/themes/simple/chunk/CHkLfdMs.min.js.map' 2025-12-03
10:40:43,562 INFO🛞 adding
'searx/static/themes/simple/chunk/CyyZ9XJS.min.js' 2025-12-03
10:40:43,562 INFO🛞 adding
'searx/static/themes/simple/chunk/CyyZ9XJS.min.js.map' 2025-12-03
10:40:43,562 INFO🛞 adding
'searx/static/themes/simple/chunk/DBO1tjH7.min.js' 2025-12-03
10:40:43,562 INFO🛞 adding
'searx/static/themes/simple/chunk/DBO1tjH7.min.js.map' 2025-12-03
10:40:43,562 INFO🛞 adding
'searx/static/themes/simple/chunk/Db5v-hxx.min.js' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/Db5v-hxx.min.js.map' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/DxJxX49r.min.js' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/DxJxX49r.min.js.map' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/KPZlR0ib.min.js' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/KPZlR0ib.min.js.map' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/Q2SRo2ED.min.js' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/Q2SRo2ED.min.js.map' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/gZqIRpW1.min.js' 2025-12-03
10:40:43,563 INFO🛞 adding
'searx/static/themes/simple/chunk/gZqIRpW1.min.js.map' 2025-12-03
10:40:43,564 INFO🛞 adding
'searx/static/themes/simple/img/empty_favicon.svg' 2025-12-03
10:40:43,564 INFO🛞 adding
'searx/static/themes/simple/img/favicon.png' 2025-12-03 10:40:43,564
INFO🛞 adding 'searx/static/themes/simple/img/favicon.svg'
2025-12-03 10:40:43,564 INFO🛞 adding
'searx/static/themes/simple/img/img_load_error.svg' 2025-12-03
10:40:43,564 INFO🛞 adding
'searx/static/themes/simple/img/searxng.png' 2025-12-03 10:40:43,564
INFO🛞 adding 'searx/static/themes/simple/img/searxng.svg'
2025-12-03 10:40:43,564 INFO🛞 adding
'searx/static/themes/simple/img/select-dark.svg' 2025-12-03 10:40:43,564
INFO🛞 adding 'searx/static/themes/simple/img/select-light.svg'
```
2025-12-03 11:21:18 +00:00
Bnyro
1174fde1f3 [feat] engines: add lucide icons (#5503) 2025-12-03 09:57:42 +01:00
Ivan Gabaldon
fb089ae297 [mod] client/simple: client plugins (#5406)
* [mod] client/simple: client plugins

Defines a new interface for client side *"plugins"* that coexist with server
side plugin system. Each plugin (e.g., `InfiniteScroll`) extends the base
`ts Plugin`. Client side plugins are independent and lazy‑loaded via `router.ts`
when their `load()` conditions are met. On each navigation request, all
applicable plugins are instanced.

Since these are client side plugins, we can only invoke them once DOM is fully
loaded. E.g. `Calculator` will not render a new `answer` block until fully
loaded and executed.

For some plugins, we might want to handle its availability in `settings.yml`
and toggle in UI, like we do for server side plugins. In that case, we extend
`py Plugin` instancing only the information and then checking client side if
[`settings.plugins`](1ad832b1dc/client/simple/src/js/toolkit.ts (L134))
array has the plugin id.

* [mod] client/simple: rebuild static
2025-12-02 10:18:00 +00:00
Bnyro
ab8224c939 [fix] brave: content description also contains website URL (#5502)
there are other classes like 'site-name-content' we don't want to match,
however only using contains(@class, 'content') would e.g. also match `site-name-content`
thus, we explicitly also require the spaces as class separator
2025-12-01 15:19:06 +01:00
github-actions[bot]
c954e71f87 [data] update searx.data - update_engine_descriptions.py (#5496) 2025-11-29 16:04:34 +01:00
Ivan Gabaldon
cbc04a839a [fix] py: missing module sniffio 2025-11-29 14:56:30 +00:00
searxng-bot
cb4a5abc8c [data] update searx.data - update_currencies.py 2025-11-29 14:54:09 +00:00
searxng-bot
07ff6e3ccc [data] update searx.data - update_wikidata_units.py 2025-11-29 09:00:05 +00:00
searxng-bot
cdaab944b4 [data] update searx.data - update_firefox_version.py 2025-11-29 08:58:56 +00:00
searxng-bot
6ecf32fd4a [data] update searx.data - update_ahmia_blacklist.py 2025-11-29 08:58:26 +00:00
Markus Heiser
20de10df4e Revert "[fix:py3.14] Struct fields aren't discovered in Python 3.14"
This reverts commit 8fdc59a760.
2025-11-28 13:38:37 +01:00
dependabot[bot]
673c29efeb [upd] pypi: Bump the minor group with 2 updates
Bumps the minor group with 2 updates: [msgspec](https://github.com/jcrist/msgspec) and [types-lxml](https://github.com/abelcheung/types-lxml).


Updates `msgspec` from 0.19.0 to 0.20.0
- [Release notes](https://github.com/jcrist/msgspec/releases)
- [Changelog](https://github.com/jcrist/msgspec/blob/main/docs/changelog.md)
- [Commits](https://github.com/jcrist/msgspec/compare/0.19.0...0.20.0)

Updates `types-lxml` from 2025.8.25 to 2025.11.25
- [Release notes](https://github.com/abelcheung/types-lxml/releases)
- [Commits](https://github.com/abelcheung/types-lxml/compare/2025.08.25...2025.11.25)

---
updated-dependencies:
- dependency-name: msgspec
  dependency-version: 0.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: types-lxml
  dependency-version: 2025.11.25
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-28 13:38:37 +01:00
dependabot[bot]
c4abf40e6e [upd] web-client (simple): Bump the minor group
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [sort-package-json](https://github.com/keithamus/sort-package-json) and [stylelint](https://github.com/stylelint/stylelint).

Updates `@biomejs/biome` from 2.3.7 to 2.3.8
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.8/packages/@biomejs/biome)

Updates `sort-package-json` from 3.4.0 to 3.5.0
- [Release notes](https://github.com/keithamus/sort-package-json/releases)
- [Commits](https://github.com/keithamus/sort-package-json/compare/v3.4.0...v3.5.0)

Updates `stylelint` from 16.25.0 to 16.26.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.25.0...16.26.0)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: sort-package-json
  dependency-version: 3.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 16.26.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-28 10:13:02 +00:00
dependabot[bot]
39b9922609 [upd] github-actions: Bump actions/setup-python from 6.0.0 to 6.1.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](e797f83bcb...83679a892e)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-28 09:28:12 +00:00
dependabot[bot]
7018e6583b [upd] github-actions: Bump peter-evans/create-pull-request
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.8 to 7.0.9.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](271a8d0340...84ae59a2cd)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 7.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-28 09:27:25 +00:00
dependabot[bot]
b957e587da [upd] github-actions: Bump github/codeql-action from 4.31.4 to 4.31.5
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.4 to 4.31.5.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](e12f017898...fdbfb4d275)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-28 09:25:18 +00:00
Markus Heiser
ebb9ea4571 [fix] brave engines - web, images & videos (#5478)
brave web:
  xpath selectors needed to be justified

brave images & videos:
  The JS code with the JS object was read incorrectly; not always, but quite
  often, it led to exceptions when the Python data structure was created from it.

BTW: A complete review was conducted and corrections or additions were made to
the type definitions.

To test all brave engines in once::

    !br !brimg !brvid !brnews weather

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-25 13:28:47 +01:00
Markus Heiser
54a97e1043 [mod] replace js_variable_to_python by js_obj_str_to_python (#2792) (#5477)
This patch is based on PR #2792 (old PR from 2023)

- js_obj_str_to_python handle more cases
- bring tests from chompjs ..
- comment out tests do not pass

The tests from chompjs give some overview of what is not implemented.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-25 12:51:08 +01:00
Markus Heiser
0ee78c19dd [mod] yandex engines: all egine should use one network
- The three Yandex engines should use the same network context.
- There is no reason to set these engines inactive

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-25 11:50:18 +01:00
Aadniz
bcc7a5eb2e [mod] yandex engine: add supported languages
Add support for Yandex's supported languages; Russian, English, Belarusian,
French, German, Indonesian, Kazakh, Tatar, Turkish and Ukrainian.
2025-11-25 11:50:18 +01:00
Markus Heiser
2313b972a3 [fix] engines: base URL can be a list or a string, but its not None!
The code injection and monkey patching examine the names in the module of the
engine; if a variable there starts without an underscore and has the value None,
then this variable needs to be configured. This outdated concept does not fit
engines that may have multiple URLs. At least not as long as the value of the
base URL (list) is None.

The default is now an empty list instead of None

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-25 06:25:45 +01:00
Markus Heiser
989b49335c [fix] engines initialization - if engine load fails, set to inactive
- if engine load fails, set the engine to inactive
- dont' load a engine, when the config says its inactive

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-25 06:25:45 +01:00
Markus Heiser
3f30831640 [fix] don't raise fatal exception when engine isn't available
When wikidata or any other engine with a init method (is active!)  raises an
exception in it's init method, the engine is never registered.

[1] https://github.com/searxng/searxng/issues/5456#issuecomment-3567790287

Closes: https://github.com/searxng/searxng/issues/5456
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-25 06:25:45 +01:00
Hermógenes Oliveira
5fcee9bc30 [fix] recoll engine: remove HTML markup from result snippets (#5472)
Recoll inserts markup tags in snippets to indicate matching terms in a
search query.  We remove them so that they don't show to users.
2025-11-24 06:54:45 +01:00
Ivan Gabaldon
2f0e52d6eb [upd] ci: docker secret maintenance
I've narrowed the permissions and rotated the token for the deploy account on
DockerHub registry. I replaced the secret ref in GitHub so that it's available
organization wide. No further actions are necessary.
2025-11-23 12:26:40 +00:00
Grant
c0d69cec4e [fix] drop mullvad-leta engine (#5428)
On 2025 November 27th, Mullvad will be shutting down the Leta servers.
For this reason, we also need to remove this engine from SearXNG.

[1] https://mullvad.net/en/blog/shutting-down-our-search-proxy-leta
2025-11-22 10:02:51 +01:00
Austin-Olacsi
c852b9a90a [feat] engine: add grokipedia (#5396) 2025-11-22 09:59:38 +01:00
Ivan Gabaldon
b876d0bed0 [upd] theme/simple: bump rolldown
(no static changes...)
2025-11-21 11:03:04 +00:00
Léon Tiekötter
e245cade25 [fix] engines: typo (#5466)
Fix typo in engine timeout definition: 'timout' -> 'timeout'
2025-11-21 11:20:10 +01:00
dependabot[bot]
7c223b32a7 [upd] web-client (simple): Bump @biomejs/biome
Bumps the minor group in /client/simple with 1 update: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome).

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-21 10:15:49 +00:00
dependabot[bot]
33a176813d [upd] github-actions: Bump actions/checkout from 5.0.0 to 6.0.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 5.0.0 to 6.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](08c6903cd8...1af3b93b68)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-21 09:38:50 +00:00
dependabot[bot]
20ec01c5f7 [upd] github-actions: Bump github/codeql-action from 4.31.3 to 4.31.4
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.3 to 4.31.4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](014f16e7ab...e12f017898)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-21 09:21:20 +00:00
dependabot[bot]
6376601ba1 [upd] pypi: Bump the minor group with 4 updates (#5462)
Bumps the minor group with 4 updates: [granian](https://github.com/emmett-framework/granian), [granian[pname]](https://github.com/emmett-framework/granian), [granian[reload]](https://github.com/emmett-framework/granian) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `granian` from 2.5.7 to 2.6.0
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.7...v2.6.0)

Updates `granian[pname]` from 2.5.7 to 2.6.0
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.7...v2.6.0)

Updates `granian[reload]` from 2.5.7 to 2.6.0
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.7...v2.6.0)

Updates `basedpyright` from 1.33.0 to 1.34.0
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.33.0...v1.34.0)
2025-11-21 08:31:16 +01:00
Markus Heiser
ca441f419c [fix] engines - set hard timouts in *sub-request* (#5460)
The requests changed here all run outside of the network context timeout,
thereby preventing the engine's timeout from being applied (the engine's timeout
can become longer than it was configured).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-21 08:16:24 +01:00
searxng-bot
04e66a2bb4 [l10n] update translations from Weblate 2025-11-20 21:22:43 +00:00
Markus Heiser
b299386d3e [fix] minor type hint issues (#5459)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-20 18:35:43 +01:00
Markus Heiser
21a4622f23 [fix] utils.js_variable_to_python - partial revert of 156d1eb8c (#5458)
The JS string, whose encoding will be corrupted if all single quotes (followed
by a comma) are replaced with double quotes. Bug was introduced in PR #4573.

Here is a simple example in which the list get corrupted::

    >>> s = r"""[ 'foo\'', 'bar']"""
    >>> print(s)
    [ 'foo\'', 'bar']
    >>> print(s.replace("',", "\","))
    [ 'foo\'", 'bar']

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-20 18:32:27 +01:00
Bnyro
041f457dfa [fix] presearch engine: blocked by captcha on every request
Presearch responds with a Cloudflare captcha on each request when using HTTP2.
Using HTTP1.1, everything seems to work fine.

- other engines with the same issue: pixabay, uxwing
- closes https://github.com/searxng/searxng/issues/5438
2025-11-20 13:48:13 +01:00
Hermógenes Oliveira
af111e413c [fix] recoll engine: fix media preview
The results from the recoll engine were not displaying the usual
toggle for showing media previews. After the changes described bellow,
the toggle is displayed and works as expected.

In the JSON returned by recoll-webui, the field containing the
mimetype is actually `mtype`, not `mime`.

Furthermore, according to the documentation for the `File` class in
`searx/result_types/file.py`, `embedded` should contain the URL to the
media itself. The embedding of the media into the page for preview is
done in `searx/templates/simple/result_templates/file.html`.
2025-11-20 13:24:17 +01:00
Ivan Gabaldon
431bf5d235 [mod] docs: add acknowledgements section (#5449)
* [mod] docs: add acknowledgements section

Moves all images into a `assets/` folder.

* [fix] docs: normalize brands svg
2025-11-20 10:31:53 +00:00
Edge-Seven
576c8ca99c [fix] client/simple: docs typo in plg.ts (#5450) 2025-11-18 09:44:41 +00:00
dependabot[bot]
45a4b8ad1c [upd] pypi: Bump the minor group with 3 updates (#5443)
Bumps the minor group with 3 updates: [certifi](https://github.com/certifi/python-certifi), [pylint](https://github.com/pylint-dev/pylint) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `certifi` from 2025.10.5 to 2025.11.12
- [Commits](https://github.com/certifi/python-certifi/compare/2025.10.05...2025.11.12)

Updates `pylint` from 4.0.2 to 4.0.3
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v4.0.2...v4.0.3)

Updates `basedpyright` from 1.32.1 to 1.33.0
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.32.1...v1.33.0)
2025-11-15 09:04:50 +01:00
Austin-Olacsi
d14d695966 [fix] drop alexandria.org (#5446) 2025-11-15 07:38:17 +01:00
dependabot[bot]
a2a47337cb [upd] web-client (simple): Bump the minor group (#5444)
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [browserslist](https://github.com/browserslist/browserslist).

Updates `@biomejs/biome` from 2.3.4 to 2.3.5
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.5/packages/@biomejs/biome)

Updates `@types/node` from 24.10.0 to 24.10.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `browserslist` from 4.27.0 to 4.28.0
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.27.0...4.28.0)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 24.10.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.28.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-14 21:50:02 +00:00
Bnyro
ba98030438 [feat] engines: add devicons engine
- official website: https://devicon.dev/
- the engine contains a lot of icons of popular software frameworks (e.g. pytest),
so they could for example be useful for visualizing a diagram of the tech stack used in an app
2025-11-14 20:26:43 +01:00
dependabot[bot]
1e200a1107 [upd] github-actions: Bump github/codeql-action from 4.31.2 to 4.31.3 (#5445)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.2 to 4.31.3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](0499de31b9...014f16e7ab)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-14 08:33:14 +00:00
Austin-Olacsi
7a1b959646 [fix] hackernews contains HTML escape codes 2025-11-10 20:37:01 +01:00
dependabot[bot]
b9b46431be [upd] web-client (simple): Bump the minor group in /client/simple with 4 updates (#5423)
* [upd] web-client (simple): Bump the minor group

Bumps the minor group in /client/simple with 4 updates: [ol](https://github.com/openlayers/openlayers), [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [sharp](https://github.com/lovell/sharp).

Updates `ol` from 10.6.1 to 10.7.0
- [Release notes](https://github.com/openlayers/openlayers/releases)
- [Commits](https://github.com/openlayers/openlayers/compare/v10.6.1...v10.7.0)

Updates `@biomejs/biome` from 2.3.2 to 2.3.4
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.4/packages/@biomejs/biome)

Updates `@types/node` from 24.9.2 to 24.10.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `sharp` from 0.34.4 to 0.34.5
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.34.4...v0.34.5)

---
updated-dependencies:
- dependency-name: ol
  dependency-version: 10.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 24.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: sharp
  dependency-version: 0.34.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* [upd] web-client (simple): rebuild static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-11-07 10:48:05 +01:00
dependabot[bot]
3f18c0f40f [upd] pypi: Bump the minor group with 3 updates (#5422)
Bumps the minor group with 3 updates: [granian](https://github.com/emmett-framework/granian), [granian[pname]](https://github.com/emmett-framework/granian) and [granian[reload]](https://github.com/emmett-framework/granian).


Updates `granian` from 2.5.6 to 2.5.7
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.6...v2.5.7)

Updates `granian[pname]` from 2.5.6 to 2.5.7
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.6...v2.5.7)

Updates `granian[reload]` from 2.5.6 to 2.5.7
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.6...v2.5.7)

---
updated-dependencies:
- dependency-name: granian
  dependency-version: 2.5.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: granian[pname]
  dependency-version: 2.5.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: granian[reload]
  dependency-version: 2.5.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-07 10:46:18 +01:00
dependabot[bot]
1cfbd32a1d [upd] github-actions: Bump JamesIves/github-pages-deploy-action (#5425)
Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.7.3 to 4.7.4.
- [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases)
- [Commits](6c2d9db40f...4a3abc783e)

---
updated-dependencies:
- dependency-name: JamesIves/github-pages-deploy-action
  dependency-version: 4.7.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-07 10:01:43 +01:00
dependabot[bot]
a15b594003 [upd] github-actions: Bump docker/setup-qemu-action from 3.6.0 to 3.7.0 (#5424)
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](29109295f8...c7c5346462)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: 3.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-07 09:56:18 +01:00
Aadniz
24d27a7a21 [fix] drop goo engine 2025-11-07 08:34:05 +01:00
Ivan Gabaldon
7af922c9df [enh] py: drop deps (#5407)
The difference between decompression with brotli or gzip in HTML files is
negligible for 3 MB of compiled binary package.

Introduced in eaa694fb7d

Closes https://github.com/searxng/searxng/security/code-scanning/276
Closes https://github.com/searxng/searxng/security/dependabot/37
2025-11-06 10:09:10 +01:00
Aadniz
b1918dd121 [fix] yandex engine: capture captcha from header instead of url path (#5417)
Yandex engine will return parsing error instead of informing that a CAPTCHA was found. It is confusing for the admin and the users (#5415).


This patch fixes an issue where the CAPTCHA response from Yandex wouldn't be detected, resulting in `ParserError` when trying to parse the response to DOM.

In this fix, I replaced the url condition and instead is checking if the `x-yandex-captcha` header is set, and is equal to `captcha`.

Alternatively, maybe something like `resp.headers.get('Location', '').startswith("https://yandex.com/showcaptcha")` could be done instead. Lastly, setting `params['allow_redirects'] = True` can also work, but this will waste an extra request. Just let me know.

Closes: https://github.com/searxng/searxng/issues/5415
2025-11-06 07:00:48 +01:00
Bnyro
1be19f8b58 [feat] sourcehut engine: implement as custom module, fix user agent
SourceHut uses a foss bot protection tool called `go-away` (which I can
recommend BTW).  It blocks common crawler user agents, such as the standard
Firefox user agent.  Hence, we're now using our custom SearXNG user agent to
clarify we're not a crawler.

Closes: https://github.com/searxng/searxng/issues/5270
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-05 17:56:13 +01:00
Bnyro
3763b4bff4 [fix] engine ahmia blacklist, arch linux: use proper searxng user agent including version (#5414) 2025-11-05 09:19:42 +01:00
Aadniz
52ffc4c7f4 [fix] qwant engine: order query parameters to prevent 403 forbidden (#5410) 2025-11-03 22:53:50 +01:00
Markus Heiser
0245327fc5 Revert "[fix] !weather crashes - cls.TURN .. (#5309)"
This reverts HOTFIX from commit fc7d8b8b [1]

[1] https://github.com/searxng/searxng/pull/5309

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-01 09:46:47 +01:00
Markus Heiser
b155e66fe5 [fix] msgspec.Struct: alias name t.ClassVar not properly detected
Reported in [1], HOTFIX in [2], this patch here is now the final solution.

Note that if using PEP 563 postponed evaluation of annotations" (e.g. ``from
__future__ import annotations``) only the following spellings will work:

    ClassVar or ClassVar[<type>]
    typing.ClassVar or typing.ClassVar[<type>]

Importing ClassVar or typing under an aliased name (e.g. ``import typing as t``)
will not be properly detected. [3]

[1] https://github.com/searxng/searxng/issues/5304#issuecomment-3394140820
[2] https://github.com/searxng/searxng/pull/5309
[3] https://jcristharif.com/msgspec/structs.html#class-variables

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-11-01 09:46:47 +01:00
dependabot[bot]
5712827703 [upd] web-client (simple): Bump the minor group (#5402)
Bumps the minor group in /client/simple with 2 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).

Updates `@biomejs/biome` from 2.2.7 to 2.3.2
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.2/packages/@biomejs/biome)

Updates `@types/node` from 24.9.1 to 24.9.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 24.9.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
2025-11-01 09:45:54 +01:00
dependabot[bot]
7ba53d302d [upd] pypi: Bump the minor group with 3 updates (#5401)
Bumps the minor group with 3 updates: [granian](https://github.com/emmett-framework/granian), [selenium](https://github.com/SeleniumHQ/Selenium) and [granian[reload]](https://github.com/emmett-framework/granian).


Updates `granian` from 2.5.5 to 2.5.6
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.5...v2.5.6)

Updates `selenium` from 4.37.0 to 4.38.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.37.0...selenium-4.38.0)

Updates `granian[reload]` from 2.5.5 to 2.5.6
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.5...v2.5.6)

---
updated-dependencies:
- dependency-name: granian
  dependency-version: 2.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: selenium
  dependency-version: 4.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian[reload]
  dependency-version: 2.5.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
2025-11-01 09:44:12 +01:00
dependabot[bot]
b8e4ebdc0c [upd] github-actions: Bump github/codeql-action from 4.30.9 to 4.31.2 (#5403)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.30.9 to 4.31.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](16140ae1a1...0499de31b9)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.31.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-31 11:31:10 +01:00
github-actions[bot]
b37d09557a [l10n] update translations from Weblate (#5404)
0bdbdde2e - 2025-10-26 - 0ko <0ko@noreply.codeberg.org>
7b0abb9aa - 2025-10-27 - artens <artens@noreply.codeberg.org>
882a28944 - 2025-10-27 - langckx <langckx@noreply.codeberg.org>
c2d025563 - 2025-10-25 - Flyingfufu <flyingfufu@noreply.codeberg.org>
2025-10-31 08:27:05 +01:00
Markus Heiser
aa28af772c [fix] ./manage dev.env - nvm is not installed by nvm.env (#5399)
To complete a SearXNG developer environment, nvm needs to be
installed (ensured).  Without this patch::

    $ LANG=C ./manage dev.env
    ...
    ./utils/lib_nvm.sh: line 27: .nvm/nvm.sh: No such file or directory
    ./utils/lib_nvm.sh: line 28: .nvm/bash_completion: No such file or directory
    ...
    (dev.env)$

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-30 17:46:05 +01:00
Markus Heiser
9c2b8f2f93 [data] update searx.data - update_ahmia_blacklist.py
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-30 07:40:20 +01:00
Markus Heiser
c48993452f [fix] update_ahmia_blacklist.py - User-Agent become required
The User-Agent header recently become required to fetch blacklist from URL

  https://ahmia.fi/blacklist/

[1] https://github.com/searxng/searxng/actions/runs/18892940199/job/53924400294

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-30 07:40:20 +01:00
Markus Heiser
6a2196c03d [fix] simple theme: fix *play* icon in the "show media" button (#5395)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-30 07:39:48 +01:00
github-actions[bot]
dce383881d [data] update searx.data - update_firefox_version.py (#5388) 2025-10-29 07:15:11 +01:00
github-actions[bot]
1ebedcbc17 [data] update searx.data - update_wikidata_units.py (#5389) 2025-10-29 07:14:31 +01:00
github-actions[bot]
5d99877d8d [data] update searx.data - update_currencies.py (#5390)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-10-29 07:13:53 +01:00
github-actions[bot]
adc1a2a1ea [data] update searx.data - update_engine_descriptions.py (#5391)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-10-29 07:13:19 +01:00
Aadniz
43065c5026 [fix] deviantart engine: pagination match change (#5384)
Pagination currently does not work for deviantart, resulting in the same page
being shown when going to the next page in SearXNG.
2025-10-28 06:21:40 +01:00
Aadniz
ea4a55fa57 [fix] qwant engine: set header Accept-Language to bypass bot detection (#5382)
Set HTTP header Accept-Language [1] for the Qwant engine.

Qwant does not seem to work on any SearXNG instance right now, and this is a fix
for this issue.

During testing, it seems like setting the Accept-Language gives more success for
bypassing bot detection (tested with a few ~20 searches).

[1] https://docs.searxng.org/dev/engines/enginelib.html#searx.enginelib.Engine.send_accept_language_header
2025-10-27 08:33:07 +01:00
Aadniz
d514dea5cc [fix] deviantart engine: does not return any results (#5383) 2025-10-27 08:02:01 +01:00
Aadniz
22e1d30017 [fix] startpage engine: properly display CAPTCHA if redirect page is seen (#5380)
Fixes an issue where startpage engine would display parsing error
(`json.decoder.JSONDecodeError`) when returning CAPTCHA redirect page.

The fix simply checks if response header has `Location` set, and if it starts
with `https://www.startpage.com/sp/captcha`, it will raise a CAPTCHA exception
before trying to parse the data.
2025-10-26 11:32:45 +01:00
Aadniz
4ca75a0450 [fix] engine qwant - return forbidden instead of showing parse error (#5377) 2025-10-25 13:43:37 +02:00
Bnyro
50a4c653dc [build] /static 2025-10-25 10:00:28 +02:00
Bnyro
b7f9b489c9 [fix] search bar: cursor jumps to beginning when clicking text field
Apparently, setting padding on an input field and then clicking that
space created by the padding forces the seekbar cursor to jump to the
beginning of the input field instead of the actual text position.

By removing that padding, the search bar input automatically claims that
height for itself and thus clicking on the blank space moves the cursor to
the correct position.

closes https://github.com/searxng/searxng/issues/5371
2025-10-25 10:00:28 +02:00
dependabot[bot]
2cdbbb249a [upd] web-client (simple): Bump the minor group (#5368)
Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [browserslist](https://github.com/browserslist/browserslist).

Updates `@biomejs/biome` from 2.2.6 to 2.2.7
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.2.7/packages/@biomejs/biome)

Updates `@types/node` from 24.8.1 to 24.9.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `browserslist` from 4.26.3 to 4.27.0
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.26.3...4.27.0)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.2.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 24.9.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.27.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-24 16:34:09 +02:00
Ivan Gabaldon
edfa71cdea [mod] rebuild static 2025-10-24 12:32:43 +02:00
Ivan Gabaldon
8dacbbbb15 [fix] client/simple: insecure ctx clipboard copy
Uses the deprecated [`execCommand()`](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand)
to copy content to clipboard if accessing the instance through HTTP, this method
isn't going away soon.

Closes https://github.com/searxng/searxng/issues/5359
2025-10-24 12:32:43 +02:00
dependabot[bot]
b770a46e1f [upd] pypi: Bump the minor group across 1 directory with 5 updates (#5372)
Bumps the minor group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [typer-slim](https://github.com/fastapi/typer) | `0.19.2` | `0.20.0` |
| [typing-extensions](https://github.com/python/typing_extensions) | `4.14.1` | `4.15.0` |
| [pylint](https://github.com/pylint-dev/pylint) | `4.0.1` | `4.0.2` |
| [selenium](https://github.com/SeleniumHQ/Selenium) | `4.36.0` | `4.37.0` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.31.7` | `1.32.1` |



Updates `typer-slim` from 0.19.2 to 0.20.0
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.19.2...0.20.0)

Updates `typing-extensions` from 4.14.1 to 4.15.0
- [Release notes](https://github.com/python/typing_extensions/releases)
- [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md)
- [Commits](https://github.com/python/typing_extensions/compare/4.14.1...4.15.0)

Updates `pylint` from 4.0.1 to 4.0.2
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v4.0.1...v4.0.2)

Updates `selenium` from 4.36.0 to 4.37.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.36.0...selenium-4.37.0)

Updates `basedpyright` from 1.31.7 to 1.32.1
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.31.7...v1.32.1)
2025-10-24 11:11:34 +02:00
github-actions[bot]
2c880f6084 [l10n] update translations from Weblate (#5370)
55c0cab85 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
7705bba80 - 2025-10-21 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
d2ee86058 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
8c4478ca3 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
147ba039a - 2025-10-21 - return42 <return42@noreply.codeberg.org>
2d9a206e8 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
024e2f1c7 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
8059378af - 2025-10-21 - return42 <return42@noreply.codeberg.org>
4b4359eea - 2025-10-21 - return42 <return42@noreply.codeberg.org>
05af879c9 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
0ea9d6393 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
e2e0907ff - 2025-10-21 - return42 <return42@noreply.codeberg.org>
9a7cfc1c1 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
06b7d62f0 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
a3bc054a5 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
34e56b171 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
8cc444358 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
55afa16d1 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
a336dd1ae - 2025-10-21 - return42 <return42@noreply.codeberg.org>
ec68a405a - 2025-10-21 - return42 <return42@noreply.codeberg.org>
beeab8c25 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
44a5c9e04 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
aef218710 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
42923cf46 - 2025-10-21 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
3cab50a73 - 2025-10-22 - jperegrinm <jperegrinm@noreply.codeberg.org>
410e760d5 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
bb5e921c3 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
eece61f04 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
1f18156d5 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
20026535d - 2025-10-21 - return42 <return42@noreply.codeberg.org>
fcc563bf8 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
ec02a81da - 2025-10-21 - return42 <return42@noreply.codeberg.org>
78125c9e6 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
7a4b89369 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
d02406831 - 2025-10-21 - return42 <return42@noreply.codeberg.org>
8fe4022cb - 2025-10-21 - return42 <return42@noreply.codeberg.org>
0e8cdcaa8 - 2025-10-20 - SomeTr <sometr@noreply.codeberg.org>
4b138b0dc - 2025-10-20 - Juno Takano <jutty@noreply.codeberg.org>
d20e2c9c1 - 2025-10-20 - ghose <ghose@noreply.codeberg.org>
2025-10-24 10:34:09 +02:00
dependabot[bot]
c41b769f97 [upd] github-actions: Bump github/codeql-action from 4.30.8 to 4.30.9 (#5369)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.30.8 to 4.30.9.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](f443b600d9...16140ae1a1)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.30.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-24 10:04:49 +02:00
Markus Heiser
e363db970c [fix] Installation Script install fails (msgspec) (#5358)
Since #5280 has been merged, msgspec, like yaml, is a fixed part of the SearXNG
*settings framework* and therefore, like yaml, must be installed in the virtual
environment before installing SearXNG (``searx``).

The actual reason is that in SearXNG we store settings in the configuration that
are required for the installation of the ``searx`` package.  This means that
these settings (from settings.yml) are read in during the installation, and all the
necessary tools for this (pyyaml, msgspec, setuptools, etc.) must be installed
beforehand (chicken or the egg dilemma).

Related:

- https://github.com/searxng/searxng/pull/5353
- https://github.com/searxng/searxng/pull/5346
- https://github.com/searxng/searxng/pull/5280
- https://github.com/searxng/searxng/pull/5254

Closes: https://github.com/searxng/searxng/issues/5357

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-23 09:27:14 +02:00
Ivan Gabaldon
16293132e3 [mod] ci: use custom static podman (#5354)
We only need updated podman on `build`. `test` and `release` can use image
provided container engine binaries.
2025-10-22 14:38:59 +02:00
Markus Heiser
f70120b0b9 [fix] Installation Script install fails (msgspec) (#5353)
Since #5280 has been merged, msgspec, like yaml, is a fixed part of the SearXNG
*settings framework* and therefore, like yaml, must be installed in the virtual
environment before installing SearXNG (``searx``).

The actual reason is that in SearXNG we store settings in the configuration that
are required for the installation of the ``searx`` package.  This means that
these settings (from settings.yml) are read in during the installation, and all the
necessary tools for this (pyyaml, msgspec, setuptools, etc.) must be installed
beforehand (chicken or the egg dilemma).

Related:

- https://github.com/searxng/searxng/pull/5346
- https://github.com/searxng/searxng/pull/5280
- https://github.com/searxng/searxng/pull/5254

Closes: https://github.com/searxng/searxng/issues/5352
2025-10-22 09:34:09 +02:00
Ivan Gabaldon
a8f3644cdc [upd] themes/simple: Bump rolldown-vite from 7.1.17 to 7.1.19 (#5351)
This security update does nothing but creating a new commit to build a container
with the new `base` image.
2025-10-21 20:16:19 +02:00
Markus Heiser
4295e758c0 [fix] Installation Script install fails (msgspec) (#5346)
Since #5280 has been merged, msgspec, like yaml, is a fixed part of the SearXNG
*settings framework* and therefore, like yaml, must be installed in the virtual
environment before installing SearXNG (``searx``).

The actual reason is that in SearXNG we store settings in the configuration that
are required for the installation of the ``searx`` package.  This means that
these settings (from settings.yml) are read in during the installation, and all the
necessary tools for this (pyyaml, msgspec, setuptools, etc.) must be installed
beforehand (chicken or the egg dilemma).

Related:

- https://github.com/searxng/searxng/pull/5280
- https://github.com/searxng/searxng/pull/5254

Closes: https://github.com/searxng/searxng/issues/5343

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-20 11:21:48 +02:00
Markus Heiser
33e798b01b [fix] TrackerPatternsDB.clean_url: don't delete query argument from new_url (#5339)
The query argument for URLs like:

- 'http://example.org?q='       --> query_str is 'q='
- 'http://example.org?/foo/bar' --> query_str is 'foo/bar'

is a *simple string* and not a key/value dict.  This string may only be removed
from the URL if one of the patterns matches.

BTW get_pretty_url(): keep such a *simple string* in the path element.

Closes: https://github.com/searxng/searxng/issues/5299

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-20 11:20:33 +02:00
Markus Heiser
d84ae96cf9 [build] /static 2025-10-20 10:18:33 +02:00
Markus Heiser
9371658531 [mod] typification of SearXNG: add new result type File
This PR adds a new result type: File

    Python class: searx/result_types/file.py
    Jinja template: searx/templates/simple/result_templates/file.html
    CSS (less) client/simple/src/less/result_types/file.less

Class 'File' (singular) replaces template 'files.html' (plural).  The renaming
was carried out because there is only one file (singular) in a result. Not to be
confused with the category 'files' where in multiple results can exist.

As mentioned in issue [1], the class '.category-files' was removed from the CSS
and the stylesheet was adopted in result_types/file.less (there based on the
templates and no longer based on the category).

[1] https://github.com/searxng/searxng/issues/5198

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-20 10:18:33 +02:00
Markus Heiser
ee6d4f322f [mod] engine: reuters - REST-API for Reuter's thumbnail, height:80
The size of the full-size images from ``thumbnail.url`` is usually several
MB. By reducing the full-size image to 80 pixels, the data size for a thumb is
reduced from MB to a few KB.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-18 14:43:35 +02:00
Bnyro
3725aef6f3 [fix] reuters: crash on empty results pages & date parsing
1. On empty result list, return empty EngineResults (#5330)

2. Use ``dateutil.parser`` to avoid ``ValueError``:

    ERROR   searx.engines.reuters : exception : Invalid isoformat string: '2022-06-08T16:07:54Z'
      File "searx/engines/reuters.py", line 91, in response
        publishedDate=datetime.fromisoformat(result["display_time"]),
    ValueError: Invalid isoformat string: '2022-06-08T16:07:54Z'

Closes: https://github.com/searxng/searxng/issues/5330
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-18 14:43:35 +02:00
Markus Heiser
e840e3f960 [fix] engine mullvadleta - ignore HTTP 403 & 429 response
It doesn't matter if you're using Mullvad's VPN and a proper browser, you'll
still get blocked for specific searches [1] with a 403 or 429 HTTP status code.
Mullvad only blocks the search request and doesn't prevent you from doing more
searches.

The logic should handle the blocked requests (403, 429), but not put the engine
on a cooldown.

[1] https://leta.mullvad.net/search?q=site%3Afoo+bar&engine=brave

Closes: https://github.com/searxng/searxng/issues/5328
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-18 09:05:54 +02:00
Bnyro
a6bb1ecf87 [build] /static 2025-10-17 15:59:53 +02:00
Bnyro
636738779e [feat] video results: display video length on video thumbnail 2025-10-17 15:59:53 +02:00
Bnyro
1d138c5968 [mod] bing engine: follow redirects (#5324)
Apparently, in China, Bing redirects from `www.bing.com` to `cn.bing.com`.
So in order to make Bing work for chinese users by default, we have to follow that redirect.

related: https://github.com/searxng/searxng/issues/5243
2025-10-17 15:43:49 +02:00
Markus Heiser
3e7e404fda [fix] issues reported by Pylint 4.0
Last major update of Pylint brings some breaking changes [1], fixed in this
patch.

[1] https://pylint.readthedocs.io/en/latest/whatsnew/4/4.0/index.html#breaking-changes
2025-10-17 15:42:22 +02:00
dependabot[bot]
602a73df9a [upd] pypi: Bump pylint from 3.3.9 to 4.0.1
Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.9 to 4.0.1.
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.9...v4.0.1)

---
updated-dependencies:
- dependency-name: pylint
  dependency-version: 4.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-17 15:42:22 +02:00
dependabot[bot]
57622793bf [upd] web-client (simple): Bump the minor group in /client/simple (#5333)
* [upd] web-client (simple): Bump the minor group

Bumps the minor group in /client/simple with 2 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).

Updates `@biomejs/biome` from 2.2.5 to 2.2.6
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.2.6/packages/@biomejs/biome)

Updates `@types/node` from 24.7.1 to 24.8.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.2.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 24.8.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* [build] /static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-10-17 10:29:16 +02:00
dependabot[bot]
080f3a5f87 [upd] github-actions: Bump actions/setup-node from 5.0.0 to 6.0.0 (#5334)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5.0.0 to 6.0.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](a0853c2454...2028fbc5c2)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-17 10:03:07 +02:00
dependabot[bot]
f54cf643b2 [upd] github-actions: Bump github/codeql-action from 4.30.7 to 4.30.8 (#5335)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.30.7 to 4.30.8.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](e296a93559...f443b600d9)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.30.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-17 10:02:59 +02:00
dependabot[bot]
dd82d785ce [upd] pypi: Bump basedpyright from 1.31.6 to 1.31.7 in the minor group (#5331)
Bumps the minor group with 1 update: [basedpyright](https://github.com/detachhead/basedpyright).

Updates `basedpyright` from 1.31.6 to 1.31.7
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.31.6...v1.31.7)
2025-10-17 09:43:36 +02:00
github-actions[bot]
f6cdd16449 [l10n] update translations from Weblate (#5336)
e23460caa - 2025-10-13 - aindriu80 <aindriu80@noreply.codeberg.org>
bb7d1cc0e - 2025-10-13 - Juno Takano <jutty@noreply.codeberg.org>
8b8bc1461 - 2025-10-13 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
f4bec8c6a - 2025-10-13 - Raithlin <raithlin@noreply.codeberg.org>
609efd4e6 - 2025-10-13 - AndersNordh <andersnordh@noreply.codeberg.org>
6c709f898 - 2025-10-13 - return42 <return42@noreply.codeberg.org>
a2b608da4 - 2025-10-13 - AndersNordh <andersnordh@noreply.codeberg.org>
4f0cd2119 - 2025-10-12 - kratos <makesocialfoss32@keemail.me>
8d049e1cb - 2025-10-11 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
4bf5fc5fe - 2025-10-11 - Linerly <linerly@noreply.codeberg.org>
c80cf6e92 - 2025-10-11 - ghose <ghose@noreply.codeberg.org>
92427655d - 2025-10-11 - Fjuro <fjuro@alius.cz>
8efe1bb12 - 2025-10-10 - SomeTr <sometr@noreply.codeberg.org>
2025-10-17 09:41:21 +02:00
benpiano800
576d30ffcd [chore] theme_args.simple_style - mention the black theme style in settings.yml (#5325) 2025-10-15 09:16:19 +02:00
Tommaso Colella
c34bb61284 [feat] engines: add Azure resources engine (#5235)
Adds a new engine `searx/engines/azure.py` to search cloud resources on Azure.

A lot of enterprise users have to deal with Azure Public Cloud.  This helps them
easily search for cloud resources without logging in to the Portal first

How to test this PR locally?

You should create an App Registration on Azure Entra Id with Reader access on
the resources you want to search for.  You should create a Secret for the App
Registration.  After that, you should set up appropriate values in the
`settings.yml` file [1]::

   - name: azure
     engine: azure
     ...
     azure_tenant_id: "your_tenant_id"
     azure_client_id: "your_client_id"
     azure_client_secret: "your_client_secret"
     azure_token_expiration_seconds: 5000

[1] https://github.com/searxng/searxng/pull/5235#issuecomment-3397664928

Co-authored-by: Bnyro <bnyro@tutanota.com>
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-13 16:33:08 +02:00
Bnyro
8baefcc21e [fix] pinterest: crash when there's no link & show image resolution + uploader name (#5314)
closes #5231
2025-10-13 07:43:36 +02:00
Markus Heiser
fc7d8b8be2 [fix] !weather crashes - cls.TURN 'member_descriptor' isn't a float (#5309)
The class method ``Compass.point`` is converted into an instance method to
circumvent the problem described in [1] (without understanding the cause).

[1] https://github.com/searxng/searxng/issues/5304#issuecomment-3394140820

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-13 07:37:42 +02:00
Ivan Gabaldon
5492de15bb [mod] container: move base to own repository (#5310)
The base images will be now built in
[another repository](https://github.com/searxng/base).
2025-10-12 16:30:57 +02:00
Ivan Gabaldon
ced08e12aa [enh] ci: bump to cp3.14 (#5302) 2025-10-11 16:59:40 +02:00
Mehmet Sait Cubukcu
613c1aa8eb docs: remove unsupported --replace flag from Docker command (#5288) 2025-10-10 20:31:48 +02:00
Bnyro
899cf7e08a [build] /static 2025-10-10 18:08:33 +02:00
Bnyro
362cc13aeb [feat] preferences hash: show applied settings in pref page when searching with 'search url of the currently saved preferences'
Previously, when using a search url copied from the cookies tab, clicking
at the settings icon at the top right would show the browser preferences
and not the preferences that were set and used with the search url.
Please see https://github.com/searxng/searxng/issues/5227 for more information.

To test:
- change some preferences
- copy the preferences search url in the settings' cookies tab
- reset the preferences or clear cookies
- paste the copied search url into the search bar to search for something
- press the settings icon
- you can now see/preview the actual settings that were used for the search
- by pressing 'save', you can keep these preferences

closes #5227
2025-10-10 18:08:33 +02:00
Bnyro
d28a1c434f [fix] no results error dialog: link to preferences doesn't work if searxng is hosted as subdirectory 2025-10-10 18:05:54 +02:00
Markus Heiser
21d0428cf2 [mod] brand - partial migration of settings to msgspec.Struct (#5280)
The settings are currently an untyped key/value structure, whose types are
dynamically built at runtime.  The construction process of this structure
is *hand-crafted*.

In the long term, we want a static typing of this structure, based on a standard
tool.  The ``msgspec.Struct`` structures are suitable as a standard tool.

This patch makes a first step towards static typing and implements the "brand"
section using ``msgspec.Struct`` structures.

BTW: searx/settings_defaults.py - ``git_url`` and ``git_branch`` had been
removed in aee613d256, this is a leftover.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-10 16:14:29 +02:00
github-actions[bot]
f0dfe3cc0e [l10n] update translations from Weblate (#5296)
bb1f7a851 - 2025-10-04 - 0ko <0ko@noreply.codeberg.org>
2025-10-10 11:27:35 +02:00
dependabot[bot]
0559b9bfcf [upd] web-client (simple): bump dependencies (#5294)
* [upd] web-client (simple): bump dependencies

* [build] /static

---------

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-10-10 11:14:54 +02:00
dependabot[bot]
37f7960266 [upd] github-actions: Bump github/codeql-action from 3.30.6 to 4.30.7 (#5295)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.6 to 4.30.7.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](64d10c1313...e296a93559)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.30.7
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-10 10:55:50 +02:00
dependabot[bot]
02d5166a3b [upd] pypi: Bump the minor group with 6 updates (#5293)
Bumps the minor group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [granian](https://github.com/emmett-framework/granian) | `2.5.4` | `2.5.5` |
| [certifi](https://github.com/certifi/python-certifi) | `2025.8.3` | `2025.10.5` |
| [tomli](https://github.com/hukkin/tomli) | `2.2.1` | `2.3.0` |
| [pylint](https://github.com/pylint-dev/pylint) | `3.3.8` | `3.3.9` |
| [wlc](https://github.com/WeblateOrg/wlc) | `1.15` | `1.16.1` |
| [granian[reload]](https://github.com/emmett-framework/granian) | `2.5.4` | `2.5.5` |


Updates `granian` from 2.5.4 to 2.5.5
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.4...v2.5.5)

Updates `certifi` from 2025.8.3 to 2025.10.5
- [Commits](https://github.com/certifi/python-certifi/compare/2025.08.03...2025.10.05)

Updates `tomli` from 2.2.1 to 2.3.0
- [Changelog](https://github.com/hukkin/tomli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hukkin/tomli/compare/2.2.1...2.3.0)

Updates `pylint` from 3.3.8 to 3.3.9
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.8...v3.3.9)

Updates `wlc` from 1.15 to 1.16.1
- [Release notes](https://github.com/WeblateOrg/wlc/releases)
- [Changelog](https://github.com/WeblateOrg/wlc/blob/main/CHANGES.rst)
- [Commits](https://github.com/WeblateOrg/wlc/compare/1.15...1.16.1)

Updates `granian[reload]` from 2.5.4 to 2.5.5
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.4...v2.5.5)

---
updated-dependencies:
- dependency-name: granian
  dependency-version: 2.5.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: certifi
  dependency-version: 2025.10.5
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: tomli
  dependency-version: 2.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: pylint
  dependency-version: 3.3.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: wlc
  dependency-version: 1.16.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian[reload]
  dependency-version: 2.5.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
2025-10-10 09:09:57 +02:00
Markus Heiser
954f0f62b4 [fix] startpage engine - SafeSearch works in reverse (#5290)
The Name of the option is *disable_family_filter* ->  we have to reverse the
meaning of the ascending safe-search filter level.

Closes: https://github.com/searxng/searxng/issues/5287

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-09 16:06:46 +02:00
Markus Heiser
898fbe7bc2 [mod] ci: add cp3.14 (part 2)
Use stable version (remove `-dev` suffix).
Stop CI on error [1] / Don't ignore when 3.14 ends with ERROR.

[1] https://github.com/searxng/searxng/pull/5217

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-08 13:47:22 +02:00
Markus Heiser
d16283d93a [fix:py3.14] using a non-empty mutable collection as default is unsafe
Starting with Python 3.14 msgspec reports::

    File "/share/searxng/searx/weather.py", line 261, in <module>
        class Temperature(msgspec.Struct, kw_only=True):
        ...<60 lines>...
                return template.format(value=val_str, unit=unit)
    TypeError: Using a non-empty mutable collection (['°C', '°F', 'K']) \
               as a default value is unsafe.\
               Instead configure a `default_factory` for this field.

The problem is solved by the fact that there are now global constants for the
units (BTW singular/plural names of the type definitions are fixed):

- TEMPERATURE_UNITS
- PRESSURE_UNITS
- WIND_SPEED_UNITS
- RELATIVE_HUMIDITY_UNITS
- COMPASS_POINTS
- COMPASS_UNITS

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-08 13:47:22 +02:00
Markus Heiser
8fdc59a760 [fix:py3.14] Struct fields aren't discovered in Python 3.14
This is a temporary workaround for #5284 [1].  However, the problem must be
solved at a different level, in msgspec [2].

[1] https://github.com/searxng/searxng/issues/5284
[2] https://github.com/jcrist/msgspec/issues/847

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-08 13:47:22 +02:00
Markus Heiser
d8d5de4d47 [fix] google scholar - detect CAPTCHA (HTTP redirects) (#5268)
In the case of .. response, for example, an HTTP 302 is returned by Google
Scholar::

    Our systems have detected unusual traffic from your computer
    network. Please try again later.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-06 10:12:38 +02:00
Markus Heiser
34eb32f418 [fix] ModuleNotFoundError: No module named 'lxml' (#5254)
When installing SearXNG (e.g.):

    pip install --use-pep517 --no-build-isolation -e .

An import exception is raised:

    ModuleNotFoundError: No module named 'lxml'

The ``setup.py`` file imports ``searx``, which in turn triggers various other
imports.  However, the name XPath is only needed for type checking.

Closes: https://github.com/searxng/searxng/issues/5177

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-05 11:44:13 +02:00
dependabot[bot]
7bf65d68c2 [upd] pypi: Bump the minor group with 2 updates (#5274)
Bumps the minor group with 2 updates: [selenium](https://github.com/SeleniumHQ/Selenium) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `selenium` from 4.35.0 to 4.36.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.35.0...selenium-4.36.0)

Updates `basedpyright` from 1.31.5 to 1.31.6
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.31.5...v1.31.6)

---
updated-dependencies:
- dependency-name: selenium
  dependency-version: 4.36.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: basedpyright
  dependency-version: 1.31.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
2025-10-04 18:07:44 +02:00
dependabot[bot]
e0b680853d [upd] web-client (simple): Bump the minor group (#5277)
Bumps the minor group in /client/simple with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.2.4` | `2.2.5` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.5.2` | `24.6.2` |
| [browserslist](https://github.com/browserslist/browserslist) | `4.26.2` | `4.26.3` |
| [lightningcss](https://github.com/parcel-bundler/lightningcss) | `1.30.1` | `1.30.2` |
| [typescript](https://github.com/microsoft/TypeScript) | `5.9.2` | `5.9.3` |

Updates `@biomejs/biome` from 2.2.4 to 2.2.5
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.2.5/packages/@biomejs/biome)

Updates `@types/node` from 24.5.2 to 24.6.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `browserslist` from 4.26.2 to 4.26.3
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.26.2...4.26.3)

Updates `lightningcss` from 1.30.1 to 1.30.2
- [Release notes](https://github.com/parcel-bundler/lightningcss/releases)
- [Commits](https://github.com/parcel-bundler/lightningcss/compare/v1.30.1...v1.30.2)

Updates `typescript` from 5.9.2 to 5.9.3
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.2...v5.9.3)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.2.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 24.6.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.26.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: lightningcss
  dependency-version: 1.30.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: typescript
  dependency-version: 5.9.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-04 14:22:51 +02:00
github-actions[bot]
cdf5f4343a [l10n] update translations from Weblate (#5278)
9e090cc25 - 2025-10-01 - Ricky-Tigg <ricky-tigg@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-10-03 10:14:21 +02:00
dependabot[bot]
3c63d346d9 [upd] github-actions: Bump github/codeql-action from 3.30.4 to 3.30.6 (#5276)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.4 to 3.30.6.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](303c0aef88...64d10c1313)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.30.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-03 09:46:04 +02:00
dependabot[bot]
43a5129a1c [upd] github-actions: Bump docker/login-action from 3.5.0 to 3.6.0 (#5275)
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.5.0 to 3.6.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](184bdaa072...5e57cd1181)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-03 09:45:15 +02:00
Markus Heiser
c6f1ea12b1 [fix] engine - cppreference has no longer a search function (#5273)
cppreference has replaced its search (``mwiki/index.php?title=``) with a DDG
search.

The engine was first introduced in SearXNG with PR-3274 [1], and even back then
the mediawiki proved to be incompatible, which is why the API could not be used
at the time. Now there isn't even a dedicated search function anymore.. I think
the cppreference project suffers from a lack of maintenance.

[1] https://github.com/searxng/searxng/pull/3247

Closes: https://github.com/searxng/searxng/issues/5271

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-03 08:40:24 +02:00
Markus Heiser
06e4f4f758 [mod] drop searxng_extra/standalone_searx.py (#5256)
This is an old and grumpy hack / SearXNG is a Flask application with
client/server structure, which can't be turned into a command line tool the way
it was done here.

Maintaining this hack is becoming increasingly complex the more we try to
remodel the core code, which is why we should now remove the hack from SearXNG.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-01 07:34:53 +02:00
Markus Heiser
748b521ac6 [fix] searx/results.py - TypeError: object of type 'NoneType' has no len()
In some engines, under certain circumstances, the content field can also have
the value ``None``; in these cases, a length check results in an exception::

    File "/usr/local/searxng/searx/results.py", line 360, in merge_two_main_results
        if len(other.content) > len(origin.content):
           ^^^^^^^^^^^^^^^^^^
    TypeError: object of type 'NoneType' has no len()

[1] https://github.com/searxng/searxng/issues/5250#issuecomment-3352863488

Reported-by: @scross01 [1]
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-01 07:13:10 +02:00
Markus Heiser
e16b6cb148 [fix] JSON format: serialization of the result-types
The ``JSONEncoder`` (``format="json"``) must perform a conversion to the
built-in types for the ``msgspec.Struct``::

    if isinstance(o, msgspec.Struct):
        return msgspec.to_builtins(o)

The result types are already of type ``msgspec.Struct``, so they can be
converted into built-in types.

The field types (in the result type) that were not yet of type ``msgspec.Struct``
have been converted to::

    searx.weather.GeoLocation@dataclass -> msgspec.Struct
    searx.weather.DateTime              -> msgspec.Struct
    searx.weather.Temperature           -> msgspec.Struct
    searx.weather.PressureUnits         -> msgspec.Struct
    searx.weather.WindSpeed             -> msgspec.Struct
    searx.weather.RelativeHumidity      -> msgspec.Struct
    searx.weather.Compass               -> msgspec.Struct

BTW: Wherever it seemed sensible, the typing was also modernized in the modified
files.

Closes: https://github.com/searxng/searxng/issues/5250
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-01 07:13:10 +02:00
Ivan Gabaldon
41e0f2abf0 [doc] dev - cleanup asdf remnants and add a note about mise-en-place (#5264)
Notes on the developer environment with MISE have been added to the Quickstart
Guide.  We migrated `.tool-versions` to replace it with `mise` [1], so we can
now remove `asdf` related documentation.

[1] https://github.com/searxng/searxng/pull/5253

Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-10-01 06:29:07 +02:00
searxng-bot
0f3ef5da59 [data] update searx.data - update_engine_traits.py 2025-09-30 16:48:59 +02:00
Markus Heiser
defd4d87c4 [fix] fetch traits, even for inactive instances
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-30 16:48:59 +02:00
Ivan Gabaldon
ebc61debf9 [fix] ci: missing container (#5263)
This workflow is no longer needed.
2025-09-29 15:15:54 +02:00
github-actions[bot]
77fd3ee534 [data] update searx.data - update_currencies.py (#5261)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-09-29 07:37:30 +02:00
github-actions[bot]
b8e60542d9 [data] update searx.data - update_engine_descriptions.py (#5262)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-09-29 07:36:51 +02:00
github-actions[bot]
5513549adc [data] update searx.data - update_wikidata_units.py (#5259)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-09-29 07:35:10 +02:00
github-actions[bot]
cd2ea7c5f5 [data] update searx.data - update_ahmia_blacklist.py (#5257)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-09-29 07:34:38 +02:00
searxng-bot
38b80133f7 [data] update searx.data - update_firefox_version.py 2025-09-29 07:33:19 +02:00
Markus Heiser
2f0d96b8bc [fix] sqlitedb: DB connector -- unset isolation_level
A Connection object can be used as a context manager that automatically commits
or rolls back open transactions when leaving the body of the context manager.

If the connection attribute ``isolation_level`` is **not** ``None``, new
transactions are implicitly opened before ``execute()`` and ``executemany()``
executes SQL- INSERT, UPDATE, DELETE, or REPLACE statements [1].

The old implementation set ``isolation_level`` to ``None`` and thereby prevented
the context manager from opening and closing the transaction scopes.

[1] https://docs.python.org/3/library/sqlite3.html#sqlite3-transaction-control-isolation-level
[2] https://github.com/searxng/searxng/pull/5239#discussion_r2381416731

Reported-by: Ivan G <igabaldon@inetol.net> [2]
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-28 07:32:41 +02:00
Markus Heiser
18a58943cc [mod] ExpireCacheSQLite - implement .setmany() for bulk loading
[1] https://github.com/searxng/searxng/issues/5223#issuecomment-3328597147

Suggested-by: Ivan G <igabaldon@inetol.net> [1]
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-28 07:32:41 +02:00
Markus Heiser
4f4de3fc87 [fix] openstreetmap: fix CURRENCIES.iso4217_to_name
This patch is a leftover from PR-5204 [1].

[1] https://github.com/searxng/searxng/pull/5204

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-28 07:32:41 +02:00
Markus Heiser
4445f26f5a [mod] run bootload of the CURRENCIES cache on demand
In [1] it can be seen that the bootload of the CURRENCIES cache takes about 2/3
of the time required to initialize SearXNG.  Whatever the absolute durations may
be, an explicit bootload during the SearXNG initialization is not required, as
the bootload is already ensured by the API of the CACHE.

- ``CurrenciesDB.name_to_iso4217``
- ``CurrenciesDB.iso4217_to_name``

The fact that the bootload now occurs on-demand should improve the
initialization time of SearXNG.

[1] https://github.com/searxng/searxng/issues/5223#issuecomment-3323083411

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-28 07:32:41 +02:00
Markus Heiser
62b0b3f697 [mod] debug-log the bootload of the CURRENCIES caches (CurrenciesDB)
The time for the bootload is measured and recorded.  To have an eye on the
bootload time is motivated by: In [1] it can be seen that the bootload of the
CURRENCIES cache takes about 2/3 of the time required to initialize SearXNG::

    6.068 <module>  searx/webapp.py:1
    └─ 6.068 wrapper  pyinstrument/context_manager.py:52
       ├─ 5.538 init  searx/webapp.py:1373
       │  ├─ 4.822 initialize  searx/search/__init__.py:34
       │  │  ├─ 4.631 ProcessorMap.init  searx/search/processors/__init__.py:47
       │  │  │  ├─ 4.607 OnlineCurrencyProcessor.initialize  searx/search/processors/online_currency.py:55
       │  │  │  │  └─ 4.607 CurrenciesDB.init  searx/data/currencies.py:25
       │  │  │  │     ├─ 4.601 CurrenciesDB.load  searx/data/currencies.py:34
       │  │  │  │     │  ├─ 4.572 ExpireCacheSQLite.set  searx/cache.py:334

In the example, the CurrenciesDB.init call takes 4.6 seconds... on my laptop,
CurrenciesDB.init takes only 0.7 seconds.  The absolute numerical values depend
on external conditions, where I already find 4-5 seconds very long. Test::

    $ rm /tmp/sxng_cache_*.db*
    $ make run 2>&1 | grep "searx.data.CURRENCIES"
    DEBUG   searx.data : init searx.data.CURRENCIES
    DEBUG   searx.data : init searx.data.CURRENCIES added 9089 items in 0.7623255252838135 sec.

[1] https://github.com/searxng/searxng/issues/5223#issuecomment-3323083411

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-28 07:32:41 +02:00
Markus Heiser
87bc97776a [mod] pin external developer tools (mise en place) (#5253)
Mise en place config [1] does no longer support ``.tool-versions``
compatibility syntax, migrate to TOML ``mise.toml``.

In ``utils/lib_sxng_node.sh`` the node version was not updated, update to
24.3.0 (compare ``mise.toml``).

[1] https://mise.jdx.dev/configuration.html

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-27 07:18:50 +02:00
Markus Heiser
77068ce20b [upd] pypi: Bump sphinx from 7.4.7 to 8.2.3 (#5252)
- supersede: https://github.com/searxng/searxng/pull/4377

Sphinx 8.2 dropped Python 3.10 support, last versions supporting Python 3.10:

- Sphinx==8.1.3
- sphinx-autobuild==2024.10.3

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-26 16:57:01 +02:00
Markus Heiser
81cbe0befe [upd] pypi: Bump black from 24.3.0 to 25.9.0 (#5251)
In 25.1.0 [2] an old bug has been fixed: "Docstring formatting does not apply to
module docstrings" [3].

[1] https://github.com/psf/black/blob/main/CHANGES.md#2590
[2] https://github.com/psf/black/blob/main/CHANGES.md#2510
[3] https://github.com/psf/black/issues/4094

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-26 12:35:57 +02:00
dependabot[bot]
1091643f32 [upd] github-actions: Bump actions/cache from 4.2.4 to 4.3.0 (#5249)
Bumps [actions/cache](https://github.com/actions/cache) from 4.2.4 to 4.3.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](0400d5f644...0057852bfa)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-26 10:46:19 +02:00
dependabot[bot]
899ae9a6e4 [upd] pypi: Bump myst-parser from 3.0.1 to 4.0.0 (#3719)
Bumps [myst-parser](https://github.com/executablebooks/MyST-Parser) from 3.0.1 to 4.0.0.
- [Release notes](https://github.com/executablebooks/MyST-Parser/releases)
- [Changelog](https://github.com/executablebooks/MyST-Parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/executablebooks/MyST-Parser/compare/v3.0.1...v4.0.0)

---
updated-dependencies:
- dependency-name: myst-parser
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-26 10:32:01 +02:00
dependabot[bot]
454f95a661 [upd] github-actions: Bump snok/container-retention-policy (#5248)
Bumps [snok/container-retention-policy](https://github.com/snok/container-retention-policy) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/snok/container-retention-policy/releases)
- [Commits](4f22ef8090...3b0972b227)

---
updated-dependencies:
- dependency-name: snok/container-retention-policy
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-26 10:03:19 +02:00
dependabot[bot]
a9ae0163ad [upd] github-actions: Bump github/codeql-action from 3.30.3 to 3.30.4 (#5247)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.3 to 3.30.4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](192325c861...303c0aef88)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.30.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-26 10:01:01 +02:00
dependabot[bot]
2a759f18da [upd] pypi: Bump the minor group with 4 updates (#5246)
Bumps the minor group with 4 updates: [lxml](https://github.com/lxml/lxml), [pyyaml](https://github.com/yaml/pyyaml), [typer-slim](https://github.com/fastapi/typer) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `lxml` from 6.0.1 to 6.0.2
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-6.0.1...lxml-6.0.2)

Updates `pyyaml` from 6.0.2 to 6.0.3
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/6.0.3/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/6.0.2...6.0.3)

Updates `typer-slim` from 0.17.4 to 0.19.2
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.17.4...0.19.2)

Updates `basedpyright` from 1.31.4 to 1.31.5
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.31.4...v1.31.5)
2025-09-26 09:56:32 +02:00
Markus Heiser
7322b07df6 [fix] ProcessorMap: fix error log, not enough arguments for format string (#5241)
Issue was introduced by PR-5204 [1]

reported issue::

    logger.error("init method of engine %s failed (%s).", eng_proc.engine.name)
    TypeError: not enough arguments for format string

[1] https://github.com/searxng/searxng/pull/5204

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-25 08:24:02 +02:00
Markus Heiser
4f4587650c [build] /static 2025-09-25 06:34:19 +02:00
Markus Heiser
8f854540a9 [fix] simple client: move code.less to result_types/code.less
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-25 06:34:19 +02:00
Ivan Gabaldon
3bf702447b [enh] container: custom certificates (#5238)
Let container instance administrators to add custom certificates:

  https://docs.searxng.org/admin/installation-docker.html#custom-certificates

Closes https://github.com/searxng/searxng/issues/5206
2025-09-23 21:57:29 +02:00
Ivan Gabaldon
d2e2802514 [fix] utils: variable expansion (#5237)
Docker buildx outputs the following error:

  variable expansion is not supported for --from, define a new stage with FROM
  using ARG from global scope as a workaround.

Also force BuildKit extension to be installed, legacy build is no longer
supported.

Closes https://github.com/searxng/searxng/issues/5219
2025-09-23 20:34:28 +02:00
Ivan Gabaldon
a57b29b009 [enh] container: compact venv (#5225)
We can leverage the immutable nature of containers to add additional
optimizations.

No debugging or tinkering inside containers, so stripping all unused symbols
inside `venv` should be fine. We are also going to compile the bytecode
ourselves to modify some parameters related to reproducibility.

With these small changes, we have reduced the `venv` layer size by 10MB~
2025-09-23 09:50:42 +02:00
Ivan Gabaldon
b7ecc1c240 [enh] container: reproducible layers (#5222)
* [enh] container: reproducible layers

We are not aiming for reproducibility compliance, but we look to make most
builder layers reproducible without caching at least for a short period of time
(until the builder's base image changes or the child dependencies of a
requirements.txt package are updated).

This feature is only available on Podman.

This targets https://github.com/searxng/searxng/pull/5086 main goal.

* [fix] misc: apply suggestions

Suggested: https://github.com/searxng/searxng/pull/5222#discussion_r2364630496
Suggested: https://github.com/searxng/searxng/pull/5222#discussion_r2364630511

* [enh] container: prevent useless layer
2025-09-20 11:33:23 +02:00
Ivan Gabaldon
164167dea0 [mod] py: remove uvloop (#5220)
We get some good stuff without uvloop, 13MB~ less of dependencies, 3
minutes of build time for armv7 saved, and we are one step closer to NT
compatibility. Although it's true that theoretically the raw performance
have worsened on network side (we only used uvloop for that), the latest
cpython versions have been improving on asyncio performance.
2025-09-20 11:12:34 +02:00
github-actions[bot]
b3eb7657b9 [l10n] update translations from Weblate (#5216)
a0783e1a1 - 2025-09-16 - recreationalprogamer <recreationalprogamer@noreply.codeberg.org>
130f66498 - 2025-09-13 - artnay <artnay@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-09-20 10:57:35 +02:00
Markus Heiser
d2b4bff856 [mod] demo engines: smaller improvement
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
1520a8d545 [mod] ADS engine: revision of the engine (Paper result)
Revision of the Astrophysics Data System (ADS) engine / use of the result type
Paper as well as other typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
f8f7adce6b [mod] Z-Library engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

The engine has been placed on inactive because no service is currently
available, or at least not known in the SearXNG community [1]

[1] https://github.com/searxng/searxng/issues/3610

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
4c42704c80 [mod] Springer Nature engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
4b4bf0ecaf [mod] Semantic Scholar engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
bb22bb1831 [mod] PubMed engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
96e63df8ca [mod] Open Library engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
0691e50e13 [mod] OpenAlex engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
599d9488c5 [mod] Google Scholar engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
078c9fcb68 [mod] Crossref engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
3ec6d65f9b [mod] CORE engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
22e73727c0 [mod] Anna's Archive engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
6c3fb9e42b [mod] arXiv engine: revision of the engine (Paper result)
Revision of the engine / use of the result type Paper as well as other
typifications.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Markus Heiser
f9b4869426 [build] /static 2025-09-20 10:56:46 +02:00
Markus Heiser
7eedd44f5f [mod] typification of SearXNG: add new result type Paper
This patch adds a new result type: Paper

- Python class:   searx/result_types/paper.py
- Jinja template: searx/templates/simple/result_templates/paper.html
- CSS (less)      client/simple/src/less/result_types/paper.less

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-20 10:56:46 +02:00
Léon Tiekötter
57ef342ad1 [fix] image proxy: object has no attribute 'status_code' (#5212)
Commit 8f8343d [1] introduced a bug in the network logic of SearXNG where stream
requests (such as the one from the image proxy) would fail because a wrapper was
returned instead of a response object with the correct attribute.

This is just a quick in place fix I implemented to get it working again. It
would be better to implement corresponding logic to give stream requests the
correct object.

[1] https://github.com/searxng/searxng/pull/5204
2025-09-20 07:54:58 +02:00
Ivan Gabaldon
0ce0d957b1 [mod] ci: add cp3.14 (#5217) 2025-09-19 19:41:32 +02:00
dependabot[bot]
a54b862f00 [upd] pypi: Bump the minor group with 3 updates (#5213)
Bumps the minor group with 3 updates: [whitenoise](https://github.com/evansd/whitenoise), [granian[reload]](https://github.com/emmett-framework/granian) and [granian](https://github.com/emmett-framework/granian).


Updates `whitenoise` from 6.10.0 to 6.11.0
- [Changelog](https://github.com/evansd/whitenoise/blob/main/docs/changelog.rst)
- [Commits](https://github.com/evansd/whitenoise/compare/6.10.0...6.11.0)

Updates `granian[reload]` from 2.5.3 to 2.5.4
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.3...v2.5.4)

Updates `granian` from 2.5.3 to 2.5.4
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.3...v2.5.4)

---
updated-dependencies:
- dependency-name: whitenoise
  dependency-version: 6.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian[reload]
  dependency-version: 2.5.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: granian
  dependency-version: 2.5.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-19 11:20:05 +02:00
dependabot[bot]
aeab5ac546 [upd] web-client (simple): Bump the minor group in /client/simple with 3 updates (#5215)
* [upd] web-client (simple): Bump the minor group

Bumps the minor group in /client/simple with 3 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [browserslist](https://github.com/browserslist/browserslist) and [sharp](https://github.com/lovell/sharp).


Updates `@types/node` from 24.3.1 to 24.5.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `browserslist` from 4.25.4 to 4.26.2
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.25.4...4.26.2)

Updates `sharp` from 0.34.3 to 0.34.4
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.34.3...v0.34.4)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.26.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: sharp
  dependency-version: 0.34.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* update rolldown-vite

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-09-19 10:44:59 +02:00
Markus Heiser
09fddfde24 [mod] demo engines: smaller corrections and improvements
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-18 19:40:03 +02:00
Markus Heiser
8f8343dc0d [mod] addition of various type hints / engine processors
Continuation of #5147 .. typification of the engine processors.

BTW:

- removed obsolete engine property https_support
- fixed & improved currency_convert
- engine instances can now implement a engine.setup method

[#5147] https://github.com/searxng/searxng/pull/5147

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-18 19:40:03 +02:00
dependabot[bot]
23257bddce [upd] pypi: Bump the minor group with 5 updates (#5200)
Bumps the minor group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [setproctitle](https://github.com/dvarrazzo/py-setproctitle) | `1.3.6` | `1.3.7` |
| [typer-slim](https://github.com/fastapi/typer) | `0.17.3` | `0.17.4` |
| [whitenoise](https://github.com/evansd/whitenoise) | `6.9.0` | `6.10.0` |
| [granian[reload]](https://github.com/emmett-framework/granian) | `2.5.2` | `2.5.3` |
| [granian](https://github.com/emmett-framework/granian) | `2.5.2` | `2.5.3` |


Updates `setproctitle` from 1.3.6 to 1.3.7
- [Changelog](https://github.com/dvarrazzo/py-setproctitle/blob/master/HISTORY.rst)
- [Commits](https://github.com/dvarrazzo/py-setproctitle/compare/version-1.3.6...version-1.3.7)

Updates `typer-slim` from 0.17.3 to 0.17.4
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.17.3...0.17.4)

Updates `whitenoise` from 6.9.0 to 6.10.0
- [Changelog](https://github.com/evansd/whitenoise/blob/main/docs/changelog.rst)
- [Commits](https://github.com/evansd/whitenoise/compare/6.9.0...6.10.0)

Updates `granian[reload]` from 2.5.2 to 2.5.3
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.2...v2.5.3)

Updates `granian` from 2.5.2 to 2.5.3
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.2...v2.5.3)
2025-09-14 10:48:04 +02:00
Ivan Gabaldon
a0d2ecf434 [enh] container: build with uv (#5199)
This commit replaces `pip` in container builds with `uv` pip compat
with a 1:1 parity. The only thing that changes is the installation speed of the
wheels, which seems to be considerably faster, although I haven't been able to
properly quantify this yet.

uv also gives us more tools to manage the cache. We can revert the prior cache
changes in `container.yml` as we won't have duplicated wheels anymore.
2025-09-14 10:36:21 +02:00
dependabot[bot]
687121d584 [upd] web-client (simple): Bump the minor group in /client/simple with 2 updates (#5202)
* [upd] web-client (simple): Bump the minor group

Bumps the minor group in /client/simple with 2 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) and [stylelint](https://github.com/stylelint/stylelint).


Updates `@biomejs/biome` from 2.2.2 to 2.2.4
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.2.4/packages/@biomejs/biome)

Updates `stylelint` from 16.23.1 to 16.24.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.23.1...16.24.0)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.2.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 16.24.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* update biome schema

* update rolldown

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-09-12 10:59:25 +02:00
dependabot[bot]
4694ba202a [upd] github-actions: Bump github/codeql-action from 3.30.0 to 3.30.3 (#5201)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.30.0 to 3.30.3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](2d92b76c45...192325c861)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.30.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-12 10:15:21 +02:00
github-actions[bot]
d79ad7457f [l10n] update translations from Weblate (#5203)
2ea8fc600 - 2025-09-11 - eudemo <eudemo@noreply.codeberg.org>
169797e8b - 2025-09-10 - alexgabi <alexgabi@noreply.codeberg.org>
822f66416 - 2025-09-11 - grumpyoldtechie <grumpyoldtechie@noreply.codeberg.org>
daba8370d - 2025-09-07 - EmilyOrSomething <emilyorsomething@noreply.codeberg.org>
2025-09-12 09:53:37 +02:00
Ivan Gabaldon
7c1ebc0148 [fix] container: add musl-locales packages 2025-09-11 06:38:45 +02:00
Ivan Gabaldon
7b02369a12 [fix] container: add tzdata package
https://github.com/searxng/searxng/pull/5192
2025-09-11 06:38:45 +02:00
Markus Heiser
a9b088d832 [feat] engines yacy & piped: enable individual configuration of URLs (#5195)
With this change it is possible with individual engines (yacy & piped)
to configure individual URLs.

Related:

- https://github.com/searxng/searxng/issues/4869#issuecomment-327335928
- https://github.com/searxng/searxng/pull/3472/files#r1595586019
- https://github.com/searxng/searxng/issues/3428#issuecomment-2102142530

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-10 12:57:36 +02:00
Markus Heiser
97ed5ef9f1 [fix] links in the README (link file in GH-UI / not the raw file) 2025-09-09 21:00:36 +02:00
Ivan Gabaldon
57b74beeea [enh] docs: update information (#5185)
README should be concise, everything else goes to CONTRIBUTING, docs
page ...
2025-09-09 20:51:22 +02:00
Austin-Olacsi
905b13aa7e [feat] naver engine: add video embeds 2025-09-09 17:04:21 +02:00
Brock Vojkovic
314924bc0e [upd] disable public domain image archive engine by default 2025-09-09 16:58:27 +08:00
dependabot[bot]
e7501eaedf [upd] pypi: Bump the minor group across 1 directory with 5 updates (#5184)
Bumps the minor group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [typer-slim](https://github.com/fastapi/typer) | `0.16.1` | `0.17.3` |
| [granian[reload]](https://github.com/emmett-framework/granian) | `2.5.1` | `2.5.2` |
| [basedpyright](https://github.com/detachhead/basedpyright) | `1.31.3` | `1.31.4` |
| [types-lxml](https://github.com/abelcheung/types-lxml) | `2025.3.30` | `2025.8.25` |
| [granian](https://github.com/emmett-framework/granian) | `2.5.1` | `2.5.2` |



Updates `typer-slim` from 0.16.1 to 0.17.3
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.16.1...0.17.3)

Updates `granian[reload]` from 2.5.1 to 2.5.2
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.1...v2.5.2)

Updates `basedpyright` from 1.31.3 to 1.31.4
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.31.3...v1.31.4)

Updates `types-lxml` from 2025.3.30 to 2025.8.25
- [Release notes](https://github.com/abelcheung/types-lxml/releases)
- [Commits](https://github.com/abelcheung/types-lxml/compare/2025.03.30...2025.08.25)

Updates `granian` from 2.5.1 to 2.5.2
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.1...v2.5.2)
2025-09-05 13:23:01 +02:00
dependabot[bot]
25953fa32e [upd] github-actions: Bump actions/setup-python from 5.6.0 to 6.0.0 (#5181)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.6.0 to 6.0.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](a26af69be9...e797f83bcb)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-05 11:42:40 +02:00
dependabot[bot]
a966e10bf5 [upd] web-client (simple): Bump the minor group in /client/simple with 2 updates (#5179)
* [upd] web-client (simple): Bump the minor group

Bumps the minor group in /client/simple with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [vite-bundle-analyzer](https://github.com/nonzzz/vite-bundle-analyzer).


Updates `@types/node` from 24.3.0 to 24.3.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `vite-bundle-analyzer` from 1.2.2 to 1.2.3
- [Release notes](https://github.com/nonzzz/vite-bundle-analyzer/releases)
- [Changelog](https://github.com/nonzzz/vite-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nonzzz/vite-bundle-analyzer/compare/v1.2.2...v1.2.3)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite-bundle-analyzer
  dependency-version: 1.2.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* update rolldown-vite

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-09-05 11:38:54 +02:00
dependabot[bot]
d4173f129f [upd] github-actions: Bump actions/setup-node from 4.4.0 to 5.0.0 (#5180)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.4.0 to 5.0.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](49933ea528...a0853c2454)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-05 11:13:40 +02:00
dependabot[bot]
02473b68df [upd] github-actions: Bump github/codeql-action from 3.29.11 to 3.30.0 (#5182)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.11 to 3.30.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](3c3833e0f8...2d92b76c45)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.30.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-05 11:11:04 +02:00
github-actions[bot]
5a0caf2663 [l10n] update translations from Weblate (#5183)
8b8b8007b - 2025-09-03 - choonarine <choonarine@noreply.codeberg.org>
2853b3d20 - 2025-09-03 - pywc <pywc@noreply.codeberg.org>
d5a641cda - 2025-09-02 - choonarine <choonarine@noreply.codeberg.org>
270a2efa1 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
356889a32 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
8623e089f - 2025-09-01 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
ea0f92a74 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
864f485f8 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
b3a8ada39 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
2f322377d - 2025-09-01 - return42 <return42@noreply.codeberg.org>
5a4e08e13 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
2099c05fb - 2025-09-01 - return42 <return42@noreply.codeberg.org>
0d4dbe2e8 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
a85407137 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
8631fa640 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
bb9d32a1a - 2025-09-01 - return42 <return42@noreply.codeberg.org>
cd7998051 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
b1cc25fdc - 2025-09-01 - return42 <return42@noreply.codeberg.org>
a822989a3 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
6820b338b - 2025-09-01 - return42 <return42@noreply.codeberg.org>
f06ff0b86 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
17c0a4870 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
e74406e3d - 2025-09-01 - return42 <return42@noreply.codeberg.org>
fb8f1077b - 2025-09-01 - return42 <return42@noreply.codeberg.org>
d14309568 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
a24a3b03a - 2025-09-01 - return42 <return42@noreply.codeberg.org>
080a57782 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
1623f6626 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
fb5177b4d - 2025-09-01 - return42 <return42@noreply.codeberg.org>
f3df8b069 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
9f317f05b - 2025-09-01 - return42 <return42@noreply.codeberg.org>
55161e8ac - 2025-09-01 - return42 <return42@noreply.codeberg.org>
0ac1c3f8f - 2025-09-01 - return42 <return42@noreply.codeberg.org>
c905ec37d - 2025-09-01 - return42 <return42@noreply.codeberg.org>
176dc7ea3 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
b2760ff5f - 2025-09-01 - return42 <return42@noreply.codeberg.org>
9759e2dc2 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
0e5d0c729 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
3ac66987f - 2025-09-01 - return42 <return42@noreply.codeberg.org>
e3d7caf59 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
48b2f1261 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
17d1a44bd - 2025-09-01 - return42 <return42@noreply.codeberg.org>
ed29ae1a3 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
a385f79e8 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
e1bb2681a - 2025-09-01 - return42 <return42@noreply.codeberg.org>
be70384be - 2025-09-01 - return42 <return42@noreply.codeberg.org>
87770e507 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
9d31b74f7 - 2025-09-01 - return42 <return42@noreply.codeberg.org>
2025-09-05 11:09:02 +02:00
Markus Heiser
f91c998aa0 [docs] fix some typos in the description of result class Code (#5174)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-03 14:53:01 +02:00
Markus Heiser
f24d85bc4b [mod] drop: from __future__ import annotations
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-03 13:37:36 +02:00
Markus Heiser
57b9673efb [mod] addition of various type hints / tbc
- pyright configuration [1]_
- stub files: types-lxml [2]_
- addition of various type hints
- enable use of new type system features on older Python versions [3]_
- ``.tool-versions`` - set python to lowest version we support (3.10.18) [4]_:
  Older versions typically lack some typing features found in newer Python
  versions.  Therefore, for local type checking (before commit), it is necessary
  to use the older Python interpreter.

.. [1] https://docs.basedpyright.com/v1.20.0/configuration/config-files/
.. [2] https://pypi.org/project/types-lxml/
.. [3] https://typing-extensions.readthedocs.io/en/latest/#
.. [4] https://mise.jdx.dev/configuration.html#tool-versions

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Format: reST
2025-09-03 13:37:36 +02:00
Butui Hu
09500459fe [fix} engine chinaso - parse_images ImageInfo key error (#5175)
Signed-off-by: Butui Hu <hot123tea123@gmail.com>
2025-09-03 05:59:18 +02:00
Bnyro
b93cc2f9f8 [feat] engines: add repology.org engine for linux packages (#5103)
Repology_ monitors a huge number of package repositories and other sources
comparing packages versions across them and gathering other information.

Repology_ shows you in which repositories a given project is packaged, which
version is the latest and which needs updating, who maintains the package, and
other related information.

.. _Repology: https://repology.org/docs/about

Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
Format: reST
2025-09-01 16:33:31 +02:00
Markus Heiser
501327ddf1 [fix] engine: searchcode.com is offline (inactive) (#5170)
Searchcode.com is offline, and its future is still uncertain [1], so the engine
will be deactivated for the time being. If Searchcode.com doesn't come back
online soon, we can remove the engine entirely.

[1] https://boyter.org/posts/searchcode-is-being-rebooted/
[2] https://github.com/searxng/searxng/pull/5131#issuecomment-3239156555


Reported-by: Bnyro <bnyro@tutanota.com> [2]

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-01 15:35:55 +02:00
Butui Hu
932fb22c80 [fix] chinaoso: add random uid to cookie (#5173)
Signed-off-by: Butui Hu <hot123tea123@gmail.com>
2025-09-01 15:34:17 +02:00
Markus Heiser
e5d2685d8d [build] /static 2025-09-01 14:51:15 +02:00
Markus Heiser
fb5fd8c819 [mod] simple client: pygments.less - switched dark theme to monokai
Compared to ``lightbulb`` theme we used in the past for the dark theme, the
``monokai`` has a better contrast [1].

BTW, the result list of SearXNG should not act as a code-checker: The border &
color of class ``.err`` (used for syntax errors) has been removed / code
snippets are often not well formed nor valid code and the rendering of such code
fragments as errors obscures the view on the code snippet.

[1] https://pygments.org/styles/

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-09-01 14:51:15 +02:00
Markus Heiser
9ac9c8c4f5 [mod] typification of SearXNG: add new result type Code
This patch adds a new result type: Code

- Python class:   searx/result_types/code.py
- Jinja template: searx/templates/simple/result_templates/code.html
- CSS (less)      client/simple/src/less/result_types/code.less

Signed-of-by: Markus Heiser <markus.heiser@darmarIT.de>
2025-09-01 14:51:15 +02:00
dependabot[bot]
b8085d27ac [upd] web-client (simple): Bump the minor group in /client/simple with 3 updates (#5165)
* [upd] web-client (simple): Bump the minor group

Bumps the minor group in /client/simple with 3 updates: [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome), [browserslist](https://github.com/browserslist/browserslist) and [vite-bundle-analyzer](https://github.com/nonzzz/vite-bundle-analyzer).


Updates `@biomejs/biome` from 2.2.0 to 2.2.2
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.2.2/packages/@biomejs/biome)

Updates `browserslist` from 4.25.3 to 4.25.4
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.25.3...4.25.4)

Updates `vite-bundle-analyzer` from 1.2.1 to 1.2.2
- [Release notes](https://github.com/nonzzz/vite-bundle-analyzer/releases)
- [Changelog](https://github.com/nonzzz/vite-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nonzzz/vite-bundle-analyzer/compare/v1.2.1...v1.2.2)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.25.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite-bundle-analyzer
  dependency-version: 1.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* [upd] simple client: lift biomejs schemas up to version 2.2.2

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-08-29 10:22:25 +02:00
dependabot[bot]
31322a49b6 [upd] pypi: Bump the minor group with 3 updates (#5166)
Bumps the minor group with 3 updates: [lxml](https://github.com/lxml/lxml), [granian[reload]](https://github.com/emmett-framework/granian) and [granian](https://github.com/emmett-framework/granian).


Updates `lxml` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-6.0.0...lxml-6.0.1)

Updates `granian[reload]` from 2.5.0 to 2.5.1
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.0...v2.5.1)

Updates `granian` from 2.5.0 to 2.5.1
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.5.0...v2.5.1)
2025-08-29 09:13:44 +02:00
github-actions[bot]
7e353f74f7 [l10n] update translations from Weblate (#5168)
87a404001 - 2025-08-28 - hhadi34 <hhadi34@noreply.codeberg.org>
86cd8cd7a - 2025-08-29 - lucasmz.dev <lucasmz.dev@noreply.codeberg.org>
7488333e6 - 2025-08-29 - ghose <ghose@noreply.codeberg.org>
d03da377c - 2025-08-29 - return42 <return42@noreply.codeberg.org>
c63fa5248 - 2025-08-28 - kratos <makesocialfoss32@keemail.me>
db35c0bfe - 2025-08-28 - Artiman <artiman@noreply.codeberg.org>
13028fa72 - 2025-08-28 - return42 <return42@noreply.codeberg.org>
d984f1cef - 2025-08-28 - return42 <return42@noreply.codeberg.org>
4ec477015 - 2025-08-28 - SomeTr <sometr@noreply.codeberg.org>
a74603ff8 - 2025-08-28 - sprinklerillicitly <sprinklerillicitly@noreply.codeberg.org>
2025-08-29 09:12:35 +02:00
github-actions[bot]
fde4fac3ca [data] update searx.data - update_external_bangs.py (#5158) 2025-08-29 07:07:46 +02:00
github-actions[bot]
a9263fd063 [data] update searx.data - update_wikidata_units.py (#5159) 2025-08-29 07:07:00 +02:00
github-actions[bot]
146cefe7fa [data] update searx.data - update_firefox_version.py (#5160) 2025-08-29 07:05:08 +02:00
github-actions[bot]
2a7d26b714 [data] update searx.data - update_ahmia_blacklist.py (#5161) 2025-08-29 07:04:41 +02:00
github-actions[bot]
480914d736 [data] update searx.data - update_currencies.py (#5162) 2025-08-29 07:04:12 +02:00
github-actions[bot]
edc50768cc [data] update searx.data - update_engine_traits.py (#5163) 2025-08-29 07:03:29 +02:00
github-actions[bot]
a519a13bfa [data] update searx.data - update_engine_descriptions.py (#5164) 2025-08-29 07:02:31 +02:00
Bnyro
f971774773 [fix] annas archive: engine broken due to site HTML changes
Apparently the layout of https://annas-archive.org has changed, making changes necessary.

The issue has been reported in #5146, see there for more details.

- closes #5146
2025-08-28 19:24:37 +02:00
Bnyro
5ca08c1813 [feat] plugins: add new time/timezone search plugin
The plugin uses the ``GeoLocation`` class, which is already implemented in the
context of weather forecasts, to determine the time zone. The ``DateTime`` class
is used for the localized display of date and time.

Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-08-28 10:49:50 +02:00
Markus Heiser
90e602b349 [fix] typo in the docs about HTML method POST versus GET 2025-08-27 10:17:24 +02:00
Markus Heiser
71f90755c4 [doc] fix missing link in `default_http_headers` description
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Format: reST
2025-08-26 08:20:56 +02:00
Markus Heiser
92463ce6a7 [doc] adds the missing documentation of the server.method settings.
TL;DR; For all the issues that comes with HTTP POST I recommend instance
maintainers to switch to GET and lock the property in the preferences:

```yaml
server:
  method: GET

preferences:
  lock:
    - method
```

We don't want this in the defaults of the SearXNG distributions for the pros vs
cons listed in this discussion:

- https://github.com/searxng/searxng/pull/3619
2025-08-26 08:20:56 +02:00
Markus Heiser
a369fe8f29 [mod] py3.9 EOL (#5148)
[1] https://devguide.python.org/versions/
[2] https://peps.python.org/pep-0596/

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-08-26 07:46:20 +02:00
muthukumaran R
a0ff173799 [feat] engines: add OpenAlex Works engine (#5102)
- Adds a new engine `searx/engines/openalex.py` that integrates the OpenAlex
  Works API to return scientific paper results using the `paper.html` template.
- Uses the official API (no auth required); supports OpenAlex polite pool via `mailto`.
- Adds developer docs at `docs/dev/engines/online/openalex.rst`.

OpenAlex API reference: https://docs.openalex.org/how-to-use-the-api/api-overview
2025-08-24 14:17:30 +02:00
dependabot[bot]
11ea1a8134 [upd] web-client (simple): Bump the minor group (#5144)
Bumps the minor group in /client/simple with 2 updates: [browserslist](https://github.com/browserslist/browserslist) and [less](https://github.com/less/less.js).


Updates `browserslist` from 4.25.2 to 4.25.3
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.25.2...4.25.3)

Updates `less` from 4.4.0 to 4.4.1
- [Release notes](https://github.com/less/less.js/releases)
- [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/less/less.js/commits)

---
updated-dependencies:
- dependency-name: browserslist
  dependency-version: 4.25.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: less
  dependency-version: 4.4.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-22 10:04:37 +02:00
dependabot[bot]
e22ebd8817 [upd] github-actions: Bump github/codeql-action from 3.29.9 to 3.29.11 (#5143)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.9 to 3.29.11.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](df559355d5...3c3833e0f8)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.29.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-22 10:01:53 +02:00
dependabot[bot]
d8048dc75b [upd] pypi: Bump the minor group with 4 updates (#5142)
Bumps the minor group with 4 updates: [flask](https://github.com/pallets/flask), [typer-slim](https://github.com/fastapi/typer), [pylint](https://github.com/pylint-dev/pylint) and [basedpyright](https://github.com/detachhead/basedpyright).


Updates `flask` from 3.1.1 to 3.1.2
- [Release notes](https://github.com/pallets/flask/releases)
- [Changelog](https://github.com/pallets/flask/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/flask/compare/3.1.1...3.1.2)

Updates `typer-slim` from 0.16.0 to 0.16.1
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.16.0...0.16.1)

Updates `pylint` from 3.3.7 to 3.3.8
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.7...v3.3.8)

Updates `basedpyright` from 1.31.0 to 1.31.3
- [Release notes](https://github.com/detachhead/basedpyright/releases)
- [Commits](https://github.com/detachhead/basedpyright/compare/v1.31.0...v1.31.3)
2025-08-22 09:53:26 +02:00
github-actions[bot]
b1e461eb4b [l10n] update translations from Weblate (#5141)
a4922b114 - 2025-08-21 - KOUSTAV <koustav@noreply.codeberg.org>
3f61bddd1 - 2025-08-18 - reis2724 <reis2724@noreply.codeberg.org>
7313a683d - 2025-08-19 - Kemystra <kemystra@noreply.codeberg.org>
92e1bce48 - 2025-08-19 - Artiman <artiman@noreply.codeberg.org>
0f27c1bc2 - 2025-08-18 - youtherthyf <youtherthyf@noreply.codeberg.org>
60496bc76 - 2025-08-16 - alexgabi <alexgabi@noreply.codeberg.org>
742982d00 - 2025-08-15 - lucasmz.dev <lucasmz.dev@noreply.codeberg.org>
2025-08-22 09:51:03 +02:00
Markus Heiser
cfb6649b90 [build] /static 2025-08-21 14:04:13 +02:00
Amit Katyal
5ca70ca17e [feat] client/simple: move cursor to end of search input on mobile
On mobile devices, when the search input is focused, move the cursor
to the end of the existing text. This improves the user experience by
making it easier to edit or append to the current query without
manually moving the cursor first.

Closes: https://github.com/searxng/searxng/issues/5112
2025-08-21 14:04:13 +02:00
Markus Heiser
22c2c93274 [build] /static 2025-08-21 09:07:08 +02:00
Markus Heiser
d2b3c92e81 [fix] move initial "JS is enabled?" (no-js) to client side
To avoid an `unsafe-inline` in the CSP header, the JS code must be moved to the
client side [1].

The `<script>` tag at the end of the HTML originates from the old implementation
of the JS client. Since PR-5073 [2] was merged, the `type` is now `module`, and
the tag must be moved to the beginning of the HTML.

> We need to inline this "JS is enabled?" thing to prevent layout shifts and
> temporary "no JS enabled" visuals as ESM scripts loads and evals everything
> deferred from initial DOM render [3]

That's true in theory, but in practice, this effect is unnoticeable because it's
masked by another effect (which we can't avoid): If we load the page with a
severely throttled connection, the HTML (result list) takes a long time to
load. Then the CSS is loaded, which also takes longer. Until the CSS has loaded,
there's no layout. A layout shift is therefore largely determined by the loading
of the HTML and CSS itself.

The running times of the ESM script can be neglected compared to the loading
times of HTML & CSS.

[1] https://github.com/searxng/searxng-docker/pull/424#issuecomment-3199494256
[2] https://github.com/searxng/searxng/pull/5073
[3] https://github.com/searxng/searxng-docker/pull/424#issuecomment-3199622504
2025-08-21 09:07:08 +02:00
Ivan Gabaldon
41a4a3e224 [fix] template: safesearch uses the wrong type (#5136)
This fixes a regression from
60bd8b9#diff-1b714182564ef1fa942ff81b28f9ba3365ab76f75346f4255398bf9d6064b4cc

Closes https://github.com/searxng/searxng/issues/5135
2025-08-20 18:04:13 +02:00
Bnyro
3649917ce6 [fix] webapp: safesearch uses wrong default value (#5134)
- this fixes a regression from 60bd8b90f0 (diff-1b714182564ef1fa942ff81b28f9ba3365ab76f75346f4255398bf9d6064b4cc)
- closes https://github.com/searxng/searxng/issues/5130
2025-08-20 14:39:05 +02:00
Bnyro
0369682690 [fix] selfhst icons: icon list url invalid, set to active
- the previous CDN icon list url no longer works
- a list of all icons is mirrored to the JSDelivr CDN however
- there's no reason to set the engine to inactive now that we use public CDNs
2025-08-20 14:27:17 +02:00
Filip Mikina
6b57705e50 [feat] engines: add GitHub Code Search engine (#5074)
This patch adds GitHub Code Search [1] engine to allow querying the codebases.

Template code.html is changed to allow passthrough of strip and highlighting
options.

Engine Searchcode is adjusted to pass filename and not rely on hardcoded
extensions.

GitHub search code API does not return the exact code line indices, this
implementation assigns the code arbitrary numbers starting from 1
(effectively relabeling the code).

The API allows for unauth calls, and the default engine settings default to
that, although the calls are heavily rate limited.

The 'text' lexer is the default pygments lexer when parsing fails.

[1] https://docs.github.com/en/rest/search/search?apiVersion=2022-11-28#search-code

Co-authored-by: Markus Heiser <markus.heiser@darmarIT.de>
2025-08-20 07:35:31 +02:00
Markus Heiser
25647c20d1 [mod] switching from pyright to basedpyright (plus first rules)
pyrightconfig.json :

  for the paths searx, searxng_extra and tests, individual rules were
  defined (for example, in test fewer / different rules are needed than in the
  searx package

searx/engines/__builtins__.pyi :

  The builtin types that are added to the global namespace of a module by the
  intended monkey patching of the engine modules / replaces the previous
  filtering of the stdout using grep.

test.pyright_modified (utils/lib_sxng_test.sh) :

  static type check of local modified files not yet commited

make test :

  prerequisite 'test.pyright' has been replaced by 'test.pyright_modified'

searx/engines/__init__.py, searx/enginelib/__init__.py :

  First, minimal typifications that were considered necessary.
2025-08-19 12:04:35 +02:00
dependabot[bot]
9bb04e288d [upd] web-client (simple): Bump the minor group across 1 directory with 6 updates (#5128)
* [upd] web-client (simple): Bump the minor group across 1 directory with 6 updates

Bumps the minor group with 6 updates in the /client/simple directory:

| Package | From | To |
| --- | --- | --- |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.1.3` | `2.2.0` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.2.0` | `24.3.0` |
| [browserslist](https://github.com/browserslist/browserslist) | `4.25.1` | `4.25.2` |
| [edge.js](https://github.com/edge-js/edge) | `6.2.1` | `6.3.0` |
| [stylelint](https://github.com/stylelint/stylelint) | `16.23.0` | `16.23.1` |
| [vite-bundle-analyzer](https://github.com/nonzzz/vite-bundle-analyzer) | `1.1.0` | `1.2.1` |



Updates `@biomejs/biome` from 2.1.3 to 2.2.0
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.2.0/packages/@biomejs/biome)

Updates `@types/node` from 24.2.0 to 24.3.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `browserslist` from 4.25.1 to 4.25.2
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.25.1...4.25.2)

Updates `edge.js` from 6.2.1 to 6.3.0
- [Release notes](https://github.com/edge-js/edge/releases)
- [Changelog](https://github.com/edge-js/edge/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/edge-js/edge/compare/v6.2.1...v6.3.0)

Updates `stylelint` from 16.23.0 to 16.23.1
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.23.0...16.23.1)

Updates `vite-bundle-analyzer` from 1.1.0 to 1.2.1
- [Release notes](https://github.com/nonzzz/vite-bundle-analyzer/releases)
- [Changelog](https://github.com/nonzzz/vite-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nonzzz/vite-bundle-analyzer/compare/v1.1.0...v1.2.1)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: "@types/node"
  dependency-version: 24.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: browserslist
  dependency-version: 4.25.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: edge.js
  dependency-version: 6.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 16.23.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite-bundle-analyzer
  dependency-version: 1.2.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* [fix] themes/simple: recreate lock

* [fix] themes/simple: promote from nursery

- noAwaitInLoop
- noBitwiseOperators
- noConstantBinaryExpression
- noGlobalDirnameFilename
- noImplicitCoercion
- noUnassignedVariables
- noUselessBackrefInRegex
- noUselessEscapeInString
- useAdjacentGetterSetter
- useConsistentObjectDefinition
- useConsistentResponse
- useIndexOf
- useIterableCallbackReturn
- useJsonImportAttribute
- useNumericSeparators
- useObjectSpread
- useParseIntRadix
- useReadonlyClassProperties
- useSingleJsDocAsterisk
- useUnifiedTypeSignature

* [fix] themes/simple: build static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-08-18 23:17:50 +02:00
Ivan Gabaldon
5f364ad999 [fix] container: change mirror (#5127)
`mirrors.edge.kernel.org` has weird issues, use the official mirror and avoid
future issues.
2025-08-18 21:33:27 +02:00
dependabot[bot]
547d9dcee7 [upd] pypi: Bump the minor group across 1 directory with 2 updates (#5126)
Bumps the minor group with 2 updates in the / directory: [valkey](https://github.com/valkey-io/valkey-py) and [selenium](https://github.com/SeleniumHQ/Selenium).


Updates `valkey` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/valkey-io/valkey-py/releases)
- [Commits](https://github.com/valkey-io/valkey-py/compare/v6.1.0...v6.1.1)

Updates `selenium` from 4.34.2 to 4.35.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/commits/selenium-4.35.0)

---
updated-dependencies:
- dependency-name: valkey
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: selenium
  dependency-version: 4.35.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-18 20:00:37 +02:00
github-actions[bot]
4304150d7f [l10n] update translations from Weblate (#5117)
b0a695592 - 2025-08-14 - zymurge <zymurge@noreply.codeberg.org>
17c30fdae - 2025-08-14 - c2qd <c2qd@noreply.codeberg.org>
a1dc25ec1 - 2025-08-12 - Kemystra <kemystra@noreply.codeberg.org>
a6c4a30e3 - 2025-08-12 - ijxp <ijxp@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-08-18 19:42:38 +02:00
Markus Heiser
9b4ea64429 [build] /static 2025-08-18 16:38:32 +02:00
Markus Heiser
4e586a7eca [fix] add missing nvm environment to the "./manage dev.env" command 2025-08-18 16:38:32 +02:00
Markus Heiser
48cec1fff6 [fix] drop obsolte client/simple/static/ 2025-08-18 16:38:32 +02:00
Markus Heiser
34e993a854 [license] client/simple: SPDX-License-Identifier: AGPL-3.0-or-later
SPDX short-form identifiers to communicate license information in a simple,
efficient, portable and machine-readable manner [1]

[1] https://spdx.dev/learn/handling-license-info/
2025-08-18 16:38:32 +02:00
Ivan Gabaldon
60bd8b90f0 [enh] theme/simple: custom router
Lay the foundation for loading scripts granularly depending on the endpoint it's
on.

Remove vendor specific prefixes as there are now managed by browserslist and
LightningCSS.

Enabled quite a few rules in Biome that don't come in recommended to better
catch issues and improve consistency.

Related:

- https://github.com/searxng/searxng/pull/5073#discussion_r2256037965
- https://github.com/searxng/searxng/pull/5073#discussion_r2256057100
2025-08-18 16:38:32 +02:00
Ivan Gabaldon
adc4361eb9 [fix] theme/simple: broken highlightResult
From `mod-simple-strict`
2025-08-18 16:38:32 +02:00
Ivan Gabaldon
7e1c7096ce [enh] theme/simple: package.json revision
Set minor versioning for most of the packages that iterate fast or we know won't
cause problems, and fixed versioning for the rest.

Packages going into bundles should be placed in "dependencies".

The inspection of prod bundles is necessary. Although it does not make a lot of
sense right now, it will be useful in later PR and will give us a reference to
start with.
2025-08-18 16:38:32 +02:00
Ivan Gabaldon
0b913053a7 [mod] theme/simple: migrate codebase to TypeScript
TypeScript is a superset of JavaScript, converting the entire theme to
TypeScript allows us to receive much more feedback on possible issues made in
package updates or our own typos, furthermore, it allows to transpile properly
to lower specs. This PR couldn't be done in smaller commits, a lot of work
needed to make everything *work properly*:

- A browser baseline has been set that requires minimum **Chromium 93, Firefox
  92 and Safari 15** (proper visuals/operation on older browser versions is not
  guaranteed)
- LightningCSS now handles minification and prefix creation for CSS.
- All hardcoded polyfills and support for previous browser baseline versions
  have been removed.
- Convert codebase to TypeScript.
- Convert IIFE to ESM, handling globals with IIFE is cumbersome, ESM is the
  standard for virtually any use of JS nowadays.
- Vite now builds the theme without the need for `vite-plugin-static-copy`.
- `searxng.ready` now accepts an array of conditions for the callback to be
  executed.
- Replace `leaflet` with `ol` as there were some issues with proper Vite
  bundling.
- Merged `head` with `main` script, as head was too small now.
- Add `assertElement` to properly check the existence of critical DOM elements.
- `searxng.on` renamed to `searxng.listen` with some handling improvements.
2025-08-18 16:38:32 +02:00
Markus Heiser
4fb6105d69 [fix] revision of utils.HTMLTextExtractor (#5125)
Related:

- https://github.com/searxng/searxng/pull/5073#issuecomment-3196282632
2025-08-18 16:30:51 +02:00
Ishbir Singh
b606103352 [fix] reuters: published date not parsed correctly in some cases
FIxes publishedDate format in reuters engine to encompass ISO 8601 times both with and without milliseconds.
Why is this change important?

Previously, the engine would sometimes fail saying:

2025-08-12 21:13:23,091 ERROR:searx.engines.reuters: exception : time data '2024-04-15T19:08:30.833Z' does not match format '%Y-%m-%dT%H:%M:%SZ'

Traceback (most recent call last):

...
  File "/usr/local/searxng/searx/engines/reuters.py", line 87, in response

    publishedDate=datetime.strptime(result["display_time"], "%Y-%m-%dT%H:%M:%SZ"),

                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...

Note that most queries seem to work with Reuters, but there are some results that have the additional milliseconds and fail. Regardless, the change is backwards compatible as both the formats (with and without the ms) should now parse correctly.
2025-08-16 15:50:38 +00:00
dependabot[bot]
792ec2afea [upd] github-actions: Bump actions/checkout from 4.2.2 to 5.0.0 (#5118)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.2 to 5.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](11bd71901b...08c6903cd8)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-15 18:06:22 +02:00
dependabot[bot]
90f997c181 [upd] github-actions: Bump github/codeql-action from 3.29.6 to 3.29.9 (#5119)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.6 to 3.29.9.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](a4e1a019f5...df559355d5)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.29.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-15 18:05:43 +02:00
Zhijie He
6b1516d6ad [fix] baidu captcha detection (#5111)
Add Baidu Captcha detection to reduce `JSONDecodeError` error

Baidu will redirect to `wappass.baidu.com` and return a captcha challenge.
Current behavior will get the data from `wappass.baidu.com` then return a
`json.decoder.JSONDecodeError` error.
2025-08-12 15:18:46 +02:00
Markus Heiser
6cccb46f2b [fix] replace X-Scheme by X-Forwarded-Proto header (#5107)
The HTTP X-Forwarded-Proto (XFP) request header is a *de-facto* standard header
for identifying the protocol (HTTP or HTTPS) that a client used to connect to a
proxy or load balancer.[1]

The ``X-Scheme`` header was added 10 years ago, why ``X-Scheme`` was used back
then and not ``X-Forwarded-Proto``, nobody knows today / possibly because
``X-Forwarded-Proto`` wasn't a *de-facto* standard back then.

[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto
[2] https://github.com/searx/searx/commit/6ef7c3276
2025-08-10 13:05:40 +02:00
Markus Heiser
a0dd416e8a [fix] use X-Forwarded-Proto header if the URL scheme is unknown (#5106)
The HTTP X-Forwarded-Proto (XFP) request header is a de-facto standard header
for identifying the protocol (HTTP or HTTPS) that a client used to connect to a
proxy or load balancer.[1]

In our documentation[2] we recommend to set the `X-Scheme` header. This header
is not required if the `server.base_url` is set correctly.[3]

If none of these URL scheme details exist, then the header X-Forwarded-Proto is
evaluated as a third alternative.

[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto
[2] https://docs.searxng.org/admin/installation-apache.html#apache-s-searxng-site
[3] https://docs.searxng.org/admin/settings/settings_server.html

Closes: https://github.com/searxng/searxng/issues/5105
2025-08-10 11:08:57 +02:00
Markus Heiser
935f3fe332 [fix] limiter: trusted proxies doc-string (#5104) 2025-08-09 23:30:48 +02:00
Ivan Gabaldon
ce8929cabe [mod] limiter: trusted proxies (#4911)
Replaces `x_for` functionality with `trusted_proxies`. This allows defining
which IP / ranges to trust extracting the client IP address from X-Forwarded-For
and X-Real-IP headers.

We don't know if the proxy chain will give us the proper client
address (REMOTE_ADDR in the WSGI environment), so we rely on reading the headers
of the proxy before SearXNG (if there is one, in that case it must be added to
trusted_proxies) hoping it has done the proper checks. In case a proxy in the
chain does not check the client address correctly, integrity is compromised and
this should be fixed by whoever manages the proxy, not us.

Closes:

- https://github.com/searxng/searxng/issues/4940
- https://github.com/searxng/searxng/issues/4939
- https://github.com/searxng/searxng/issues/4907
- https://github.com/searxng/searxng/issues/3632
- https://github.com/searxng/searxng/issues/3191
- https://github.com/searxng/searxng/issues/1237

Related:

- https://github.com/searxng/searxng-docker/issues/386
- https://github.com/inetol-infrastructure/searxng-container/issues/81
2025-08-09 23:03:30 +02:00
Markus Heiser
341d718c7f [fix] duckduckgo weather: add type hints and fix WEATHERKIT_TO_CONDITION (#5101) 2025-08-09 12:24:19 +02:00
Markus Heiser
6172beba1a [doc] Development Quickstart: debug with the Python Debugger pdb (#5100)
Related:

- https://github.com/searxng/searxng/pull/5037#issuecomment-3166851578
2025-08-09 12:16:19 +02:00
Austin-Olacsi
cf5061dc70 [feat] engines: add Marginalia (#5087)
To get an API key follow instructions at [1].

[1] https://about.marginalia-search.com/article/api/

Related (historical ordered):
- https://github.com/searxng/searxng/issues/1620
- https://github.com/searxng/searxng/issues/1673
- https://github.com/searxng/searxng/pull/1627
- https://github.com/searxng/searxng/pull/2489

Closes:
- https://github.com/searxng/searxng/issues/3034

Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-08-09 08:38:11 +02:00
github-actions[bot]
5e7109cd26 [l10n] update translations from Weblate (#5096)
0fbf5aa2d - 2025-08-07 - alexgabi <alexgabi@noreply.codeberg.org>
d18d3ed1c - 2025-08-07 - return42 <return42@noreply.codeberg.org>
7927a63a0 - 2025-08-06 - pikzim <pikzim@noreply.codeberg.org>
27c8b4013 - 2025-08-05 - nhthinh <nhthinh@noreply.codeberg.org>
83262e748 - 2025-08-04 - IcewindX <icewindx@noreply.codeberg.org>
2025-08-08 17:19:22 +02:00
Bnyro
761b74e8c9 [fix] legacy results: published date missing (#5093)
The `publishedDate` has always been `None` before that change, which
causes that there are no `publishedDate`s visible for any result.
2025-08-08 12:22:00 +02:00
Ivan Gabaldon
dd170964c7 [mod] ci: strict(er) exec (#5099)
All actions are pulled using the version hash, versions are handled by
dependabot, and we'll have control over which actions get updated.

Replaces Trivy scanner with Docker Scout, we have recently begun analyzing the
images there, and the action will keep us in sync about the problems on GHCS
dashboard.
2025-08-08 11:26:45 +02:00
Ivan Gabaldon
1f619248b6 [mod] ci: docker task unused (#5098)
We always use the latest versions of our base images, so this dependabot task
is unneeded.
2025-08-08 10:07:14 +02:00
dependabot[bot]
77f10f09f9 [upd] pypi: Bump certifi from 2025.7.14 to 2025.8.3 in the minor group (#5097)
Bumps the minor group with 1 update: [certifi](https://github.com/certifi/python-certifi).


Updates `certifi` from 2025.7.14 to 2025.8.3
- [Commits](https://github.com/certifi/python-certifi/compare/2025.07.14...2025.08.03)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2025.8.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-08 09:36:24 +02:00
Bnyro
25c327904a [fix] tagesschau: crash if there's no video stream available
Sometimes, there's only an `adaptivestreaming` field in `streams`, which
is usually an m3u8 file. That's however not supported by the video player
of any browser, so we can't use and must build a different url instead.
2025-08-08 07:19:12 +00:00
Bnyro
612b76b75e [fix] webapp.py: default_http_headers not parsed as strings (#5094)
WhiteNoise requires all headers to be strings, however it's common to use
other primitive types (e.g. numbers) in the header, e.g. `X-XSS-Protection: 0`.
Thus, we must convert all types of values (i.e. numbers) to strings.

- closes https://github.com/searxng/searxng/issues/5091
2025-08-07 20:50:31 +02:00
Ivan Gabaldon
4942c9b914 [fix] ci: cache is not overwritten (#5089)
Due to current limitations of `actions/cache`, the cache cannot be overwritten.
In our case, we need to accumulate cached wheels from different architectures.
To solve this, we simply delete the key before storing the cache again.
2025-08-07 16:53:37 +02:00
Ivan Gabaldon
3de7a6da2d [enh] container: tidy builds (#5086)
Building the container currently does not work properly.
When rebuilding several times with `make container`, `version_frozen.py`
is recreated, which wouldn't be an issue if the file’s timestamp was constant.
Now, when creating `version_frozen.py`, it will have the same timestamp as the
commit when it was created. (`version_frozen.py` is moved to a dedicated layer).

Reusing "builder" cache when building "dist" could be slow
(CD reports 2 seconds, but locally I've seen it take up to 10 seconds),
so the Dockerfile is now split and we save a couple steps
by importing the "builder" image directly.

The last changes made it possible to remove the layer cache in "builder",
since the overhead is now greater than building the layers from scratch.

Until now, all "dist" layers were squashed into a single layer,
which in most cases is a good idea
(except for storage/delivery pricing/overhead), but in our case,
since we manage the entire pipeline, we can ignore this
and share layers between builds.
This means (for example) that if we change files unrelated to the container
in several consecutive commits (documentation changes), we don't have to push
the entire image to registry, but only the different layers
(`version_frozen.py` in this example).
The same applies when pulling, as only the layers that have changed
compared to the local layers will be downloaded (that's the theory,
we'll see if this works as expected or if we need to tweak something else).
2025-08-07 10:46:26 +02:00
Bnyro
94256e3383 [feat] duckduckgo weather: migrate to new weather engine template
- not 100% sure about the condition code mapping, there are no real matches for most of the codes from Apple WeatherKit to the weather codes we have in SearXNG
- related: https://github.com/searxng/searxng/issues/4885
2025-08-06 14:09:23 +02:00
Markus Heiser
2e62eb5d68 [fix] engine yummly: website were taken offline in December 2024 (#5080)
The app and website were taken offline in December 2024, with the latter
pointing to KitchenAid's US website. [1]

[1] https://en.wikipedia.org/wiki/Yummly

Closes: https://github.com/searxng/searxng/issues/5079
2025-08-03 10:49:14 +02:00
Ivan Gabaldon
3d96414482 [enh] container: latest tag should be last (#5078)
With this change, the "latest" tag will be visually higher (on registry tag list). Right now, it appears under the "DOCKER_TAG" manifest tag, which can be confusing.
2025-08-01 14:51:28 +02:00
Markus Heiser
664aab0ec9 [fix] CI task "update_engine_traits.py" fails (#5069)
* [fix] CI task "update_engine_traits.py" fails

To catch all problems with an HTTP request, the more general class
``httpx.HTTPError`` must be caught, for your test use::

    $ ./manage dev.env
    $ python ./searxng_extra/update/update_engine_traits.py

Closes: https://github.com/searxng/searxng/issues/5068

* [data] update searx.data - update_engine_traits.py
2025-08-01 12:08:27 +02:00
dependabot[bot]
dcb1e20007 [upd] pypi: Bump the minor group with 2 updates (#5077)
* [upd] pypi: Bump the minor group with 2 updates

Bumps the minor group with 2 updates: [granian[reload]](https://github.com/emmett-framework/granian) and [granian](https://github.com/emmett-framework/granian).


Updates `granian[reload]` from 2.4.2 to 2.5.0
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.4.2...v2.5.0)

Updates `granian` from 2.4.2 to 2.5.0
- [Release notes](https://github.com/emmett-framework/granian/releases)
- [Commits](https://github.com/emmett-framework/granian/compare/v2.4.2...v2.5.0)

---
updated-dependencies:
- dependency-name: granian[reload]
  dependency-version: 2.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: granian
  dependency-version: 2.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* [enh] py: use humanized duration

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-08-01 10:55:45 +02:00
github-actions[bot]
c2d4e3c49a [l10n] update translations from Weblate (#5076)
17e9fcd68 - 2025-07-29 - musabustun <musabustun@noreply.codeberg.org>
90b302e3e - 2025-07-29 - return42 <return42@noreply.codeberg.org>
023a22292 - 2025-07-29 - return42 <return42@noreply.codeberg.org>
17d37ede6 - 2025-07-30 - gkalathas <gkalathas@noreply.codeberg.org>
3c64c165f - 2025-07-29 - return42 <return42@noreply.codeberg.org>
d8f65cdc7 - 2025-07-26 - IcewindX <icewindx@noreply.codeberg.org>
2025-08-01 10:02:49 +02:00
benpiano800
46f41d2138 [feat] statistics answerer: add the ability to calculate the range of a set 2025-07-31 20:13:24 +02:00
Markus Heiser
6b9e12e4c1 [test] calculator plugin: report the DeprecationWarning once (#5070)
Reporting the DeprecationWarning once should be sufficient when running tests.
2025-07-29 16:31:28 +02:00
github-actions[bot]
40b78ad06c [data] update searx.data - update_wikidata_units.py (#5062) 2025-07-29 07:26:01 +02:00
github-actions[bot]
db83a39544 [data] update searx.data - update_external_bangs.py (#5061) 2025-07-29 07:25:26 +02:00
github-actions[bot]
bb3bea829d [data] update searx.data - update_ahmia_blacklist.py (#5064) 2025-07-29 07:24:09 +02:00
github-actions[bot]
dc9ad0a493 [data] update searx.data - update_currencies.py (#5065) 2025-07-29 07:23:38 +02:00
github-actions[bot]
5db7b70dc7 [data] update searx.data - update_engine_descriptions.py (#5066) 2025-07-29 07:22:58 +02:00
github-actions[bot]
2ad35421d7 [data] update searx.data - update_firefox_version.py (#5063)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-07-29 07:22:21 +02:00
Markus Heiser
f32e91e51a [fix] duckduckgo engine: logger.error / missing argument (#5057)
The error message in case the vqd value could not be determined was incorrect
and triggered an exception::

     File "/usr/local/searxng/searxng-src/searx/engines/duckduckgo.py", line 132, in get_vqd
       logger.error("vqd value from duckduckgo.com ", resp.status_code)
     Message: 'vqd value from duckduckgo.com '
     Arguments: (202,)
2025-07-28 15:36:52 +02:00
Markus Heiser
17f2027c4f [fix] NotImplementedError raised by ResultContainer (#5058)
If the ``on_result`` handle returns False, then the ``else`` was always jumped
to, which throws the NotImplementedError exception::

    File "/usr/local/searxng/searxng-src/searx/results.py", line 99, in extend
      raise NotImplementedError(f"no handler implemented to process the result of type {result}")
    NotImplementedError: no handler implemented to process the result of type MainResult(title=...
2025-07-28 15:36:26 +02:00
Markus Heiser
8084a86784 [upd] update to gecko driver v36
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-28 12:53:26 +02:00
Markus Heiser
8c2c3430da [fix] apply shell formating / shfmt (make format.shell)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-28 12:53:26 +02:00
Markus Heiser
cd062d7349 [fix] don't install pyright twice and do some clean up
Pyright has been installed twice so far, once via `package.json` and once in the
test script via `npx --no-install`. Separating the type checks in the CI and on
the developer desktop is also not necessary.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-28 12:53:26 +02:00
Markus Heiser
67e423edb2 [enh] CI - add shell script formatter
Implement rules and functions to format shell scripts:

    $ make format.shell

or alternatively to format all source code:

    $ make format

The formatter `shfmt` reads the rules from the editorconfig[1]

  If any EditorConfig files are found, they will be used to apply formatting
  options.  If any parser or printer flags are given to the tool, no
  EditorConfig files will be used.

[1] https://github.com/patrickvane/shfmt?tab=readme-ov-file#description

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-28 12:53:26 +02:00
Markus Heiser
7ee3dc9d74 [mod] dependabot: add searxng.org/devtools from Go and Node.js
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-28 12:53:26 +02:00
Markus Heiser
cf2cc87594 [mod] create a Go project with the developer tools from Go
The `go.mod` was created by::

   $ ./manage dev.env
   (dev.env)$ go mod init searxng.org/devtools
   (dev.env)$ go get -tool mvdan.cc/sh/v3/cmd/shfmt@v3.12.0

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-28 12:53:26 +02:00
Markus Heiser
20a193f04c [mod] add Golang ecosystem to the SearXNG toolchain
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-28 12:53:26 +02:00
Markus Heiser
ae0fcf3a42 [chore] overdue maintenance of shell scripts
Removes obsolete scripts and fix various leftovers.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-28 12:53:26 +02:00
mggh0139
54a2b553f4 [fix] tracker pattern: let startup continue if url fetch fails (#5055)
Use Python exception to prevent startup crash in case of fetch ClearURL
failure. Also add some logs.

Closes: https://github.com/searxng/searxng/issues/5054
2025-07-28 07:03:01 +02:00
Fjara
f04c273732 [fix] correct comment in settings.yml for value to disable scheduling (#5052)
settings.yml correct value to disable scheduling
2025-07-27 17:36:39 +02:00
Bnyro
1baf3dcd1c [fix] webapp.py: info (and other) page(s) don't load properly (#5051) 2025-07-26 17:58:53 +02:00
Markus Heiser
649a8dd577 [fix] cleanup: rename searx leftovers to SearXNG (#5049)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-26 06:22:46 +02:00
SeriousConcept1134
02cbdf468b [fix] google video: refactor broken engine to work again
The current google_videos.py in the master branch is completely non functional, due to it not parsing the returned video search results correctly. The result is searxng saying that no results were found. This commit is a new updated google_videos.py that's designed to fix that and is confirmed to be working.

Implementing the suggestions by Bnyro.

Re-formatted with `black` for compatibility. After failing automated checks, ran the command:
black --line-length 120 --skip-string-normalization --target-version py311 google_videos.py
2025-07-25 21:40:53 +02:00
Markus Heiser
168fa9b09b [mod] make run: start granian server and versioning by Dependabot (#5037)
The new ``requirements-server.txt`` (granian) is installed into the virtualenv
of Dockerfile.

When ``make run`` is called, a granian server is started with auto reload on
application's files changes / requires granian[reload] extra, see
``requirements-dev.txt``.

Dependabot supports updates to any ``.txt`` file [1].

[1] https://docs.github.com/en/code-security/dependabot/ecosystems-supported-by-dependabot/supported-ecosystems-and-repositories#pip-and-pip-compile

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-25 17:40:33 +02:00
github-actions[bot]
83adda8567 [l10n] update translations from Weblate (#5047)
19de4a735 - 2025-07-23 - eudemo <eudemo@noreply.codeberg.org>
4504f8600 - 2025-07-22 - IcewindX <icewindx@noreply.codeberg.org>
2b4ec6d2c - 2025-07-22 - lucasmz.dev <lucasmz.dev@noreply.codeberg.org>
69b3590de - 2025-07-22 - Fjuro <fjuro@alius.cz>
f48c7b9ac - 2025-07-21 - alexgabi <alexgabi@noreply.codeberg.org>
f8bc97254 - 2025-07-21 - alexgabi <alexgabi@noreply.codeberg.org>
7bd4b6441 - 2025-07-21 - Juno Takano <jutty@noreply.codeberg.org>
527bc690c - 2025-07-20 - 0ko <0ko@noreply.codeberg.org>
dd242f579 - 2025-07-20 - IcewindX <icewindx@noreply.codeberg.org>
f2a3cdb26 - 2025-07-19 - ledjfou <ledjfou@noreply.codeberg.org>
6781d5611 - 2025-07-20 - alexgabi <alexgabi@noreply.codeberg.org>
df82ea943 - 2025-07-18 - zbbhzdaajc <zbbhzdaajc@noreply.codeberg.org>
7892aac02 - 2025-07-18 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
2025-07-25 12:20:58 +02:00
Markus Heiser
84c3a832a4 [fix] false is an invalid value for wiki_url in settings.yml (#5046)
Closes: https://github.com/searxng/searxng/issues/5045
2025-07-24 17:47:09 +02:00
Ivan Gabaldon
802bf4f9e7 [fix] py: absolute static path (#5043)
The path to static should be relative (If sxng is served under "/sxng", the static route passed to the client won't be "/sxng/static/..." as expected but "/static/...")

Closes https://github.com/searxng/searxng/issues/5042
2025-07-24 14:55:04 +02:00
Bnyro
6b16a04e7e [mod] wordnik: convert to answerer (#4980)
Wordnik is now an answerer and not in the infobox anymore: it uses the
translations answerer, because it provides all the features needed. By default,
only its first results is shown

Additionally a new "define" category is added - I know, it's the same as the
"dictionaries" category, but I don't think we can alias categories.  This allows
to search e.g. for `!define tree`, the idea is to allow easy searches for
definitions of words.

Related:

- https://github.com/searxng/searxng/issues/4111
2025-07-24 07:42:31 +02:00
Ivan Gabaldon
b01d32d69d [fix] py: restore application for uWSGI (#5040)
Was removed on https://github.com/searxng/searxng/pull/5032
2025-07-23 23:55:50 +02:00
Ivan Gabaldon
f7c8e4c353 [fix] py: overwrite version_frozen on explicit freeze (#5020)
Once version_frozen.py has been created, it will never be updated again unless the file is manually deleted.
2025-07-23 18:17:58 +02:00
Ivan Gabaldon
42f102ce1b [enh] py: whitenoise for static handling (#5032)
While looking at ways to better handle static files, I saw a package that replaces Flask `static_folder` functionality. Not only it's considerably faster, but already includes the capability to serve sidecars without having to intercept. This also replaces the uWSGI folder mapping functionality.

Closes https://github.com/searxng/searxng/issues/4977
2025-07-23 18:16:10 +02:00
Bnyro
5cbf422621 [fix] tracker url remover + external bangs: use standard network config
Using plain `httpx` directly doesn't use SearXNG's additional network config, including proxies, http2 config, ...

Related issues:
- https://github.com/searxng/searxng/issues/5027
2025-07-22 10:25:33 +02:00
Ivan Gabaldon
b95a3e905d [fix] container: remove static path mount (#5006)
I've seen that by default Granian sets a `Cache-Control` header for 1 day IF `GRANIAN_STATIC_PATH_MOUNT` is set. This option is not a hard requirement, but it's set because I found to be faster when serving the static files.

Another thing is that by removing `GRANIAN_STATIC_PATH_MOUNT`, the headers set by the application are present again in the static files, which was not the case before.

Related https://github.com/searxng/searxng/pull/5004
2025-07-19 10:18:50 +02:00
github-actions[bot]
be392a45fc [l10n] update translations from Weblate (#5023)
fce853a65 - 2025-07-16 - return42 <return42@noreply.codeberg.org>
234a91155 - 2025-07-16 - return42 <return42@noreply.codeberg.org>
162ff0369 - 2025-07-16 - return42 <return42@noreply.codeberg.org>
3307e81ab - 2025-07-16 - return42 <return42@noreply.codeberg.org>
7948181fb - 2025-07-15 - Juno Takano <jutty@noreply.codeberg.org>
e88a0b264 - 2025-07-15 - muha7a <muha7a@noreply.codeberg.org>
7b37b944e - 2025-07-14 - Cookie_Monster <cookie_monster@noreply.codeberg.org>
d6c61f1ff - 2025-07-14 - kolegacik <kolegacik@noreply.codeberg.org>
5bd662542 - 2025-07-15 - lucasmz.dev <lucasmz.dev@noreply.codeberg.org>
4ddad097c - 2025-07-14 - yoonhahwang <yoonhahwang@noreply.codeberg.org>
a8d319c18 - 2025-07-13 - norizou <norizou@noreply.codeberg.org>
e7e471f65 - 2025-07-13 - Hēphaistos <hephaistos@noreply.codeberg.org>
b6b198f0a - 2025-07-12 - return42 <return42@noreply.codeberg.org>
9da60d355 - 2025-07-11 - sourdragon <sourdragon@noreply.codeberg.org>
632b879ba - 2025-07-12 - return42 <return42@noreply.codeberg.org>
a543b2b87 - 2025-07-12 - return42 <return42@noreply.codeberg.org>
7e418d9cc - 2025-07-12 - return42 <return42@noreply.codeberg.org>
6e78fbd5c - 2025-07-12 - return42 <return42@noreply.codeberg.org>
917b27bad - 2025-07-12 - return42 <return42@noreply.codeberg.org>
82e69afbf - 2025-07-12 - return42 <return42@noreply.codeberg.org>
096c36ef7 - 2025-07-12 - return42 <return42@noreply.codeberg.org>
2048ef8e2 - 2025-07-12 - return42 <return42@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-07-19 07:14:26 +02:00
Ivan Gabaldon
ff2e0ea278 [mod] py: don't append "-dirty" to DOCKER_TAG (#5021)
We don't expect tags to have "-dirty", just the GIT_VERSION regardless of how the container is built.
2025-07-18 10:42:44 +02:00
dependabot[bot]
22c6cd4121 [upd] pypi: Bump certifi from 2025.7.9 to 2025.7.14 in the minor group (#5022)
Bumps the minor group with 1 update: [certifi](https://github.com/certifi/python-certifi).


Updates `certifi` from 2025.7.9 to 2025.7.14
- [Commits](https://github.com/certifi/python-certifi/compare/2025.07.09...2025.07.14)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2025.7.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-18 10:41:18 +02:00
Markus Heiser
e851bc1269 [fix] calculator plugin: filtering real calculation tasks (#5016)
Whether the query is a real calculation tasks is currently only detected in the
AST, resulting in unnecessary creatins of subprocesses. This problem is
mitigated with this patch: if the query contains letters, it is obviously not a
math problem, and the plugin can return without further action.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-17 19:50:02 +02:00
Markus Heiser
62fac1c6a9 [fix] custom plugins: settings must not be merged.
In customizing it should be decided which plugin modules should be loaded and
which should not.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-16 20:55:39 +02:00
mrpaulblack
a0a2f0fd42 [build] /static 2025-07-16 11:02:12 +02:00
mrpaulblack
23d6f59771 [fix] simple theme: display image detail view fullscreen on landscape phones 2025-07-16 11:02:12 +02:00
Ivan Gabaldon
d574339853 [mod] container: remove Cache-Control header (#5005)
Granian shouldn't actually handle the cache, we leave that to the upstream proxy.

Related https://github.com/searxng/searxng/pull/5004
2025-07-11 17:34:07 +02:00
Markus Heiser
574b285efa [mod] remove option ui.static_use_hash (cache busting) (#5004)
Cache busting has caused serious problems for users in the past, here are two
examples:

- https://github.com/searxng/searxng/issues/4419
- https://github.com/searxng/searxng/issues/4481

And it makes development and deployment significantly more complex because it
binds the client side to the server side:

- https://github.com/searxng/searxng/pull/4466

In the light of a decoupled development of the WEB clients from the server side:

- https://github.com/searxng/searxng/pull/4988

is it appropriate to abandon this feature. In fact,  it has been ineffective
since #4436 anyway.

However, the benefit has always been questionable, since at best only a few kB
of data are saved (at least in the context of an image_proxy, the effect is below
the detection limit). Ultimately, the client is responsible for caching.

Related: https://github.com/searxng/searxng/issues?q=label%3A%22clear%20browser%20cache%22

Closes: https://github.com/searxng/searxng/pull/4466
Closes: https://github.com/searxng/searxng/issues/1326
Closes: https://github.com/searxng/searxng/issues/964

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-11 16:53:36 +02:00
Ivan Gabaldon
9149175ff2 [fix] devcontainers: missing Valkey package (#4997)
Use specific branch as `valkey-server` package is only available in trixie and bookworm backports.

Reported https://github.com/searxng/searxng/discussions/4995
Closes https://github.com/searxng/searxng/issues/4996
2025-07-11 16:51:58 +02:00
dependabot[bot]
d8c74c830b [upd] pypi: Bump the minor group with 2 updates (#5000)
Bumps the minor group with 2 updates: [selenium](https://github.com/SeleniumHQ/Selenium) and [certifi](https://github.com/certifi/python-certifi).


Updates `selenium` from 4.34.0 to 4.34.2
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/commits)

Updates `certifi` from 2025.6.15 to 2025.7.9
- [Commits](https://github.com/certifi/python-certifi/compare/2025.06.15...2025.07.09)

---
updated-dependencies:
- dependency-name: selenium
  dependency-version: 4.34.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: certifi
  dependency-version: 2025.7.9
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
2025-07-11 11:16:22 +02:00
github-actions[bot]
b5ae3a047d [l10n] update translations from Weblate (#4998)
6c74fe951 - 2025-07-08 - janindu-t <janindu-t@noreply.codeberg.org>
a17afd1fd - 2025-07-06 - ajiou <ajiou@noreply.codeberg.org>
6424a07ea - 2025-07-05 - aindriu80 <aindriu80@noreply.codeberg.org>
e62b0059e - 2025-07-05 - kratos <makesocialfoss32@keemail.me>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-07-11 11:15:07 +02:00
Bnyro
a48ec8a4d5 [chore] engines: remove redundant usages of utils#gen_useragent (#4993)
These engines override the user agent manually using `gen_useragent`, although that's already done in the online preprocessor that runs before the actual `request(query, params)` method is called. Hence, this call is duplicated.

Related:
- https://github.com/searxng/searxng/pull/4990#discussion_r2195142838
2025-07-11 08:42:39 +02:00
Bnyro
4b9644eb27 [fix] public domain image archive: cloud provider changed angolia -> aws
- apparently, PDIA switched from Angolia to AWS :/
- we no longer require an API key, but the AWS node might change, so we still have to extract the API url of the node
- the response format is still the same, so no changes needed in that regard

- closes #4989
2025-07-10 15:12:26 +02:00
Markus Heiser
2fe8540903 [fix] prevent multiple, parallel initializations of tables in the cache DB (#4991)
Depending on the respective runtime behavior, it could happen that the initial
loading of the DB tables in the cache was performed multiple times and in
parallel. The concurrent accesses then led to the `sqlite3.OperationalError:
database is locked` exception as in #4951.

Since this problem depends significantly on the runtimes (e.g., how long it
takes to retrieve the content for a table), this error could not be observed in
all installations.

Closes: https://github.com/searxng/searxng/issues/4951

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-09 17:32:10 +02:00
Gaspard d'Hautefeuille
f798ddd492 [mod] migrate from Redis to Valkey (#4795)
This patch migrates from `redis==5.2.1` [1] to `valkey==6.1.0` [2].

The migration to valkey is necessary because the company behind Redis has decided
to abandon the open source license. After experiencing a drop in user numbers,
they now want to run it under a dual license again. But this move demonstrates
once again how unreliable the company is and how it treats open source
developers.

To review first, read the docs::

    $ make docs.live

Follow the instructions to remove redis:

- http://0.0.0.0:8000/admin/settings/settings_redis.html

Config and install a local valkey DB:

- http://0.0.0.0:8000/admin/settings/settings_valkey.html

[1] https://pypi.org/project/redis/
[2] https://pypi.org/project/valkey/

Co-authored-by: HLFH <gaspard@dhautefeuille.eu>
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-09 07:55:37 +02:00
Markus Heiser
bd593d0bad [fix] granian: enabling debug on searxng-docker causes server crash (#4985)
When debugging is enabled, the context in which the process is running (uWSGI or
`Flask.run` server) was previously checked [1]. This check has not yet taken the
granian server into account.

----

The check is actually only required for the developer environment (`make run`)
[2] and is intended to prevent double loading of modules when initializing a
Flask server [3].

In the long term, we should find a more robust solution that explicitly enables
the specific features of a development environment via switches. Further
information on this problematic code can be found in [4][5][6].

[1] https://github.com/searxng/searxng/issues/4973#issuecomment-3047890957
[2] https://flask.palletsprojects.com/en/stable/api/#flask.Flask.run
[3] https://github.com/pallets/flask/issues/5307#issuecomment-1774646119
[4] https://github.com/searxng/searxng/pull/1656#issuecomment-1214198941
[5] https://github.com/searxng/searxng/pull/1616#issuecomment-1206137468
[6] https://stackoverflow.com/a/25504196

- closes: https://github.com/searxng/searxng/issues/4973

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-08 13:46:39 +02:00
Markus Heiser
fe52290e65 [fix] calculator plugin: subrocess is not closed on timeout (#4983)
The issue was introduced in commit: edfbf1e

Problematic code::

    def timeout_func(timeout, func, *args, **kwargs):
        ...
        if not p.is_alive():
            ret_val = que.get()
        else:
            logger.debug("terminate function after timeout is exceeded")  # type: ignore
            p.terminate()
        p.join()
        p.close()

The `logger` function in the `else` path is not defined.  Was accidentally
removed in commit edfbf1e without providing an appropriate replacement.::

    File "/usr/local/searxng/searx/plugins/calculator.py", line 216, in timeout_func
      logger.debug("terminate function after timeout is exceeded")  # type: ignore
      ^^^^^^
    NameError: name 'logger' is not defined

The exception triggered by this prevents the `p.terminate()` from being
executed. As a result, the processes accumulate in memory (memory leak).

Related: https://github.com/searxng/searx-instances/discussions/708#discussioncomment-13688168

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-08 09:30:41 +02:00
Bnyro
6ff4035635 [feat] engines: add pixabay for royalty free images/videos
What's changed?
- this PR adds Pixabay, a collection of royalty free images
- additionaly it seems to have some videos, so there's an engine for it too

Author Notes
- when using SearXNG's transport, all our requests will get blocked, probably due to fingerprinting
- we should find an alternative solution because this is just a hacky change to make things work for now, but idk how ...
2025-07-05 13:45:19 +02:00
Bnyro
5926d737e3 [fix] calculator plugin: crash when trying to evaluate non-math query (#4975)
It's possible that `SyntaxError` or `TypeError` instances are thrown
when we can't evaluate a query, simply because it's not a math expression.
In this case, it should just be skipped, i.e. the calculator plugin doesn't
return any result instead of forwarding the exception.
2025-07-04 21:32:54 +02:00
Ivan Gabaldon
01be2612ab [mod] container: replace uWSGI with Granian (#4820)
* [mod] container: replace uWSGI with Granian

The configuration in Granian is handled with ENVs, much more convenient and practical for updating. The settings have been tested for over two months in a production instance, being usable on small to somewhat large instances without having to modify anything.

It also removes the patch functions and ENVs abstraction from the entrypoint, this makes it possible to run the container with immutable configuration.

In some setups, It may be desired to have the volumes/files under a specific uid/gid (other than searxng:searxng), if the entrypoint has root permissions it will chown automatically on every start, which may not be desired. Explicitly setting the new ENV `FORCE_OWNERSHIP=false` will prevent ownership from being modified.

No manual migration is necessary **unless** the user has changed the default uWSGI configuration or has a very specific setup.

Closes https://github.com/searxng/searxng/issues/4894
Closes https://github.com/searxng/searxng/issues/4818
Closes https://github.com/searxng/searxng/issues/4802

Supersedes https://github.com/searxng/searxng/pull/4596

Related https://github.com/searxng/searxng/discussions/4479

* [mod] docs: add container/granian

All container documentation has been recreated.

A new documentation page has been created for Granian.

* [enh] misc: apply suggestions

Minor documentation changes.

Suggested https://github.com/searxng/searxng/pull/4820#discussion_r2134539259
Suggested https://github.com/searxng/searxng/pull/4820#discussion_r2134538610
Suggested https://github.com/searxng/searxng/pull/4820#discussion_r2134827964
Suggested https://github.com/searxng/searxng/pull/4820#discussion_r2134544300
Suggested https://github.com/searxng/searxng/pull/4820#discussion_r2149387388

---------

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-07-04 14:35:28 +02:00
dependabot[bot]
6ca8db5e67 [upd] web-client (simple): Bump the minor group across 1 directory with 4 updates (#4970)
Bumps the minor group with 4 updates in the /client/simple directory: [ionicons](https://github.com/ionic-team/ionicons), [sort-package-json](https://github.com/keithamus/sort-package-json), [stylelint](https://github.com/stylelint/stylelint) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `ionicons` from 8.0.9 to 8.0.10
- [Release notes](https://github.com/ionic-team/ionicons/releases)
- [Commits](https://github.com/ionic-team/ionicons/compare/v8.0.9...v8.0.10)

Updates `sort-package-json` from 3.3.1 to 3.4.0
- [Release notes](https://github.com/keithamus/sort-package-json/releases)
- [Commits](https://github.com/keithamus/sort-package-json/compare/v3.3.1...v3.4.0)

Updates `stylelint` from 16.21.0 to 16.21.1
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.21.0...16.21.1)

Updates `vite` from 7.0.1 to 7.0.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.0.2/packages/vite)

---
updated-dependencies:
- dependency-name: ionicons
  dependency-version: 8.0.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: sort-package-json
  dependency-version: 3.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 16.21.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: vite
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-04 12:17:51 +02:00
dependabot[bot]
b44a360947 [upd] pypi: Bump selenium from 4.33.0 to 4.34.0 in the minor group (#4968)
Bumps the minor group with 1 update: [selenium](https://github.com/SeleniumHQ/Selenium).


Updates `selenium` from 4.33.0 to 4.34.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.33.0...selenium-4.34.0)

---
updated-dependencies:
- dependency-name: selenium
  dependency-version: 4.34.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-04 12:02:21 +02:00
dependabot[bot]
db8d4d3877 [upd] web-client (simple): Bump vite from 6.3.5 to 7.0.0 in /client/simple (#4944)
* [upd] web-client (simple): Bump vite in /client/simple

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* [fix] theme/simple: api sync

CSS sourcemap generation doesn't work right now anyway.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-07-04 11:04:22 +02:00
dependabot[bot]
08d8fb7146 [upd] github-actions: Bump aquasecurity/trivy-action (#4969)
Bumps [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action) from 0.31.0 to 0.32.0.
- [Release notes](https://github.com/aquasecurity/trivy-action/releases)
- [Commits](https://github.com/aquasecurity/trivy-action/compare/0.31.0...0.32.0)

---
updated-dependencies:
- dependency-name: aquasecurity/trivy-action
  dependency-version: 0.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-04 11:01:23 +02:00
github-actions[bot]
eeed75b715 [l10n] update translations from Weblate (#4966) 2025-07-04 10:20:18 +02:00
Markus Heiser
34728ae097 [build] /static 2025-07-03 17:35:05 +02:00
Ivan Gabaldon
879ac4e60f [mod] theme/simple: fmt/lint major pass
*Not so safe* changes, no behaviour changes.

- More ES5 to ES2015+ conversion.
- Make Biome not cry anymore applying remaining changes.
2025-07-03 17:35:05 +02:00
Ivan Gabaldon
95172213f6 [mod] theme/simple: fmt/lint minor pass
*Safe* changes, no behaviour changes.

- Initial ES5 to ES2015+ conversion.
- Plenty of styling diff changes.
2025-07-03 17:35:05 +02:00
Ivan Gabaldon
a947d5b3cf [mod] theme/simple: improve fmt/lint tech
This is one of various PR to refactor the simple theme internally.

Replace eslint tool with Biome. I have been using this for quite some time, and
it will help us to have more consistent and valid code without extending on
other third party plugins.

Removes unused dependencies.
2025-07-03 17:35:05 +02:00
Bnyro
0cbb4f74cc [feat] wttr.in: migrate to new weather engine template (#4888)
Author Notes
- wttr.in provides 8 hourly time forecasts per day, I assumed that they're always describing the weather for 3 hours each, starting at 1 o'clock in the morning

related:
- https://github.com/searxng/searxng/pull/4663
- https://github.com/searxng/searxng/issues/4885
2025-07-03 16:42:13 +02:00
Bnyro
99033f548e [feat] calculator: add support for math constants (e, pi) 2025-07-03 13:57:31 +02:00
Bnyro
27466faadb [feat] calculator: add support for comparation operators (<, <=, ==, ...) 2025-07-03 13:57:31 +02:00
Bnyro
a0fca8c21b [feat] calculator: add some operations (mod, shifts, bitwise and/or) 2025-07-03 13:57:31 +02:00
Markus Heiser
39c50dc013 [fix] sec-fetch-* headers cannot be verified for non-secure requests (#4962)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-30 13:31:45 +02:00
github-actions[bot]
60be0f453e [data] update searx.data - update_firefox_version.py (#4954)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-29 08:17:46 +02:00
github-actions[bot]
4fd3217786 [data] update searx.data - update_external_bangs.py (#4955)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-29 08:17:06 +02:00
github-actions[bot]
a8cc4ad877 [data] update searx.data - update_wikidata_units.py (#4956)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-29 08:16:07 +02:00
github-actions[bot]
c475508a1b [data] update searx.data - update_ahmia_blacklist.py (#4957)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-29 08:15:38 +02:00
github-actions[bot]
2c0bda729a [data] update searx.data - update_currencies.py (#4958)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-29 08:15:05 +02:00
github-actions[bot]
8de4119179 [data] update searx.data - update_engine_traits.py (#4959)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-29 08:14:42 +02:00
github-actions[bot]
6df862a4c7 [data] update searx.data - update_engine_descriptions.py (#4960)
Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-29 08:14:18 +02:00
dependabot[bot]
df76647c52 [upd] pypi: Bump lxml from 5.4.0 to 6.0.0 (#4948)
* [upd] pypi: Bump lxml from 5.4.0 to 6.0.0

Bumps [lxml](https://github.com/lxml/lxml) from 5.4.0 to 6.0.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.4.0...lxml-6.0.0)

---
updated-dependencies:
- dependency-name: lxml
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* [enh] container: remove unneeded dependencies

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ivan Gabaldon <igabaldon@inetol.net>
2025-06-28 15:31:27 +02:00
dependabot[bot]
467536cc2d [upd] web-client (simple): Bump svgo from 3.3.2 to 4.0.0 in /client/simple (#4945)
* [upd] web-client (simple): Bump svgo in /client/simple

---
updated-dependencies:
- dependency-name: svgo
  dependency-version: 4.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* [build] /static

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-28 15:30:30 +02:00
Markus Heiser
657237dac4 [fix] leftover from PR #4947 - ./manage vite.simple.build (#4953)
PR #4947 upgraded the pygment, but forgot to apply the change to the static
files::

    $ ./manage vite.simple.build

Related:

- https://github.com/searxng/searxng/pull/4947
2025-06-28 13:34:36 +02:00
dependabot[bot]
9ee1ca89e7 [upd] pypi: Bump pygments from 2.19.1 to 2.19.2 in the minor group (#4947)
Bumps the minor group with 1 update: [pygments](https://github.com/pygments/pygments).


Updates `pygments` from 2.19.1 to 2.19.2
- [Release notes](https://github.com/pygments/pygments/releases)
- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)
- [Commits](https://github.com/pygments/pygments/compare/2.19.1...2.19.2)

---
updated-dependencies:
- dependency-name: pygments
  dependency-version: 2.19.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-27 18:13:32 +02:00
Ivan Gabaldon
49fdf4edd9 [fix] utils: truncated result (#4949)
Make sure to prase everything before returning.

Related: \
```
FAIL: test_html_to_text (tests.unit.test_utils.TestUtils.test_html_to_text)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/runner/work/searxng/searxng/tests/unit/test_utils.py", line 53, in test_html_to_text
    self.assertEqual(utils.html_to_text(r"regexp: (?<![a-zA-Z]"), "regexp: (?<![a-zA-Z]")
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'regexp: (?' != 'regexp: (?<![a-zA-Z]'
- regexp: (?
+ regexp: (?<![a-zA-Z]
```
2025-06-27 17:52:12 +02:00
dependabot[bot]
a76ccba9c5 [upd] web-client (simple): Bump vite-plugin-static-copy (#4943)
---
updated-dependencies:
- dependency-name: vite-plugin-static-copy
  dependency-version: 3.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-27 16:14:32 +02:00
github-actions[bot]
d47ff4d026 [l10n] update translations from Weblate (#4946)
66f385590 - 2025-06-26 - AndersNordh <andersnordh@noreply.codeberg.org>
2f0d725c7 - 2025-06-27 - MaheAlif <mahealif@noreply.codeberg.org>
3b8c842d2 - 2025-06-25 - SomeTr <sometr@noreply.codeberg.org>
88c5a918b - 2025-06-25 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
306e1f8a4 - 2025-06-25 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
f1314daea - 2025-06-25 - return42 <return42@noreply.codeberg.org>
f4d3905d2 - 2025-06-25 - Linerly <linerly@noreply.codeberg.org>
790dbb51c - 2025-06-25 - return42 <return42@noreply.codeberg.org>
4c59a2801 - 2025-06-24 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
2b70aab75 - 2025-06-24 - ghose <ghose@noreply.codeberg.org>
dade2fbb2 - 2025-06-24 - SomeTr <sometr@noreply.codeberg.org>
930f76d9d - 2025-06-24 - AndersNordh <andersnordh@noreply.codeberg.org>
f2f5bfa28 - 2025-06-24 - SecularSteve <secularsteve@noreply.codeberg.org>
14bcf9a7b - 2025-06-24 - SecularSteve <secularsteve@noreply.codeberg.org>
ba266aa82 - 2025-06-24 - SecularSteve <secularsteve@noreply.codeberg.org>
c25b3788c - 2025-06-24 - SecularSteve <secularsteve@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-27 14:47:34 +02:00
Ivan Gabaldon
c6e0ad930d [fix] container: remove HEALTHCHECK (#4941)
This is a poorly designed instruction, which is hardcoded and cannot be easily modified or maintained on a rolling release sw like ours. This *should* be set in the SearXNG Docker Compose template, not in the image itself.

The OCI format is now used since we no longer have the HEALTHCHECK on the Dockerfile.

Closes https://github.com/searxng/searxng/issues/4906
Closes https://github.com/searxng/searxng/issues/4722
2025-06-26 14:46:59 +02:00
useralias
8757655644 [fix] restore startpage autocompleter
Changes:
- Undo deletions of the autocompleter in settings and logic
- Add fixed autocomplete function in autocomplete.py

Related:
- https://github.com/searxng/searxng/issues/4334
2025-06-25 17:38:31 +02:00
Markus Heiser
776ac0add8 [docs] Docker's entrypoint.sh does no longer have an help option -h
The new Docker entrypoint.sh script implemented in PR:

- https://github.com/searxng/searxng/pull/4793

does no longer have a `-h` option [1].  When building the `make docs` a warming
is shown::

  WARNING: Unexpected return code 2 from command Command(command=('../container/entrypoint.sh', '-h') .. (output='../container/entrypoint.sh: 152: SEARXNG_VERSION: parameter not set')

[1] https://github.com/searxng/searxng/pull/4793/files#diff-694a402a03e8de5aa227b1c0294ffdc072b6bac09b4dcbe144dc7d97d4e07159L35

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-25 09:32:01 +02:00
Markus Heiser
39474b392a [fix] debian: install apt package python-is-python3
On debian the 'python-is-python3' packages restores an appropriate
'/usr/bin/python' symlink for third-party scripts[1]

[1] https://github.com/searxng/searxng/issues/3235#issuecomment-1954459081

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-25 08:29:57 +02:00
benpiano800
b47ee0a4e3 [chore] docs: various grammatical fixes 2025-06-23 23:01:29 +02:00
Bnyro
cacfe54153 [chore] fix ci 2025-06-23 22:57:11 +02:00
Bnyro
b385f32098 [fix] uxwing: doesn't work / forbidden
the engine is currently broken because
- it requires a normal user agent (spoofed)
- it has some additional fingerprinting if using http2
2025-06-23 22:51:48 +02:00
Markus Heiser
2dd4f7b972 [mod] data: implement a simple tracker URL (SQL) database
On demand, the tracker data is loaded directly into the cache, so that the
maintenance of this data via PRs is no longer necessary.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-23 22:12:18 +02:00
Markus Heiser
58c10f758b [mod] plugins: activate tracker url plugin by default
With the new implementation for removing tracker arguments from URLs, we use the
tracker definitions of the ClearURLs project [1].  These definitions are
regularly updated and significantly improve data protection, which is why we
should now also enable this plugin by default.

[1] https://github.com/ClearURLs

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-23 22:12:18 +02:00
Bnyro
2001efbbab [data] update searx.data - add tracker_patterns.json 2025-06-23 22:12:18 +02:00
Bnyro
8f7eee2473 [feat] tracker url plugin: use ClearURL tracking param list 2025-06-23 22:12:18 +02:00
Bnyro
58df3e8e97 [build] /static 2025-06-22 09:41:16 +02:00
Bnyro
096fb74f4e [fix] weather template: text overflow on small screen devices
- this PR fixes that the columns of the weather table are overflowing on small screen devices
- therefore we now display "..." at the end of too long words and cut them off
- additionally I added some small gap between columns, otherwise it looks weird on small screens

- closes https://github.com/searxng/searxng/issues/4887
2025-06-22 09:41:16 +02:00
Robert M. Clabough
ec892d3836 [feat] engines: add Tube Archivist engine (#4889)
Tube Archivist [1] is a self-hosted project which archives youtube videos on
your own local server.  This engine connects with Tube Archivist's search API to
allow searching from SearXNG into your own hosted videos.

[1] https://www.tubearchivist.com/

Signed-off-by:  Robert M. Clabough <robert@claobugh.tech>
Co-authored-by: Bnyro <bnyro@tutanota.com>
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-22 09:40:42 +02:00
useralias
cc61d0833c [refactor] yahoo engine: fix missing results and improve request code structure (#4923)
Changes:
- Add required iscqry, pz and bct search parameters
- Remove unused/optional search parameters (ei, fr2, age)
- Fix offset calculation
- Use new sB cookie for filters (time, safesearch, language)
- Group related parameter assignments together
- Restructure request parameter building to better match a real request
- Use f-strings for string formatting
- Add logging of domain and cookies used

Related:
- https://github.com/searxng/searxng/issues/4910
2025-06-22 08:56:25 +02:00
Nanashi
64f00bf5fd [fix] remove dissem.in due to its closure (#4930)
remove dissem.in due to its closure [1]

[1] https://association.dissem.in/dissemin-closure.html
2025-06-22 08:52:46 +02:00
dependabot[bot]
3c3f06aafe [upd] pypi: Bump certifi from 2025.4.26 to 2025.6.15 in the minor group (#4927)
Bumps the minor group with 1 update: [certifi](https://github.com/certifi/python-certifi).


Updates `certifi` from 2025.4.26 to 2025.6.15
- [Commits](https://github.com/certifi/python-certifi/compare/2025.04.26...2025.06.15)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2025.6.15
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-22 07:36:49 +02:00
dependabot[bot]
105dfad66d [upd] web-client (simple): Bump the minor group (#4926)
Bumps the minor group in /client/simple with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [stylelint](https://github.com/stylelint/stylelint) and [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy).


Updates `@eslint/js` from 9.28.0 to 9.29.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.29.0/packages/js)

Updates `eslint` from 9.28.0 to 9.29.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.28.0...v9.29.0)

Updates `stylelint` from 16.20.0 to 16.21.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.20.0...16.21.0)

Updates `vite-plugin-static-copy` from 3.0.0 to 3.0.2
- [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases)
- [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@3.0.0...vite-plugin-static-copy@3.0.2)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.29.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: eslint
  dependency-version: 9.29.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 16.21.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: vite-plugin-static-copy
  dependency-version: 3.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-22 07:35:52 +02:00
github-actions[bot]
174faa342a [l10n] update translations from Weblate (#4925)
9c4f336a6 - 2025-06-19 - itsmrxyz <itsmrxyz@noreply.codeberg.org>
f639499e2 - 2025-06-18 - Adiker <adiker@noreply.codeberg.org>
67ddeb0b8 - 2025-06-19 - Fjuro <git@alius.cz>
2f37218d3 - 2025-06-17 - Linerly <linerly@noreply.codeberg.org>
b6b11a88e - 2025-06-16 - aindriu80 <aindriu80@noreply.codeberg.org>
23d4b17ed - 2025-06-16 - Shihfu Juan <xlion@xlion.tw>
b6e19a4a7 - 2025-06-16 - Juno Takano <jutty@noreply.codeberg.org>
9fe7bb4b4 - 2025-06-16 - artens <artens@noreply.codeberg.org>
a52c6a9ed - 2025-06-17 - radekjuthner <radekjuthner@noreply.codeberg.org>
91aafaa77 - 2025-06-16 - French <french@noreply.codeberg.org>
f00ea030c - 2025-06-15 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
0ff16bbad - 2025-06-14 - French <french@noreply.codeberg.org>
1785f8d3b - 2025-06-13 - SomeTr <sometr@noreply.codeberg.org>
2c394a6f4 - 2025-06-13 - AndersNordh <andersnordh@noreply.codeberg.org>
136e3016d - 2025-06-13 - ghose <ghose@noreply.codeberg.org>
c29cfab40 - 2025-06-13 - AndersNordh <andersnordh@noreply.codeberg.org>
cf982efb8 - 2025-06-13 - L33P <l33p@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-22 07:32:29 +02:00
github-actions[bot]
e52e9bb4b6 [l10n] update translations from Weblate (#4914)
0c960fb83 - 2025-06-13 - Outbreak2096 <outbreak2096@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-14 08:42:06 +02:00
benpiano800
0b877f1fb8 [mod] Hash plugin: List the available hash functions in the description
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-06-12 21:05:49 +02:00
benpiano800
a6d0333e30 [chore] Preferences: Make autocomplete description sound less casual (#4908) 2025-06-12 02:07:30 +02:00
benpiano800
e58ed0fdba [chore] Preferences: Fix grammatical error in results_on_new_tab.html (#4909) 2025-06-12 01:51:24 +02:00
Brock Vojkovic
8888d71ab9 [mod] disable wallhaven by default 2025-06-10 15:57:39 +00:00
Ivan Gabaldon
c081447d06 [fix] CI: prevent manifest removal (#4905)
The action does not take into account all cases of how an image is stored, causing errors like the ones below on image pull. I exclude `base` until I find a solution.

*Error: internal error: unable to copy from source ...: initializing source ...: reading manifest ... in ghcr.io/searxng/base: manifest unknown*
2025-06-10 13:49:36 +02:00
Markus Heiser
d0bb977c48 [fix] .editorconfig: correction of the settings from the realities (#4892)
The code formatter allows up to 120 characters per line, but for better
readability the editor should prefer 80 characters per line

In the HTML templates (jinja) we usually use an indentation of two and no tabs.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-09 07:19:50 +02:00
0xhtml
6a2cb45791 [feat] bing: raise error upon receiving wrong results page 2025-06-08 22:09:27 +02:00
benpiano800
49a1f08a17 [feat] engines: add Minecraft Wiki (#4896) 2025-06-06 17:05:30 +02:00
dependabot[bot]
33891e5367 [upd] github-actions: Bump aquasecurity/trivy-action (#4898)
Bumps [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action) from 0.30.0 to 0.31.0.
- [Release notes](https://github.com/aquasecurity/trivy-action/releases)
- [Commits](https://github.com/aquasecurity/trivy-action/compare/0.30.0...0.31.0)

---
updated-dependencies:
- dependency-name: aquasecurity/trivy-action
  dependency-version: 0.31.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-06 10:34:07 +02:00
dependabot[bot]
13132c0769 [upd] web-client (simple): Bump the minor group (#4899)
Bumps the minor group in /client/simple with 3 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint) and [ionicons](https://github.com/ionic-team/ionicons).


Updates `@eslint/js` from 9.27.0 to 9.28.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.28.0/packages/js)

Updates `eslint` from 9.27.0 to 9.28.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.27.0...v9.28.0)

Updates `ionicons` from 8.0.8 to 8.0.9
- [Release notes](https://github.com/ionic-team/ionicons/releases)
- [Commits](https://github.com/ionic-team/ionicons/compare/v8.0.8...v8.0.9)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.28.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: eslint
  dependency-version: 9.28.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: ionicons
  dependency-version: 8.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-06 10:03:54 +02:00
github-actions[bot]
3f1504a913 [l10n] update translations from Weblate (#4897)
1abc876b1 - 2025-06-06 - Linerly <linerly@noreply.codeberg.org>
8e107bf1a - 2025-06-06 - realkendrick_fr <realkendrick_fr@noreply.codeberg.org>
3ea971192 - 2025-06-03 - LinuxWizard <linuxwizard@noreply.codeberg.org>
455f80f14 - 2025-06-02 - ghose <ghose@noreply.codeberg.org>
aab313207 - 2025-06-02 - wags07 <wags07@noreply.codeberg.org>
1f1390745 - 2025-06-02 - aindriu80 <aindriu80@noreply.codeberg.org>
c098e4d67 - 2025-06-02 - Shihfu Juan <xlion@xlion.tw>
a30395996 - 2025-06-01 - AndersNordh <andersnordh@noreply.codeberg.org>
a1648feed - 2025-06-02 - yurtpage <yurtpage@noreply.codeberg.org>
985d3f23c - 2025-06-02 - rodgui <rodgui@noreply.codeberg.org>
1526dbc88 - 2025-06-02 - rodgui <rodgui@noreply.codeberg.org>
2d6baae9e - 2025-06-02 - artens <artens@noreply.codeberg.org>
bb5344f55 - 2025-06-02 - Haraldher <haraldher@noreply.codeberg.org>
08991138c - 2025-06-01 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
94952bbd5 - 2025-06-01 - AndersNordh <andersnordh@noreply.codeberg.org>
e4a792010 - 2025-06-01 - Fjuro <git@alius.cz>
0bd241620 - 2025-06-02 - thenack0 <thenack0@noreply.codeberg.org>
3bdff93bc - 2025-06-01 - pochinki <pochinki@noreply.codeberg.org>
091107dc4 - 2025-06-01 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
ac147f2cc - 2025-05-31 - SomeTr <sometr@noreply.codeberg.org>
dd0b77eee - 2025-06-01 - ngf <ngf@noreply.codeberg.org>
db2aa378b - 2025-06-01 - return42 <return42@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-06-06 09:50:34 +02:00
Ivan Gabaldon
eb36de8d91 [mod] container: revert to alpine (#4893)
I'm not too pleased to reverse this, but issues like https://github.com/searxng/searxng/issues/4792 have not been foreseen, and we can't just turn away. It has become apparent over the last weeks that there are still quite a few people with an incompatible CPU or having SearXNG on some random VM provider who can't (or won't) modify the configuration of their machines to expose the features needed for x86_64v2 march.

As I don't want to trash the work with apko and base images, I thought about trying building Alpine again now that we have all the container related workflow refactored.

There will still be the discussion of whether to use musl and its drawbacks, but right now I don't know any other alternatives.

The nice part of this is that both Dockerfiles (mainline and legacy) can now be unified under the same umbrella again.

Closes https://github.com/searxng/searxng/issues/4792
Closes https://github.com/searxng/searxng/issues/4753
2025-06-03 21:24:47 +02:00
useralias
b73ac81815 [fix] startpage engine: resolve instant CAPTCHA issues (#4890)
Changes:
- Improve log messages for better debugging of future CAPTCHA issues
- Fixed erroneous get_sc_url variable where sc was always blank (when no cached value)
- Move Origin and Referer headers to request() function
- Add missing form parameters (abp, abd, abe) required by Startpage
  to avoid being flagged as automated requests
- Include segment parameter for paginated requests
- Clean up unnecessary commented-out headers
- Fix minor typos e.g. "time-stamp" → "timestamp", "scrap" → "scrapes"

Related:
- https://github.com/searxng/searxng/issues/4673
2025-06-03 09:58:52 +02:00
Markus Heiser
d63bdcd773 [mod] CI: exclude SearXNG checker and build & deploy of online docs (#4875)
checker.yml

1. The checker is not yet of sufficient quality to allow the results of the
   check to be evaluated / we do not evaluate them ourselves.

2. The checker sends hundreds of requests to the search engines and causes
   problems there / we either overload small providers or we train their bot
   defenses to use the SearXNG signature.

documentation.yml

Building the documentation and deploying it on GH-docs of a clones (GH forks) is
generally not desirable either --> We have >2k clones, but we only need one
up-to-date documentation and that is the one from the master branch of the
searxng/searxng repo.

If search engines like Google start linking to the documentation in the clones,
SearXNG users may no longer find the original documentation or be lost in the
flood of options.

Related:

- https://github.com/searxng/searxng/issues/4847

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-06-01 19:47:56 +02:00
benpiano800
93751b6379 [chore] engine preferences: fix grammar mistakes (#4883) 2025-05-31 21:09:31 +02:00
Markus Heiser
6e2d3e05c4 [build] /static 2025-05-31 20:34:59 +02:00
Markus Heiser
ff206e9679 [mod] weather results: add types, i18n/l10n, symbols & unit conversions
The types necessary for weather information such as GeoLocation, DateTime,
Temperature,Pressure, WindSpeed, RelativeHumidity, Compass (wind direction) and
symbols for the weather have been implemented.

There are unit conversions and translations for weather property labels.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-31 20:34:59 +02:00
Markus Heiser
a800dd0473 [mod] implement searx.wikidata_units for unit converters 2025-05-31 20:34:59 +02:00
Bnyro
cf59ee2efc [feat] open meteo: use new weather answerer 2025-05-31 20:34:59 +02:00
Bnyro
d70f0a3321 [feat] result types: add weather result answerer and template 2025-05-31 20:34:59 +02:00
benpiano800
37d851fb23 [mod] UI footer: correct capitalization of "SearXNG" in base.html 2025-05-30 09:33:57 +02:00
dependabot[bot]
1b424b8d54 [upd] pypi: Bump the minor group with 2 updates
Bumps the minor group with 2 updates: [selenium](https://github.com/SeleniumHQ/Selenium) and [typer-slim](https://github.com/fastapi/typer).


Updates `selenium` from 4.32.0 to 4.33.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.32.0...selenium-4.33.0)

Updates `typer-slim` from 0.15.4 to 0.16.0
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.15.4...0.16.0)

---
updated-dependencies:
- dependency-name: selenium
  dependency-version: 4.33.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: typer-slim
  dependency-version: 0.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-30 09:23:11 +02:00
dependabot[bot]
b991688fcb [upd] web-client (simple): Bump the minor group
Bumps the minor group in /client/simple with 2 updates: [globals](https://github.com/sindresorhus/globals) and [stylelint](https://github.com/stylelint/stylelint).


Updates `globals` from 16.1.0 to 16.2.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v16.1.0...v16.2.0)

Updates `stylelint` from 16.19.1 to 16.20.0
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.19.1...16.20.0)

---
updated-dependencies:
- dependency-name: globals
  dependency-version: 16.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: stylelint
  dependency-version: 16.20.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-30 09:16:49 +02:00
searxng-bot
44471bef35 [l10n] update translations from Weblate
0f55f2438 - 2025-05-29 - sandijs <sandijs@noreply.codeberg.org>
109f7dcb8 - 2025-05-26 - ngf <ngf@noreply.codeberg.org>
d2ba9b3d0 - 2025-05-26 - artnay <artnay@noreply.codeberg.org>
33c6f23bf - 2025-05-26 - realkendrick_fr <realkendrick_fr@noreply.codeberg.org>
2025-05-30 09:13:36 +02:00
dependabot[bot]
0b4c47a123 [upd] web-client (simple): Bump the minor group
Bumps the minor group in /client/simple with 4 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js), [eslint](https://github.com/eslint/eslint), [sharp](https://github.com/lovell/sharp) and [webpack](https://github.com/webpack/webpack).


Updates `@eslint/js` from 9.26.0 to 9.27.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.27.0/packages/js)

Updates `eslint` from 9.26.0 to 9.27.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.26.0...v9.27.0)

Updates `sharp` from 0.34.1 to 0.34.2
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.34.1...v0.34.2)

Updates `webpack` from 5.99.8 to 5.99.9
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.99.8...v5.99.9)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.27.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: eslint
  dependency-version: 9.27.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor
- dependency-name: sharp
  dependency-version: 0.34.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
- dependency-name: webpack
  dependency-version: 5.99.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-29 09:00:15 +02:00
Markus Heiser
913dfbde3c [fix] plugins: currency processor bug
Fix C&P typo from  https://github.com/searxng/searxng/pull/4836

Closes: https://github.com/searxng/searxng/issues/4861
2025-05-29 07:37:59 +02:00
searxng-bot
7448a18efa [data] update searx.data - update_ahmia_blacklist.py 2025-05-29 07:11:55 +02:00
searxng-bot
23396f5a1d [data] update searx.data - update_firefox_version.py 2025-05-29 07:10:22 +02:00
searxng-bot
dbe6a6f4fa [data] update searx.data - update_wikidata_units.py 2025-05-29 07:08:32 +02:00
searxng-bot
b2727e1be9 [data] update searx.data - update_currencies.py 2025-05-29 07:07:55 +02:00
searxng-bot
9d8592afd7 [data] update searx.data - update_engine_traits.py 2025-05-29 07:07:05 +02:00
searxng-bot
70a387a48f [data] update searx.data - update_engine_descriptions.py 2025-05-29 07:06:38 +02:00
Bnyro
2288f07d62 [fix] presearch: reuse response cookies from token extraction
Why?
- presearch requires the response cookies of the first request to be sent within the second request
- otherwise we miss auth information and the engine doesn't work

Related:
- https://github.com/searxng/searxng/pull/4858
- closes https://github.com/searxng/searxng/issues/4854

Co-authored-by: Aadniz <8147434+Aadniz@users.noreply.github.com>
2025-05-28 12:53:45 +02:00
Bnyro
20b40351b9 [chore] il post: disable by default 2025-05-26 17:39:09 +02:00
Bnyro
7a5a499795 [build] /static 2025-05-25 18:04:18 +02:00
Bnyro
9dfdd30da0 [fix] search: autocomplete focus on results page
This has been a regression introduced with the removal of
the unmaintained autocomplete.js library.

We should only focus the search bar on the main search page at `/`
and not at the results page located at `/search`.

I'm not sure if there's a better way to figure out if
we're on the results page than checking if the id of the
main element is `#main_results`, checking the path
obviously isn't a better solution because it can differ
depending on the instance / reverse proxy / ....

- related to 32823ecb69
- closes https://github.com/searxng/searxng/issues/4846
2025-05-25 18:04:18 +02:00
Ivan Gabaldon
14b8a999f3 [mod] ci: exclude some workflows from forks (#4849)
Excludes some workflows/jobs unneeded on forks.

Closes https://github.com/searxng/searxng/issues/4847
2025-05-25 14:54:27 +02:00
Markus Heiser
848c8d0544 [mod] data: implement a simple currencies (SQL) database (#4836)
To reduce the memory footprint, this patch no longer loads the JSON data
completely into memory.  Instead, there is an SQL database based on
`ExpireCacheSQLite`.

The class CurrenciesDB is a simple DB application that encapsulates the
DB (queries and initialization) and provides convenient methods like
`name_to_iso4217` and `iso4217_to_name`.

Related:

- https://github.com/searxng/searxng/discussions/1892
- https://github.com/searxng/searxng/pull/3458#issuecomment-2900807671
- https://github.com/searxng/searxng/pull/4650

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-25 10:40:57 +02:00
github-actions[bot]
e46187e3ce [l10n] update translations from Weblate (#4840)
51e0a154c - 2025-05-22 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
256b8cb8e - 2025-05-16 - wetinee <wetinee@noreply.codeberg.org>
ac12b76a8 - 2025-05-16 - wetinee <wetinee@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-05-25 10:36:27 +02:00
Markus Heiser
064eb50473 [mod] engines: Yahoo in different languages (#4826)
BTW fix issue reported in [1]

[1] https://github.com/searxng/searxng/pull/4814#issuecomment-2896948787

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-05-24 13:14:13 +02:00
Alexandre Flament
9ed9a9aa53 [fix] searx.network: don't trigger DeprecationWarning (#4845)
Avoid a confusing warning:

    DeprecationWarning: Setting per-request cookies=<...> is being deprecated

Code based on httpx unit test [1]

[1] 6a99f6f2b3/tests/client/test_cookies.py (L123-L137)

Closes: https://github.com/searxng/searxng/issues/4833
2025-05-24 12:40:05 +02:00
Markus Heiser
230215c250 [fix] preferences: description not localized for all UI languages (#4844)
The previous implementation for determining the description of an engine did not
take into account that the UI languages ​​can also have a region tag and/or a
script tag:

    el-GR:      Ελληνικά, Ελλάδα (Greek, Greece)
    fa-IR:      فارسی, ایران (Persian, Iran)
    nb-NO:      Norsk bokmål, Norge (Norwegian bokmål, Norway)
    nl-BE:      Nederlands, België (Dutch, Belgium)
    pt-BR:      Português, Brasil (Portuguese, Brazil)
    zh-HK:      中文, 中國香港特別行政區 (Chinese, Hong Kong SAR China)
    zh-Hans-CN: 中文, 中国 (Chinese, China)
    zh-Hant-TW: 中文, 台灣 (Chinese, Taiwan)

Closes: https://github.com/searxng/searxng/issues/4842

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-23 17:11:41 +02:00
Markus Heiser
1ef5c03962 [fix] ddg engine: IndexError exception is raised on empty contend (#4843)
Sometimes (e.g. when ddg does not have a result item) there is no content and
the engine will fail with an IndexError:

  * Error: IndexError
  * Percentage: 10
  * Parameters: `()`
  * File name: `searx/engines/duckduckgo.py:375`
  * Function: `response`
  * Code: `item["content"] = extract_text(eval_xpath(div_result, './/a[contains(@class, "result__snippet")]')[0])`

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-23 14:55:22 +02:00
useralias
4fa7de8033 [refactor] duckduckgo engine: improve request logic and code structure (#4837)
Changes:
- Add trailing slash to base URL to prevent potential redirects
- Remove advanced search syntax filtering (no longer guarantees a CAPTCHA)
- Correct pagination offset calculation: Page 2 now starts at offset 10,
  subsequent pages use 10 + (n-2)*15 formula instead of the previous
  broken 20 + (n-2)*50 calculation that caused CAPTCHAs
- Restructure request parameter building to better match a real request
- "kt" cookie is no longer an empty string if the language/region is "all"
- Group related parameter assignments together
- Add header logging to debugging output

Related:

- https://github.com/searxng/searxng/issues/4824
2025-05-23 13:01:10 +02:00
Markus Heiser
98badc9cd0 [fix] searx.data: fetch-traits - z-library (httpx.ConnectError) (#4835)
There is currently no known z-library, and all known URLs are dead [1]. To avoid
interrupting automated updates, a connection error to a z-library is treated as
a *known error*, and the old properties of the z-library are retained.

[1] https://github.com/searxng/searxng/issues/3610

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-22 17:43:11 +02:00
Markus Heiser
d29cf64ce4 [mod] searx.data: lazy load of the data objects (databases) (#4834)
In the previous implementation, all databases were loaded into memory when
importing the searx.data package, regardless of whether they were ever needed.

Regardless of this, it is an antipattern to load entire databases into memory
when importing a package or module; databases should be loaded when needed.

Lazy loading is a first step toward improving memory usage and also improves
performance when setting up the runtime environment.  Building on this,
subsequent PRs will be able to further optimize memory behavior, e.g., by using
a real database application such as the one already available via

    searx.cache.ExpireCache

Related:

- https://github.com/searxng/searxng/discussions/1892
- https://github.com/searxng/searxng/pull/3458
- https://github.com/searxng/searxng/pull/4650

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-22 16:23:30 +02:00
Markus Heiser
861f9c4be5 [build] /static 2025-05-22 15:16:54 +02:00
Bnyro
32823ecb69 [refactor] search.js: use custom auto completion implementation
The previously used library is unmaintained for 6 years now [1] and the solution
had know issues [2][3]

[1] https://github.com/searxng/searxng/pull/4284#discussion_r1954493434
[2] https://github.com/searxng/searxng/pull/4318#issuecomment-2731576657
[3] https://github.com/privau/searxng/issues/56
2025-05-22 15:16:54 +02:00
Zhijie He
156d1eb8c8 [feat] engines: add Naver engine (#4573)
Refactor Naver engine (Web, News, Images, Videos, Autocomplete)

- ref: https://search.naver.com/
- lang: `ko`
- Wikidata: https://www.wikidata.org/wiki/Q485639

Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-05-21 18:25:02 +02:00
Markus Heiser
365b9426f1 [fix] engines: disable those with known issues (#4813)
- z-library https://github.com/searxng/searxng/issues/3610
- library of congress: https://github.com/searxng/searxng/issues/4810
- qwant: https://github.com/searxng/searxng/issues/3929

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-21 15:50:29 +02:00
Ivan Gabaldon
9ffe23ecf3 [mod] container: remove -e flag
Temporarily remove the -e flag from set to prevent entrypoint.sh from stopping execution if any command returns a non-zero status. This doesn't solve anything but relaxes the script checks.

Related https://github.com/searxng/searxng/issues/4818
2025-05-21 15:27:26 +02:00
Bnyro
502017b901 [fix] pinterest: engine broken due to API changes (#4816)
- apparently the API now requires a `X-Pinterest-PWS-Handler` in order to
  properly function (extracted from their web UI)

- the other `X-Pinterest` headers here are added in case they become mandatory
  too

Closes: https://github.com/searxng/searxng/issues/4812
2025-05-21 15:22:42 +02:00
Bnyro
88973f5431 [feat] engines: add uxwing engine for icons (#4819)
- uxwing provides attribution-free icons to use for design projects
- svgrepo was my go-to before, but it's ratelimiting a lot recently
2025-05-21 15:10:29 +02:00
Bnyro
8bff73c9b6 [refactor] icon engines: add new icon category (#4817)
Icons category makes sense because it allows to quickly search for free SVG
icons to use for websites / other designs with a quick `!icons` query

Icons don't seem to fit into the normal images category that well because icons
are quite a special type of images
2025-05-21 14:52:16 +02:00
Jost Alemann
7420706a50 [chore] fix some docstring typos (#4815) 2025-05-20 21:03:54 +02:00
useralias
6ec554cb5b [fix] yahoo: url and title xpath 2025-05-20 21:02:40 +02:00
Alexandre Flament
7a3742ae56 [mod] upgrade to httpx 0.28.1 (#4674) 2025-05-20 18:18:07 +02:00
Markus Heiser
ca67f1dffe [fix] duckduckgo engines: issue when get_vqd() is used by ddg-images and ddg-videos (#4809)
The global variable CACHE is not initialized when DDG images or DDG videos
import the get_vqd() function (please remember: the engine modules are imported
using the importlib method and not via the `import` keyword).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-20 16:10:10 +02:00
Ivan Gabaldon
749de829d5 [mod] container: refactor entrypoint script
That entrypoint is prone to screw things up, especially with permission handling. The new script handles initialization better and fixes some issues like delayed settings update via ENVs and timestamp overwriting, also adjusts what should be copied into the container.

Related https://github.com/searxng/searxng/pull/4721#issuecomment-2850272129
2025-05-20 11:49:30 +02:00
Ivan Gabaldon
a195f52412 [fix] container: base-builder should have essentials
The wolfi-base metapackage includes busybox, ca-certificates-bundle and the package manager. The change is to make the use of base-builder image more flexible.
2025-05-20 11:31:45 +02:00
dependabot[bot]
5dff826937 [upd] web-client (simple): Bump vite-plugin-static-copy (#4791)
Bumps [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) from 2.3.1 to 3.0.0.
- [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases)
- [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@2.3.1...vite-plugin-static-copy@3.0.0)
2025-05-18 13:22:48 +02:00
Markus Heiser
b8b857d24c [mod] engine invidious: commented out / no public API available nowadays (#4800)
Reported-by: @unifox https://github.com/searxng/searxng/issues/2722#issuecomment-2884993248

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-18 13:20:27 +02:00
Ivan Gabaldon
86373e7c87 [mod] container: build custom base images (#4799)
Instead of using Wolfi base images from cgr.dev and making that mess on the Dockerfile, why don't we build the base images ourselves from Wolfi repos with apko? The intention of this is to simplify the main Dockerfile and avoid having to patch the base image every time, it also simplifies some steps like image ownership management and provides extremely fast builds.
2025-05-17 18:21:04 +02:00
github-actions[bot]
1b08324f26 [l10n] update translations from Weblate (#4788) 2025-05-16 09:40:45 +02:00
dependabot[bot]
b8682ffc69 [upd] pypi: Bump typer-slim from 0.15.3 to 0.15.4 in the minor group (#4789)
Bumps the minor group with 1 update: [typer-slim](https://github.com/fastapi/typer).


Updates `typer-slim` from 0.15.3 to 0.15.4
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.15.3...0.15.4)

---
updated-dependencies:
- dependency-name: typer-slim
  dependency-version: 0.15.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-16 09:20:44 +02:00
Ivan Gabaldon
03083f07da [enh] container: use Wolfi OS as base image
Wolfi OS images are specifically designed for container use. Using a specially designed base image for containers not only reduces maintenance burdens, but improves overall experience for developers (fewer packages we have to track) and end users (smaller images).

Discussion here: https://github.com/searxng/searxng/issues/4753
2025-05-15 22:56:31 +02:00
Ivan Gabaldon
cd64fb966e [enh] container: support multiple registries
Allows to push the manifests to other registries, this allows to push both docker.io and ghcr.io registries.
2025-05-15 11:37:18 +02:00
Ivan Gabaldon
743f24d8c6 [fix] CI: commit author should be searxng-bot
If the workflow is executed with the "workflow_dispatch" trigger, the user who executed the workflow becomes the author of the commit on the PR, this is not intended.

It also reverts the body param so that the default text of the action does not appear.
2025-05-15 11:19:28 +02:00
Ivan Gabaldon
bec76bc2e3 [fix] CI: prevent race condition
`checker.yml` and `integration.yml` are the only workflows that are currently safe to be executed simultaneously, the others present a risk that the order of completion may not be expected. The ones that are chained from `integration.yml` can be called as many times as `integration.yml` workflows are running at that moment, the same with the trigger "workflow_dispatch".

This can be fatal for workflows like `container.yml` that use a centralized cache to store and load the candidate images in a common tag called "searxng-<arch>".

* For example, a `container.yml` workflow is executed after being chained from `integration.yml` (called "~1"), and seconds later it may be triggered again because another PR merged some breaking changes (called "~2"). While "~1" has already passed the test job successfully and is about to start the release job, "~2" finishes building the container and overwrites the references on the common tag. When "~1" in the release job loads the images using the common tag, it will load the container of "~2" instead of "~1" having skipped the whole test job process.

The example is only set for the container workflow, but the other workflows might occur in a similar way.
2025-05-15 11:19:28 +02:00
Ivan Gabaldon
d0b7f26f4b [fix] CI: container-mounts bad hash
This is a typo, but if there are multiple patterns in hashFiles, they should be separated by commas.

https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions#examples-with-multiple-patterns
2025-05-15 11:19:28 +02:00
Ivan Gabaldon
b42f812c57 [fix] CI: handle old cache images from registry
Currently, we have 1100~ cache images uploaded to GHCR that weigh more than 300 MB each (most of them are layers from the second phase of the Dockerfile that were uploaded by mistake, read below). To avoid problems, I have set up a new job in a new workflow to be run weekly purging all images older than 1 week, but leaving always the 100 most recent ones.

Only the builder images should be uploaded to cache, the actual behaviour not only slows down the time for building the container, but also wastes lots of space by saving large and useless layers to GHCR that will never be used again.
2025-05-14 22:42:36 +02:00
dependabot[bot]
c73b469ce7 Bump flask from 3.1.0 to 3.1.1 (#4780)
Bumps [flask](https://github.com/pallets/flask) from 3.1.0 to 3.1.1.
- [Release notes](https://github.com/pallets/flask/releases)
- [Changelog](https://github.com/pallets/flask/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/flask/compare/3.1.0...3.1.1)
2025-05-14 08:18:03 +02:00
Ivan Gabaldon
1a8884fa26 [enh] tidy: clean old morty, filtron, searx references
Everyone should have already switched from legacy methods.
2025-05-13 21:10:02 +02:00
dependabot[bot]
4fb29aae81 [upd] pypi: Bump the minor group with 2 updates (#4776)
Bumps the minor group with 2 updates: [selenium](https://github.com/SeleniumHQ/Selenium) and [redis](https://github.com/redis/redis-py).


Updates `selenium` from 4.31.0 to 4.32.0
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.31.0...selenium-4.32.0)

Updates `redis` from 5.0.8 to 5.2.1
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v5.0.8...v5.2.1)
2025-05-13 17:44:10 +02:00
dependabot[bot]
c303da55b0 [upd] web-client (simple): Bump the minor group (#4775)
Bumps the minor group in /client/simple with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) | `9.25.1` | `9.26.0` |
| [eslint](https://github.com/eslint/eslint) | `9.25.1` | `9.26.0` |
| [globals](https://github.com/sindresorhus/globals) | `16.0.0` | `16.1.0` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `6.3.4` | `6.3.5` |
| [webpack](https://github.com/webpack/webpack) | `5.99.7` | `5.99.8` |


Updates `@eslint/js` from 9.25.1 to 9.26.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.26.0/packages/js)

Updates `eslint` from 9.25.1 to 9.26.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.25.1...v9.26.0)

Updates `globals` from 16.0.0 to 16.1.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v16.0.0...v16.1.0)

Updates `vite` from 6.3.4 to 6.3.5
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.5/packages/vite)

Updates `webpack` from 5.99.7 to 5.99.8
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.99.7...v5.99.8)
2025-05-13 17:38:46 +02:00
Ivan Gabaldon
2cfd3fc44b [enh] tidy: clean old morty, filtron, searx references
Everyone should have already switched from legacy methods
2025-05-13 10:37:02 +02:00
Markus Heiser
9006866019 [fix] engine archlinux: avoid Anubis challenge by User-Agent "SearXNG" (#4779)
Of the archlinux wikis only wiki.archlinux.org has a has Anubis challenge.

About Anubis[1]:

> Anubis decides to present a challenge using this logic:
>
> - User-Agent contains "Mozilla"
> ...
> This should ensure that git clients, RSS readers, and other low-harm clients
> can get through without issue ..

[1] 6c0ff3f4d5/docs/docs/design/how-anubis-works.mdx (challenge-presentation)


Suggested-by: @unixfox https://github.com/searxng/searxng/issues/4646#issuecomment-2855322406
Closes: https://github.com/searxng/searxng/issues/4646

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-13 10:18:28 +02:00
Ivan Gabaldon
5d99373bc6 [fix] DOCKERHUB_USERNAME env reference (#4778)
When making the container rework, I unknowingly deleted the section where an env with the same name as the secret was defined on the job scope, making it look like it was originally defined as an organization env.

Since we can't validate the secrets in a condition directly, it's better to let docker/login-action take care of failing the entire job if the credentials are invalid.

Reported in: https://github.com/searxng/searxng/issues/4777
2025-05-12 23:43:47 +02:00
Ivan Gabaldon
945b30a1c4 [mod] lib_sxng_container.sh: replace echo commands with heredoc
Suggested-by: @return42 https://github.com/searxng/searxng/pull/4764#discussion_r2083571202
2025-05-12 17:11:35 +02:00
Ivan Gabaldon
64a5b6920f [mod] lib_sxng_container.sh use required_commands() helper
Suggested-by: @return42 https://github.com/searxng/searxng/pull/4764#discussion_r2083564489
2025-05-12 17:11:35 +02:00
Markus Heiser
346d7fe019 [mod] CI: dependabot group updates by minor & patch and major updates (#4773)
By default, Dependabot opens a new pull request to update each dependency and we
have a very large number of Dependabot pull requests to review and merge, which
can quickly become difficult to manage.

The intention of this patch to dependabot is to have:

- one PR for all minor & patch level updates
- one PR for every dependency with a major update

[1] https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/optimizing-pr-creation-version-updates
[2] https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference#groups

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-12 16:42:43 +02:00
Markus Heiser
750a7b4d6f [doc] add chapter on the purpose of (git) commits (#4729)
Chapter on the purpose of (git) commits

The commits and their messages are elementary for the traceability of changes
and are unfortunately still too often given too little attention.

It therefore seems necessary to dedicate a chapter to this topic in the context
of development.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-12 08:27:16 +02:00
Ivan Gabaldon
da3c640cef revert using null keyword
env.DOCKERHUB_USERNAME shouldn't be an empty string as it's defined and set (I think, I can't see this). Even if wasn't defined, GitHub Org/Repo wide envs/secrets should return an empty string (?)
2025-05-11 19:28:51 +02:00
Ivan Gabaldon
d16854e67a [mod] rework container deployment (#4764)
container.yml will run after integration.yml COMPLETES successfully and in master branch.

Style changes, cleanup and improved integration with CI by leveraging the use of
shared cache between all workflows.

* Podman is now supported to build the container images (Docker also received a refactor, merging both build and buildx)
* Container images are being built by Buildah instead of Docker BuildKit.
* Container images are tested before release.
* Splitting "modern" (amd64 & arm64) and "legacy" (armv7) arches on different Dockerfiles allowing future optimizations.
2025-05-11 18:12:51 +02:00
Ivan Gabaldon
1b787ed35e [mod] refactor integration.yml (#4763)
Style changes, cleanup and improved integration with CI by leveraging the use of
shared cache between all workflows.
2025-05-10 13:59:31 +02:00
Ivan Gabaldon
8e2e7774d7 [mod] new l10n.yml workflow (#4734)
l10n.yml will run after integration.yml finishes successfully (will defer anything depending on integration.yml until heavy loads like container building are moved to separate workflows) and in master branch.

* After every integration.yml workflow completes successfully, only the `update` job runs.
* Dispatch and Crontab triggers only the `pr` job.

Style changes, cleanup and improved integration with CI by leveraging the use of shared cache between all workflows (not functional until all workflows have been refactored).
2025-05-10 13:08:20 +02:00
Ivan Gabaldon
e982b9f732 [fix] documentation should run on push/pr
Instead of executing the workflow after integration.yml completes correctly, let's run this workflow parallel to integration.yml restoring the original behaviour.
2025-05-10 07:41:42 +02:00
Émilien (perso)
48456caeb3 chore: docker + github-actions dependabot (#4754)
* chore: docker dependabot

* Add github actions too
2025-05-09 20:46:20 +02:00
Markus Heiser
ef158ce1f4 [build] /static 2025-05-09 12:40:34 +02:00
Markus Heiser
cbf9ec7bf4 [fix] static.build.commit: add missing searx/templates/simple/icons.html
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-09 12:40:34 +02:00
Markus Heiser
409ede1530 [fix] simple client: jinja_svg_catalog addClassesToSVGElement
Starting with ionicons-8.0.8 the SVG already contains a class attribute and
instaed of using SVGO plugin ``addAttributesToSVGElement`` we habve to use
``addClassesToSVGElement`` to add out ``__jinja_class_placeholder__``.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-09 12:40:34 +02:00
dependabot[bot]
1326ec7429 [upd] web-client (simple): Bump ionicons in /client/simple
Bumps [ionicons](https://github.com/ionic-team/ionicons) from 7.4.0 to 8.0.8.
- [Release notes](https://github.com/ionic-team/ionicons/releases)
- [Commits](https://github.com/ionic-team/ionicons/compare/v7.4.0...v8.0.8)

---
updated-dependencies:
- dependency-name: ionicons
  dependency-version: 8.0.8
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-09 12:40:34 +02:00
dependabot[bot]
50406d4b46 [upd] pypi: Bump pylint from 3.3.6 to 3.3.7 (#4750)
Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.6 to 3.3.7.
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.6...v3.3.7)

---
updated-dependencies:
- dependency-name: pylint
  dependency-version: 3.3.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 11:10:37 +02:00
dependabot[bot]
5ce3aa3acf [upd] pypi: Bump yamllint from 1.37.0 to 1.37.1 (#4752)
Bumps [yamllint](https://github.com/adrienverge/yamllint) from 1.37.0 to 1.37.1.
- [Release notes](https://github.com/adrienverge/yamllint/releases)
- [Changelog](https://github.com/adrienverge/yamllint/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/adrienverge/yamllint/compare/v1.37.0...v1.37.1)

---
updated-dependencies:
- dependency-name: yamllint
  dependency-version: 1.37.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 11:09:44 +02:00
SearXNG Bot
76ebad0b21 [l10n] update translations from Weblate (#4744)
6f8c520f2 - 2025-05-08 - polskiecus <polskiecus@noreply.codeberg.org>
05dd91d5b - 2025-05-08 - return42 <return42@noreply.codeberg.org>
686b8e5fb - 2025-05-08 - return42 <return42@noreply.codeberg.org>
f40b42bd8 - 2025-05-05 - ehsanrs2 <ehsanrs2@noreply.codeberg.org>
b8013bc99 - 2025-05-03 - polskiecus <polskiecus@noreply.codeberg.org>
5affaa104 - 2025-05-02 - SomeTr <sometr@noreply.codeberg.org>

Co-authored-by: searxng-bot <searxng-bot@users.noreply.github.com>
2025-05-09 09:31:50 +02:00
github-actions[bot]
d76f030cb3 [data] update searx.data - update_wikidata_units.py (#4738) 2025-05-09 07:09:58 +02:00
github-actions[bot]
b3b15ecc72 [data] update searx.data - update_ahmia_blacklist.py (#4739)
Co-authored-by: inetol <inetol@users.noreply.github.com>
2025-05-09 07:09:00 +02:00
github-actions[bot]
1319b250af [data] update searx.data - update_currencies.py (#4740)
Co-authored-by: inetol <inetol@users.noreply.github.com>
2025-05-09 07:08:26 +02:00
github-actions[bot]
198928de05 [data] update searx.data - update_engine_traits.py (#4741)
Co-authored-by: inetol <inetol@users.noreply.github.com>
2025-05-09 07:07:33 +02:00
github-actions[bot]
11d9c830b8 [data] update searx.data - update_engine_descriptions.py (#4742)
Co-authored-by: inetol <inetol@users.noreply.github.com>
2025-05-09 07:06:52 +02:00
Ivan Gabaldon
743f90514b [fix] missing PR perm data-update.yml workflow (#4737)
We actually don't need to keep the token on checkout because `peter-evans/create-pull-request` will read from `github.token`. The obvious `pull-requests` write permission wasn't set in the last fix, so I added it now.
2025-05-08 23:55:23 +02:00
Ivan Gabaldon
48801dbc9a [mod] CI move build of online docs to dedicated workflow documentation.yml (#4733)
documentation.yml will run after integration.yml COMPLETES successfully (will
defer anything depending on integration.yml until heavy loads like container
building are moved to separate workflows) and in master branch.

Style changes, cleanup and improved integration with CI by leveraging the use of
shared cache between all workflows (not functional until all workflows have been
refactored).
2025-05-08 17:40:05 +02:00
Ivan Gabaldon
5451ab243a [fix] fix security.yml workflow (#4735)
Uploading SARIFs needs to write into the repository GitHub security tab
2025-05-08 17:13:07 +02:00
Ivan Gabaldon
7ca24eee45 [fix] missing perm data-update.yml workflow (#4736)
We need to keep the token on checkout and allow writing into the repository to create the branch
2025-05-08 16:51:21 +02:00
Ivan Gabaldon
c6a70782b2 [mod] CI: refactor data-update.yml - searxng_extra/update scripts (#4732)
Style changes, cleanup and improved integration with CI by leveraging the use of
shared cache between all workflows (not functional until all workflows have been
refactored).
2025-05-08 15:13:22 +02:00
Ivan Gabaldon
01a07f34b2 [mod] CI refactor security.yml - style and cleanup changes (#4731) 2025-05-08 14:44:22 +02:00
Ivan Gabaldon
f32fcb1243 [mod] CI: refactor checker.yml - make search.checker (#4730)
Style changes, cleanup and improved integration with CI by leveraging the use of
shared cache between all workflows (not functional until all workflows have been
refactored).
2025-05-08 13:58:06 +02:00
benpiano800
bc06b1aece [enh] plugins: tor_check: Add more keywords (#4726)
Previously, there was only one usable keyword for the tor_check plugin. Adding more keywords eliminates confusion.
2025-05-07 10:39:46 +02:00
Brock Vojkovic
ff60fe635f [fix] sec-fetch-* blocking infinite scroll (#4728) 2025-05-07 10:38:21 +02:00
Markus Heiser
6e7119fa4e [fix] references from searx.botdetection.http_sec_fetch (#4723) 2025-05-07 10:25:47 +02:00
Ivan Gabaldon
f52cd3f008 missing dependency for armv7 (#4727) 2025-05-07 08:53:34 +02:00
Ivan Gabaldon
a2fa7de880 [mod] Rework Dockerfile - migrate to glibc (debian) (#4721) 2025-05-06 11:56:59 +02:00
Bnyro
0315988f5a fix] revert searxng/searxng#4699 due to breaking issues (#4720)
This reverts commit 2e74d86321.
2025-05-05 09:46:37 +02:00
Ivan Gabaldon
2e74d86321 Rework Dockerfile (#4699)
This is one of various PR to refactor the entire SearXNG Docker workflow.

Switches to Python glibc based images, all dependencies are installed via pip and not from system repositories, and several minor changes.

This PR will increase the image size from 194.9 MB to 345.47 MB (amd64), this is due to ARMv7 images (needs dependencies for wheels compilation and runtime (?)) and uWSGI webserver. Later PR will reduce the final image size.
2025-05-04 22:27:53 +02:00
Émilien (perso)
19b116f1d7 fix: check if the browser supports Sec-Fetch headers (#4696) 2025-05-04 10:12:25 +02:00
Markus Heiser
fe08bb1d90 [mod] botdetection: HTTP Fetch Metadata Request Headers
HTTP Fetch Metadata Request Headers [1][2] are used to detect bot requests. Bots
with invalid *Fetch Metadata* will be redirected to the intro (`index`)  page.

[1] https://www.w3.org/TR/fetch-metadata/
[2] https://developer.mozilla.org/en-US/docs/Glossary/Fetch_metadata_request_header

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-04 02:07:26 +02:00
Markus Heiser
8ef5fbca4e [fix] cache.ExpireCache: definition of a context name for the key
The definition of a context name belongs in the abstract base class (was
previously only in the concrete implementation for the SQLite adapter).

Suggested-by: @dalf https://github.com/searxng/searxng/pull/4650#discussion_r2069873853
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-03 08:39:12 +02:00
Markus Heiser
7351c38e6c [fix] (armv7) cache.ExpireCache: remove option ENCRYPT_VALUE
Prophylactic encryption of the value currently makes no sense; on the contrary,
since the ``cryptography`` package is not available on armv7, it would cause
further problems.

Suggested-by: @dalf https://github.com/searxng/searxng/pull/4650#issuecomment-2830786661
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-03 08:39:12 +02:00
Markus Heiser
bdfe1c2a15 [mod] engines: migration of the individual cache solutions to EngineCache
The EngineCache class replaces all previously individual solutions for caches in
the context of the engines.

- demo_offline.py
- duckduckgo.py
- radio_browser.py
- soundcloud.py
- startpage.py
- wolframalpha_api.py
- wolframalpha_noapi.py

Search term to test most of the modified engines::

    !ddg !rb !sc !sp !wa test

    !ddg !rb !sc !sp !wa foo

For introspection of the DB, jump into developer environment and run command to
show cache state::

    $ ./manage pyenv.cmd bash --norc --noprofile
    (py3) python -m searx.enginelib cache state

    cache tables and key/values
    ===========================
    [demo_offline        ] 2025-04-22 11:32:50 count        --> (int) 4
    [startpage           ] 2025-04-22 12:32:30 SC_CODE      --> (str) fSOBnhEMlDfE20
    [duckduckgo          ] 2025-04-22 12:32:31 4dff493e.... --> (str) 4-128634958369380006627592672385352473325
    [duckduckgo          ] 2025-04-22 12:40:06 3e2583e2.... --> (str) 4-263126175288871260472289814259666848451
    [radio_browser       ] 2025-04-23 11:33:08 servers      --> (list) ['https://de2.api.radio-browser.info',  ...]
    [soundcloud          ] 2025-04-29 11:40:06 guest_client_id --> (str) EjkRJG0BLNEZquRiPZYdNtJdyGtTuHdp
    [wolframalpha        ] 2025-04-22 12:40:06 code         --> (str) 5aa79f86205ad26188e0e26e28fb7ae7
    number of tables: 6
    number of key/value pairs: 7

In the "cache tables and key/values" section, the table name (engine name) is at
first position on the second there is the calculated expire date and on the
third and fourth position the key/value is shown.

About duckduckgo: The *vqd coode* of ddg depends on the query term and therefore
the key is a hash value of the query term (to not to store the raw query term).

In the "properties of ENGINES_CACHE" section all properties of the SQLiteAppl /
ExpireCache and their last modification date are shown::

    properties of ENGINES_CACHE
    ===========================
    [last modified: 2025-04-22 11:32:27] DB_SCHEMA           : 1
    [last modified: 2025-04-22 11:32:27] LAST_MAINTENANCE    :
    [last modified: 2025-04-22 11:32:27] crypt_hash          : ca612e3566fdfd7cf7efe2b1c9349f461158d07cb78a3750e5c5be686aa8ebdc
    [last modified: 2025-04-22 11:32:30] CACHE-TABLE--demo_offline: demo_offline
    [last modified: 2025-04-22 11:32:30] CACHE-TABLE--startpage: startpage
    [last modified: 2025-04-22 11:32:31] CACHE-TABLE--duckduckgo: duckduckgo
    [last modified: 2025-04-22 11:33:08] CACHE-TABLE--radio_browser: radio_browser
    [last modified: 2025-04-22 11:40:06] CACHE-TABLE--soundcloud: soundcloud
    [last modified: 2025-04-22 11:40:06] CACHE-TABLE--wolframalpha: wolframalpha

These properties provide information about the state of the ExpireCache and
control the behavior.  For example, the maintenance intervals are controlled by
the last modification date of the LAST_MAINTENANCE property and the hash value
of the password can be used to detect whether the password has been changed (in
this case the DB entries can no longer be decrypted and the entire cache must be
discarded).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-03 08:39:12 +02:00
Markus Heiser
4cbfba9d7b [mod] ExpireCache - sqlite based key/value cache with expire time 2025-05-03 08:39:12 +02:00
Markus Heiser
4a594f1b53 [fix] ResourceWarning: unclosed database in sqlite3
Reported:

- https://github.com/inetol-infrastructure/searxng-container/issues/5

Related:

- https://github.com/searxng/searxng/issues/4405#issuecomment-2692352352

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-03 08:39:12 +02:00
Bnyro
590b211652 [fix] semantic scholar: method not allowed / engine doesn't work
Fixes the semantic scholar engine by extracting a ui version token.

BTW: remove html tags from the content.

Author's checklist:

- they are ratelimiting very fast, if you do approx more than 2 requests per
  minute, you have to wait some time again...

- they also have an official api at api.semanticscholar.org, but it's ratelimits
  are even harder

Closes: https://github.com/searxng/searxng/issues/4685
2025-05-02 16:46:38 +02:00
return42
41e3a0baa7 [data] update searx.data - update_engine_descriptions.py 2025-05-02 16:45:47 +02:00
dependabot[bot]
11204459da [upd] web-client (simple): Bump less-loader in /client/simple
Bumps [less-loader](https://github.com/webpack-contrib/less-loader) from 12.2.0 to 12.3.0.
- [Release notes](https://github.com/webpack-contrib/less-loader/releases)
- [Changelog](https://github.com/webpack-contrib/less-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/less-loader/compare/v12.2.0...v12.3.0)

---
updated-dependencies:
- dependency-name: less-loader
  dependency-version: 12.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 16:06:36 +02:00
Markus Heiser
03787b2e5a [docs] fix link searx/languages.py to new file searx/sxng_locales.py
The language settings page in the documentation reference languages.py which was
removed in commit c9cd376

Closes: https://github.com/searxng/searxng/issues/4690
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-02 15:19:55 +02:00
dependabot[bot]
72294a9ffa [upd] web-client (simple): Bump webpack in /client/simple
Bumps [webpack](https://github.com/webpack/webpack) from 5.99.6 to 5.99.7.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.99.6...v5.99.7)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.99.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 14:50:13 +02:00
BrandonStudio
d47cf9db24 [feat] engine ChinaSo: support source filter for ChinaSo-News
* filtering ChinaSo-News results by source, option ``chinaso_news_source``
* add ChinaSo engine to the online docs https://docs.searxng.org/dev/engines/online/chinaso.html
* fix SearXNG categories in the settings.yml
* deactivate ChinaSo engines ``inactive: true`` until [1] is fixed
* configure network of the ChinaSo engines

[1] https://github.com/searxng/searxng/issues/4694

Signed-off-by: @BrandonStudio
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-05-02 14:22:51 +02:00
dependabot[bot]
705ebe64b5 [upd] pypi: Bump typer-slim from 0.15.2 to 0.15.3
Bumps [typer-slim](https://github.com/fastapi/typer) from 0.15.2 to 0.15.3.
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.15.2...0.15.3)

---
updated-dependencies:
- dependency-name: typer-slim
  dependency-version: 0.15.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 13:46:47 +02:00
dependabot[bot]
b072b0f66b [upd] pypi: Bump setproctitle from 1.3.5 to 1.3.6
Bumps [setproctitle](https://github.com/dvarrazzo/py-setproctitle) from 1.3.5 to 1.3.6.
- [Changelog](https://github.com/dvarrazzo/py-setproctitle/blob/master/HISTORY.rst)
- [Commits](https://github.com/dvarrazzo/py-setproctitle/compare/version-1.3.5...version-1.3.6)

---
updated-dependencies:
- dependency-name: setproctitle
  dependency-version: 1.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 13:37:39 +02:00
dependabot[bot]
4beb5523f5 [upd] pypi: Bump certifi from 2025.1.31 to 2025.4.26
Bumps [certifi](https://github.com/certifi/python-certifi) from 2025.1.31 to 2025.4.26.
- [Commits](https://github.com/certifi/python-certifi/compare/2025.01.31...2025.04.26)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2025.4.26
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 13:37:11 +02:00
dependabot[bot]
54e6e2a96d [upd] web-client (simple): Bump stylelint in /client/simple
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.19.0 to 16.19.1.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.19.0...16.19.1)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 16.19.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 13:36:01 +02:00
searxng-bot
abcf8ca073 [l10n] update translations from Weblate
244e1f3f2 - 2025-04-30 - return42 <return42@noreply.codeberg.org>
2025-05-02 13:29:05 +02:00
dependabot[bot]
1a16281490 Bump vite from 6.3.3 to 6.3.4 in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.3 to 6.3.4.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.4/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.3.4
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-01 09:43:39 +02:00
Bnyro
fd33559cfb [fix] brave: fix images and videos engines 2025-04-30 08:28:04 +02:00
Denperidge
60e31eacfc [fix] pdia: dynamically fetch API key config file location
As suggested by @Bnyro at
https://github.com/searxng/searxng/pull/4652#discussion_r2055760390 !
2025-04-29 20:45:08 +02:00
return42
c45b970546 [data] update searx.data - update_currencies.py 2025-04-29 09:12:06 +02:00
Markus Heiser
a4251be397 [data] update searx.data - make data.traits
Related:

- https://github.com/searxng/searxng/pull/4687

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-29 09:11:33 +02:00
Markus Heiser
c20038e7c3 [fix] engine yahoo: replace fetch_traits by a list of languages
The Yahoo engine's fetch_traits function has been encountering an error in CI
jobs for several months [1], thus aborting the process for all other engines as
well.

The language selection dialog (which fetch_traits calls) requires an `EuConsent`
cookie. Strangely, the cookie is not needed for searching, which is why the
engine itself still works.

Since Yahoo won't be conquering any new marketplaces in the foreseeable future,
it should be sufficient to hard-implement the list of currently available
languages ​​(`yahoo_languages`).

[1] https://github.com/searxng/searxng/actions/runs/14720458830/job/41313149268

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-29 08:48:56 +02:00
return42
20e40ded6d [data] update searx.data - update_wikidata_units.py 2025-04-29 07:07:15 +02:00
return42
4de0766b76 [data] update searx.data - update_ahmia_blacklist.py 2025-04-29 07:06:49 +02:00
return42
6de83ca47f [data] update searx.data - update_firefox_version.py 2025-04-29 07:06:26 +02:00
return42
a32bcd54c5 [data] update searx.data - update_external_bangs.py 2025-04-29 07:06:10 +02:00
searxng-bot
c733aa83e8 [l10n] update translations from Weblate
bec89c8a4 - 2025-04-24 - Atul_Eterno <atul_eterno@noreply.codeberg.org>
97edb4d63 - 2025-04-23 - whytf <whytf@noreply.codeberg.org>
e7111d6ec - 2025-04-22 - prashere <prashere@noreply.codeberg.org>
f5eeda966 - 2025-04-20 - return42 <return42@noreply.codeberg.org>
2025-04-27 17:13:43 +02:00
dependabot[bot]
9dfc6f38d5 [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.2 to 6.3.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-27 10:16:44 +02:00
dependabot[bot]
e1076f5c35 [upd] web-client (simple): Bump @eslint/js in /client/simple
Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.24.0 to 9.25.1.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.25.1/packages/js)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.25.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-27 10:16:26 +02:00
dependabot[bot]
8489817561 [upd] web-client (simple): Bump webpack in /client/simple
Bumps [webpack](https://github.com/webpack/webpack) from 5.99.5 to 5.99.6.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.99.5...v5.99.6)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.99.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-27 10:16:03 +02:00
dependabot[bot]
38ff1e4a7d [upd] web-client (simple): Bump stylelint in /client/simple
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.18.0 to 16.19.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.18.0...16.19.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 16.19.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-27 10:15:40 +02:00
dependabot[bot]
21cdb0332b [upd] web-client (simple): Bump eslint in /client/simple
Bumps [eslint](https://github.com/eslint/eslint) from 9.24.0 to 9.25.1.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.24.0...v9.25.1)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.25.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-27 10:15:33 +02:00
dependabot[bot]
30330617d9 [upd] pypi: Bump lxml from 5.3.2 to 5.4.0
Bumps [lxml](https://github.com/lxml/lxml) from 5.3.2 to 5.4.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.3.2...lxml-5.4.0)

---
updated-dependencies:
- dependency-name: lxml
  dependency-version: 5.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-26 13:46:56 +02:00
Markus Heiser
33729439c5 [fix] is_werkzeug_reload_active is not realted to python -m
Werkzeug's reloader is not active when was server is launched by uWSGI.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-24 17:24:51 +02:00
Markus Heiser
20ce88a274 Revert "[fix] is_werkzeug_reload_active is not realted to python -m"
This reverts commit 3392beb914.
2025-04-24 17:03:20 +02:00
Zhijie He
8595e467ce [fix] fix Quark engine calling 2025-04-24 16:17:34 +02:00
Markus Heiser
3392beb914 [fix] is_werkzeug_reload_active is not realted to python -m
Werkzeug's reloader is not active when was server is launched by::

    python -m searx.webapp

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-24 15:33:59 +02:00
Markus Heiser
c6c6d3027c [mod] internal ! and external !! bangs: ignore upper/lower case
Closes: https://github.com/searxng/searxng/issues/1223

Suggested-by: @dalf https://github.com/searxng/searxng/issues/1223#issuecomment-1133772363
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-24 10:40:18 +02:00
Markus Heiser
d19eb3903e [clean] drop unusable engine: server/project on curlie.org is broken
The websites of https://curlie.org are no longer usable, long runtimes and
recurring "Bad Gateway" messages .. the project is no longer maintained and is
therefore no longer useful in SearXNG.

Related: https://github.com/searxng/searxng/issues/1190
Closes: https://github.com/searxng/searxng/issues/3482

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-24 09:57:50 +02:00
Markus Heiser
f45d4145e6 [fix] typo in soundcloud engine
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-23 18:42:40 +02:00
Markus Heiser
937eb907d3 [data] update searx.data - make data.traits (mullvad leta)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-23 14:06:32 +02:00
Grant Lanham
851c0e5cc0 [fix] engine: re-implement mullvad leta integration
Re-writes the Mullvad Leta integration to work with the new breaking changes.

Mullvad Leta is a search engine proxy.  Currently Leta only offers text search
results not image, news or any other types of search result.  Leta acts as a
proxy to Google and Brave search results.

- Remove docstring comments regarding requiring the use of Mullvad VPN, which is
  no longer a hard requirement.

- configured two engines: ``mullvadleta`` (uses google) and
  ``mullvadleta brave`` (uses brave)

- since leta may not provide up-to-date search results, both search engines are
  disabled by default.

.. hint::

   Leta caches each search for up to 30 days.  For example, if you use search
   terms like ``news``, contrary to your intention you'll get very old results!

Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
Signed-off-by: Grant Lanham <contact@grantlanham.com>
2025-04-23 14:06:32 +02:00
Aadniz
07a94d4d2e [mod] include SEARXNG_METHOD environment variable 2025-04-23 07:29:26 +02:00
Markus Heiser
e9157b3c1a [fix] issues when launching a local development server
A local development server can be launched by one of these command lines::

    $ flask --app searx.webapp run
    $ python -m searx.webapp

The different ways of starting the server should lead to the same result, which
is generally the case.  However, if the modules are reloaded after code
changes (reload option), it must be avoided that the application is initialized
twice at startup.  We have already discussed this in 2022 [1][2].

Further information on this topic can be found in [3][4][5].

To test a bash in the ./local environment was started and the follwing commands
had been executed::

    $ ./manage pyenv.cmd bash --norc --noprofile
    (py3) SEARXNG_DEBUG=1 flask --app searx.webapp run --reload
    (py3) SEARXNG_DEBUG=1 python -m searx.webapp

Since the generic parts of the docs also initialize the app to generate doc from
it, the build of the docs was also tested::

    $ make docs.clean docs.live

[1] https://github.com/searxng/searxng/pull/1656#issuecomment-1214198941
[2] https://github.com/searxng/searxng/pull/1616#issuecomment-1206137468
[3] https://flask.palletsprojects.com/en/stable/api/#flask.Flask.run
[4] https://github.com/pallets/flask/issues/5307#issuecomment-1774646119
[5] https://stackoverflow.com/a/25504196

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-22 14:26:11 +02:00
dependabot[bot]
5ae3b3f17e [upd] web-client (simple): Bump vite-plugin-static-copy
Bumps [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) from 2.3.0 to 2.3.1.
- [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases)
- [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@2.3.0...vite-plugin-static-copy@2.3.1)

---
updated-dependencies:
- dependency-name: vite-plugin-static-copy
  dependency-version: 2.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-18 09:46:01 +02:00
dependabot[bot]
50ac76ce94 [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.6 to 6.3.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.3.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.3.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-18 09:43:05 +02:00
searxng-bot
5aea044eb5 [l10n] update translations from Weblate
f290f4ffe - 2025-04-15 - return42 <return42@noreply.codeberg.org>
4a9134b03 - 2025-04-14 - DZDevelopers <dzdevelopers@noreply.codeberg.org>
a8c86581d - 2025-04-14 - aindriu80 <aindriu80@noreply.codeberg.org>
2b5395719 - 2025-04-11 - ayame30 <ayame30@noreply.codeberg.org>
448a443fa - 2025-04-11 - ayame30 <ayame30@noreply.codeberg.org>
2025-04-18 09:30:55 +02:00
Zhijie He
808dcaf1e2 [feat] engine: add Steam engine 2025-04-18 09:30:17 +02:00
Markus Heiser
777ba6ddf8 [fix] disable engine ansa by default
Reported-by: https://github.com/searxng/searxng/pull/4575#issuecomment-2813007107
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-17 16:50:57 +02:00
Tommaso Colella
8ca57748ff [fix] docs: changed "many" to "some" for clarity in contribution guide's privacy by design section 2025-04-17 16:47:52 +02:00
Tommaso Colella
30399c50e2 [fix] docs: typos and minor refinements in contribution_guide.rst 2025-04-17 16:47:52 +02:00
Tommaso Colella
e6467bce7c [fix] docs: better phrasing for many sections of contribution_guide.rst 2025-04-17 16:47:52 +02:00
Tommaso Colella
8ca2bbc4e9 [fix] docs: typos in dev contrib guide "it's might be because
of the tool" -> "it might be because the tool"
2025-04-17 16:47:52 +02:00
Tommaso Colella
a74593419f [fix] docs: typo in templates dev doc developerat -> developer at 2025-04-17 16:47:52 +02:00
Zhijie He
f94802f2d2 [feat] engines: add Hugging Face engine 2025-04-17 16:43:32 +02:00
Tommaso Colella
d1c584b961 [feat] engine: add engine for italian press agency ansa 2025-04-17 15:33:57 +02:00
Markus Heiser
81f3d15665 [fix] settings.yml files: doc & obsolete settings in the template
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-17 13:31:10 +02:00
Tommaso Colella
99ad69450d [fix] Result type: remove rstrip "/" form url normalization 2025-04-17 10:24:05 +02:00
RobinFrcd
087da66565 [feat] add SensCritique (FR) engine
Closes: https://github.com/searxng/searxng/issues/4623
2025-04-17 10:19:22 +02:00
Markus Heiser
b84ae39978 [fix] doc of setting server.base_url, env is SEARXNG_BASE_URL
Related:

- https://github.com/searxng/searxng/issues/4634

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-16 14:54:46 +02:00
Tommaso Colella
391bb1268d [feat] engine: add microsoft learn engine 2025-04-12 11:14:13 +02:00
dependabot[bot]
2287a6826a Bump vite from 6.2.5 to 6.2.6 in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.5 to 6.2.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.2.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.2.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.2.6
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-11 18:23:56 +02:00
dependabot[bot]
b3971f89e2 [upd] web-client (simple): Bump less in /client/simple
Bumps [less](https://github.com/less/less.js) from 4.2.2 to 4.3.0.
- [Release notes](https://github.com/less/less.js/releases)
- [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/less/less.js/compare/v4.2.2...v4.3.0)

---
updated-dependencies:
- dependency-name: less
  dependency-version: 4.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-11 16:02:15 +02:00
Markus Heiser
a4e08a5c2f [upd] web-client (simple): Bump eslint, sharp, webpack
Closes: https://github.com/searxng/searxng/pull/4618
Closes: https://github.com/searxng/searxng/pull/4617
Closes: https://github.com/searxng/searxng/pull/4616
Closes: https://github.com/searxng/searxng/pull/4615

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-11 15:57:01 +02:00
grasdk
8ee51cc0f3 [fix] engine dokuwiki: basedir duplication
Dokuwiki searches behind reverse proxy had duplicate base path in the url,
creating a wrong url.

This patch exchanges string concat of URLs with urljoin [1] from urllib.parse.  This
eliminates the dual problem, while retaining the old functionality designed to
concatenate protocol, hostname and port (as base_url) with path.

[1] https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urljoin

Closes: https://github.com/searxng/searxng/issues/4598
2025-04-11 09:47:25 +02:00
dependabot[bot]
ed2953c59f [upd] pypi: Bump lxml from 5.3.1 to 5.3.2
Bumps [lxml](https://github.com/lxml/lxml) from 5.3.1 to 5.3.2.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.3.1...lxml-5.3.2)

---
updated-dependencies:
- dependency-name: lxml
  dependency-version: 5.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-11 09:25:19 +02:00
dependabot[bot]
e2fac7f306 [upd] pypi: Bump selenium from 4.30.0 to 4.31.0
Bumps [selenium](https://github.com/SeleniumHQ/Selenium) from 4.30.0 to 4.31.0.
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.30.0...selenium-4.31.0)

---
updated-dependencies:
- dependency-name: selenium
  dependency-version: 4.31.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-11 09:23:45 +02:00
dependabot[bot]
8db2a15307 [upd] pypi: Bump sphinx-issues from 5.0.0 to 5.0.1
Bumps [sphinx-issues](https://github.com/sloria/sphinx-issues) from 5.0.0 to 5.0.1.
- [Commits](https://github.com/sloria/sphinx-issues/compare/5.0.0...5.0.1)

---
updated-dependencies:
- dependency-name: sphinx-issues
  dependency-version: 5.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-11 09:23:30 +02:00
searxng-bot
92b8f71780 [l10n] update translations from Weblate
63157cd1f - 2025-04-10 - pfaca <pfaca@noreply.codeberg.org>
e50166782 - 2025-04-10 - return42 <return42@noreply.codeberg.org>
f7ed39011 - 2025-04-09 - Kita Ikuyo <kitakita@disroot.org>
c8786066f - 2025-04-08 - return42 <return42@noreply.codeberg.org>
dd4adf136 - 2025-04-08 - return42 <return42@noreply.codeberg.org>
df50952f0 - 2025-04-08 - return42 <return42@noreply.codeberg.org>
d9a9a0bad - 2025-04-06 - eatyourglory <eatyourglory@noreply.codeberg.org>
2025-04-11 09:21:14 +02:00
Markus Heiser
15384e8fc5 [fix] make docs - ERROR: Unknown target name: "auth_key"
BTW: fix a bug with sys.path: repo-root (not util) needs to added to generate
autodoc from scripts in ./searxng_extra

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-09 17:28:18 +02:00
Markus Heiser
b146b745a7 [fix] Meilisearch engine: Authorization Token When Integrating Meilisearch
`X-Meili-API-Key` has  been changed to `Authorization` [1]

[1] https://www.meilisearch.com/docs/reference/api/overview#authorization

Suggested-by: https://github.com/searxng/searxng/issues/4416#issuecomment-2781254841
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-07 08:44:00 +02:00
Markus Heiser
c185d07689 [build] /static 2025-04-06 19:21:07 +02:00
Markus Heiser
5a54372368 [fix] images cropped in Safari (webkit)
- Closes: https://github.com/searxng/searxng/issues/4156

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-06 19:21:07 +02:00
Markus Heiser
8c8aba8cf5 [fix] engine radio browser: get servers from DNS api.radio-browser.info
Do a DNS-lookup of 'all.api.radio-browser.info', add reverse lookup and select
randomly a URL from available servers

Closes: https://github.com/searxng/searxng/issues/4576
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-06 18:59:10 +02:00
Ivan Gabaldon
9424bac031 Don't hardcode uWSGI parameters (#4578)
* Initial update

* fix

* add todo note
2025-04-04 14:57:53 +02:00
dependabot[bot]
59228fb1db [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.4 to 6.2.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.2.5/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.2.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.2.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-04 11:47:26 +02:00
searxng-bot
f630a24311 [l10n] update translations from Weblate
faf95be5a - 2025-04-03 - sakistzimas <sakistzimas@noreply.codeberg.org>
e42efee66 - 2025-04-02 - Juno Takano <jutty@noreply.codeberg.org>
c1fbb26c4 - 2025-04-02 - return42 <return42@noreply.codeberg.org>
562d21fb9 - 2025-04-02 - ghose <ghose@noreply.codeberg.org>
1ea9e67c5 - 2025-04-01 - return42 <return42@noreply.codeberg.org>
daaa0b41e - 2025-03-31 - wags07 <wags07@noreply.codeberg.org>
52635ec5f - 2025-03-31 - return42 <return42@noreply.codeberg.org>
589ad13f2 - 2025-03-31 - return42 <return42@noreply.codeberg.org>
1f063c96e - 2025-03-31 - return42 <return42@noreply.codeberg.org>
c001e606d - 2025-03-31 - return42 <return42@noreply.codeberg.org>
9bc14f1a0 - 2025-03-31 - wags07 <wags07@noreply.codeberg.org>
6a524ecb4 - 2025-03-31 - return42 <return42@noreply.codeberg.org>
508fe79c7 - 2025-03-31 - return42 <return42@noreply.codeberg.org>
8c8db80e7 - 2025-03-31 - return42 <return42@noreply.codeberg.org>
c9f551913 - 2025-03-31 - AndersNordh <andersnordh@noreply.codeberg.org>
6c56adc71 - 2025-03-31 - artens <artens@noreply.codeberg.org>
15526190b - 2025-03-31 - Linerly <linerly@noreply.codeberg.org>
2102783df - 2025-03-31 - AndersNordh <andersnordh@noreply.codeberg.org>
fee510d78 - 2025-03-30 - kratos <makesocialfoss32@keemail.me>
d5c9b970c - 2025-03-30 - Fjuro <fjuro@noreply.codeberg.org>
94259815b - 2025-03-30 - return42 <return42@noreply.codeberg.org>
a448cf7da - 2025-03-29 - Outbreak2096 <outbreak2096@noreply.codeberg.org>
0c3ef7929 - 2025-03-29 - Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
ce2fbffe8 - 2025-03-29 - SomeTr <sometr@noreply.codeberg.org>
2025-04-04 10:21:19 +02:00
dependabot[bot]
4452358e87 Bump vite from 6.2.3 to 6.2.4 in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.3 to 6.2.4.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.2.4/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-03 09:25:43 +02:00
Markus Heiser
7546f88b1e [build] /static 2025-04-03 09:03:35 +02:00
Markus Heiser
d4c6c9401d [fix] client/simple: add missing "swiped-events" devDependencies (import)
In commit 1a3543d4b in PR-4284 [1] the swiped-events [2] were forgotten to be
migrated.  In this patch, the event library is added to the ``devDependencies``
and imported by::

    import "../../../node_modules/swiped-events/src/swiped-events.js

[1] https://github.com/searxng/searxng/pull/4284
[2] https://www.npmjs.com/package/swiped-events

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Reported-by: https://github.com/searxng/searxng/pull/4198#issuecomment-2770734321
2025-04-03 09:03:35 +02:00
Markus Heiser
e6308b8167 [fix] hardening against arguments of type None, where str or dict is expected
On a long-running server, the tracebacks below can be found (albeit rarely),
which indicate problems with NoneType where a string or another data type is
expected.

result.img_src::

    File "/usr/local/searxng/searxng-src/searx/templates/simple/result_templates/images.html", line 13, in top-level template code
      <img src="" data-src="{{ image_proxify(result.img_src) }}" alt="{{ result.title|striptags }}">{{- "" -}}
      ^
    File "/usr/local/searxng/searxng-src/searx/webapp.py", line 284, in image_proxify
      if url.startswith('//'):
         ^^^^^^^^^^^^^^
    AttributeError: 'NoneType' object has no attribute 'startswith'

result.content::

    File "/usr/local/searxng/searxng-src/searx/result_types/_base.py", line 105, in _normalize_text_fields
      result.content = WHITESPACE_REGEX.sub(" ", result.content).strip()
                       ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
    TypeError: expected string or bytes-like object, got 'NoneType'

html_to_text, when html_str is a NoneType::

    File "/usr/local/searxng/searxng-src/searx/engines/wikipedia.py", line 190, in response
      title = utils.html_to_text(api_result.get('titles', {}).get('display') or api_result.get('title'))
    File "/usr/local/searxng/searxng-src/searx/utils.py", line 158, in html_to_text
      html_str = html_str.replace('\n', ' ').replace('\r', ' ')
                 ^^^^^^^^^^^^^^^^
    AttributeError: 'NoneType' object has no attribute 'replace'

presearch engine, when json_resp is a NoneType::

    File "/usr/local/searxng/searxng-src/searx/engines/presearch.py", line 221, in response
      results = parse_search_query(json_resp.get('results'))
    File "/usr/local/searxng/searxng-src/searx/engines/presearch.py", line 161, in parse_search_query
      for item in json_results.get('specialSections', {}).get('topStoriesCompact', {}).get('data', []):
                  ^^^^^^^^^^^^^^^^
    AttributeError: 'NoneType' object has no attribute 'get'

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-04-01 11:13:47 +02:00
Zhijie He
08885d0614 [feat] add Quark autocomplete support
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-31 14:59:49 +02:00
Zhijie He
7b4612e862 [feat] engines: add Ollama engine 2025-03-30 14:25:58 +02:00
Bnyro
9ffa9fb730 [feat] engines: add reuters news engine 2025-03-30 13:56:09 +02:00
Tommaso Colella
5daa4f0460 [feat] engine: add engine for italian online newspaper "il post" 2025-03-30 13:45:06 +02:00
Zhijie He
33661cc5c3 [feat] engines: add Quark engine
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-30 13:20:35 +02:00
Zhijie He
b231cb4b59 [feat] engines: add Niconico videos engine
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-30 12:42:31 +02:00
naughtymommy42069
c8b419fcbb [feat] engine: add bitchute 2025-03-30 12:41:43 +02:00
Markus Heiser
237267ffbe [data] update searx.data - update_engine_descriptions.py 2025-03-30 09:54:03 +02:00
Markus Heiser
50f92779bd [refactor] migrate plugins from "module" to class SXNGPlugin
This patch brings two major changes:

- ``Result.filter_urls(..)`` to pass a filter function for URL fields
- The ``enabled_plugins:`` section in SearXNG's settings do no longer exists.

To understand plugin development compile documentation:

    $ make docs.clean docs.live

and read http://0.0.0.0:8000/dev/plugins/development.html

There is no longer a distinction between built-in and external plugin, all
plugins are registered via the settings in the ``plugins:`` section.

In SearXNG, plugins can be registered via a fully qualified class name.  A
configuration (`PluginCfg`) can be transferred to the plugin, e.g. to activate
it by default / *opt-in* or *opt-out* from user's point of view.

built-in plugins
================

The built-in plugins are all located in the namespace `searx.plugins`.

.. code:: yaml

    plugins:

      searx.plugins.calculator.SXNGPlugin:
        active: true

      searx.plugins.hash_plugin.SXNGPlugin:
        active: true

      searx.plugins.self_info.SXNGPlugin:
        active: true

      searx.plugins.tracker_url_remover.SXNGPlugin:
        active: true

      searx.plugins.unit_converter.SXNGPlugin:
        active: true

      searx.plugins.ahmia_filter.SXNGPlugin:
        active: true

      searx.plugins.hostnames.SXNGPlugin:
        active: true

      searx.plugins.oa_doi_rewrite.SXNGPlugin:
        active: false

      searx.plugins.tor_check.SXNGPlugin:
        active: false

external plugins
================

SearXNG supports *external plugins* / there is no need to install one, SearXNG
runs out of the box.

- Only show green hosted results: https://github.com/return42/tgwf-searx-plugins/

To get a developer installation in a SearXNG developer environment:

.. code:: sh

   $ git clone git@github.com:return42/tgwf-searx-plugins.git
   $ ./manage pyenv.cmd python -m \
         pip install -e tgwf-searx-plugins

To register the plugin in SearXNG add ``only_show_green_results.SXNGPlugin`` to
the ``plugins:``:

.. code:: yaml

    plugins:
      # ...
      only_show_green_results.SXNGPlugin:
        active: false

Result.filter_urls(..)
======================

The ``Result.filter_urls(..)`` can be used to filter and/or modify URL fields.
In the following example, the filter function ``my_url_filter``:

.. code:: python

   def my_url_filter(result, field_name, url_src) -> bool | str:
       if "google" in url_src:
           return False              # remove URL field from result
       if "facebook" in url_src:
           new_url = url_src.replace("facebook", "fb-dummy")
           return new_url            # return modified URL
       return True                   # leave URL in field unchanged

is applied to all URL fields in the :py:obj:`Plugin.on_result` hook:

.. code:: python

   class MyUrlFilter(Plugin):
       ...
       def on_result(self, request, search, result) -> bool:
           result.filter_urls(my_url_filter)
           return True

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-29 10:16:43 +01:00
return42
d36da0a6c3 [data] update searx.data - update_ahmia_blacklist.py 2025-03-29 09:49:27 +01:00
return42
d7ca257fcd [data] update searx.data - update_firefox_version.py 2025-03-29 09:48:39 +01:00
return42
98024d8518 [data] update searx.data - update_wikidata_units.py 2025-03-29 09:48:06 +01:00
return42
96d0854a50 [data] update searx.data - update_currencies.py 2025-03-29 09:47:33 +01:00
Aadniz
ecee73eafd [fix] presearch engine: Unexpected crash if duration not in videos 2025-03-28 16:26:39 +01:00
searxng-bot
1189b1906c [l10n] update translations from Weblate
9a0c9e142 - 2025-03-27 - return42 <return42@noreply.codeberg.org>
8e06fb05a - 2025-03-27 - return42 <return42@noreply.codeberg.org>
8e683ef69 - 2025-03-27 - return42 <return42@noreply.codeberg.org>
3588715a0 - 2025-03-27 - return42 <return42@noreply.codeberg.org>
acf531db2 - 2025-03-27 - return42 <return42@noreply.codeberg.org>
b4b09bdef - 2025-03-27 - return42 <return42@noreply.codeberg.org>
8bef57082 - 2025-03-27 - return42 <return42@noreply.codeberg.org>
239bae388 - 2025-03-27 - return42 <return42@noreply.codeberg.org>
ca6a6fc4f - 2025-03-27 - return42 <return42@noreply.codeberg.org>
2a19a52db - 2025-03-27 - return42 <return42@noreply.codeberg.org>
7b217fad1 - 2025-03-24 - Haraldher <haraldher@noreply.codeberg.org>
649d15f55 - 2025-03-24 - Haraldher <haraldher@noreply.codeberg.org>
2025-03-28 08:51:09 +01:00
dependabot[bot]
4a0ff84a40 [upd] pypi: Bump selenium from 4.29.0 to 4.30.0
Bumps [selenium](https://github.com/SeleniumHQ/Selenium) from 4.29.0 to 4.30.0.
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/compare/selenium-4.29.0...selenium-4.30.0)

---
updated-dependencies:
- dependency-name: selenium
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 08:50:32 +01:00
dependabot[bot]
d02d432862 [upd] pypi: Bump yamllint from 1.36.2 to 1.37.0
Bumps [yamllint](https://github.com/adrienverge/yamllint) from 1.36.2 to 1.37.0.
- [Release notes](https://github.com/adrienverge/yamllint/releases)
- [Changelog](https://github.com/adrienverge/yamllint/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/adrienverge/yamllint/compare/v1.36.2...v1.37.0)

---
updated-dependencies:
- dependency-name: yamllint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 08:50:10 +01:00
dependabot[bot]
3c537f958f [upd] web-client (simple): Bump stylelint in /client/simple
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.16.0 to 16.17.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.16.0...16.17.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 08:49:44 +01:00
dependabot[bot]
a2ad1bed00 [upd] web-client (simple): Bump eslint in /client/simple
Bumps [eslint](https://github.com/eslint/eslint) from 9.22.0 to 9.23.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.22.0...v9.23.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 08:48:46 +01:00
Markus Heiser
f62f6194e3 [build] /static 2025-03-27 12:27:37 +01:00
Markus Heiser
68d871dea0 [fix] image deatils view: vertical overflow in results.image-detail-open
overflow-y: scroll
  If the information on the image exceeds the visible area in the detail view,
  there must be a way to access this information via scroll.

max-height: -17rem versus 7rem
  There are new fields in the lower area, so the height of the image (top) must
  be reduced

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-27 12:27:37 +01:00
Markus Heiser
150b2e21fd [fix] make docs -> ERROR: Unknown target name: "google: max 50 pages".
Fix the issues reported by sphinx build::

    docstring of searx.engines.google.max_page:1: ERROR: Unknown target name: "google: max 50 pages".
    docstring of searx.engines.google_images.max_page:1: ERROR: Unknown target name: "google: max 50 pages".
    docstring of searx.engines.google_scholar.max_page:1: ERROR: Unknown target name: "google: max 50 pages".

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-27 06:57:28 +01:00
Aadniz
02f5002a5f [fix] baidu engine: properly decoding HTML escape codes 2025-03-27 06:11:39 +01:00
Bnyro
4dfc47584d [refactor] duration strings: move parsing logic to utils.py 2025-03-25 16:48:44 +01:00
Bnyro
c28d35c7fc [fix] duckduckgo news: unescaped html sequences in description 2025-03-25 16:14:36 +01:00
dependabot[bot]
2ad987c711 Bump vite from 6.2.2 to 6.2.3 in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.2 to 6.2.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.2.3/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.2.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 16:04:41 +01:00
Markus Heiser
5986629c6b [fix] make data.traits - partial revert of commit 30a8204
The entries in the catalog of search languages are build up from the "Engine
Traits" [1] and which entries are included in the catalog is controlled qby two
threshold values [2].

If possible, the values should ensure that no languages or regions disappear
from the catalog of search languages [3].

The threshold values should have been adjusted in commit 30a8204:

- ``min_eng_per_region = 18``
- ``min_eng_per_lang = 22``

Because the threshold values were not adjusted, many entries were missing in the
search language catalog.  This bug has been fixed with this patch: the threshold
values have been adjusted and the catalog of search languages has been completed
again.

[1] https://docs.searxng.org/dev/engines/enginelib.html#module-searx.enginelib.traits
[2] 96a6e3dcb2/searxng_extra/update/update_engine_traits.py (L104-L105)
[3] https://github.com/searxng/searxng/blob/master/searx/sxng_locales.py

Closes: https://github.com/searxng/searxng/issues/4519
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-22 07:52:36 +01:00
dependabot[bot]
7e680d8e8e [upd] web-client (simple): Bump stylelint in /client/simple
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.15.0 to 16.16.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.15.0...16.16.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-21 11:43:46 +01:00
Ikko Eltociear Ashimine
2482646323 [fix] typo in doc-str: offical -> official 2025-03-21 11:05:54 +01:00
Markus Heiser
96a6e3dcb2 [fix] Results.url: don't normalize www.example.com to example.com
Hostname "www" in URL results can't be normalized to an empty string:

- https://www.tu-darmstadt.de/
- https://tu-darmstadt.de/

Reported-By: @Bnyro <bnyro@tutanota.com>
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-21 10:28:34 +01:00
searxng-bot
ef99cc472d [l10n] update translations from Weblate
efbb54229 - 2025-03-16 - gkkulik <gkkulik@noreply.codeberg.org>
f76dddd02 - 2025-03-15 - cc5efd7b0 <cc5efd7b0@noreply.codeberg.org>
2025-03-21 08:40:14 +01:00
dependabot[bot]
64b52d485b [upd] pypi: Bump yamllint from 1.36.0 to 1.36.2
Bumps [yamllint](https://github.com/adrienverge/yamllint) from 1.36.0 to 1.36.2.
- [Release notes](https://github.com/adrienverge/yamllint/releases)
- [Changelog](https://github.com/adrienverge/yamllint/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/adrienverge/yamllint/compare/v1.36.0...v1.36.2)

---
updated-dependencies:
- dependency-name: yamllint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-21 08:39:32 +01:00
dependabot[bot]
de6b027ec7 [upd] pypi: Bump tomli from 2.0.2 to 2.2.1
Bumps [tomli](https://github.com/hukkin/tomli) from 2.0.2 to 2.2.1.
- [Changelog](https://github.com/hukkin/tomli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hukkin/tomli/compare/2.0.2...2.2.1)

---
updated-dependencies:
- dependency-name: tomli
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-21 08:38:48 +01:00
dependabot[bot]
f687306a95 [upd] pypi: Bump pylint from 3.3.4 to 3.3.6
Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.4 to 3.3.6.
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.4...v3.3.6)

---
updated-dependencies:
- dependency-name: pylint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-21 08:38:16 +01:00
Bnyro
b75e56afe6 [fix] duckduckgo: answer sometimes contains faulty (duplicated) url 2025-03-21 07:48:30 +01:00
Bnyro
3668c7012e [fix] presearch videos: item description and duration are located in metadata field 2025-03-20 20:55:09 +01:00
Aadniz
556db857aa [fix] presearch engine: News and Videos formatted incorrectly 2025-03-20 20:44:43 +01:00
Tan Yong Sheng
40feede51e [fix] engine: core.ac.uk implement API v3 / v2 is no longer supported 2025-03-19 17:51:00 +01:00
Alexandre Flament
82b9e533b2 [fix] static.build: upgrade min. node version to 18.17
For sharp [1] dependency / this commit was cherry picked from PR #3157

[1] https://www.npmjs.com/package/sharp
2025-03-18 06:19:44 +01:00
Bnyro
babbe9e1ae [fix] duckduckgo: show proper source url of answers 2025-03-18 05:31:28 +01:00
Bnyro
885d02c8c3 [feat] engine: add selfh.st/icons for logos of common self-hosted programs 2025-03-17 20:23:54 +01:00
Bnyro
bbb2894b04 [engine] elasticsearch: add pagination support 2025-03-16 22:10:05 +01:00
Brock Vojkovic
84636ef49a [feat] add docker healthcheck back (#4504) 2025-03-16 11:34:26 +01:00
Markus Heiser
a1d5add718 fixup! [fix] fix invalid escape error in Baidu Images & default config typo 2025-03-15 17:14:54 +01:00
Zhijie He
38caa49540 [fix] fix invalid escape error in Baidu Images & default config typo 2025-03-15 17:14:54 +01:00
Zhijie He
4ce7f1accc [feat]: engines add images & kaifa from baidu.com 2025-03-15 17:14:54 +01:00
Ivan Gabaldon
11b5ae186b container: add default support for IPv6 (#4448)
* Initial update

* update docs and test files
2025-03-15 11:20:37 +01:00
Markus Heiser
583007fd04 [build] /static 2025-03-15 10:36:33 +01:00
Markus Heiser
da7b069d6e [fix] plugins: bugfix of tor_check and unit_converter
Closes: https://github.com/searxng/searxng/issues/4461
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-15 10:36:33 +01:00
Markus Heiser
f49b2c94a9 [mod] migrate all key-value.html templates to KeyValue type
The engines now all use KeyValue results and return the results in a
EngineResults object.

The sqlite engine can return MainResult results in addition to KeyValue
results (based on engine's config in settings.yml),

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-15 10:36:33 +01:00
Markus Heiser
af5dbdf768 [mod] typification of SearXNG: add new result type KeyValue
This patch adds a new result type: KeyValue

- Python class:   searx/result_types/keyvalue.py
- Jinja template: searx/templates/simple/result_templates/keyvalue.html
- CSS (less)      client/simple/src/less/result_types/keyvalue.less

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-15 10:36:33 +01:00
Markus Heiser
8769b7c6d6 [refactor] typification of SearXNG (MainResult) / result items (part 2)
The class ReslutContainer has been revised, it can now handle the typed Result
items of classes:

- MainResult
- LegacyResult (a dict wrapper for backward compatibility)

Due to the now complete typing of theses three clases, instead of the *getitem*
accesses, the fields can now be accessed directly via attributes (which is also
supported by the IDE).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-15 10:36:33 +01:00
Markus Heiser
d6ce29f7f0 [build] /static 2025-03-15 09:03:49 +01:00
Markus Heiser
eb1bdea865 [fix] make static.build.commit: add client/simple/package-lock.json
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-15 09:03:49 +01:00
bearz314
85bdff6b0a [web-client] simple theme: dynamic vertical height
On mobile devices with browser chrome (UI) that recedes on scroll,
'vh' includes the height covered by chrome, which 'dvh' does not.
By using 'dvh' the footer is immediately visible on the homepage
without scrollbar on mobile devices.
2025-03-15 09:03:49 +01:00
dependabot[bot]
f7ef4396b1 [upd] pypi: Bump aiounittest from 1.4.3 to 1.5.0
Bumps [aiounittest](https://github.com/kwarunek/aiounittest) from 1.4.3 to 1.5.0.
- [Release notes](https://github.com/kwarunek/aiounittest/releases)
- [Commits](https://github.com/kwarunek/aiounittest/compare/1.4.3...1.5.0)

---
updated-dependencies:
- dependency-name: aiounittest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-15 08:04:23 +01:00
dependabot[bot]
83f6545903 [upd] pypi: Bump yamllint from 1.35.1 to 1.36.0
Bumps [yamllint](https://github.com/adrienverge/yamllint) from 1.35.1 to 1.36.0.
- [Changelog](https://github.com/adrienverge/yamllint/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/adrienverge/yamllint/compare/v1.35.1...v1.36.0)

---
updated-dependencies:
- dependency-name: yamllint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-15 07:52:10 +01:00
searxng-bot
6afe0e29a7 [l10n] update translations from Weblate
efa1f5656 - 2025-03-13 - return42 <return42@noreply.codeberg.org>
5e0a76d3c - 2025-03-13 - return42 <return42@noreply.codeberg.org>
2025-03-15 07:50:21 +01:00
dependabot[bot]
523871ae7b [upd] web-client (simple): Bump @eslint/js in /client/simple
Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.21.0 to 9.22.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.22.0/packages/js)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-15 07:49:52 +01:00
dependabot[bot]
505f7732d8 [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.1 to 6.2.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.2.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-15 07:49:44 +01:00
dependabot[bot]
896cb3ab46 [upd] web-client (simple): Bump eslint in /client/simple
Bumps [eslint](https://github.com/eslint/eslint) from 9.21.0 to 9.22.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.21.0...v9.22.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-15 07:49:34 +01:00
XLion
3fe602a468 [fix] "[fix] uwsgi: don't set static-expires": Clean comment that forgot to cleen
I noticed this when I tracking the difference between my current `settings.yml` and the `settings.yml`.
2025-03-11 11:04:34 +01:00
Brock Vojkovic
8b1d73c5b9 [feat] add docker into devcontainer (#4475) 2025-03-09 09:40:49 +01:00
Aadniz
a88b4d7036 [fix] presearch engine: domain sometimes included in beginning of titles 2025-03-08 12:39:16 +01:00
Austin-Olacsi
73d50f5748 [feat] add bilibili support to get get_embeded_stream_url 2025-03-08 10:47:30 +01:00
Markus Heiser
523d2a7683 [fix] uwsgi: don't set static-expires
As long we don't have a working solution for cache busting [3][4] we should not
set an expire time in thw uWSGI config.

The default procedure in every web browser is the "304 Not Modified" [2] and
this default procedure should also be sufficient for us as long as we have not
implemented a complete alternative (cache busting) / form [1]

> By default uWSGI will add a Last-Modified [2] header to all static responses,
> and will honor the If-Modified-Since [2] request header.

[1] https://uwsgi-docs.readthedocs.io/en/latest/StaticFiles.html#setting-the-expires-headers
[2] https://developer.mozilla.org/de/docs/Web/HTTP/Status/304
[3] https://github.com/searxng/searxng/pull/4433
[4] https://github.com/searxng/searxng/issues/964

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-08 09:08:03 +01:00
Aadniz
4884747508 [fix] presearch engine: Title showing <em> html code 2025-03-07 21:24:35 +01:00
Markus Heiser
eb3633629a [fix] set language for engines from chinese market (no i18n index nor UI)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-07 19:59:13 +01:00
Loris
02b76c8389 [fix] engine qwant: add tgp and llm arguments to avoid CAPTCHA 2025-03-07 18:58:45 +01:00
Aadniz
67a8b66f75 [README] Updated logo paths
Since the commit a207f5d035, logos has been moved and README.rst needs to point to the new paths.
2025-03-07 13:40:31 +01:00
Markus Heiser
08a90d46d6 [doc] add missing docs for the search.max_page setting
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-07 10:07:41 +01:00
dependabot[bot]
e7cb18c3dd [upd] web-client (simple): Bump vite-plugin-static-copy
Bumps [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases)
- [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@2.2.0...vite-plugin-static-copy@2.3.0)

---
updated-dependencies:
- dependency-name: vite-plugin-static-copy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 09:34:05 +01:00
dependabot[bot]
9a50f6c9a1 [upd] web-client (simple): Bump vite in /client/simple
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.0 to 6.2.1.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@6.2.1/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 09:21:34 +01:00
dependabot[bot]
00bae78463 [upd] web-client (simple): Bump stylelint in /client/simple
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.14.1 to 16.15.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.14.1...16.15.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 09:21:16 +01:00
dependabot[bot]
375f0c4a79 [upd] pypi: Bump mock from 5.1.0 to 5.2.0
Bumps [mock](https://github.com/testing-cabal/mock) from 5.1.0 to 5.2.0.
- [Changelog](https://github.com/testing-cabal/mock/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/testing-cabal/mock/compare/5.1.0...5.2.0)

---
updated-dependencies:
- dependency-name: mock
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 08:17:31 +01:00
dependabot[bot]
424cbf7851 [upd] pypi: Bump jinja2 from 3.1.5 to 3.1.6
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.5 to 3.1.6.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.5...3.1.6)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 08:17:14 +01:00
searxng-bot
860f0a35ac [l10n] update translations from Weblate
a516df5a2 - 2025-03-06 - DanielBoone <danielboone@noreply.codeberg.org>
2763a5d77 - 2025-03-06 - return42 <return42@noreply.codeberg.org>
4a3a81c9b - 2025-03-06 - marc-lopez <marc-lopez@noreply.codeberg.org>
d2bd5b048 - 2025-03-05 - MonsoonFire <monsoonfire@noreply.codeberg.org>
752b558d6 - 2025-03-05 - buiducnhat <buiducnhat@noreply.codeberg.org>
0ff2ccf43 - 2025-03-04 - marc-lopez <marc-lopez@noreply.codeberg.org>
462a0625d - 2025-03-03 - Juno Takano <jutty@noreply.codeberg.org>
5cb41045c - 2025-03-02 - gkkulik <gkkulik@noreply.codeberg.org>
e599c3942 - 2025-03-02 - gkkulik <gkkulik@noreply.codeberg.org>
d44128eda - 2025-03-02 - gkkulik <gkkulik@noreply.codeberg.org>
2025-03-07 08:16:45 +01:00
Bubu
b8671c7a4a [feat] engines: add baidu (general) 2025-03-07 06:59:28 +01:00
Zhijie He
066aabc112 [feat] engines: add www.acfun.cn 2025-03-06 17:52:16 +01:00
Zhijie He
8fe4904619 [feat] engines: add www.iqiyi.com
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-06 17:28:14 +01:00
Zhijie He
08d08475fc [feat] engines: add www.chinaso.com
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-06 17:23:11 +01:00
Markus Heiser
194f222203 [fix] engines: Google-Web & Google-Video (random arc_id)
Both enghines have been reported ``TooManyRequests``, additionaly Google-Videos
thumbnails needed a review.

Based on the research from @unixfox [1] this patch generates every hour a new random
``arc_id``.

[1] https://github.com/searxng/searxng/issues/4435#issuecomment-2703279522

Closes:

- https://github.com/searxng/searxng/issues/4435
- https://github.com/searxng/searxng/issues/4431

Related:

- https://github.com/searxng/searxng/discussions/4434
- https://github.com/searxng/searxng/discussions/4429

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-06 15:43:53 +01:00
Markus Heiser
8984d7ae02 [fix] brave engine: add sec-fetch headers and source=web argument
The intention is to reduce the "TooManyRequestsException".

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-02 18:19:55 +01:00
Zhijie He
b0beb307ca [chore] add timediff field for sogou_videos
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-02 13:31:31 +01:00
Zhijie He
76f52b5b45 [feat] add Sogou WeChat article search support 2025-03-02 13:31:31 +01:00
Zhijie He
97aa5a779b [feat] add Sogou engine for searxng
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-02 13:31:31 +01:00
Zhijie He
71d1504e57 [feat] add 360search engine for searxng
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-03-02 13:25:35 +01:00
Markus Heiser
80f5fad16e [fix] add backward compatibility for the "enabled_plugins:"
Before #4183 a builtin plugin was *defautlt_on* when it is listed in the
"enabled_plugins" settings, this patch restores the previous behavior.

Not part of this patch but just to mentioning in context of #4263:

  In the long term, we will abolish the "enabled_plugins:" setting and combine
  all options for the plugins in the "plugins:" setting, as is already planned
  in the PR #4282

Closes: https://github.com/searxng/searxng/issues/4263
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-01 18:02:31 +01:00
Markus Heiser
0c2076ca5b [doc] minor improvements to the favicon docs (cache.db_url)
Related:

- https://github.com/searxng/searxng/issues/4405

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-01 18:02:05 +01:00
Bnyro
a51416c7c3 [feat] engines: add openclipart.org 2025-03-01 18:01:51 +01:00
Markus Heiser
d0022d86d2 [refactor] soundcloud engine
Closes: https://github.com/searxng/searxng/issues/4226
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-01 17:51:14 +01:00
Markus Heiser
1d16b94279 [fix] wikidata: increase wikidata queries timeout
The big queries for initializing and updating the currencies take longer than
the default of the wikidata engine, which is only 3sec.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-01 12:21:29 +01:00
return42
30a820437d [data] update searx.data - update_engine_traits.py 2025-03-01 09:43:06 +01:00
Markus Heiser
03419078ef [fix] bing fetch engine traits - adjusted XPath selectors
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-03-01 09:43:06 +01:00
return42
01e2b3e325 [data] update searx.data - update_firefox_version.py 2025-03-01 07:47:48 +01:00
return42
ccf485c519 [data] update searx.data - update_wikidata_units.py 2025-03-01 07:47:24 +01:00
return42
64810ee911 [data] update searx.data - update_ahmia_blacklist.py 2025-03-01 07:44:28 +01:00
return42
a4b120c33d [data] update searx.data - update_engine_descriptions.py 2025-03-01 07:43:29 +01:00
return42
73e4128970 [data] update searx.data - update_external_bangs.py 2025-03-01 07:43:00 +01:00
dependabot[bot]
355883f366 [upd] pypi: Bump typer-slim from 0.15.1 to 0.15.2
Bumps [typer-slim](https://github.com/fastapi/typer) from 0.15.1 to 0.15.2.
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.15.1...0.15.2)

---
updated-dependencies:
- dependency-name: typer-slim
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-28 12:58:29 +01:00
dependabot[bot]
b4b1a61562 [upd] pypi: Bump setproctitle from 1.3.4 to 1.3.5
Bumps [setproctitle](https://github.com/dvarrazzo/py-setproctitle) from 1.3.4 to 1.3.5.
- [Changelog](https://github.com/dvarrazzo/py-setproctitle/blob/master/HISTORY.rst)
- [Commits](https://github.com/dvarrazzo/py-setproctitle/compare/version-1.3.4...version-1.3.5)

---
updated-dependencies:
- dependency-name: setproctitle
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-28 12:57:45 +01:00
searxng-bot
28b5cbf276 [l10n] update translations from Weblate
0e9536840 - 2025-02-24 - dauiau <dauiau@users.noreply.translate.codeberg.org>
047501d2d - 2025-02-25 - return42 <return42@users.noreply.translate.codeberg.org>
647b20923 - 2025-02-21 - kratos <kratos@users.noreply.translate.codeberg.org>
288d0d4c8 - 2025-02-21 - guenael <guenael@users.noreply.translate.codeberg.org>
2025-02-28 12:57:15 +01:00
dependabot[bot]
d9d5e9140e [upd] web-client (simple): Bump globals in /client/simple
Bumps [globals](https://github.com/sindresorhus/globals) from 15.15.0 to 16.0.0.
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v15.15.0...v16.0.0)

---
updated-dependencies:
- dependency-name: globals
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-28 12:56:27 +01:00
Markus Heiser
cd1b88e916 [mod] bump copy-webpack-plugin 13.0.2, eslint 9.21 & vite 6.2.0
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:41:06 +01:00
Markus Heiser
4e195e1000 [mod] bump copy-webpack-plugin 13.0.2, eslint 9.21 & vite 6.2.0
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:38:59 +01:00
Markus Heiser
d5ba3bf150 [build] /static 2025-02-28 12:27:41 +01:00
Markus Heiser
485f1f8eff [upd] npm: Bump eslint from 9.19.0 to 9.20.1 in /client/simple
Related:

- https://github.com/searxng/searxng/pull/4322

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
8b864ed111 [fix] simple template - video.html fix button icon to icon_small
BTW: Rename the manufacturer-specific name ``ion-icon`` of the icon set in
SerXNG to ``sxng-icon-set`` --> The icon set can be assembled together as
desired in the FE and should therefore not have a manufacturer-specific name in
the style and template definitions.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
6500d73714 [web-client] integrate the migrated theme in the github CI
- upgrade to ubuntu-24.04 to get NodeJS v20
- remove DEBUG (V=1) environment / in a ViteJS env the DEBUG environment is
  reserved for interactive debugging tasks (not for verbose build messages).

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
2bf77f5d2d [web-client] integrate the migrated theme in the development workflows
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
1a3543d4b2 [web-client] simple theme: final build by vite & clean up grunt leftovers
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
872e09d103 [web-client] simple theme: move SVGs to client/simple/src and deploy to static by plg_svg2svg
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
189dd0155d [web-client] simple theme: refactor jinja_svg_catalog and cleanup icon names
This patch implements the template generation of the template:

  searx/templates/simple/icons.html

by the way the icon set (the icon names) has been normalized:

  film-outline   --> film
  magnet-outline --> magnet
  ..
  warning        --> alert

Some missing (categorie) icons had been added.

Some of the ionicons are not suitable for a dark theme, we fixed the svg
manually in src/svg/ionicons:

- https://github.com/searxng/searxng/pull/4284#issuecomment-2680550342

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
30ee34d3ea [web-client] simple theme: vite plugins plg_svg2png & plg_svg2svg
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
a207f5d035 [web-client] simple theme: move src/brand to client/simple/src
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
d29ca7d593 [web-client] simple theme: stylelint-prettier LESS source files
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
a8ed79b730 [web-client] simple theme: stylelint LESS source files
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
b74496b192 [web-client] simple theme: eslint JS source files
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
7a6ea56565 [web-client] simple theme: vite build -- CSS sourcemaps still missing!!!
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
a1132deaa4 [web-client] simple theme: move sources to client/simple/src
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
b6487b70aa [web-client] simple theme: build & development env based on vite.
Vite is a build tool, it consists of two major parts [1]:

- A dev server that provides rich feature enhancements over native ES modules,
  for example extremely fast Hot Module Replacement (HMR).

- A build command that bundles your code with Rollup, pre-configured to output
  highly optimized static assets for production.

[1] https://vite.dev/guide/

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-28 12:27:41 +01:00
Markus Heiser
e86bfa163b Revert "[feat] add HEALTHCHECK in Dockerfile"
This reverts commit dabe425499.
2025-02-26 11:55:43 +01:00
Markus Heiser
333d536937 Revert "Updated health check in Dockerfile"
This reverts commit 1fd4dab3b4.
2025-02-26 11:55:43 +01:00
Salvatore Gabriele La Greca
1fd4dab3b4 Updated health check in Dockerfile 2025-02-26 10:20:51 +01:00
Markus Heiser
887594f634 [fix] Internet links disappeared from wikidata side box (second try)
Related:

- https://github.com/searxng/searxng/pull/4286#issuecomment-2639960013

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-26 08:45:56 +01:00
fatwang2
bc5c8e5748 [fix] engine unsplash: image links by preserving URL parameters
Only remove ixid parameter while keeping other essential URL parameters
to ensure images are properly displayed in search results.
2025-02-26 08:44:39 +01:00
dependabot[bot]
cb0a75bad9 [upd] pypi: Bump selenium from 4.28.1 to 4.29.0
Bumps [selenium](https://github.com/SeleniumHQ/Selenium) from 4.28.1 to 4.29.0.
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/commits/selenium-4.29.0)

---
updated-dependencies:
- dependency-name: selenium
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-26 07:18:24 +01:00
Brock Vojkovic
dabe425499 [feat] add HEALTHCHECK in Dockerfile 2025-02-26 07:17:49 +01:00
searxng-bot
f325f8a886 [l10n] update translations from Weblate
fecbeb1d5 - 2025-02-20 - return42 <return42@users.noreply.translate.codeberg.org>
8891568c6 - 2025-02-17 - AlanBacker <alanbacker@users.noreply.translate.codeberg.org>
727ae2508 - 2025-02-15 - return42 <return42@users.noreply.translate.codeberg.org>
11f215e90 - 2025-02-15 - return42 <return42@users.noreply.translate.codeberg.org>
9eb07083e - 2025-02-15 - thenack0 <thenack0@users.noreply.translate.codeberg.org>
2025-02-26 07:16:01 +01:00
Markus Heiser
2e0abc9310 [fix] various issues in the documentation
Closes: https://github.com/searxng/searxng/issues/4370
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-26 07:15:39 +01:00
Markus Heiser
28d1240fce [fix] remove dead invidious instances from the settings
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-20 17:16:15 +01:00
Markus Heiser
4994fbb5af [fix] engines bing.images & brave.videos - fix parse data string
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-20 17:03:25 +01:00
Markus Heiser
caf0dd5372 [fix] piped engine - update backend_url list
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-20 14:43:01 +01:00
Markus Heiser
c0a21789a3 [mod] activate startpage by default and use default timeout (3sec)
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-20 14:23:03 +01:00
Bnyro
0f2fc5879d [feat] startpage: support for news and images 2025-02-20 13:44:28 +01:00
Markus Heiser
feb15e3878 [fix] brave.news engine: response is HTML and no longer JSON
The response from brave.com for news is no longer a JSON string.

Closes: https://github.com/searxng/searxng/issues/4352
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-20 10:08:03 +01:00
bearz314
c2804c51e2 [doc] Add myself for trying to improve searxng 2025-02-20 07:55:45 +01:00
bearz314
0a3eb24a0b [fix] limiter: prevent loading cached index html when redirected
The redirection to index lets client requests CSS token, if somehow they haven't been.
We need to ensure the html isn't cached so the latest token can be retrieved.
2025-02-20 07:55:45 +01:00
bearz314
16fafed6a2 [fix] limiter: prevent caching of token link
Depending on server and client setup, this CSS link with empty content may be cached.
For example, in my setup CloudFlare automatically adds 14400s (4hours) in my test.
This prevents caching by browser and proxies so the CSS can be reliably requested.
2025-02-20 07:55:45 +01:00
Markus Heiser
44d941c93c [fix] mojeek web engine: don't add empty fmt argument for web searches
Empty ``&fmt=`` argument triggers an automated tools detection from mojeek.

Suggested-by: @shinodark in https://github.com/searxng/searxng/issues/4307#issuecomment-2669355322
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-20 07:45:57 +01:00
Markus Heiser
cc9dbde2e5 [fix] autocomplete: remove broken startpage backend
as long we don't have a solution for #4334 we can't offer startpage as
autocomplete backend.

Related:

- https://github.com/searxng/searxng/issues/4334

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-17 11:00:18 +01:00
Duckxz
1ae37728e4 [fix] Fix improper import of corrections.html 2025-02-17 06:41:04 +01:00
searxng-bot
d37dc30783 [l10n] update translations from Weblate
2b26704c4 - 2025-02-12 - return42 <return42@users.noreply.translate.codeberg.org>
647377905 - 2025-02-12 - return42 <return42@users.noreply.translate.codeberg.org>
afd50738d - 2025-02-12 - alexgabi <alexgabi@users.noreply.translate.codeberg.org>
665fafbe2 - 2025-02-11 - naktinis <naktinis@users.noreply.translate.codeberg.org>
583834fec - 2025-02-10 - alexgabi <alexgabi@users.noreply.translate.codeberg.org>
0f4f34434 - 2025-02-10 - MonsoonFire <monsoonfire@users.noreply.translate.codeberg.org>
fbd59c560 - 2025-02-08 - akinu <akinu@users.noreply.translate.codeberg.org>
c3f7f27f6 - 2025-02-07 - SecularSteve <secularsteve@users.noreply.translate.codeberg.org>
cba4bc53f - 2025-02-07 - SecularSteve <secularsteve@users.noreply.translate.codeberg.org>
2025-02-15 07:16:17 +01:00
dependabot[bot]
f92bfebe21 [upd] pypi: Bump lxml from 5.3.0 to 5.3.1
Bumps [lxml](https://github.com/lxml/lxml) from 5.3.0 to 5.3.1.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.3.0...lxml-5.3.1)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-15 07:16:00 +01:00
dependabot[bot]
0eb23c490d [upd] pypi: Bump aiounittest from 1.4.2 to 1.4.3
Bumps [aiounittest](https://github.com/kwarunek/aiounittest) from 1.4.2 to 1.4.3.
- [Release notes](https://github.com/kwarunek/aiounittest/releases)
- [Commits](https://github.com/kwarunek/aiounittest/compare/1.4.2...1.4.3)

---
updated-dependencies:
- dependency-name: aiounittest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-15 07:15:35 +01:00
bonswouar
d456f3dd9f [fix] engine adobe stock videos datetime parsing
re #4310
2025-02-12 07:05:58 +01:00
Markus Heiser
a1e2b25467 [mod] improve description of the prefernces URL in the "COOKIES" tab
Closes: https://github.com/searxng/searxng/issues/4272
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-09 13:32:33 +01:00
Bnyro
3a59aea742 [fix] results.py: crashes when 'parsed_url' is None 2025-02-08 17:18:43 +01:00
Bnyro
28ead13eb9 [chore] engines: replace datetime.utcfromtimestamp with datetime.fromtimestamp 2025-02-07 17:19:00 +01:00
searxng-bot
9b1f8681a1 [l10n] update translations from Weblate
d030e5252 - 2025-02-06 - curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>
d3c6b503b - 2025-02-06 - curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>
ed13a35ed - 2025-02-06 - curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>
1126eef12 - 2025-02-06 - curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>
ee8fd4d82 - 2025-02-06 - curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>
b9507095f - 2025-02-06 - curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>
5766ca07e - 2025-02-06 - curtwheeler <curtwheeler@users.noreply.translate.codeberg.org>
cadb0be4f - 2025-02-06 - ivantodorov <ivantodorov@users.noreply.translate.codeberg.org>
9e1d733b7 - 2025-02-06 - ivantodorov <ivantodorov@users.noreply.translate.codeberg.org>
bbb8c9646 - 2025-02-06 - AndersNordh <andersnordh@users.noreply.translate.codeberg.org>
463ea44dc - 2025-02-05 - artens <artens@users.noreply.translate.codeberg.org>
3549e01c0 - 2025-02-05 - return42 <return42@users.noreply.translate.codeberg.org>
58277713c - 2025-02-05 - Ricky-Tigg <ricky-tigg@users.noreply.translate.codeberg.org>
511926257 - 2025-02-03 - artens <artens@users.noreply.translate.codeberg.org>
6d49bafee - 2025-02-03 - artens <artens@users.noreply.translate.codeberg.org>
5d1dcf0b0 - 2025-02-03 - return42 <return42@users.noreply.translate.codeberg.org>
bb40eae80 - 2025-02-03 - artens <artens@users.noreply.translate.codeberg.org>
3e34b5486 - 2025-02-03 - davquar <davquar@users.noreply.translate.codeberg.org>
e67e0eaaf - 2025-02-03 - return42 <return42@users.noreply.translate.codeberg.org>
664e90b17 - 2025-02-03 - kny5 <kny5@users.noreply.translate.codeberg.org>
34ebe95c7 - 2025-02-03 - AndersNordh <andersnordh@users.noreply.translate.codeberg.org>
74e21c47a - 2025-02-03 - rodgui <rodgui@users.noreply.translate.codeberg.org>
ac770eae1 - 2025-02-03 - kny5 <kny5@users.noreply.translate.codeberg.org>
e9509ed4b - 2025-02-02 - davquar <davquar@users.noreply.translate.codeberg.org>
79824e94e - 2025-02-01 - matsob0123 <matsob0123@users.noreply.translate.codeberg.org>
4153606b0 - 2025-02-01 - Fjuro <fjuro@users.noreply.translate.codeberg.org>
9c6763231 - 2025-01-31 - Shihfu Juan <xlion@xlion.tw>
791869503 - 2025-01-31 - Shihfu Juan <xlion@xlion.tw>
00e05f5aa - 2025-01-31 - Shihfu Juan <xlion@xlion.tw>
2025-02-07 17:06:27 +01:00
dependabot[bot]
739822f705 [upd] pypi: Bump babel from 2.16.0 to 2.17.0
Bumps [babel](https://github.com/python-babel/babel) from 2.16.0 to 2.17.0.
- [Release notes](https://github.com/python-babel/babel/releases)
- [Changelog](https://github.com/python-babel/babel/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-babel/babel/compare/v2.16.0...v2.17.0)

---
updated-dependencies:
- dependency-name: babel
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-07 17:06:09 +01:00
Markus Heiser
d45dea56c5 [fix] selenium: binary is not a Firefox executable
Since Ubuntu installs firefox frrom snap, we can't use any longer
``Browser('firefox')``.

[1] https://github.com/searxng/searxng/pull/3663#issuecomment-2255963036
[2] https://splinter.readthedocs.io/en/latest/drivers/firefox.html#custom-binary-path

Suggested-by: @allendema
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-07 17:05:06 +01:00
Markus Heiser
8c610404bd [upd] upgrade: github actions / to ubuntu: 24.04 / to nvm: node 20.15
- ubuntu-20.04 --> ubuntu-24.04

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-07 17:05:06 +01:00
Markus Heiser
147bda894e [fix] Internet links disappeared from wikidata side box
Closes: https://github.com/searxng/searxng/issues/4285

Reported and tested by: Popolon
Suggested-by: @dalf
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-02-06 14:50:30 +01:00
allixx
4ab7984edd [fix] public domain image archive: change name to lowercase
Otherwise logs are flooded with warnings:
WARNING:searx.engines: Engine name is not lowercase: "Public Domain Image Archive", converting to lowercase
2025-02-03 18:38:56 +01:00
XLion
ab1e895cc0 [fix] openverse: update API and website URL (#4275) 2025-02-02 22:12:24 +01:00
dependabot[bot]
6324a9752a [upd] pypi: Bump certifi from 2024.12.14 to 2025.1.31
Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.12.14 to 2025.1.31.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.12.14...2025.01.31)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-31 08:58:22 +01:00
dependabot[bot]
d7602aa4f1 [upd] pypi: Bump sphinx-notfound-page from 1.0.4 to 1.1.0
Bumps [sphinx-notfound-page](https://github.com/readthedocs/sphinx-notfound-page) from 1.0.4 to 1.1.0.
- [Changelog](https://github.com/readthedocs/sphinx-notfound-page/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/readthedocs/sphinx-notfound-page/compare/1.0.4...1.1.0)

---
updated-dependencies:
- dependency-name: sphinx-notfound-page
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-31 08:57:55 +01:00
dependabot[bot]
157c9267ec [upd] pypi: Bump pylint from 3.3.3 to 3.3.4
Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.3 to 3.3.4.
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.3...v3.3.4)

---
updated-dependencies:
- dependency-name: pylint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-31 08:57:18 +01:00
searxng-bot
eea4d4fd1d [l10n] update translations from Weblate
86a55bb1f - 2025-01-30 - Shihfu Juan <xlion@xlion.tw>
553225b31 - 2025-01-30 - kratos <kratos@users.noreply.translate.codeberg.org>
f6ad2986e - 2025-01-30 - return42 <return42@users.noreply.translate.codeberg.org>
b550ed406 - 2025-01-30 - nebras <nebras@users.noreply.translate.codeberg.org>
2852d3ada - 2025-01-29 - Outbreak2096 <outbreak2096@users.noreply.translate.codeberg.org>
98d2ed269 - 2025-01-30 - Linerly <linerly@users.noreply.translate.codeberg.org>
8b13e0d11 - 2025-01-29 - RoyBarina <roybarina@users.noreply.translate.codeberg.org>
75bcc2aaf - 2025-01-29 - ghose <ghose@users.noreply.translate.codeberg.org>
6b21bccc2 - 2025-01-29 - Priit Jõerüüt <jrtcdbrg@users.noreply.translate.codeberg.org>
5dc3d664d - 2025-01-29 - return42 <return42@users.noreply.translate.codeberg.org>
2025-01-31 08:54:00 +01:00
return42
738906358b [data] update searx.data - update_currencies.py 2025-01-29 06:23:04 +01:00
return42
fc8938c968 [data] update searx.data - update_ahmia_blacklist.py 2025-01-29 06:07:28 +01:00
return42
3b9e06fbd2 [data] update searx.data - update_wikidata_units.py 2025-01-29 06:06:50 +01:00
return42
4934922156 [data] update searx.data - update_engine_traits.py 2025-01-29 06:05:58 +01:00
return42
bee39e4ec0 [data] update searx.data - update_engine_descriptions.py 2025-01-29 06:04:54 +01:00
Markus Heiser
3f4e0b0859 [fix] gettext can't work with f-strings (i10n)
``str.format`` is the pythonic way of handling strings returned by
gettext.gettext that retain interpolation tokens.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-29 06:04:09 +01:00
Markus Heiser
a235c54f8c [mod] rudimentary implementation of a MainResult type
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-29 05:04:41 +01:00
Markus Heiser
df3344e5d5 [fix] JSON & CSV format return error 500
For CSV and JSON output, the LegacyResult and the Result objects needs to be
converted to a python dictionary.

Closes: https://github.com/searxng/searxng/issues/4244
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-29 05:04:41 +01:00
Markus Heiser
906b9e7d4c [fix] hostnames plugin: AttributeError: 'NoneType' object has no attribute 'netloc'
Closes: https://github.com/searxng/searxng/issues/4245
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-28 16:28:12 +01:00
Markus Heiser
36a1ef1239 [refactor] typification of SearXNG / EngineResults
In [1] and [2] we discussed the need of a Result.results property and how we can
avoid unclear code.  This patch implements a class for the reslut-lists of
engines::

    searx.result_types.EngineResults

A simple example for the usage in engine development::

    from searx.result_types import EngineResults
    ...
    def response(resp) -> EngineResults:
        res = EngineResults()
        ...
        res.add( res.types.Answer(answer="lorem ipsum ..", url="https://example.org") )
        ...
        return res

[1] https://github.com/searxng/searxng/pull/4183#pullrequestreview-257400034
[2] https://github.com/searxng/searxng/pull/4183#issuecomment-2614301580
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-28 07:07:08 +01:00
Markus Heiser
edfbf1e118 [refactor] typification of SearXNG (initial) / result items (part 1)
Typification of SearXNG
=======================

This patch introduces the typing of the results.  The why and how is described
in the documentation, please generate the documentation ..

    $ make docs.clean docs.live

and read the following articles in the "Developer documentation":

- result types --> http://0.0.0.0:8000/dev/result_types/index.html

The result types are available from the `searx.result_types` module.  The
following have been implemented so far:

- base result type: `searx.result_type.Result`
  --> http://0.0.0.0:8000/dev/result_types/base_result.html

- answer results
  --> http://0.0.0.0:8000/dev/result_types/answer.html

including the type for translations (inspired by #3925).  For all other
types (which still need to be set up in subsequent PRs), template documentation
has been created for the transition period.

Doc of the fields used in Templates
===================================

The template documentation is the basis for the typing and is the first complete
documentation of the results (needed for engine development).  It is the
"working paper" (the plan) with which further typifications can be implemented
in subsequent PRs.

- https://github.com/searxng/searxng/issues/357

Answer Templates
================

With the new (sub) types for `Answer`, the templates for the answers have also
been revised, `Translation` are now displayed with collapsible entries (inspired
by #3925).

    !en-de dog

Plugins & Answerer
==================

The implementation for `Plugin` and `Answer` has been revised, see
documentation:

- Plugin: http://0.0.0.0:8000/dev/plugins/index.html
- Answerer: http://0.0.0.0:8000/dev/answerers/index.html

With `AnswerStorage` and `AnswerStorage` to manage those items (in follow up
PRs, `ArticleStorage`, `InfoStorage` and .. will be implemented)

Autocomplete
============

The autocompletion had a bug where the results from `Answer` had not been shown
in the past.  To test activate autocompletion and try search terms for which we
have answerers

- statistics: type `min 1 2 3` .. in the completion list you should find an
  entry like `[de] min(1, 2, 3) = 1`

- random: type `random uuid` .. in the completion list, the first item is a
  random UUID

Extended Types
==============

SearXNG extends e.g. the request and response types of flask and httpx, a module
has been set up for type extensions:

- Extended Types
  --> http://0.0.0.0:8000/dev/extended_types.html

Unit-Tests
==========

The unit tests have been completely revised.  In the previous implementation,
the runtime (the global variables such as `searx.settings`) was not initialized
before each test, so the runtime environment with which a test ran was always
determined by the tests that ran before it.  This was also the reason why we
sometimes had to observe non-deterministic errors in the tests in the past:

- https://github.com/searxng/searxng/issues/2988 is one example for the Runtime
  issues, with non-deterministic behavior ..

- https://github.com/searxng/searxng/pull/3650
- https://github.com/searxng/searxng/pull/3654
- https://github.com/searxng/searxng/pull/3642#issuecomment-2226884469
- https://github.com/searxng/searxng/pull/3746#issuecomment-2300965005

Why msgspec.Struct
==================

We have already discussed typing based on e.g. `TypeDict` or `dataclass` in the past:

- https://github.com/searxng/searxng/pull/1562/files
- https://gist.github.com/dalf/972eb05e7a9bee161487132a7de244d2
- https://github.com/searxng/searxng/pull/1412/files
- https://github.com/searxng/searxng/pull/1356

In my opinion, TypeDict is unsuitable because the objects are still dictionaries
and not instances of classes / the `dataclass` are classes but ...

The `msgspec.Struct` combine the advantages of typing, runtime behaviour and
also offer the option of (fast) serializing (incl. type check) the objects.

Currently not possible but conceivable with `msgspec`: Outsourcing the engines
into separate processes, what possibilities this opens up in the future is left
to the imagination!

Internally, we have already defined that it is desirable to decouple the
development of the engines from the development of the SearXNG core / The
serialization of the `Result` objects is a prerequisite for this.

HINT: The threads listed above were the template for this PR, even though the
implementation here is based on msgspec.  They should also be an inspiration for
the following PRs of typification, as the models and implementations can provide
a good direction.

Why just one commit?
====================

I tried to create several (thematically separated) commits, but gave up at some
point ... there are too many things to tackle at once / The comprehensibility of
the commits would not be improved by a thematic separation. On the contrary, we
would have to make multiple changes at the same places and the goal of a change
would be vaguely recognizable in the fog of the commits.

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-28 07:07:08 +01:00
Bnyro
9079d0cac0 [refactor] translation engines: common interface 2025-01-28 07:07:08 +01:00
Denperidge
70f1b65008 [feat] engines: add NixOS Wiki
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-01-26 20:12:19 +01:00
Markus Heiser
06f6ee4e36 [build] /static 2025-01-26 13:34:52 +01:00
Markus Heiser
9beff8212b [refactor] results.js: wait one second before loading full high-res image
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-26 13:34:52 +01:00
Bnyro
cf4e183790 [refactor] results.js: cancel image loading after next one selected 2025-01-26 13:34:52 +01:00
Bnyro
c1fcee9d9f [docs] settings_search.rst: add missing autocompletion providers 2025-01-26 08:38:29 +01:00
Bnyro
176079977d [chore] autocomplete.py: order autocompletion engines alphabetically 2025-01-25 12:12:46 +01:00
Zhijie He
f3f13519ff [feat] autocompletion: add baidu search autocompleter (#4227) 2025-01-25 11:59:10 +01:00
dependabot[bot]
04a6ab12fb [upd] npm: Bump less from 4.2.1 to 4.2.2 in /searx/static/themes/simple
Bumps [less](https://github.com/less/less.js) from 4.2.1 to 4.2.2.
- [Release notes](https://github.com/less/less.js/releases)
- [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/less/less.js/commits)

---
updated-dependencies:
- dependency-name: less
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-24 20:24:52 +01:00
searxng-bot
edf6d96625 [l10n] update translations from Weblate
8a0e2e2d6 - 2025-01-21 - return42 <return42@users.noreply.translate.codeberg.org>
b70a88fec - 2025-01-19 - rajeeban <rajeeban@users.noreply.translate.codeberg.org>
2025-01-24 09:52:04 +01:00
dependabot[bot]
fa50324dae [upd] pypi: Bump selenium from 4.27.1 to 4.28.1
Bumps [selenium](https://github.com/SeleniumHQ/Selenium) from 4.27.1 to 4.28.1.
- [Release notes](https://github.com/SeleniumHQ/Selenium/releases)
- [Commits](https://github.com/SeleniumHQ/Selenium/commits)

---
updated-dependencies:
- dependency-name: selenium
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-24 09:48:34 +01:00
Markus Heiser
bee2677929 [build] /static 2025-01-21 22:55:45 +01:00
Markus Heiser
e7081bb2c1 [update] make pygments.less
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-21 16:12:27 +01:00
dependabot[bot]
1fde000499 [upd] pypi: Bump pygments from 2.18.0 to 2.19.1
Bumps [pygments](https://github.com/pygments/pygments) from 2.18.0 to 2.19.1.
- [Release notes](https://github.com/pygments/pygments/releases)
- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)
- [Commits](https://github.com/pygments/pygments/compare/2.18.0...2.19.1)

---
updated-dependencies:
- dependency-name: pygments
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-21 16:12:27 +01:00
Bnyro
8731e37796 [build] /static 2025-01-20 18:46:31 +01:00
Bnyro
e92d1bc6af [fix] results.js: back button not working after closing image result manually 2025-01-20 18:46:31 +01:00
Bnyro
f766faca3f [feat] engines: add ipernity (images) 2025-01-20 17:22:32 +01:00
dependabot[bot]
c020a964e4 [upd] npm: Bump eslint in /searx/static/themes/simple
Bumps [eslint](https://github.com/eslint/eslint) from 9.17.0 to 9.18.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.17.0...v9.18.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 16:53:12 +01:00
dependabot[bot]
46b16e6ff1 [upd] npm: Bump stylelint-config-standard in /searx/static/themes/simple
Bumps [stylelint-config-standard](https://github.com/stylelint/stylelint-config-standard) from 36.0.1 to 37.0.0.
- [Release notes](https://github.com/stylelint/stylelint-config-standard/releases)
- [Changelog](https://github.com/stylelint/stylelint-config-standard/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint-config-standard/compare/36.0.1...37.0.0)

---
updated-dependencies:
- dependency-name: stylelint-config-standard
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 16:52:21 +01:00
Markus Heiser
98c66c0ae6 [build] /static 2025-01-20 16:41:00 +01:00
Markus Heiser
c06ec65b2a [fix] LESS sourcemaps broken in less-plugin-clean-css v1.6.0
The ``less-plugin-clean-css`` lacks some maintenance: the sourcemaps are broken
since v1.6.0 (08/2024) [1]

- [1] https://github.com/less/less-plugin-clean-css/issues/42

Closes: https://github.com/searxng/searxng/issues/4143

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-20 16:41:00 +01:00
Markus Heiser
e581921c92 [fix] engine brave: remove date from the content string
Related: https://github.com/searxng/searxng/issues/4211#issuecomment-2601941440
Closes: https://github.com/searxng/searxng/issues/4006

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-20 16:40:36 +01:00
Markus Heiser
073d9549a0 [build] /static 2025-01-20 13:52:43 +01:00
Markus Heiser
601ffcb8a3 [mod] add swipe events to the image gallery (gesture control)
Adds [1] to the searxng.min.js and horizontal swipe events to the image gallery.

[1] https://www.npmjs.com/package/swiped-events

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-20 13:52:43 +01:00
Markus Heiser
d9115b8d48 [build] /static 2025-01-20 13:29:26 +01:00
Bnyro
c760ad0808 [feat] image results: dismiss image viewer on back button press on mobile devices 2025-01-20 13:29:26 +01:00
Bnyro
2f087a3a22 [feat] public domain image archive: automatically obtain algolia api key 2025-01-20 12:56:15 +01:00
Denperidge
3333d9f385 [feat] engines: public domain image archive 2025-01-20 12:56:15 +01:00
Popolon
1a885b70ce [feat] wikidata: add mastodon, peertube and Lemmy accounts to infobox
Co-authored-by: Popolon <popolon@popolon.org>
Co-authored-by: Bnyro <bnyro@tutanota.com>
2025-01-20 11:19:56 +01:00
searxng-bot
a576f69c12 [l10n] update translations from Weblate
09c56a561 - 2025-01-16 - tentsbet <tentsbet@users.noreply.translate.codeberg.org>
219fff972 - 2025-01-14 - hirushaadi <hirushaadi@users.noreply.translate.codeberg.org>
2b4b64e60 - 2025-01-14 - return42 <return42@users.noreply.translate.codeberg.org>
6a359da17 - 2025-01-14 - return42 <return42@users.noreply.translate.codeberg.org>
2025-01-17 08:13:57 +01:00
DanielMowitz
272e39893d [feat]: engines: add astrophysical data system 2025-01-16 20:27:55 +01:00
Markus Heiser
41159fed32 [build] /static 2025-01-16 10:51:33 +01:00
Markus Heiser
b1507f188e [fix] gallery view overlaps category bar
Closes: https://github.com/searxng/searxng/issues/4190

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-16 10:51:33 +01:00
Markus Heiser
1668ff5e64 [fix] theme simple: image viewer hides autocomplete suggestions
Closes: https://github.com/searxng/searxng/issues/3509
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-16 10:51:33 +01:00
Markus Heiser
f03ab00155 [fix] broken mobile view (from #4154)
Related:
- https://github.com/searxng/searxng/pull/4154#issuecomment-2591881963

Closes: https://github.com/searxng/searxng/issues/4187

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-16 10:51:33 +01:00
Markus Heiser
15d0e274b3 [fix] build workflows of the themes
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-16 10:51:33 +01:00
Markus Heiser
e4f8f0483f [mod] slightly improve make node.clean themes.all
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-14 15:22:23 +01:00
Bnyro
5a1a43ef74 [build] /static 2025-01-14 15:22:23 +01:00
Bnyro
94b6adf03d [chore] stylelint: fix reported errors 2025-01-14 15:22:23 +01:00
Bnyro
337a6db064 [upd] stylelint: use less-compatible configuration and update rules 2025-01-14 15:22:23 +01:00
Markus Heiser
9d834c0722 [fix] issues reported by sytlelint
"Unexpected vendor-prefixed":
   -webkit-transform & -ms-transform [3]
   -webkit-animation [2]
   @-webkit-keyframes [1]

[1] https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes
[2] https://developer.mozilla.org/en-US/docs/Web/CSS/animation
[3] https://developer.mozilla.org/en-US/docs/Web/CSS/transform

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-14 15:22:23 +01:00
Markus Heiser
0abad23daa [upd] migrate .eslintrc.json to eslint.config.mjs
The migration was done by the following steps, firts prepare the node enviroment
an open a bash in this environment::

    $ make clean nvm.nodejs
    ...
    $ ./manage nvm.bash
    $ which npx
    searxng/.nvm/versions/node/v23.5.0/bin/npx

In this environment the migration command from [1] is started::

    $ npx @eslint/migrate-config .eslintrc.json
    Need to install the following packages:
    @eslint/migrate-config@1.3.5
    Migrating .eslintrc.json

    Wrote new config to ./eslint.config.mjs

    You will need to install the following packages to use the new config:
    - globals
    - @eslint/js
    - @eslint/eslintrc

    You can install them using the following command:

    npm install globals @eslint/js @eslint/eslintrc -D

    The following messages were generated during migration:
    - The 'node' environment is used, so switching sourceType to 'commonjs'.

[1] https://eslint.org/docs/latest/use/configure/migration-guide#migrate-your-config-file

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-14 15:22:23 +01:00
Markus Heiser
943c8fb85b [upd] update npm dependencies (package.json) and .tool-versions
To avoid issue like [1], versions from now on are pinned in::

    searx/static/themes/simple/package-lock.json

To test nodejs v23 or newer is needed (will be installed by nvm).  To drop a
possibly existing installation::

    $ make clean

Install nodejs in nvm::

    $ make nvm.nodejs
    INFO:  install (update) NVM at searxng/.nvm
    ...
    Now using node v23.5.0 (npm v10.9.2)
    Creating default alias: default -> v23.5 (-> v23.5.0)
    INFO:  Node.js is installed at searxng/.nvm/versions/node/v23.5.0/bin/node
    INFO:  Node.js is version v23.5.0
    INFO:  npm is installed at searxng/.nvm/versions/node/v23.5.0/bin/npm
    INFO:  npm is version 10.9.2
    INFO:  NVM is installed at searxng/.nvm

To test npm checks and builds:

    $ make static.build.commit

Related:

[1] https://github.com/searxng/searxng/issues/4143

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-14 15:22:23 +01:00
Lucki
35c80268bf [json_engine] Fix R0912 (too-many-branches) 2025-01-14 14:07:35 +01:00
Lucki
3942b311ac [json_engine] Add unit test 2025-01-14 14:07:35 +01:00
Lucki
64d954b350 [json_engine] mirror xpath functionality 2025-01-14 14:07:35 +01:00
Lucki
591d9c2505 [json_engine] document existing options 2025-01-14 14:07:35 +01:00
Markus Heiser
09cce18518 [data] update searx.data - make data.all
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-13 08:02:01 +01:00
searxng-bot
94a0b415ef [l10n] update translations from Weblate
8f8f92dc0 - 2025-01-10 - hirushaadi <hirushaadi@users.noreply.translate.codeberg.org>
d4ae2e4ba - 2025-01-08 - Harshith-10 <harshith-10@users.noreply.translate.codeberg.org>
05848d0bb - 2025-01-08 - return42 <return42@users.noreply.translate.codeberg.org>
151cde7fc - 2025-01-08 - return42 <return42@users.noreply.translate.codeberg.org>
43ba79c99 - 2025-01-06 - return42 <return42@users.noreply.translate.codeberg.org>
2025-01-10 08:13:22 +01:00
Markus Heiser
6dab7fe78b Revert "[l10n ga] trigger weblate.push.translations (another try)"
This reverts commit e352926187.
2025-01-06 17:12:16 +01:00
Markus Heiser
e352926187 [l10n ga] trigger weblate.push.translations (another try)
Related:

- https://github.com/searxng/searxng/issues/4117

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-06 16:59:20 +01:00
Markus Heiser
b0391fe718 reomve DUMMY from searxng.msg catalog
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-06 16:24:44 +01:00
Markus Heiser
91d3d38690 [l10n ga] trigger weblate.push.translations
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-06 16:16:04 +01:00
Markus Heiser
c5991865c8 [fix] l10n ga (Irish) messages.po is marked as fuzzy
$ ./manage pyenv.cmd pybabel compile --statistics -d searx/translations/

reports:

    catalog searx/translations/ga/LC_MESSAGES/messages.po is marked as fuzzy, skipping

This commit removes the ``fuzzy`` tag and BTW reverts commit 655e41f27

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-06 15:49:21 +01:00
Markus Heiser
655e41f274 [l10n ga] trigger weblate.push.translations
Related:

- https://github.com/searxng/searxng/issues/4117

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-06 14:54:41 +01:00
Aindriú Mac Giolla Eoin
d9343b6388 [l10n] adding new language Irish (ga) 2025-01-06 14:54:41 +01:00
Bnyro
0642c5434a [fix] dockerhub: switch to new api path
Co-authored-by: Markus Heiser <markus.heiser@darmarit.de>
2025-01-06 13:46:13 +01:00
Lucki
18c3e08837 Fix usage of api_key engine setting
The value of `params['api_key']` isn't read anywhere.
Writing directly into the header object solves this quite easily though.

> [Users can authenticate by including their API key either in a request URL by appending `?apikey=<API KEY>`, or by including the `X-API-Key: <API KEY>` header with the request.](https://wallhaven.cc/help/api)
2025-01-06 12:25:33 +01:00
Alexandre Flament
96c32549be [fix] requirements-dev.txt: remove autodoc_pydantic
Related to #3727
2025-01-05 09:31:03 +01:00
searxng-bot
a060c09854 [l10n] update translations from Weblate
3db237112 - 2024-12-31 - kratos <kratos@users.noreply.translate.codeberg.org>
2025-01-03 08:49:25 +01:00
Markus Heiser
c1bb0bebd4 [data] update searx.data - update_engine_traits.py
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-29 10:12:45 +01:00
Markus Heiser
af3f272b0b [fix] update_engine_traits.py: annas archive, bing-* and zlibrary engines
Github action Update data - update_engine_traits [1] had issues in annas
archive, bing-* and zlibrary engines:

    ./manage pyenv.cmd python ./searxng_extra/update/update_engine_traits.py

[1] https://github.com/searxng/searxng/actions/runs/12530827768/job/34953392587

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-29 10:12:45 +01:00
return42
05c82d3201 [data] update searx.data - update_engine_descriptions.py 2024-12-29 10:12:24 +01:00
return42
f0e9c3be8c [data] update searx.data - update_currencies.py 2024-12-29 10:11:38 +01:00
return42
428eaea2b7 [data] update searx.data - update_wikidata_units.py 2024-12-29 10:11:09 +01:00
return42
3d55008f23 [data] update searx.data - update_ahmia_blacklist.py 2024-12-29 10:10:38 +01:00
Markus Heiser
9e32cd2047 [fix] replaca inoffical msgspec-python313-pre by offical msgspec 0.19
inoffical msgspec-python313-pre was an inetrim solution from e710ebdf6

related:

- https://github.com/searxng/searxng/pull/4129
- https://github.com/jcrist/msgspec/issues/764#issuecomment-2561330165

closes:

- https://github.com/searxng/searxng/issues/4015

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-28 10:42:20 +01:00
dependabot[bot]
120a519c5c [upd] pypi: Bump pylint from 3.3.2 to 3.3.3
Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.2 to 3.3.3.
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.2...v3.3.3)

---
updated-dependencies:
- dependency-name: pylint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-28 09:05:21 +01:00
searxng-bot
402a09963e [l10n] update translations from Weblate
31b458aa4 - 2024-12-25 - return42 <return42@users.noreply.translate.codeberg.org>
fe7cc8706 - 2024-12-25 - return42 <return42@users.noreply.translate.codeberg.org>
7a585b545 - 2024-12-22 - alexgabi <alexgabi@users.noreply.translate.codeberg.org>
2e2fdbd16 - 2024-12-21 - xawos <xawos@users.noreply.translate.codeberg.org>
e2774bb44 - 2024-12-21 - ghose <ghose@users.noreply.translate.codeberg.org>
970bd5d86 - 2024-12-21 - xawos <xawos@users.noreply.translate.codeberg.org>
4c775384c - 2024-12-21 - xawos <xawos@users.noreply.translate.codeberg.org>
176f7df6e - 2024-12-21 - xawos <xawos@users.noreply.translate.codeberg.org>
a6a842d01 - 2024-12-20 - Amirkhandrend-Nicest-XII <Amirkhandrend-Nicest-XII@users.noreply.translate.codeberg.org>
2024-12-28 09:04:50 +01:00
Austin-Olacsi
73e395c8ce [feat] engines: re-add alexandria.org 2024-12-25 13:13:18 +01:00
dependabot[bot]
19ecdd8aae Bump jinja2 from 3.1.4 to 3.1.5
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.5.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.4...3.1.5)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-25 08:03:43 +01:00
Markus Heiser
3749154660 [mod] add support for Python 3.13
Python 3.13 has been released [1]

- fasttext-predict supports py3.13 from version 0.9.2.3 [2]

[1] https://www.python.org/downloads/release/python-3130/
[2] https://github.com/searxng/fasttext-predict/commit/f2da9cd173

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-24 19:46:04 +01:00
Markus Heiser
e710ebdf67 [fix] temporary msgspec-python313-pre
Waitng for new release of msgspec for Python 3.13:

- https://github.com/jcrist/msgspec/issues/764#issuecomment-2466150924

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-24 19:35:54 +01:00
Markus Heiser
26097f444b [fix] engine google_video: google changed the layout of the HTML response
Closes: https://github.com/searxng/searxng/issues/4127
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-22 11:45:46 +01:00
dependabot[bot]
19ee529b78 [upd] pypi: Bump certifi from 2024.8.30 to 2024.12.14
Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.8.30 to 2024.12.14.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.08.30...2024.12.14)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-20 10:07:08 +01:00
searxng-bot
ce53d97327 [l10n] update translations from Weblate
979094524 - 2024-12-17 - Amirkhandrend-Nicest-XII <Amirkhandrend-Nicest-XII@users.noreply.translate.codeberg.org>
2024-12-20 08:16:12 +01:00
Markus Heiser
65c970bdf4 [build] /static 2024-12-16 11:39:38 +01:00
Bnyro
d4e3a5f2f2 [refactor] webapp.py: reuse get_client_settings() method to unify preference handling before render 2024-12-16 11:39:38 +01:00
Markus Heiser
1604a00b89 Revert "[weblate] add dummy string to trigger weblate.push.translations in CI"
This reverts commit 899edee5ec.
2024-12-16 09:27:19 +01:00
Markus Heiser
899edee5ec [weblate] add dummy string to trigger weblate.push.translations in CI
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-16 08:41:57 +01:00
Bnyro
523df1d7f4 [build] /static 2024-12-16 08:36:48 +01:00
Bnyro
c8e932647b [fix] settings: javascript crash when entering due to missing search form 2024-12-16 08:36:48 +01:00
Zhijie He
8d2c01e4ce [chore] cleanup 2024-12-16 08:32:35 +01:00
Zhijie He
12c27f416f [enh] add engine- prefix, replace blank space to - 2024-12-16 08:32:35 +01:00
Zhijie He
e90fa48018 [fix]: fix engine name may break some css style, contains "right", "left", "center" 2024-12-16 08:32:35 +01:00
dependabot[bot]
3742d558ac [upd] pypi: Bump pylint from 3.3.1 to 3.3.2
Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.1...v3.3.2)

---
updated-dependencies:
- dependency-name: pylint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-14 08:33:35 +01:00
dependabot[bot]
db67efae6f [upd] pypi: Bump typer-slim from 0.14.0 to 0.15.1
Bumps [typer-slim](https://github.com/fastapi/typer) from 0.14.0 to 0.15.1.
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](https://github.com/fastapi/typer/compare/0.14.0...0.15.1)

---
updated-dependencies:
- dependency-name: typer-slim
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-14 08:33:14 +01:00
dependabot[bot]
b8d2d2df8a [upd] pypi: Bump sphinxcontrib-programoutput from 0.17 to 0.18
Bumps [sphinxcontrib-programoutput](https://github.com/NextThought/sphinxcontrib-programoutput) from 0.17 to 0.18.
- [Changelog](https://github.com/OpenNTI/sphinxcontrib-programoutput/blob/master/CHANGES.rst)
- [Commits](https://github.com/NextThought/sphinxcontrib-programoutput/compare/0.17...0.18)

---
updated-dependencies:
- dependency-name: sphinxcontrib-programoutput
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-14 08:31:39 +01:00
Markus Heiser
c60fe999cf Update data - locales
./searxng_extra/update/update_locales.py

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-13 18:45:14 +01:00
Markus Heiser
f952668fde [l10n] adding new language Tatar (tt)
$ ./manage pyenv.cmd bash
    $ pybabel init -i searx/translations/messages.pot -d searx/translations -l tt
    creating catalog searx/translations/tt/LC_MESSAGES/messages.po based on searx/translations/messages.pot

Closes: https://github.com/searxng/searxng/issues/4098

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-13 18:45:14 +01:00
searxng-bot
8791345869 [l10n] update translations from Weblate
941da8a11 - 2024-12-13 - Kita Ikuyo <searinminecraft@courvix.com>
7c9e8973a - 2024-12-12 - return42 <return42@users.noreply.translate.codeberg.org>
1ef3f3b6e - 2024-12-12 - OpenCode <OpenCode@users.noreply.translate.codeberg.org>
8edb4af3d - 2024-12-11 - KhietVo <KhietVo@users.noreply.translate.codeberg.org>
77469663d - 2024-12-11 - dansmachina <dansmachina@users.noreply.translate.codeberg.org>
be726d2c7 - 2024-12-09 - kkrawczyk <kkrawczyk@users.noreply.translate.codeberg.org>
dfb9dd20f - 2024-12-10 - artnay <artnay@users.noreply.translate.codeberg.org>
a1977736f - 2024-12-09 - return42 <return42@users.noreply.translate.codeberg.org>
e17d999d7 - 2024-12-07 - Eryk Michalak <gnu.ewm@protonmail.com>
2024-12-13 08:15:55 +01:00
Markus Heiser
0245e82bd2 [build] /static 2024-12-01 15:04:05 +01:00
Markus Heiser
8c3f0c3d52 [fix] if image load fails on client side, show default image
BTW: change icon color from red to gray

Closes:

- https://github.com/searxng/searxng/issues/4066

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
2024-12-01 15:04:05 +01:00
984 changed files with 134219 additions and 54423 deletions

View File

@@ -1,4 +1,22 @@
FROM mcr.microsoft.com/devcontainers/base:debian
ARG DEBIAN_CODENAME="bookworm"
FROM mcr.microsoft.com/devcontainers/base:$DEBIAN_CODENAME
ARG DEBIAN_CODENAME="bookworm"
RUN cat <<EOF > /etc/apt/sources.list.d/debian.sources
Types: deb
URIs: http://deb.debian.org/debian
Suites: $DEBIAN_CODENAME $DEBIAN_CODENAME-updates $DEBIAN_CODENAME-backports
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: http://security.debian.org/debian-security
Suites: $DEBIAN_CODENAME-security
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
RUN apt-get update && \
apt-get -y install python3 python3-venv redis firefox-esr graphviz imagemagick librsvg2-bin fonts-dejavu shellcheck
apt-get -y install python3 python3-venv valkey-server firefox-esr graphviz imagemagick librsvg2-bin fonts-dejavu shellcheck

View File

@@ -1,9 +1,13 @@
{
"build": {
"args": {
"DEBIAN_CODENAME": "bookworm",
},
"dockerfile": "Dockerfile"
},
"features": {
"ghcr.io/devcontainers/features/github-cli": {}
"ghcr.io/devcontainers/features/github-cli": {},
"ghcr.io/devcontainers/features/docker-in-docker": {}
},
"customizations": {
"vscode": {

View File

@@ -1,163 +0,0 @@
;;; .dir-locals.el
;;
;; Per-Directory Local Variables:
;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html
;;
;; For full fledge developer tools install emacs packages:
;;
;; M-x package-install ...
;;
;; magit gitconfig
;; nvm lsp-mode lsp-pyright lsp-eslint
;; pyvenv pylint pip-requirements
;; jinja2-mode
;; json-mode
;; company company-jedi company-quickhelp company-shell
;; realgud
;; sphinx-doc markdown-mode graphviz-dot-mode
;; apache-mode nginx-mode
;;
;; To setup a developer environment, build target::
;;
;; $ make node.env.dev pyenv.install
;;
;; Some buffer locals are referencing the project environment:
;;
;; - prj-root --> <repo>/
;; - nvm-dir --> <repo>/.nvm
;; - python-environment-directory --> <repo>/local
;; - python-environment-default-root-name --> py3
;; - python-shell-virtualenv-root --> <repo>/local/py3
;; When this variable is set with the path of the virtualenv to use,
;; `process-environment' and `exec-path' get proper values in order to run
;; shells inside the specified virtualenv, example::
;; (setq python-shell-virtualenv-root "/path/to/env/")
;; - python-shell-interpreter --> <repo>/local/py3/bin/python
;;
;; Python development:
;;
;; Jedi, flycheck & other python stuff should use the 'python-shell-interpreter'
;; from the local py3 environment.
;;
((nil
. ((fill-column . 80)
(indent-tabs-mode . nil)
(eval . (progn
(add-to-list 'auto-mode-alist '("\\.html\\'" . jinja2-mode))
;; project root folder is where the `.dir-locals.el' is located
(setq-local prj-root
(locate-dominating-file default-directory ".dir-locals.el"))
(setq-local python-environment-directory
(expand-file-name "./local" prj-root))
;; to get in use of NVM environment, install https://github.com/rejeep/nvm.el
(setq-local nvm-dir (expand-file-name "./.nvm" prj-root))
;; use nodejs from the (local) NVM environment (see nvm-dir)
(nvm-use-for-buffer)
(ignore-errors (require 'lsp))
(setq-local lsp-server-install-dir (car (cdr nvm-current-version)))
(setq-local lsp-enable-file-watchers nil)
;; use 'py3' environment as default
(setq-local python-environment-default-root-name
"py3")
(setq-local python-shell-virtualenv-root
(expand-file-name
python-environment-default-root-name python-environment-directory))
(setq-local python-shell-interpreter
(expand-file-name
"bin/python" python-shell-virtualenv-root))))))
(makefile-gmake-mode
. ((indent-tabs-mode . t)))
(yaml-mode
. ((eval . (progn
;; flycheck should use the local py3 environment
(setq-local flycheck-yaml-yamllint-executable
(expand-file-name "bin/yamllint" python-shell-virtualenv-root))
(setq-local flycheck-yamllintrc
(expand-file-name ".yamllint.yml" prj-root))
(flycheck-checker . yaml-yamllint)))))
(json-mode
. ((eval . (progn
(setq-local js-indent-level 4)
(flycheck-checker . json-python-json)))))
(js-mode
. ((eval . (progn
(ignore-errors (require 'lsp-eslint))
(setq-local js-indent-level 2)
;; flycheck should use the eslint checker from developer tools
(setq-local flycheck-javascript-eslint-executable
(expand-file-name "node_modules/.bin/eslint" prj-root))
;; (flycheck-mode)
(if (featurep 'lsp-eslint)
(lsp))
))))
(python-mode
. ((eval . (progn
(ignore-errors (require 'jedi-core))
(ignore-errors (require 'lsp-pyright))
(ignore-errors (sphinx-doc-mode))
(setq-local python-environment-virtualenv
(list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
;;"--system-site-packages"
"--quiet"))
(setq-local pylint-command
(expand-file-name "bin/pylint" python-shell-virtualenv-root))
(if (featurep 'lsp-pyright)
(lsp))
;; pylint will find the '.pylintrc' file next to the CWD
;; https://pylint.readthedocs.io/en/latest/user_guide/run.html#command-line-options
(setq-local flycheck-pylintrc
".pylintrc")
;; flycheck & other python stuff should use the local py3 environment
(setq-local flycheck-python-pylint-executable
python-shell-interpreter)
;; use 'M-x jedi:show-setup-info' and 'M-x epc:controller' to inspect jedi server
;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-root -- You
;; can specify a full path instead of a name (relative path). In that case,
;; python-environment-directory is ignored and Python virtual environment
;; is created at the specified path.
(setq-local jedi:environment-root
python-shell-virtualenv-root)
;; https://tkf.github.io/emacs-jedi/latest/#jedi:server-command
(setq-local jedi:server-command
(list python-shell-interpreter
jedi:server-script))
;; jedi:environment-virtualenv --> see above 'python-environment-virtualenv'
;; is set buffer local! No need to setup jedi:environment-virtualenv:
;;
;; Virtualenv command to use. A list of string. If it is nil,
;; python-environment-virtualenv is used instead. You must set non-nil
;; value to jedi:environment-root in order to make this setting work.
;;
;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-virtualenv
;;
;; (setq-local jedi:environment-virtualenv
;; (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
;; "--python"
;; "/usr/bin/python3.4"
;; ))
))))
)

View File

@@ -1,44 +1,6 @@
*~
*/*~
*/*/*~
*/*/*/*~
*/*/*/*/*~
*
# Git
.git
.gitignore
# CI
.codeclimate.yml
.travis.yml
.taskcluster.yml
# Byte-compiled / optimized / DLL files
__pycache__/
*/__pycache__/
*/*/__pycache__/
*/*/*/__pycache__/
*.py[cod]
*/*.py[cod]
*/*/*.py[cod]
*/*/*/*.py[cod]
# node_modules
node_modules/
*/node_modules/
*/*/node_modules/
*/*/*/node_modules/
*/*/*/*/node_modules/
.tx/
# to sync with .gitignore
geckodriver.log
.coverage
coverage/
cache/
build/
dist/
local/
gh-pages/
*.egg-info/
!container/*.template.*
!container/entrypoint.sh
!searx/**
!requirements*.txt

View File

@@ -10,21 +10,50 @@ trim_trailing_whitespace = true
end_of_line = lf
charset = utf-8
[*.py]
max_line_length = 119
[{*.py,*.pyi}]
# code formatter accepts length of 120, but editor should prefer 80
max_line_length = 80
[{*.sh,manage}]
indent_style = space
indent_size = 4
# shfmt options
shell_variant = bash
switch_case_indent = true
[*.html]
indent_size = 4
# in the jinja templates we use indent size of 2 and we do not use tabs
indent_size = 2
indent_style = space
[*.css]
indent_size = 2
[*.less]
indent_size = 2
[*.js]
indent_size = 2
[*.ts]
indent_size = 2
[*.json]
indent_size = 4
indent_size = 2
insert_final_newline = ignore
[*.map]
indent_size = ignore
insert_final_newline = ignore
# Minified JavaScript files shouldn't be changed
[**.min.js]
[*.min.js]
indent_style = ignore
insert_final_newline = ignore
# Minified CSS files shouldn't be changed
[*.min.css]
indent_style = ignore
insert_final_newline = ignore

View File

@@ -1,39 +1,50 @@
---
name: Bug report
about: Report a bug in SearXNG
title: ''
labels: bug
assignees: ''
name: "Bug report"
about: Report a bug in SearXNG"
labels: ["bug"]
type: "bug"
---
<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SearXNG -->
**Version of SearXNG, commit number if you are using on master branch and stipulate if you forked SearXNG**
<!-- If you are running on master branch using git execute this command
in order to fetch the latest commit ID:
```
git log -1
```
If you are using searxng-docker then look at the bottom of the SearXNG page
and check for the version after "Powered by SearXNG"
_Replace this placeholder with a meaningful and precise description of the bug._
Please also stipulate if you are using a forked version of SearXNG and
include a link to the fork source code.
<!-- FILL IN THESE FIELDS .. and delete the comments after reading.
Use Markdown for formatting -> https://www.markdowntools.io/cheat-sheet
-->
**How did you install SearXNG?**
<!-- Did you install SearXNG using the official wiki or using searxng-docker
or manually by executing the searx/webapp.py file? -->
**What happened?**
<!-- A clear and concise description of what the bug is. -->
**How To Reproduce**
<!-- How can we reproduce this issue? (as minimally and as precisely as possible) -->
### How To Reproduce?
<!-- How can we reproduce this issue? (as minimally and as precisely as
possible) -->
### Expected behavior
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Screenshots & Logs**
### Screenshots & Logs
<!-- If applicable, add screenshots, logs to help explain your problem. -->
**Additional context**
### Version of SearXNG
<!-- Commit number if you are using on master branch and stipulate if you forked
SearXNG -->
<!-- Look at the bottom of the SearXNG page and check for the version after
"Powered by SearXNG" If you are using a forked version of SearXNG include a
link to the fork source code. -->
### How did you install SearXNG?
<!-- Did you install SearXNG using the official documentation or using
searxng-docker? -->
### Additional context
<!-- Add any other context about the problem here. -->
### Code of Conduct
[AI Policy]: https://github.com/searxng/searxng/blob/master/AI_POLICY.rst
- [ ] I read the [AI Policy] and hereby confirm that this issue conforms with the policy.

View File

@@ -1,4 +1,4 @@
blank_issues_enabled: true
blank_issues_enabled: false
contact_links:
- name: Questions & Answers (Q&A)
url: https://github.com/searxng/searxng/discussions/categories/q-a

View File

@@ -1,31 +1,46 @@
---
name: Engine request
about: Request a new engine in SearXNG
title: ''
labels: enhancement, engine request
assignees: ''
name: Engine request"
about: Request a new engine in SearXNG"
labels: ["engine request"]
type: "feature"
---
<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SearXNG -->
**Working URL to the engine**
<!-- Please check if the engine is responding correctly before submitting it. -->
<!-- FILL IN THESE FIELDS .. and delete the comments after reading.
**Why do you want to add this engine?**
<!-- What's special about this engine? Is it open source or libre? -->
Use Markdown for formatting -> https://www.markdowntools.io/cheat-sheet
-->
**Features of this engine**
<!-- Features of this engine: Doesn't track its users, fast, easy to integrate, ... -->
### Working URL to the engine
**How can SearXNG fetch the information from this engine?**
<!-- List API URL, example code (using the correct markdown) and more
that could be useful for the developers in order to implement this engine.
If you don't know what to write, let this part blank. -->
<!-- Please check if the engine is responding correctly before submitting -->
**Applicable category of this engine**
<!-- Where should this new engine fit in SearXNG? Current categories in SearXNG:
general, files, images, it, map, music, news, science, social media and videos.
You can add multiple categories at the same time. -->
### Why do you want to add this engine?
**Additional context**
<!-- Add any other context about this engine here. -->
<!-- What's special about this engine? -->
### Features of this engine
<!-- Features of this engine: Serves special content, is fast, is easy to
integrate, ... ? -->
### How can SearXNG fetch results from this engine?
<!-- List API URL, example code and more that could be useful for the developers
in order to implement this engine. If you don't know what to write, let
this part blank. -->
### Applicable category of this engine
<!-- Where should this new engine fit in SearXNG? Current categories in
SearXNG: general, files, images, it, map, music, news, science, social
media and videos. -->
### Additional context
<!-- Add any other context about the problem here. -->
### Code of Conduct
[AI Policy]: https://github.com/searxng/searxng/blob/master/AI_POLICY.rst
- [ ] I read the [AI Policy] and hereby confirm that this issue conforms with the policy.

View File

@@ -1,21 +1,32 @@
---
name: Feature request
about: Request a new feature in SearXNG
title: ''
labels: enhancement
assignees: ''
name: "Feature request"
about: "Request a new feature in SearXNG"
labels: ["new feature"]
type: "feature"
---
<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SearXNG -->
**Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
_Replace this placeholder with a concise description of the feature._
<!-- FILL IN THESE FIELDS .. and delete the comments after reading.
Use Markdown for formatting -> https://www.markdowntools.io/cheat-sheet
-->
### Is your feature request related to a problem?
<!-- A clear and concise description of what the problem is. Ex. I'm always
frustrated when [...] -->
### Describe the solution you'd like
**Describe the solution you'd like**
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered**
### Describe alternatives you've considered
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->
### Code of Conduct
[AI Policy]: https://github.com/searxng/searxng/blob/master/AI_POLICY.rst
- [ ] I read the [AI Policy] and hereby confirm that this issue conforms with the policy.

View File

@@ -10,13 +10,66 @@ updates:
target-branch: "master"
commit-message:
prefix: "[upd] pypi:"
groups:
minor:
applies-to: version-updates
update-types:
- "minor"
- "patch"
- package-ecosystem: "npm"
directory: "/searx/static/themes/simple"
directory: "/client/simple"
schedule:
interval: "weekly"
day: "friday"
open-pull-requests-limit: 5
target-branch: "master"
commit-message:
prefix: "[upd] npm:"
prefix: "[upd] web-client (simple):"
groups:
minor:
applies-to: version-updates
update-types:
- "minor"
- "patch"
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
day: "friday"
open-pull-requests-limit: 5
target-branch: "master"
commit-message:
prefix: "[upd] searxng.org/devtools (Node.js):"
groups:
minor:
applies-to: version-updates
update-types:
- "minor"
- "patch"
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "weekly"
day: "friday"
open-pull-requests-limit: 5
target-branch: "master"
commit-message:
prefix: "[upd] searxng.org/devtools (Go):"
groups:
minor:
applies-to: version-updates
update-types:
- "minor"
- "patch"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "friday"
target-branch: "master"
commit-message:
prefix: "[upd] github-actions:"

View File

@@ -1,31 +0,0 @@
name: "Checker"
on: # yamllint disable-line rule:truthy
schedule:
- cron: "0 4 * * 5"
workflow_dispatch:
jobs:
checker:
name: Checker
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Ubuntu packages
run: |
sudo ./utils/searxng.sh install packages
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
architecture: 'x64'
- name: Install Python dependencies
run: |
make V=1 install
- name: Checker
run: |
make search.checker

170
.github/workflows/container.yml vendored Normal file
View File

@@ -0,0 +1,170 @@
---
name: Container
# yamllint disable-line rule:truthy
on:
workflow_dispatch:
workflow_run:
workflows:
- Integration
types:
- completed
branches:
- master
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
permissions:
contents: read
packages: read
env:
PYTHON_VERSION: "3.14"
jobs:
build:
if: |
github.event_name == 'workflow_dispatch'
|| (github.repository_owner == 'searxng' && github.event.workflow_run.conclusion == 'success')
name: Build (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-26.04
arch: amd64
- runner: ubuntu-26.04-arm
arch: arm64
- runner: ubuntu-26.04-arm
arch: armv7
permissions:
packages: write
outputs:
docker_tag: ${{ steps.build.outputs.docker_tag }}
git_url: ${{ steps.build.outputs.git_url }}
steps:
- name: Login to GHCR
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
with:
registry: "ghcr.io"
username: "${{ github.repository_owner }}"
password: "${{ secrets.GITHUB_TOKEN }}"
- name: Setup Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Setup QEMU
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: "${{ github.event.workflow_run.head_sha || github.sha }}"
persist-credentials: "false"
fetch-depth: "0"
- name: Setup cache Python
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
restore-keys: |
python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-
path: "./local/"
- name: Setup cache container
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
key: "container-${{ matrix.arch }}-${{ hashFiles('./requirements*.txt') }}"
restore-keys: |
container-${{ matrix.arch }}-
path: "/var/tmp/buildah-cache-*/*"
- name: Build
id: build
env:
OVERRIDE_ARCH: "${{ matrix.arch }}"
run: make container.build
test:
name: Test (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
needs: build
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-26.04
arch: amd64
- runner: ubuntu-26.04-arm
arch: arm64
- runner: ubuntu-26.04-arm
arch: armv7
steps:
- name: Login to GHCR
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
with:
registry: "ghcr.io"
username: "${{ github.repository_owner }}"
password: "${{ secrets.GITHUB_TOKEN }}"
- name: Setup QEMU
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: "${{ github.event.workflow_run.head_sha || github.sha }}"
persist-credentials: "false"
- name: Test
env:
OVERRIDE_ARCH: "${{ matrix.arch }}"
GIT_URL: "${{ needs.build.outputs.git_url }}"
run: make container.test
release:
if: github.repository_owner == 'searxng' && github.ref_name == 'master'
name: Release
runs-on: ubuntu-26.04-arm
needs:
- build
- test
permissions:
packages: write
steps:
- name: Login to Docker Hub
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
with:
registry: "docker.io"
username: "${{ secrets.DOCKER_USER }}"
password: "${{ secrets.DOCKER_TOKEN }}"
- name: Login to GHCR
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
with:
registry: "ghcr.io"
username: "${{ github.repository_owner }}"
password: "${{ secrets.GITHUB_TOKEN }}"
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: "${{ github.event.workflow_run.head_sha || github.sha }}"
persist-credentials: "false"
- name: Release
env:
GIT_URL: "${{ needs.build.outputs.git_url }}"
DOCKER_TAG: "${{ needs.build.outputs.docker_tag }}"
run: make container.push

View File

@@ -1,14 +1,27 @@
name: "Update searx.data"
on: # yamllint disable-line rule:truthy
---
name: Update searx.data
# yamllint disable-line rule:truthy
on:
workflow_dispatch:
schedule:
- cron: "59 23 28 * *"
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
permissions:
contents: read
env:
PYTHON_VERSION: "3.14"
jobs:
updateData:
name: Update data - ${{ matrix.fetch }}
runs-on: ubuntu-24.04
if: ${{ github.repository_owner == 'searxng'}}
data:
if: github.repository_owner == 'searxng'
name: ${{ matrix.fetch }}
runs-on: ubuntu-26.04-arm
strategy:
fail-fast: false
matrix:
@@ -20,48 +33,48 @@ jobs:
- update_engine_traits.py
- update_wikidata_units.py
- update_engine_descriptions.py
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Ubuntu packages
run: |
sudo ./utils/searxng.sh install packages
- name: Set up Python
uses: actions/setup-python@v5
- name: Setup Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: '3.12'
architecture: 'x64'
python-version: "${{ env.PYTHON_VERSION }}"
- name: Install Python dependencies
run: |
make V=1 install
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
- name: Setup cache Python
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
restore-keys: |
python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-
path: "./local/"
- name: Setup venv
run: make V=1 install
- name: Fetch data
env:
FETCH_SCRIPT: ./searxng_extra/update/${{ matrix.fetch }}
run: |
V=1 ./manage pyenv.cmd python "$FETCH_SCRIPT"
run: V=1 ./manage pyenv.cmd python "./searxng_extra/update/${{ matrix.fetch }}"
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v6
- name: Create PR
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
commit-message: '[data] update searx.data - ${{ matrix.fetch }}'
committer: searxng-bot <noreply@github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
signoff: false
branch: update_data_${{ matrix.fetch }}
delete-branch: true
draft: false
title: '[data] update searx.data - ${{ matrix.fetch }}'
author: "searxng-bot <searxng-bot@users.noreply.github.com>"
committer: "searxng-bot <searxng-bot@users.noreply.github.com>"
title: "[mod] data: update searx.data - ${{ matrix.fetch }}"
commit-message: "[mod] data: update searx.data - ${{ matrix.fetch }}"
branch: "ci-data-${{ matrix.fetch }}"
delete-branch: "true"
draft: "false"
signoff: "false"
body: |
update searx.data - ${{ matrix.fetch }}
Update searx.data - ${{ matrix.fetch }}
labels: |
data
- name: Check outputs
run: |
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"

71
.github/workflows/documentation.yml vendored Normal file
View File

@@ -0,0 +1,71 @@
---
name: Documentation
# yamllint disable-line rule:truthy
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
branches:
- master
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
permissions:
contents: read
env:
PYTHON_VERSION: "3.14"
jobs:
release:
if: github.repository_owner == 'searxng' || github.event_name == 'workflow_dispatch'
name: Release
runs-on: ubuntu-26.04-arm
permissions:
# for JamesIves/github-pages-deploy-action to push
contents: write
steps:
- name: Setup Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: "false"
fetch-depth: "0"
- name: Setup cache Python
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
restore-keys: |
python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-
path: "./local/"
- name: Setup dependencies
run: sudo ./utils/searxng.sh install buildhost
- name: Setup venv
run: make V=1 install
- name: Build documentation
run: make V=1 docs.html
- if: github.ref_name == 'master'
name: Release
uses: JamesIves/github-pages-deploy-action@d92aa235d04922e8f08b40ce78cc5442fcfbfa2f # v4.8.0
with:
folder: "dist/docs"
branch: "gh-pages"
commit-message: "[mod] docs: build from commit ${{ github.sha }}"
# Automatically remove deleted files from the deploy branch
clean: "true"
single-commit: "true"

View File

@@ -1,205 +1,103 @@
---
name: Integration
on: # yamllint disable-line rule:truthy
# yamllint disable-line rule:truthy
on:
push:
branches: ["master"]
branches:
- master
pull_request:
branches: ["master"]
branches:
- master
concurrency:
group: ${{ github.workflow }}-${{ github.ref_name }}
cancel-in-progress: false
permissions:
contents: read
env:
PYTHON_VERSION: "3.14"
jobs:
python:
test:
name: Python ${{ matrix.python-version }}
runs-on: ubuntu-20.04
runs-on: ubuntu-26.04
strategy:
matrix:
os: [ubuntu-20.04]
python-version: ["3.9", "3.10", "3.11", "3.12"]
python-version:
- "3.11"
- "3.12"
- "3.13"
- "3.14"
steps:
- name: Setup Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: "${{ matrix.python-version }}"
- name: Checkout
uses: actions/checkout@v4
- name: Install Ubuntu packages
run: |
sudo ./utils/searxng.sh install packages
sudo apt install firefox
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
python-version: ${{ matrix.python-version }}
architecture: 'x64'
- name: Cache Python dependencies
id: cache-python
uses: actions/cache@v4
persist-credentials: "false"
- name: Setup cache Python
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: |
./local
./.nvm
./node_modules
key: python-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('requirements*.txt', 'setup.py') }}
- name: Install Python dependencies
if: steps.cache-python.outputs.cache-hit != 'true'
run: |
make V=1 install
make V=1 gecko.driver
key: "python-${{ matrix.python-version }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
restore-keys: |
python-${{ matrix.python-version }}-${{ runner.arch }}-
path: "./local/"
- name: Setup venv
run: make V=1 install
- name: Run tests
run: make V=1 ci.test
themes:
name: Themes
runs-on: ubuntu-20.04
theme:
name: Theme
runs-on: ubuntu-26.04-arm
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Ubuntu packages
run: sudo ./utils/searxng.sh install buildhost
- name: Set up Python
uses: actions/setup-python@v5
- name: Setup Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: '3.12'
architecture: 'x64'
- name: Cache Python dependencies
id: cache-python
uses: actions/cache@v4
with:
path: |
./local
./.nvm
./node_modules
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
- name: Install node dependencies
run: make V=1 node.env
- name: Build themes
run: make V=1 themes.all
python-version: "${{ env.PYTHON_VERSION }}"
documentation:
name: Documentation
runs-on: ubuntu-20.04
permissions:
contents: write # for JamesIves/github-pages-deploy-action to push changes in repo
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
fetch-depth: '0'
persist-credentials: false
- name: Install Ubuntu packages
run: sudo ./utils/searxng.sh install buildhost
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
architecture: 'x64'
- name: Cache Python dependencies
id: cache-python
uses: actions/cache@v4
with:
path: |
./local
./.nvm
./node_modules
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
- name: Build documentation
run: |
make V=1 docs.clean docs.html
- name: Deploy
if: github.ref == 'refs/heads/master'
uses: JamesIves/github-pages-deploy-action@3.7.1
with:
GITHUB_TOKEN: ${{ github.token }}
BRANCH: gh-pages
FOLDER: dist/docs
CLEAN: true # Automatically remove deleted files from the deploy branch
SINGLE_COMMIT: true
COMMIT_MESSAGE: '[doc] build from commit ${{ github.sha }}'
node-version: "26"
check-latest: "true"
babel:
name: Update translations branch
runs-on: ubuntu-20.04
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
needs:
- python
- themes
- documentation
permissions:
contents: write # for make V=1 weblate.push.translations
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
fetch-depth: '0'
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
architecture: 'x64'
- name: Cache Python dependencies
id: cache-python
uses: actions/cache@v4
with:
path: |
./local
./.nvm
./node_modules
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
- name: weblate & git setup
env:
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
run: |
mkdir -p ~/.config
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
git config --global user.email "searxng-bot@users.noreply.github.com"
git config --global user.name "searxng-bot"
- name: Update transations
id: update
run: |
make V=1 weblate.push.translations
persist-credentials: "false"
dockers:
name: Docker
if: github.ref == 'refs/heads/master'
needs:
- python
- themes
- documentation
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
runs-on: ubuntu-20.04
steps:
- name: Checkout
if: env.DOCKERHUB_USERNAME != null
uses: actions/checkout@v4
- name: Setup cache Python
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
# make sure "make docker.push" can get the git history
fetch-depth: '0'
- name: Set up Python
uses: actions/setup-python@v5
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
restore-keys: |
python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-
path: "./local/"
- name: Setup cache Node.js
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
python-version: '3.12'
architecture: 'x64'
- name: Cache Python dependencies
id: cache-python
uses: actions/cache@v4
with:
path: |
./local
./.nvm
./node_modules
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
- name: Set up QEMU
if: env.DOCKERHUB_USERNAME != null
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
if: env.DOCKERHUB_USERNAME != null
uses: docker/setup-buildx-action@v1
- name: Login to DockerHub
if: env.DOCKERHUB_USERNAME != null
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
if: env.DOCKERHUB_USERNAME != null
run: make -e GIT_URL=$(git remote get-url origin) docker.buildx
key: "nodejs-${{ runner.arch }}-${{ hashFiles('**/package-lock.json') }}"
restore-keys: |
nodejs-${{ runner.arch }}-
path: "./client/simple/node_modules/"
- name: Setup venv
run: make V=1 install
- name: Lint
run: make themes.lint
- name: Build
run: make themes.all

134
.github/workflows/l10n.yml vendored Normal file
View File

@@ -0,0 +1,134 @@
---
name: Translation
# yamllint disable-line rule:truthy
on:
workflow_dispatch:
workflow_run:
workflows:
- Integration
types:
- completed
branches:
- master
schedule:
- cron: "05 07 * * 5"
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false
permissions:
contents: read
env:
PYTHON_VERSION: "3.14"
jobs:
update:
if: github.event.workflow_run.conclusion == 'success' && github.repository_owner == 'searxng'
name: Update
runs-on: ubuntu-26.04-arm
permissions:
# For "make V=1 weblate.push.translations"
contents: write
steps:
- name: Setup Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
token: "${{ secrets.WEBLATE_GITHUB_TOKEN }}"
fetch-depth: "0"
- name: Setup cache Python
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
restore-keys: |
python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-
path: "./local/"
- name: Setup venv
run: make V=1 install
- name: Setup Weblate
run: |
mkdir -p ~/.config
echo "${{ secrets.WEBLATE_CONFIG }}" >~/.config/weblate
- name: Setup Git
run: |
git config --global user.email "searxng-bot@users.noreply.github.com"
git config --global user.name "searxng-bot"
- name: Update translations
run: make V=1 weblate.push.translations
pr:
if: |
github.repository_owner == 'searxng'
&& (github.event_name == 'workflow_dispatch' || github.event_name == 'schedule')
name: Pull Request
runs-on: ubuntu-26.04-arm
permissions:
# For "make V=1 weblate.translations.commit"
contents: write
# For action "peter-evans/create-pull-request"
pull-requests: write
steps:
- name: Setup Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
python-version: "${{ env.PYTHON_VERSION }}"
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
token: "${{ secrets.WEBLATE_GITHUB_TOKEN }}"
fetch-depth: "0"
- name: Setup cache Python
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
key: "python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-${{ hashFiles('./requirements*.txt') }}"
restore-keys: |
python-${{ env.PYTHON_VERSION }}-${{ runner.arch }}-
path: "./local/"
- name: Setup venv
run: make V=1 install
- name: Setup Weblate
run: |
mkdir -p ~/.config
echo "${{ secrets.WEBLATE_CONFIG }}" >~/.config/weblate
- name: Setup Git
run: |
git config --global user.email "searxng-bot@users.noreply.github.com"
git config --global user.name "searxng-bot"
- name: Merge and push translation updates
run: make V=1 weblate.translations.commit
- name: Create PR
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
author: "searxng-bot <searxng-bot@users.noreply.github.com>"
committer: "searxng-bot <searxng-bot@users.noreply.github.com>"
title: "[mod] i18n: update translations from Weblate"
commit-message: "[mod] i18n: update translations from Weblate"
branch: "translations_update"
delete-branch: "true"
draft: "false"
signoff: "false"
body: |
Update translations from Weblate
labels: |
area:i18n

View File

@@ -1,28 +0,0 @@
name: "Security checks"
on: # yamllint disable-line rule:truthy
schedule:
- cron: "42 05 * * *"
workflow_dispatch:
jobs:
dockers:
name: Trivy ${{ matrix.image }}
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'searxng/searxng:latest'
ignore-unfixed: false
vuln-type: 'os,library'
severity: 'UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL'
format: 'sarif'
output: 'trivy-results.sarif'
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: 'trivy-results.sarif'

View File

@@ -1,59 +0,0 @@
name: "Update translations"
on: # yamllint disable-line rule:truthy
schedule:
- cron: "05 07 * * 5"
workflow_dispatch:
jobs:
babel:
name: "create PR for additions from weblate"
runs-on: ubuntu-20.04
if: ${{ github.repository_owner == 'searxng' && github.ref == 'refs/heads/master' }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: '0'
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
architecture: 'x64'
- name: Cache Python dependencies
id: cache-python
uses: actions/cache@v4
with:
path: |
./local
./.nvm
./node_modules
key: python-ubuntu-20.04-3.12-${{ hashFiles('requirements*.txt', 'setup.py','.nvmrc', 'package.json') }}
- name: weblate & git setup
env:
WEBLATE_CONFIG: ${{ secrets.WEBLATE_CONFIG }}
run: |
mkdir -p ~/.config
echo "${WEBLATE_CONFIG}" > ~/.config/weblate
git config --global user.email "searxng-bot@users.noreply.github.com"
git config --global user.name "searxng-bot"
- name: Merge and push transation updates
run: |
make V=1 weblate.translations.commit
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v3
with:
token: ${{ secrets.WEBLATE_GITHUB_TOKEN }}
commit-message: '[l10n] update translations from Weblate'
committer: searxng-bot <searxng-bot@users.noreply.github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
signoff: false
branch: translations_update
delete-branch: true
draft: false
title: '[l10n] update translations from Weblate'
body: |
update translations from Weblate
labels: |
translation

1
.gitignore vendored
View File

@@ -9,6 +9,7 @@ geckodriver.log
.coverage
coverage/
.govm/
.nvm/
cache/
build/

11
.helix/languages.toml Normal file
View File

@@ -0,0 +1,11 @@
[[language]]
name = "python"
language-servers = ["basedpyright", "pylsp"]
auto-format = true
[language-server.pylsp.config.pylsp]
plugins.pylint.enabled = true
plugins.isort.enabled = true
plugins.black.enabled = true
plugins.black.skip_string_normalization = true
plugins.black.line_length = 120

2
.nvmrc
View File

@@ -1 +1 @@
v20.10
25

View File

@@ -162,7 +162,7 @@ no-docstring-rgx=^_
property-classes=abc.abstractproperty
# Regular expression matching correct variable names
variable-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*)|([a-z]))$
variable-rgx=([a-zA-Z0-9_]*)$
[FORMAT]
@@ -311,7 +311,7 @@ dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
ignored-argument-names=_.*|^ignored_|^unused_
# Tells whether we should check for unused import in __init__ files.
init-import=no
init-import=yes
# List of qualified module names which can have objects that can redefine
# builtins.

View File

@@ -1,2 +0,0 @@
python 3.12.0
shellcheck 0.9.0

20
AI_POLICY.rst Normal file
View File

@@ -0,0 +1,20 @@
.. SPDX-License-Identifier: AGPL-3.0-or-later
AI Policy
=========
Restrictions on Generative AI Usage
-----------------------------------
- **All AI usage in any form must be disclosed.** You must state the tool you used (e.g. Claude Code, Cursor, Amp) along with the extent that the work was AI-assisted.
- **The human-in-the-loop must fully understand all code.** If you use generative AI tools as an aid in developing code or documentation changes, ensure that you fully understand the proposed changes and can explain why they are the correct approach.
- **AI should never be the main author of the PR.** AI may be used as a tool to help with developing, but the human contribution to the code changes should always be reasonably larger than the part written by AI. For example, you should be the one that decides about the structure of the PR, not the LLM.
- **Issues and PR descriptions must be fully human-written.** Do not post output from Large Language Models or similar generative AI as comments on any of our discussion forums (e.g. GitHub Issues, Matrix, ...), as such comments tend to be formulaic and low content. If you're a not a native English speaker, using AI for translating self-written issue texts to English is okay, but please keep the wording as close as possible to the original wording.
- **Bad AI drivers will be denounced.** People who produce bad contributions that are clearly AI (slop) will be blocked for all future contributions.
There are Humans Here
---------------------
Every discussion, issue, and pull request is read and reviewed by humans. It is a boundary point at which people interact with each other and the work done. It is rude and disrespectful to approach this boundary with low-effort, unqualified work, since it puts the burden of validation on the maintainer.
It takes a lot of maintainer time and energy to review AI-generated contributions! Sending the output of an LLM to open source project maintainers extracts work from them in the form of design and code review, so we call this kind of contribution an "extractive contribution".
The *golden rule* is that a contribution should be worth more to the project than the time it takes to review it, which is usually not the case if large parts of your PR were written by LLMs.

View File

@@ -2,7 +2,7 @@ searxng is a fork from `searx <https://github.com/searx/searx>`_ and is
maintained by Markus Heiser (`@return42 <https://github.com/return42>`_)
People who have submitted patches/translations, reported bugs, consulted
features or generally made searx better:
features or generally made SearXNG better:
- Adam Tauber `@asciimoo <https://github.com/asciimoo>`_
- Matej Cotman `@matejc <https://github.com/matejc>`_
@@ -173,4 +173,9 @@ features or generally made searx better:
- Austin Olacsi `<https://github.com/Austin-Olacsi>`
- @micsthepick
- Daniel Kukula `<https://github.com/dkuku>`
- Patrick Evans `https://github.com/holysoles`
- Patrick Evans `https://github.com/holysoles`
- Daniel Mowitz `<https://daniel.mowitz.rocks>`
- `Bearz314 <https://github.com/bearz314>`_
- Tommaso Colella `<https://github.com/gioleppe>`
- @AgentScrubbles
- Filip Mikina `<https://github.com/fiffek>`

View File

@@ -1,49 +0,0 @@
# How to contribute
## Resources in the documentation
* [Development quickstart](https://docs.searxng.org/dev/quickstart.html)
* [Contribution guide](https://docs.searxng.org/dev/contribution_guide.html)
## Submitting PRs
Please follow the provided PR template when writing a description for your changes.
Do not take criticism personally. When you get feedback, it is about your work,
not your character, personality, etc. Keep in mind we all want to make the project better.
When something is not clear, please ask questions to clear things up.
If you would like to introduce a big architectural changes or do a refactoring
either in the codebase or the development tools, please open an issue with a proposal
first. This way we can think together about the problem and probably come up
with a better solution.
## Coding conventions and guidelines
### Commit messages
* Always write descriptive commit messages ("fix bug" is not acceptable).
* Use the present tense ("Add feature" not "Added feature").
* Use the imperative mood ("Move cursor to..." not "Moves cursor to...").
* Limit the first line to 72 characters or less.
* Include the number of the issue you are fixing.
### Coding guidelines
As a Python project, we must follow [PEP 8](https://www.python.org/dev/peps/pep-0008/) and [PEP 20](https://www.python.org/dev/peps/pep-0020/) guidelines.
Furthermore, follow the Clean code conventions. The most important
in this project are the following rules:
* Simpler is better. [KISS principle](https://en.wikipedia.org/wiki/KISS_principle)
* Be consistent.
* Every function must do one thing.
* Use descriptive names for functions and variables.
* Always look for the root cause.
* Keep configurable data high level.
* Avoid negative conditionals.
* Prefer fewer arguments.
* Do not add obvious comment to code.
* Do not comment out code, just delete lines.

98
CONTRIBUTING.rst Normal file
View File

@@ -0,0 +1,98 @@
.. SPDX-License-Identifier: AGPL-3.0-or-later
.. _Quickstart guide: https://docs.searxng.org/dev/quickstart.html
.. _Commits guide: https://docs.searxng.org/dev/commits.html
.. _AI Policy: https://github.com/searxng/searxng/blob/master/AI_POLICY.rst
.. _Weblate: https://translate.codeberg.org/projects/searxng/searxng/
.. _GitHub Codespaces: https://docs.github.com/en/codespaces/overview
.. _120 hours per month: https://github.com/settings/billing
.. _list of existing Codespaces: https://github.com/codespaces
Thank you for your interest in SearXNG.
Have a look at our `Quickstart guide`_, it's very easy to contribute.
Further information on *how-to* can be found
`here <https://docs.searxng.org/dev/index.html>`_.
Translations
============
Help translate SearXNG at `Weblate`_.
.. image:: https://translate.codeberg.org/widget/searxng/searxng/horizontal-auto.svg
:target: https://translate.codeberg.org/engage/searxng/
:alt: Weblate
:width: 768px
Cloud development
=================
You can contribute from your browser using `GitHub Codespaces`_:
- Fork the repository.
- Click on the ``<> Code`` green button.
- Click on the ``Codespaces`` tab instead of ``Local``.
- Click on ``Create codespace on master``.
- VSCode is going to start in the browser.
- Wait for ``git pull && make install`` to appear and then disappear.
- You have `120 hours per month`_ (see also your `list of existing Codespaces`_).
- You can start SearXNG using ``make run`` in the terminal or by pressing ``Ctrl+Shift+B``.
How-to contribute
=================
Submitting pull requests
------------------------
Please follow the provided PR template when writing a description for your
changes.
Do not take criticism personally. When you get feedback, it is about your work,
not your character or personality. Keep in mind we all want to make SearXNG
better.
When something is not clear, please ask questions to clear things up.
If you would like to introduce a big architectural change or do a refactor,
either in the codebase or the development tooling, please open an issue with a
proposal first. This way we can think together about the problem and probably
come up with a better solution.
Coding conventions and guidelines
---------------------------------
Commit messages
~~~~~~~~~~~~~~~
- Always write descriptive commit messages *("fix bug" is not acceptable)*.
- Use the present tense *("Add feature", not "Added feature")*.
- Use the imperative mood *("Move cursor to...", not "Moves cursor to...")*.
- Limit the first line (commit title) to 72 characters or less.
See `Commits guide`_ for more details.
Coding guidelines
~~~~~~~~~~~~~~~~~
As a Python project, we must follow `PEP 8 <https://www.python.org/dev/peps/pep-0008/>`_
and `PEP 20 <https://www.python.org/dev/peps/pep-0020/>`_ guidelines.
Furthermore, follow Clean Code conventions. The most important
rules in this project are:
- Simpler is better. `KISS principle <https://en.wikipedia.org/wiki/KISS_principle>`_
- Be consistent.
- Every function must do one thing.
- Use descriptive names for functions and variables.
- Always look for the root cause.
- Keep configurable data high level.
- Avoid negative conditionals.
- Prefer fewer arguments.
- Do not add obvious comments to code.
- Do not comment out code, delete lines instead.
AI Policy
~~~~~~~~~
For our policy on the use of AI tools, please read `AI Policy`_.

View File

@@ -1,89 +0,0 @@
FROM alpine:3.20
ENTRYPOINT ["/sbin/tini","--","/usr/local/searxng/dockerfiles/docker-entrypoint.sh"]
EXPOSE 8080
VOLUME /etc/searxng
ARG SEARXNG_GID=977
ARG SEARXNG_UID=977
RUN addgroup -g ${SEARXNG_GID} searxng && \
adduser -u ${SEARXNG_UID} -D -h /usr/local/searxng -s /bin/sh -G searxng searxng
ENV INSTANCE_NAME=searxng \
AUTOCOMPLETE= \
BASE_URL= \
MORTY_KEY= \
MORTY_URL= \
SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml \
UWSGI_SETTINGS_PATH=/etc/searxng/uwsgi.ini \
UWSGI_WORKERS=%k \
UWSGI_THREADS=4
WORKDIR /usr/local/searxng
COPY requirements.txt ./requirements.txt
RUN apk add --no-cache -t build-dependencies \
build-base \
py3-setuptools \
python3-dev \
libffi-dev \
libxslt-dev \
libxml2-dev \
openssl-dev \
tar \
git \
&& apk add --no-cache \
ca-certificates \
python3 \
py3-pip \
libxml2 \
libxslt \
openssl \
tini \
uwsgi \
uwsgi-python3 \
brotli \
&& pip3 install --break-system-packages --no-cache -r requirements.txt \
&& apk del build-dependencies \
&& rm -rf /root/.cache
COPY --chown=searxng:searxng dockerfiles ./dockerfiles
COPY --chown=searxng:searxng searx ./searx
ARG TIMESTAMP_SETTINGS=0
ARG TIMESTAMP_UWSGI=0
ARG VERSION_GITCOMMIT=unknown
RUN su searxng -c "/usr/bin/python3 -m compileall -q searx" \
&& touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml \
&& touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini \
&& find /usr/local/searxng/searx/static -a \( -name '*.html' -o -name '*.css' -o -name '*.js' \
-o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
-type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
# Keep these arguments at the end to prevent redundant layer rebuilds
ARG LABEL_DATE=
ARG GIT_URL=unknown
ARG SEARXNG_GIT_VERSION=unknown
ARG SEARXNG_DOCKER_TAG=unknown
ARG LABEL_VCS_REF=
ARG LABEL_VCS_URL=
LABEL maintainer="searxng <${GIT_URL}>" \
description="A privacy-respecting, hackable metasearch engine." \
version="${SEARXNG_GIT_VERSION}" \
org.label-schema.schema-version="1.0" \
org.label-schema.name="searxng" \
org.label-schema.version="${SEARXNG_GIT_VERSION}" \
org.label-schema.url="${LABEL_VCS_URL}" \
org.label-schema.vcs-ref=${LABEL_VCS_REF} \
org.label-schema.vcs-url=${LABEL_VCS_URL} \
org.label-schema.build-date="${LABEL_DATE}" \
org.label-schema.usage="https://github.com/searxng/searxng-docker" \
org.opencontainers.image.title="searxng" \
org.opencontainers.image.version="${SEARXNG_DOCKER_TAG}" \
org.opencontainers.image.url="${LABEL_VCS_URL}" \
org.opencontainers.image.revision=${LABEL_VCS_REF} \
org.opencontainers.image.source=${LABEL_VCS_URL} \
org.opencontainers.image.created="${LABEL_DATE}" \
org.opencontainers.image.documentation="https://github.com/searxng/searxng-docker"

View File

@@ -17,7 +17,6 @@ help:
@echo 'install - developer install of SearxNG into virtualenv'
@echo 'uninstall - uninstall developer installation'
@echo 'clean - clean up working tree'
@echo 'search.checker - check search engines'
@echo 'test - run shell & CI tests'
@echo 'test.shell - test shell scripts'
@echo 'ci.test - run CI tests'
@@ -32,61 +31,53 @@ install uninstall:
$(Q)./manage pyenv.$@
PHONY += clean
clean: py.clean docs.clean node.clean nvm.clean test.clean
clean: py.clean docs.clean node.clean nvm.clean go.clean test.clean
$(Q)./manage build_msg CLEAN "common files"
$(Q)find . -name '*.orig' -exec rm -f {} +
$(Q)find . -name '*.rej' -exec rm -f {} +
$(Q)find . -name '*~' -exec rm -f {} +
$(Q)find . -name '*.bak' -exec rm -f {} +
lxc.clean:
$(Q)rm -rf lxc-env
PHONY += search.checker search.checker.%
search.checker: install
$(Q)./manage pyenv.cmd searxng-checker -v
search.checker.%: install
$(Q)./manage pyenv.cmd searxng-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
PHONY += test ci.test test.shell
ci.test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst test.pybabel
test: test.yamllint test.black test.pyright test.pylint test.unit test.robot test.rst test.shell
test: test.yamllint test.black test.pyright_modified test.pylint test.unit test.robot test.rst test.shell test.shfmt
ci.test: test test.pybabel
test.shell:
$(Q)shellcheck -x -s dash \
dockerfiles/docker-entrypoint.sh
container/entrypoint.sh
$(Q)shellcheck -x -s bash \
utils/brand.sh \
$(MTOOLS) \
utils/lib.sh \
utils/lib_sxng*.sh \
utils/lib_go.sh \
utils/lib_govm.sh \
utils/lib_nvm.sh \
utils/lib_redis.sh \
utils/searxng.sh \
utils/lxc.sh \
utils/lxc-searxng.env \
utils/searx.sh \
utils/filtron.sh \
utils/morty.sh
utils/lib_valkey.sh \
utils/searxng.sh
$(Q)$(MTOOLS) build_msg TEST "$@ OK"
PHONY += format
format: format.python format.shell
# wrap ./manage script
MANAGE += weblate.translations.commit weblate.push.translations
MANAGE += data.all data.traits data.useragents data.locales
MANAGE += data.all data.traits data.useragents data.locales data.currencies
MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean
MANAGE += docker.build docker.push docker.buildx
MANAGE += podman.build
MANAGE += docker.build docker.buildx
MANAGE += container.build container.test container.push
MANAGE += gecko.driver
MANAGE += node.env node.env.dev node.clean
MANAGE += py.build py.clean
MANAGE += pyenv pyenv.install pyenv.uninstall
MANAGE += format.python
MANAGE += test.yamllint test.pylint test.pyright test.black test.pybabel test.unit test.coverage test.robot test.rst test.clean
MANAGE += themes.all themes.simple themes.simple.test pygments.less
MANAGE += format.python format.shell
MANAGE += test.yamllint test.pylint test.black test.pybabel test.unit test.coverage test.robot test.rst test.clean test.themes test.pyright test.pyright_modified test.shfmt
MANAGE += themes.all themes.simple themes.simple.analyze themes.fix themes.lint themes.test
MANAGE += static.build.commit static.build.drop static.build.restore
MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs
MANAGE += go.env.dev go.clean
PHONY += $(MANAGE)
@@ -95,8 +86,8 @@ $(MANAGE):
# short hands of selected targets
PHONY += docs docker themes
PHONY += docs container themes
docs: docs.html
docker: docker.build
container: container.build
themes: themes.all

View File

@@ -1,25 +1,34 @@
## What does this PR do?
<!-- FILL IN THESE FIELDS .. and delete the comments after reading.
<!-- MANDATORY -->
Use Markdown for formatting -> https://www.markdowntools.io/cheat-sheet
-->
<!-- explain the changes in your PR, algorithms, design, architecture -->
### What does this PR do?
## Why is this change important?
<!-- Explain the motivation and changes in your pull request. -->
<!-- MANDATORY -->
### How to test this PR locally?
<!-- explain the motivation behind your PR -->
<!-- Commands to run the tests or instructions to test the changes. Are there
any edge cases (environment, language, or other contexts) to take into
account? -->
## How to test this PR locally?
<!-- commands to run the tests or instructions to test the changes -->
## Author's checklist
<!-- additional notes for reviewers -->
## Related issues
### Related issues
<!--
Closes #234
Closes: #234
-->
### Code of Conduct
<!-- ⚠️ Bad AI drivers will be denounced: People who produce bad contributions
that are clearly AI (slop) will be blocked for all future contributions.
-->
[AI Policy]: https://github.com/searxng/searxng/blob/master/AI_POLICY.rst
- [ ] **I hereby confirm that this PR conforms with the [AI Policy].**
If I have used AI tools for working on the changes in this PR, I will
attach a list of all AI tools I used and how I used them. I hereby confirm
that I haven't used any other tools than the ones I mention below.

View File

@@ -1,130 +1,62 @@
.. SPDX-License-Identifier: AGPL-3.0-or-later
----
.. figure:: https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng.svg
:target: https://docs.searxng.org/
:alt: SearXNG
:width: 100%
:align: center
----
Privacy-respecting, hackable `metasearch engine`_
Searx.space_ lists ready-to-use running instances.
A user_, admin_ and developer_ handbook is available on the homepage_.
|SearXNG install|
|SearXNG homepage|
|SearXNG wiki|
|AGPL License|
|Issues|
|commits|
|weblate|
|SearXNG logo|
----
.. _searx.space: https://searx.space
.. _user: https://docs.searxng.org/user
.. _admin: https://docs.searxng.org/admin
.. _developer: https://docs.searxng.org/dev
.. _homepage: https://docs.searxng.org/
.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
.. _Installation guide: https://docs.searxng.org/admin/installation.html
.. _Configuration guide: https://docs.searxng.org/admin/settings/index.html
.. _CONTRIBUTING: https://github.com/searxng/searxng/blob/master/CONTRIBUTING.rst
.. _LICENSE: https://github.com/searxng/searxng/blob/master/LICENSE
.. |SearXNG logo| image:: https://raw.githubusercontent.com/searxng/searxng/master/src/brand/searxng-wordmark.svg
:target: https://docs.searxng.org/
:width: 5%
.. figure:: https://raw.githubusercontent.com/searxng/searxng/master/client/simple/src/brand/searxng.svg
:target: https://searxng.org
:alt: SearXNG
:width: 512px
.. |SearXNG install| image:: https://img.shields.io/badge/-install-blue
:target: https://docs.searxng.org/admin/installation.html
.. |SearXNG homepage| image:: https://img.shields.io/badge/-homepage-blue
:target: https://docs.searxng.org/
SearXNG is a `metasearch engine`_. Users are neither tracked nor profiled.
.. |SearXNG wiki| image:: https://img.shields.io/badge/-wiki-blue
:target: https://github.com/searxng/searxng/wiki
.. image:: https://img.shields.io/badge/organization-3050ff?style=flat-square&logo=searxng&logoColor=fff&cacheSeconds=86400
:target: https://github.com/searxng
:alt: Organization
.. |AGPL License| image:: https://img.shields.io/badge/license-AGPL-blue.svg
.. image:: https://img.shields.io/badge/documentation-3050ff?style=flat-square&logo=readthedocs&logoColor=fff&cacheSeconds=86400
:target: https://docs.searxng.org
:alt: Documentation
.. image:: https://img.shields.io/github/license/searxng/searxng?style=flat-square&label=license&color=3050ff&cacheSeconds=86400
:target: https://github.com/searxng/searxng/blob/master/LICENSE
:alt: License
.. |Issues| image:: https://img.shields.io/github/issues/searxng/searxng?color=yellow&label=issues
:target: https://github.com/searxng/searxng/issues
.. image:: https://img.shields.io/github/commit-activity/y/searxng/searxng/master?style=flat-square&label=commits&color=3050ff&cacheSeconds=3600
:target: https://github.com/searxng/searxng/commits/master/
:alt: Commits
.. |PR| image:: https://img.shields.io/github/issues-pr-raw/searxng/searxng?color=yellow&label=PR
:target: https://github.com/searxng/searxng/pulls
.. |commits| image:: https://img.shields.io/github/commit-activity/y/searxng/searxng?color=yellow&label=commits
:target: https://github.com/searxng/searxng/commits/master
.. |weblate| image:: https://translate.codeberg.org/widgets/searxng/-/searxng/svg-badge.svg
.. image:: https://img.shields.io/weblate/progress/searxng?server=https%3A%2F%2Ftranslate.codeberg.org&style=flat-square&label=translated&color=3050ff&cacheSeconds=86400
:target: https://translate.codeberg.org/projects/searxng/
Contact
=======
Ask questions or chat with the SearXNG community (this not a chatbot) on
IRC
`#searxng on libera.chat <https://web.libera.chat/?channel=#searxng>`_
which is bridged to Matrix.
Matrix
`#searxng:matrix.org <https://matrix.to/#/#searxng:matrix.org>`_
:alt: Translated
Setup
=====
- A well maintained `Docker image`_, also built for ARM64 and ARM/v7
architectures.
- Alternatively there are *up to date* `installation scripts`_.
- For individual setup consult our detailed `Step by step`_ instructions.
- To fine-tune your instance, take a look at the `Administrator documentation`_.
To install SearXNG, see `Installation guide`_.
.. _Administrator documentation: https://docs.searxng.org/admin/index.html
.. _Step by step: https://docs.searxng.org/admin/installation-searxng.html
.. _installation scripts: https://docs.searxng.org/admin/installation-scripts.html
.. _Docker image: https://github.com/searxng/searxng-docker
To fine-tune SearXNG, see `Configuration guide`_.
Translations
============
Further information on *how-to* can be found `here <https://docs.searxng.org/admin/index.html>`_.
.. _Weblate: https://translate.codeberg.org/projects/searxng/searxng/
Connect
=======
Help translate SearXNG at `Weblate`_
.. figure:: https://translate.codeberg.org/widgets/searxng/-/multi-auto.svg
:target: https://translate.codeberg.org/projects/searxng/
If you have questions or want to connect with others in the community:
- `#searxng:matrix.org <https://matrix.to/#/#searxng:matrix.org>`_
Contributing
============
.. _development quickstart: https://docs.searxng.org/dev/quickstart.html
.. _developer documentation: https://docs.searxng.org/dev/index.html
See CONTRIBUTING_ for more details.
Are you a developer? Have a look at our `development quickstart`_ guide, it's
very easy to contribute. Additionally we have a `developer documentation`_.
License
=======
Codespaces
==========
You can contribute from your browser using `GitHub Codespaces`_:
- Fork the repository
- Click on the ``<> Code`` green button
- Click on the ``Codespaces`` tab instead of ``Local``
- Click on ``Create codespace on master``
- VSCode is going to start in the browser
- Wait for ``git pull && make install`` to appear and then disappear
- You have `120 hours per month`_ (see also your `list of existing Codespaces`_)
- You can start SearXNG using ``make run`` in the terminal or by pressing ``Ctrl+Shift+B``
.. _GitHub Codespaces: https://docs.github.com/en/codespaces/overview
.. _120 hours per month: https://github.com/settings/billing
.. _list of existing Codespaces: https://github.com/codespaces
This project is licensed under the GNU Affero General Public License (AGPL-3.0).
See LICENSE_ for more details.

2
client/simple/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
dist
node_modules

View File

@@ -0,0 +1,19 @@
{
"$schema": "https://json.schemastore.org/stylelintrc.json",
"plugins": ["stylelint-prettier"],
"extends": ["stylelint-config-standard-less"],
"rules": {
"at-rule-no-vendor-prefix": null,
"at-rule-prelude-no-invalid": null,
"declaration-empty-line-before": null,
"declaration-property-value-no-unknown": null,
"no-invalid-position-at-import-rule": null,
"prettier/prettier": true,
"property-no-vendor-prefix": null,
"selector-attribute-quotes": null,
"selector-class-pattern": null,
"selector-id-pattern": null,
"selector-no-vendor-prefix": null,
"shorthand-property-no-redundant-values": null
}
}

24
client/simple/README.rst Normal file
View File

@@ -0,0 +1,24 @@
=====================
MEMO vite development
=====================
Local install::
# in folder ./client/simple/
$ npm install
Start development server::
$ ./manage vite.simple.dev
# in folder ./client/simple/
$ npm exec -- vite
Fix source code::
# in folder ./client/simple/
$ npm run fix
Fix & Build::
$ ./manage vite.simple.build

155
client/simple/biome.json Normal file
View File

@@ -0,0 +1,155 @@
{
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
"files": {
"ignoreUnknown": true,
"includes": ["**", "!node_modules", "!src/brand", "!src/svg"]
},
"assist": {
"enabled": true,
"actions": {
"preset": "recommended",
"source": {
"useSortedAttributes": "on",
"useSortedProperties": "on"
}
}
},
"formatter": {
"enabled": true,
"bracketSameLine": false,
"bracketSpacing": true,
"formatWithErrors": false,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 120
},
"linter": {
"enabled": true,
"rules": {
"preset": "recommended",
"complexity": {
"noForEach": "error",
"noImplicitCoercions": "error",
"noRedundantDefaultExport": "error",
"noUselessCatchBinding": "error",
"noUselessUndefined": "error",
"useArrayFind": "error",
"useSimplifiedLogicExpression": "error"
},
"correctness": {
"noGlobalDirnameFilename": "error",
"useImportExtensions": "error",
"useJsonImportAttributes": "error",
"useSingleJsDocAsterisk": "error"
},
"nursery": {
"noFloatingPromises": "warn",
"noMisusedPromises": "warn",
"useAwaitThenable": "off",
"useExhaustiveSwitchCases": "warn",
"useExplicitType": "off",
"useRegexpExec": "warn"
},
"performance": {
"noAwaitInLoops": "error",
"noBarrelFile": "error",
"noDelete": "error",
"noNamespaceImport": "error",
"noReExportAll": "error",
"useTopLevelRegex": "error"
},
"style": {
"noCommonJs": "error",
"noEnum": "error",
"noImplicitBoolean": "error",
"noIncrementDecrement": "error",
"noInferrableTypes": "error",
"noMultiAssign": "error",
"noMultilineString": "error",
"noNamespace": "error",
"noNegationElse": "error",
"noNestedTernary": "error",
"noParameterAssign": "error",
"noParameterProperties": "error",
"noSubstr": "error",
"noUnusedTemplateLiteral": "error",
"noUselessElse": "error",
"noYodaExpression": "error",
"useAsConstAssertion": "error",
"useAtIndex": "error",
"useCollapsedElseIf": "error",
"useCollapsedIf": "error",
"useConsistentArrayType": {
"level": "error",
"options": {
"syntax": "shorthand"
}
},
"useConsistentBuiltinInstantiation": "error",
"useConsistentEnumValueType": "error",
"useConsistentMemberAccessibility": {
"level": "error",
"options": {
"accessibility": "explicit"
}
},
"useConsistentObjectDefinitions": {
"level": "error",
"options": {
"syntax": "explicit"
}
},
"useConsistentTypeDefinitions": {
"level": "error",
"options": {
"style": "type"
}
},
"useDefaultSwitchClause": "error",
"useDestructuring": "error",
"useExplicitLengthCheck": "error",
"useForOf": "error",
"useGroupedAccessorPairs": "error",
"useNumberNamespace": "error",
"useNumericSeparators": "error",
"useObjectSpread": "error",
"useReadonlyClassProperties": "error",
"useSelfClosingElements": "error",
"useShorthandAssign": "error",
"useSingleVarDeclarator": "error",
"useThrowNewError": "error",
"useThrowOnlyError": "error",
"useTrimStartEnd": "error",
"useUnifiedTypeSignatures": "error"
},
"suspicious": {
"noBitwiseOperators": "error",
"noConstantBinaryExpressions": "error",
"noDeprecatedImports": "error",
"noEmptyBlockStatements": "error",
"noEqualsToNull": "error",
"noEvolvingTypes": "error",
"noForIn": "error",
"noImportCycles": "error",
"noNestedPromises": "error",
"noParametersOnlyUsedInRecursion": "error",
"noReturnAssign": "error",
"noUnassignedVariables": "error",
"noVar": "error",
"useNumberToFixedDigitsArgument": "error",
"useStaticResponseMethods": "error"
}
}
},
"javascript": {
"formatter": {
"arrowParentheses": "always",
"jsxQuoteStyle": "double",
"quoteProperties": "asNeeded",
"quoteStyle": "double",
"semicolons": "always",
"trailingCommas": "none"
}
}
}

View File

@@ -0,0 +1,177 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/*
this file is generated automatically by searxng_extra/update/update_pygments.py
using pygments version 2.20.0:
./manage templates.simple.pygments
*/
.code-highlight {
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.hll { background-color: #ffffcc }
.c { color: #3D7B7B; font-style: italic } /* Comment */
.err { border: 1px solid #F00 } /* Error */
.k { color: #008000; font-weight: bold } /* Keyword */
.o { color: #666 } /* Operator */
.ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.cp { color: #9C6500 } /* Comment.Preproc */
.cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.gd { color: #A00000 } /* Generic.Deleted */
.ge { font-style: italic } /* Generic.Emph */
.ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.gr { color: #E40000 } /* Generic.Error */
.gh { color: #000080; font-weight: bold } /* Generic.Heading */
.gi { color: #008400 } /* Generic.Inserted */
.go { color: #717171 } /* Generic.Output */
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.gs { font-weight: bold } /* Generic.Strong */
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.gt { color: #04D } /* Generic.Traceback */
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.kp { color: #008000 } /* Keyword.Pseudo */
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.kt { color: #B00040 } /* Keyword.Type */
.m { color: #666 } /* Literal.Number */
.s { color: #BA2121 } /* Literal.String */
.na { color: #687822 } /* Name.Attribute */
.nb { color: #008000 } /* Name.Builtin */
.nc { color: #00F; font-weight: bold } /* Name.Class */
.no { color: #800 } /* Name.Constant */
.nd { color: #A2F } /* Name.Decorator */
.ni { color: #717171; font-weight: bold } /* Name.Entity */
.ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.nf { color: #00F } /* Name.Function */
.nl { color: #767600 } /* Name.Label */
.nn { color: #00F; font-weight: bold } /* Name.Namespace */
.nt { color: #008000; font-weight: bold } /* Name.Tag */
.nv { color: #19177C } /* Name.Variable */
.ow { color: #A2F; font-weight: bold } /* Operator.Word */
.w { color: #BBB } /* Text.Whitespace */
.mb { color: #666 } /* Literal.Number.Bin */
.mf { color: #666 } /* Literal.Number.Float */
.mh { color: #666 } /* Literal.Number.Hex */
.mi { color: #666 } /* Literal.Number.Integer */
.mo { color: #666 } /* Literal.Number.Oct */
.sa { color: #BA2121 } /* Literal.String.Affix */
.sb { color: #BA2121 } /* Literal.String.Backtick */
.sc { color: #BA2121 } /* Literal.String.Char */
.dl { color: #BA2121 } /* Literal.String.Delimiter */
.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.s2 { color: #BA2121 } /* Literal.String.Double */
.se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.sh { color: #BA2121 } /* Literal.String.Heredoc */
.si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.sx { color: #008000 } /* Literal.String.Other */
.sr { color: #A45A77 } /* Literal.String.Regex */
.s1 { color: #BA2121 } /* Literal.String.Single */
.ss { color: #19177C } /* Literal.String.Symbol */
.bp { color: #008000 } /* Name.Builtin.Pseudo */
.fm { color: #00F } /* Name.Function.Magic */
.vc { color: #19177C } /* Name.Variable.Class */
.vg { color: #19177C } /* Name.Variable.Global */
.vi { color: #19177C } /* Name.Variable.Instance */
.vm { color: #19177C } /* Name.Variable.Magic */
.il { color: #666 } /* Literal.Number.Integer.Long */
}
.code-highlight-dark(){
.code-highlight {
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.hll { background-color: #49483e }
.c { color: #959077 } /* Comment */
.err { color: #ED007E; background-color: #1E0010 } /* Error */
.esc { color: #F8F8F2 } /* Escape */
.g { color: #F8F8F2 } /* Generic */
.k { color: #66D9EF } /* Keyword */
.l { color: #AE81FF } /* Literal */
.n { color: #F8F8F2 } /* Name */
.o { color: #FF4689 } /* Operator */
.x { color: #F8F8F2 } /* Other */
.p { color: #F8F8F2 } /* Punctuation */
.ch { color: #959077 } /* Comment.Hashbang */
.cm { color: #959077 } /* Comment.Multiline */
.cp { color: #959077 } /* Comment.Preproc */
.cpf { color: #959077 } /* Comment.PreprocFile */
.c1 { color: #959077 } /* Comment.Single */
.cs { color: #959077 } /* Comment.Special */
.gd { color: #FF4689 } /* Generic.Deleted */
.ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */
.ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.gr { color: #F8F8F2 } /* Generic.Error */
.gh { color: #F8F8F2 } /* Generic.Heading */
.gi { color: #A6E22E } /* Generic.Inserted */
.go { color: #66D9EF } /* Generic.Output */
.gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */
.gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */
.gu { color: #959077 } /* Generic.Subheading */
.gt { color: #F8F8F2 } /* Generic.Traceback */
.kc { color: #66D9EF } /* Keyword.Constant */
.kd { color: #66D9EF } /* Keyword.Declaration */
.kn { color: #FF4689 } /* Keyword.Namespace */
.kp { color: #66D9EF } /* Keyword.Pseudo */
.kr { color: #66D9EF } /* Keyword.Reserved */
.kt { color: #66D9EF } /* Keyword.Type */
.ld { color: #E6DB74 } /* Literal.Date */
.m { color: #AE81FF } /* Literal.Number */
.s { color: #E6DB74 } /* Literal.String */
.na { color: #A6E22E } /* Name.Attribute */
.nb { color: #F8F8F2 } /* Name.Builtin */
.nc { color: #A6E22E } /* Name.Class */
.no { color: #66D9EF } /* Name.Constant */
.nd { color: #A6E22E } /* Name.Decorator */
.ni { color: #F8F8F2 } /* Name.Entity */
.ne { color: #A6E22E } /* Name.Exception */
.nf { color: #A6E22E } /* Name.Function */
.nl { color: #F8F8F2 } /* Name.Label */
.nn { color: #F8F8F2 } /* Name.Namespace */
.nx { color: #A6E22E } /* Name.Other */
.py { color: #F8F8F2 } /* Name.Property */
.nt { color: #FF4689 } /* Name.Tag */
.nv { color: #F8F8F2 } /* Name.Variable */
.ow { color: #FF4689 } /* Operator.Word */
.pm { color: #F8F8F2 } /* Punctuation.Marker */
.w { color: #F8F8F2 } /* Text.Whitespace */
.mb { color: #AE81FF } /* Literal.Number.Bin */
.mf { color: #AE81FF } /* Literal.Number.Float */
.mh { color: #AE81FF } /* Literal.Number.Hex */
.mi { color: #AE81FF } /* Literal.Number.Integer */
.mo { color: #AE81FF } /* Literal.Number.Oct */
.sa { color: #E6DB74 } /* Literal.String.Affix */
.sb { color: #E6DB74 } /* Literal.String.Backtick */
.sc { color: #E6DB74 } /* Literal.String.Char */
.dl { color: #E6DB74 } /* Literal.String.Delimiter */
.sd { color: #E6DB74 } /* Literal.String.Doc */
.s2 { color: #E6DB74 } /* Literal.String.Double */
.se { color: #AE81FF } /* Literal.String.Escape */
.sh { color: #E6DB74 } /* Literal.String.Heredoc */
.si { color: #E6DB74 } /* Literal.String.Interpol */
.sx { color: #E6DB74 } /* Literal.String.Other */
.sr { color: #E6DB74 } /* Literal.String.Regex */
.s1 { color: #E6DB74 } /* Literal.String.Single */
.ss { color: #E6DB74 } /* Literal.String.Symbol */
.bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */
.fm { color: #A6E22E } /* Name.Function.Magic */
.vc { color: #F8F8F2 } /* Name.Variable.Class */
.vg { color: #F8F8F2 } /* Name.Variable.Global */
.vi { color: #F8F8F2 } /* Name.Variable.Instance */
.vm { color: #F8F8F2 } /* Name.Variable.Magic */
.il { color: #AE81FF } /* Literal.Number.Integer.Long */
}
}

5161
client/simple/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,49 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@searxng/theme-simple",
"version": "0.0.0",
"private": true,
"license": "AGPL-3.0",
"type": "module",
"scripts": {
"build": "npm run build:icons && npm run build:vite",
"build:icons": "node theme_icons.ts",
"build:vite": "vite build",
"clean": "rm -Rf node_modules",
"fix": "npm run fix:stylelint && npm run fix:biome && npm run fix:package",
"fix:biome": "biome check --write",
"fix:package": "sort-package-json --quiet",
"fix:stylelint": "stylelint --fix strict 'src/**/*.{scss,sass,less,styl}'",
"lint": "npm run lint:biome && npm run lint:tsc",
"lint:biome": "biome lint",
"lint:tsc": "tsc --noEmit"
},
"browserslist": [
"baseline 2022",
"not dead"
],
"dependencies": {
"ionicons": "^8.0.13",
"normalize.css": "8.0.1",
"ol": "^10.9.0",
"swiped-events": "1.2.0"
},
"devDependencies": {
"@biomejs/biome": "2.5.3",
"@types/node": "^26.1.1",
"browserslist": "^4.28.6",
"browserslist-to-esbuild": "^2.1.1",
"edge.js": "^6.5.1",
"less": "^4.6.7",
"mathjs": "^15.2.0",
"sharp": "~0.35.3",
"sort-package-json": "^4.0.0",
"stylelint": "^17.14.0",
"stylelint-config-standard-less": "^4.1.0",
"stylelint-prettier": "^5.0.3",
"svgo": "^4.0.2",
"typescript": "~7.0.2",
"vite": "^8.1.4",
"vite-bundle-analyzer": "^1.3.8"
}
}

View File

@@ -50,17 +50,17 @@
</metadata>
<path
d="M 39.581382,41.421315 H 30.62689 v -1.21543 q 0,-2.033984 0.818554,-3.59668 0.818555,-1.5875 3.447852,-4.018359 l 1.5875,-1.438672 q 1.413867,-1.289844 2.058789,-2.43086 0.669727,-1.141015 0.669727,-2.282031 0,-1.736328 -1.190625,-2.703711 -1.190625,-0.992188 -3.323828,-0.992188 -2.00918,0 -4.340821,0.84336 -2.331641,0.818554 -4.861719,2.455664 v -7.788673 q 3.001367,-1.041796 5.481836,-1.53789 2.480469,-0.496094 4.787305,-0.496094 6.052344,0 9.227344,2.480469 3.175001,2.455664 3.175001,7.19336 0,2.430859 -0.967383,4.365625 -0.967383,1.909961 -3.299024,4.117578 l -1.5875,1.413868 q -1.686719,1.53789 -2.207617,2.480469 -0.520899,0.917773 -0.520899,2.033984 z m -8.954492,3.671094 h 8.954492 v 8.830469 H 30.62689 Z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.80000305px;line-height:1;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold';display:inline;fill:#db3434;fill-opacity:1;stroke-width:0.26458335"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50.80000305px;line-height:1;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold';display:inline;fill:#808080;fill-opacity:1;stroke-width:0.26458335"
id="path827"
inkscape:connector-curvature="0" />
<circle
style="fill:none;fill-opacity:1;stroke:#db3434;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path834"
cx="35"
cy="36.486031"
r="30" />
<rect
style="opacity:1;fill:#db3434;fill-opacity:1;stroke:none;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
style="opacity:1;fill:#808080;fill-opacity:1;stroke:none;stroke-width:8;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect912"
width="18.846331"
height="39.963303"

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,66 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/**
* Base class for client-side plugins.
*
* @remarks
* Handle conditional loading of the plugin in:
*
* - client/simple/src/js/router.ts
*
* @abstract
*/
export abstract class Plugin {
/**
* Plugin name.
*/
protected readonly id: string;
/**
* @remarks
* Don't hold references of this instance outside the class.
*/
protected constructor(id: string) {
this.id = id;
queueMicrotask(() => this.invoke());
}
private async invoke(): Promise<void> {
try {
console.debug(`[PLUGIN] ${this.id}: Running...`);
const result = await this.run();
if (!result) return;
console.debug(`[PLUGIN] ${this.id}: Running post-exec...`);
// @ts-expect-error
void (await this.post(result as NonNullable<Awaited<ReturnType<this["run"]>>>));
} catch (error) {
console.error(`[PLUGIN] ${this.id}:`, error);
} finally {
console.debug(`[PLUGIN] ${this.id}: Done.`);
}
}
/**
* Plugin goes here.
*
* @remarks
* The plugin is already loaded at this point. If you wish to execute
* conditions to exit early, consider moving the logic to:
*
* - client/simple/src/js/router.ts
*
* ...to avoid unnecessarily loading this plugin on the client.
*/
protected abstract run(): Promise<unknown>;
/**
* Post-execution hook.
*
* @remarks
* The hook is only executed if `#run()` returns a truthy value.
*/
// @ts-expect-error
protected abstract post(result: NonNullable<Awaited<ReturnType<this["run"]>>>): Promise<void>;
}

View File

@@ -0,0 +1,4 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
// core
void import.meta.glob(["./*.ts", "./util/**/.ts"], { eager: true });

View File

@@ -0,0 +1,36 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type { Plugin } from "./Plugin.ts";
import { type EndpointsKeys, endpoint } from "./toolkit.ts";
type Options =
| {
on: "global";
}
| {
on: "endpoint";
where: EndpointsKeys[];
};
export const load = <T extends Plugin>(instance: () => Promise<T>, options: Options): void => {
if (!check(options)) return;
void instance();
};
const check = (options: Options): boolean => {
// biome-ignore lint/style/useDefaultSwitchClause: options is typed
switch (options.on) {
case "global": {
return true;
}
case "endpoint": {
if (!options.where.includes(endpoint)) {
// not on the expected endpoint
return false;
}
return true;
}
}
};

View File

@@ -0,0 +1,142 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import { http, listen, settings } from "../toolkit.ts";
import { assertElement } from "../util/assertElement.ts";
const fetchResults = async (qInput: HTMLInputElement, query: string): Promise<void> => {
try {
let res: Response;
if (settings.method === "GET") {
res = await http("GET", `./autocompleter?q=${query}`);
} else {
res = await http("POST", "./autocompleter", { body: new URLSearchParams({ q: query }) });
}
const results = await res.json();
const autocomplete = document.querySelector<HTMLElement>(".autocomplete");
assertElement(autocomplete);
const autocompleteList = document.querySelector<HTMLUListElement>(".autocomplete ul");
assertElement(autocompleteList);
autocomplete.classList.add("open");
autocompleteList.replaceChildren();
// show an error message that no result was found
if (results?.[1]?.length === 0) {
const noItemFoundMessage = Object.assign(document.createElement("li"), {
className: "no-item-found",
textContent: settings.translations?.no_item_found ?? "No results found"
});
autocompleteList.append(noItemFoundMessage);
return;
}
const fragment = new DocumentFragment();
for (const result of results[1]) {
const li = Object.assign(document.createElement("li"), { textContent: result });
listen("mousedown", li, () => {
qInput.value = result;
const form = document.querySelector<HTMLFormElement>("#search");
form?.submit();
});
fragment.append(li);
}
autocompleteList.append(fragment);
} catch (error) {
console.error("Error fetching autocomplete results:", error);
}
};
const qInput = document.getElementById("q") as HTMLInputElement | null;
assertElement(qInput);
let timeoutId: number;
listen("input", qInput, () => {
clearTimeout(timeoutId);
const query = qInput.value;
const minLength = settings.autocomplete_min ?? 2;
if (query.length < minLength) return;
timeoutId = window.setTimeout(async () => {
if (query === qInput.value) {
await fetchResults(qInput, query);
}
}, 300);
});
const autocomplete: HTMLElement | null = document.querySelector<HTMLElement>(".autocomplete");
const autocompleteList: HTMLUListElement | null = document.querySelector<HTMLUListElement>(".autocomplete ul");
if (autocompleteList) {
listen("keydown", qInput, (event: KeyboardEvent) => {
if (event.key === "Escape") {
autocomplete?.classList.remove("open");
}
});
listen("keyup", qInput, (event: KeyboardEvent) => {
const listItems = [...autocompleteList.children] as HTMLElement[];
const currentIndex = listItems.findIndex((item) => item.classList.contains("active"));
let newCurrentIndex = -1;
switch (event.key) {
case "ArrowUp": {
const currentItem = listItems[currentIndex];
if (currentItem && currentIndex >= 0) {
currentItem.classList.remove("active");
}
// we need to add listItems.length to the index calculation here because the JavaScript modulos
// operator doesn't work with negative numbers
newCurrentIndex = (currentIndex - 1 + listItems.length) % listItems.length;
break;
}
case "ArrowDown": {
const currentItem = listItems[currentIndex];
if (currentItem && currentIndex >= 0) {
currentItem.classList.remove("active");
}
newCurrentIndex = (currentIndex + 1) % listItems.length;
break;
}
case "Enter":
if (autocomplete) {
autocomplete.classList.remove("open");
}
break;
default:
break;
}
if (newCurrentIndex !== -1) {
const selectedItem = listItems[newCurrentIndex];
if (selectedItem) {
selectedItem.classList.add("active");
if (!selectedItem.classList.contains("no-item-found")) {
const qInput = document.getElementById("q") as HTMLInputElement | null;
if (qInput) {
qInput.value = selectedItem.textContent ?? "";
}
}
}
}
});
listen("blur", qInput, () => {
autocomplete?.classList.remove("open");
});
listen("focus", qInput, () => {
autocomplete?.classList.add("open");
});
}

View File

@@ -0,0 +1,488 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import { listen, mutable, settings } from "../toolkit.ts";
import { assertElement } from "../util/assertElement.ts";
export type KeyBindingLayout = "default" | "vim";
type KeyBinding = {
key: string;
fun: (event: KeyboardEvent) => void;
des: string;
cat: string;
};
type HighlightResultElement = "down" | "up" | "visible" | "bottom" | "top";
/* common base for layouts */
const baseKeyBinding: Record<string, KeyBinding> = {
Escape: {
key: "ESC",
fun: (event: KeyboardEvent) => removeFocus(event),
des: "remove focus from the focused input",
cat: "Control"
},
c: {
key: "c",
fun: () => copyURLToClipboard(),
des: "copy url of the selected result to the clipboard",
cat: "Results"
},
h: {
key: "h",
fun: () => toggleHelp(keyBindings),
des: "toggle help window",
cat: "Other"
},
i: {
key: "i",
fun: () => searchInputFocus(),
des: "focus on the search input",
cat: "Control"
},
n: {
key: "n",
fun: () => GoToNextPage(),
des: "go to next page",
cat: "Results"
},
o: {
key: "o",
fun: () => openResult(false),
des: "open search result",
cat: "Results"
},
p: {
key: "p",
fun: () => GoToPreviousPage(),
des: "go to previous page",
cat: "Results"
},
r: {
key: "r",
fun: () => reloadPage(),
des: "reload page from the server",
cat: "Control"
},
t: {
key: "t",
fun: () => openResult(true),
des: "open the result in a new tab",
cat: "Results"
}
};
const keyBindingLayouts: Record<KeyBindingLayout, Record<string, KeyBinding>> = {
// SearXNG layout
default: {
ArrowLeft: {
key: "←",
fun: () => highlightResult("up")(),
des: "select previous search result",
cat: "Results"
},
ArrowRight: {
key: "→",
fun: () => highlightResult("down")(),
des: "select next search result",
cat: "Results"
},
...baseKeyBinding
},
// Vim-like keyboard layout
vim: {
b: {
key: "b",
fun: () => scrollPage(-window.innerHeight),
des: "scroll one page up",
cat: "Navigation"
},
d: {
key: "d",
fun: () => scrollPage(window.innerHeight / 2),
des: "scroll half a page down",
cat: "Navigation"
},
f: {
key: "f",
fun: () => scrollPage(window.innerHeight),
des: "scroll one page down",
cat: "Navigation"
},
g: {
key: "g",
fun: () => scrollPageTo(-document.body.scrollHeight, "top"),
des: "scroll to the top of the page",
cat: "Navigation"
},
j: {
key: "j",
fun: () => highlightResult("down")(),
des: "select next search result",
cat: "Results"
},
k: {
key: "k",
fun: () => highlightResult("up")(),
des: "select previous search result",
cat: "Results"
},
u: {
key: "u",
fun: () => scrollPage(-window.innerHeight / 2),
des: "scroll half a page up",
cat: "Navigation"
},
v: {
key: "v",
fun: () => scrollPageTo(document.body.scrollHeight, "bottom"),
des: "scroll to the bottom of the page",
cat: "Navigation"
},
y: {
key: "y",
fun: () => copyURLToClipboard(),
des: "copy url of the selected result to the clipboard",
cat: "Results"
},
...baseKeyBinding
}
};
const keyBindings: Record<string, KeyBinding> =
settings.hotkeys && settings.hotkeys in keyBindingLayouts
? keyBindingLayouts[settings.hotkeys]
: keyBindingLayouts.default;
const isElementInDetail = (element?: HTMLElement): boolean => {
const ancestor = element?.closest(".detail, .result");
return ancestor?.classList.contains("detail") ?? false;
};
const getResultElement = (element?: HTMLElement): HTMLElement | undefined => {
return element?.closest(".result") ?? undefined;
};
const isImageResult = (resultElement?: HTMLElement): boolean => {
return resultElement?.classList.contains("result-images") ?? false;
};
const highlightResult =
(which: HighlightResultElement | HTMLElement) =>
(noScroll?: boolean, keepFocus?: boolean): void => {
let effectiveWhich = which;
let current = document.querySelector<HTMLElement>(".result[data-vim-selected]");
if (!current) {
// no selection : choose the first one
current = document.querySelector<HTMLElement>(".result");
if (!current) {
// no first one : there are no results
return;
}
// replace up/down actions by selecting first one
if (which === "down" || which === "up") {
effectiveWhich = current;
}
}
const results = Array.from(document.querySelectorAll<HTMLElement>(".result"));
let next: HTMLElement | undefined;
if (typeof effectiveWhich === "string") {
switch (effectiveWhich) {
case "visible": {
const top = document.documentElement.scrollTop || document.body.scrollTop;
const bot = top + document.documentElement.clientHeight;
for (const element of results) {
const etop = element.offsetTop;
const ebot = etop + element.clientHeight;
if (ebot <= bot && etop > top) {
next = element;
break;
}
}
break;
}
case "down":
next = results[results.indexOf(current) + 1] || current;
break;
case "up":
next = results[results.indexOf(current) - 1] || current;
break;
case "bottom":
next = results.at(-1);
break;
// biome-ignore lint/complexity/noUselessSwitchCase: fallthrough is intended
case "top":
default:
[next] = results;
}
} else {
next = effectiveWhich;
}
if (next) {
current.removeAttribute("data-vim-selected");
next.setAttribute("data-vim-selected", "true");
if (!keepFocus) {
const link = next.querySelector<HTMLAnchorElement>("h3 a") || next.querySelector<HTMLAnchorElement>("a");
link?.focus();
}
if (!noScroll) {
mutable.scrollPageToSelected?.();
}
}
};
const reloadPage = (): void => {
document.location.reload();
};
const removeFocus = (event: KeyboardEvent): void => {
const target = event.target as HTMLElement;
const tagName = target?.tagName?.toLowerCase();
if (document.activeElement && (tagName === "input" || tagName === "select" || tagName === "textarea")) {
(document.activeElement as HTMLElement).blur();
} else {
mutable.closeDetail?.();
}
};
const pageButtonClick = (css_selector: string): void => {
const button = document.querySelector<HTMLButtonElement>(css_selector);
if (button) {
button.click();
}
};
const GoToNextPage = (): void => {
pageButtonClick('nav#pagination .next_page button[type="submit"]');
};
const GoToPreviousPage = (): void => {
pageButtonClick('nav#pagination .previous_page button[type="submit"]');
};
mutable.scrollPageToSelected = (): void => {
const sel = document.querySelector<HTMLElement>(".result[data-vim-selected]");
if (!sel) return;
const wtop = document.documentElement.scrollTop || document.body.scrollTop;
const height = document.documentElement.clientHeight;
const etop = sel.offsetTop;
const ebot = etop + sel.clientHeight;
const offset = 120;
// first element ?
if (!sel.previousElementSibling && ebot < height) {
// set to the top of page if the first element
// is fully included in the viewport
window.scroll(window.scrollX, 0);
return;
}
if (wtop > etop - offset) {
window.scroll(window.scrollX, etop - offset);
} else {
const wbot = wtop + height;
if (wbot < ebot + offset) {
window.scroll(window.scrollX, ebot - height + offset);
}
}
};
const scrollPage = (amount: number): void => {
window.scrollBy(0, amount);
highlightResult("visible")();
};
const scrollPageTo = (position: number, nav: HighlightResultElement): void => {
window.scrollTo(0, position);
highlightResult(nav)();
};
const searchInputFocus = (): void => {
window.scrollTo(0, 0);
const q = document.querySelector<HTMLInputElement>("#q");
if (q) {
q.focus();
if (q.setSelectionRange) {
const len = q.value.length;
q.setSelectionRange(len, len);
}
}
};
const openResult = (newTab: boolean): void => {
let link = document.querySelector<HTMLAnchorElement>(".result[data-vim-selected] h3 a");
if (!link) {
link = document.querySelector<HTMLAnchorElement>(".result[data-vim-selected] > a");
}
if (!link) return;
const url = link.getAttribute("href");
if (url) {
if (newTab) {
window.open(url);
} else {
window.location.href = url;
}
}
};
const initHelpContent = (divElement: HTMLElement, keyBindings: typeof baseKeyBinding): void => {
const categories: Record<string, KeyBinding[]> = {};
for (const binding of Object.values(keyBindings)) {
const { cat } = binding;
categories[cat] ??= [];
categories[cat].push(binding);
}
const sortedCategoryKeys = Object.keys(categories).sort(
(a, b) => (categories[b]?.length ?? 0) - (categories[a]?.length ?? 0)
);
let html = '<a href="#" class="close" aria-label="close" title="close">×</a>';
html += "<h3>How to navigate SearXNG with hotkeys</h3>";
html += "<table>";
for (const [i, categoryKey] of sortedCategoryKeys.entries()) {
const bindings = categories[categoryKey];
if (!bindings || bindings.length === 0) continue;
const isFirst = i % 2 === 0;
const isLast = i === sortedCategoryKeys.length - 1;
if (isFirst) {
html += "<tr>";
}
html += "<td>";
html += `<h4>${categoryKey}</h4>`;
html += '<ul class="list-unstyled">';
for (const binding of bindings) {
html += `<li><kbd>${binding.key}</kbd> ${binding.des}</li>`;
}
html += "</ul>";
html += "</td>";
if (!isFirst || isLast) {
html += "</tr>";
}
}
html += "</table>";
divElement.innerHTML = html;
};
const toggleHelp = (keyBindings: typeof baseKeyBinding): void => {
let helpPanel = document.querySelector<HTMLElement>("#vim-hotkeys-help");
if (helpPanel) {
// toggle hidden
helpPanel.classList.toggle("invisible");
} else {
// first call
helpPanel = Object.assign(document.createElement("div"), {
id: "vim-hotkeys-help",
className: "dialog-modal"
});
initHelpContent(helpPanel, keyBindings);
const [body] = document.getElementsByTagName("body");
if (body) {
body.appendChild(helpPanel);
}
}
};
const copyURLToClipboard = async (): Promise<void> => {
const selectedResult = document.querySelector<HTMLElement>(".result[data-vim-selected]");
if (!selectedResult) return;
const resultAnchor = selectedResult.querySelector<HTMLAnchorElement>("a");
assertElement(resultAnchor);
const url = resultAnchor.getAttribute("href");
if (url) {
if (window.isSecureContext) {
await navigator.clipboard.writeText(url);
} else {
const selection = window.getSelection();
if (selection) {
const node = document.createElement("span");
node.textContent = url;
resultAnchor.appendChild(node);
const range = document.createRange();
range.selectNodeContents(node);
selection.removeAllRanges();
selection.addRange(range);
document.execCommand("copy");
node.remove();
}
}
}
};
listen("click", ".result", function (this: HTMLElement, event: PointerEvent) {
if (!isElementInDetail(event.target as HTMLElement)) {
highlightResult(this)(true, true);
const resultElement = getResultElement(event.target as HTMLElement);
if (resultElement && isImageResult(resultElement)) {
event.preventDefault();
mutable.selectImage?.(resultElement);
}
}
});
// FIXME: Focus might also trigger Pointer event ^^^
listen(
"focus",
".result a",
(event: FocusEvent) => {
if (!isElementInDetail(event.target as HTMLElement)) {
const resultElement = getResultElement(event.target as HTMLElement);
if (resultElement && !resultElement.hasAttribute("data-vim-selected")) {
highlightResult(resultElement)(true);
}
if (resultElement && isImageResult(resultElement)) {
event.preventDefault();
mutable.selectImage?.(resultElement);
}
}
},
{ capture: true }
);
listen("keydown", document, (event: KeyboardEvent) => {
// check for modifiers so we don't break browser's hotkeys
if (Object.hasOwn(keyBindings, event.key) && !event.ctrlKey && !event.altKey && !event.shiftKey && !event.metaKey) {
const tagName = (event.target as HTMLElement)?.tagName?.toLowerCase();
if (event.key === "Escape") {
keyBindings[event.key]?.fun(event);
} else if (event.target === document.body || tagName === "a" || tagName === "button") {
event.preventDefault();
keyBindings[event.key]?.fun(event);
}
}
});
mutable.selectNext = highlightResult("down");
mutable.selectPrevious = highlightResult("up");

View File

@@ -0,0 +1,76 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import { http, listen, settings } from "../toolkit.ts";
import { assertElement } from "../util/assertElement.ts";
let engineDescriptions: Record<string, [string, string]> | undefined;
const loadEngineDescriptions = async (): Promise<void> => {
if (engineDescriptions) return;
try {
const res = await http("GET", "engine_descriptions.json");
engineDescriptions = await res.json();
} catch (error) {
console.error("Error fetching engineDescriptions:", error);
}
if (!engineDescriptions) return;
for (const [engine_name, [description, source]] of Object.entries(engineDescriptions)) {
const elements = document.querySelectorAll<HTMLElement>(`[data-engine-name="${engine_name}"] .engine-description`);
const sourceText = ` (<i>${settings.translations?.Source}:&nbsp;${source}</i>)`;
for (const element of elements) {
element.innerHTML = description + sourceText;
}
}
};
const toggleEngines = (enable: boolean, engineToggles: NodeListOf<HTMLInputElement>): void => {
for (const engineToggle of engineToggles) {
// check if element visible, so that only engines of the current category are modified
if (engineToggle.offsetParent) {
engineToggle.checked = !enable;
}
}
};
const engineElements: NodeListOf<HTMLElement> = document.querySelectorAll<HTMLElement>("[data-engine-name]");
for (const engineElement of engineElements) {
listen("mouseenter", engineElement, loadEngineDescriptions);
}
const engineToggles: NodeListOf<HTMLInputElement> = document.querySelectorAll<HTMLInputElement>(
"tbody input[type=checkbox][class~=checkbox-onoff]"
);
const enableAllEngines: NodeListOf<HTMLElement> = document.querySelectorAll<HTMLElement>(".enable-all-engines");
for (const engine of enableAllEngines) {
listen("click", engine, () => toggleEngines(true, engineToggles));
}
const disableAllEngines: NodeListOf<HTMLElement> = document.querySelectorAll<HTMLElement>(".disable-all-engines");
for (const engine of disableAllEngines) {
listen("click", engine, () => toggleEngines(false, engineToggles));
}
listen("click", "#copy-hash", async function (this: HTMLElement) {
const target = this.parentElement?.querySelector<HTMLPreElement>("pre");
assertElement(target);
if (window.isSecureContext) {
await navigator.clipboard.writeText(target.innerText);
} else {
const selection = window.getSelection();
if (selection) {
const range = document.createRange();
range.selectNodeContents(target);
selection.removeAllRanges();
selection.addRange(range);
document.execCommand("copy");
}
}
if (this.dataset.copiedText) {
this.innerText = this.dataset.copiedText;
}
});

View File

@@ -0,0 +1,190 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import "../../../node_modules/swiped-events/src/swiped-events.js";
import { listen, mutable, settings } from "../toolkit.ts";
import { assertElement } from "../util/assertElement.ts";
let imgTimeoutID: number;
const imageLoader = (resultElement: HTMLElement): void => {
if (imgTimeoutID) clearTimeout(imgTimeoutID);
const imgElement = resultElement.querySelector<HTMLImageElement>(".result-images-source img");
if (!imgElement) return;
// use thumbnail until full image loads
const thumbnail = resultElement.querySelector<HTMLImageElement>(".image_thumbnail");
if (thumbnail) {
if (thumbnail.src === `${settings.theme_static_path}/img/img_load_error.svg`) return;
imgElement.onerror = (): void => {
imgElement.src = thumbnail.src;
};
imgElement.src = thumbnail.src;
}
const imgSource = imgElement.getAttribute("data-src");
if (!imgSource) return;
// unsafe nodejs specific, cast to https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#return_value
// https://github.com/searxng/searxng/pull/5073#discussion_r2265767231
imgTimeoutID = setTimeout(() => {
imgElement.src = imgSource;
imgElement.removeAttribute("data-src");
}, 1000) as unknown as number;
};
const imageThumbnails: NodeListOf<HTMLImageElement> = document.querySelectorAll<HTMLImageElement>(
"#urls img.image_thumbnail, img.thumbnail"
);
for (const thumbnail of imageThumbnails) {
if (thumbnail.complete && thumbnail.naturalWidth === 0) {
thumbnail.src = `${settings.theme_static_path}/img/img_load_error.svg`;
}
thumbnail.onerror = (): void => {
thumbnail.src = `${settings.theme_static_path}/img/img_load_error.svg`;
};
}
const copyUrlButton: HTMLButtonElement | null =
document.querySelector<HTMLButtonElement>("#search_url button#copy_url");
copyUrlButton?.style.setProperty("display", "block");
mutable.selectImage = (resultElement: HTMLElement): void => {
// add a class that can be evaluated in the CSS and indicates that the
// detail view is open
const resultsElement = document.getElementById("results");
resultsElement?.classList.add("image-detail-open");
// add a hash to the browser history so that pressing back doesn't return
// to the previous page this allows us to dismiss the image details on
// pressing the back button on mobile devices
window.location.hash = "#image-viewer";
mutable.scrollPageToSelected?.();
// if there is no element given by the caller, stop here
if (!resultElement) return;
imageLoader(resultElement);
};
mutable.closeDetail = (): void => {
const resultsElement = document.getElementById("results");
resultsElement?.classList.remove("image-detail-open");
// remove #image-viewer hash from url by navigating back
if (window.location.hash === "#image-viewer") {
window.history.back();
}
mutable.scrollPageToSelected?.();
};
listen("click", ".btn-collapse", function (this: HTMLElement) {
const btnLabelCollapsed = this.getAttribute("data-btn-text-collapsed");
const btnLabelNotCollapsed = this.getAttribute("data-btn-text-not-collapsed");
const target = this.getAttribute("data-target");
if (!(target && btnLabelCollapsed && btnLabelNotCollapsed)) return;
const targetElement = document.querySelector<HTMLElement>(target);
assertElement(targetElement);
const isCollapsed = this.classList.contains("collapsed");
const newLabel = isCollapsed ? btnLabelNotCollapsed : btnLabelCollapsed;
const oldLabel = isCollapsed ? btnLabelCollapsed : btnLabelNotCollapsed;
this.innerHTML = this.innerHTML.replace(oldLabel, newLabel);
this.classList.toggle("collapsed");
targetElement.classList.toggle("invisible");
});
listen("click", ".media-loader", function (this: HTMLElement) {
const target = this.getAttribute("data-target");
if (!target) return;
const iframeLoad = document.querySelector<HTMLIFrameElement>(`${target} > iframe`);
assertElement(iframeLoad);
const srctest = iframeLoad.getAttribute("src");
if (!srctest) {
const dataSrc = iframeLoad.getAttribute("data-src");
if (dataSrc) {
iframeLoad.setAttribute("src", dataSrc);
}
}
});
listen("click", "#copy_url", async function (this: HTMLElement) {
const target = this.parentElement?.querySelector<HTMLPreElement>("pre");
assertElement(target);
if (window.isSecureContext) {
await navigator.clipboard.writeText(target.innerText);
} else {
const selection = window.getSelection();
if (selection) {
const range = document.createRange();
range.selectNodeContents(target);
selection.removeAllRanges();
selection.addRange(range);
document.execCommand("copy");
}
}
if (this.dataset.copiedText) {
this.innerText = this.dataset.copiedText;
}
});
listen("click", ".result-detail-close", (event: Event) => {
event.preventDefault();
mutable.closeDetail?.();
});
listen("click", ".result-detail-previous", (event: Event) => {
event.preventDefault();
mutable.selectPrevious?.(false);
});
listen("click", ".result-detail-next", (event: Event) => {
event.preventDefault();
mutable.selectNext?.(false);
});
// listen for the back button to be pressed and dismiss the image details when called
window.addEventListener("hashchange", () => {
if (window.location.hash !== "#image-viewer") {
mutable.closeDetail?.();
}
});
const swipeHorizontal: NodeListOf<HTMLElement> = document.querySelectorAll<HTMLElement>(".swipe-horizontal");
for (const element of swipeHorizontal) {
listen("swiped-left", element, () => {
mutable.selectNext?.(false);
});
listen("swiped-right", element, () => {
mutable.selectPrevious?.(false);
});
}
window.addEventListener(
"scroll",
() => {
const backToTopElement = document.getElementById("backToTop");
const resultsElement = document.getElementById("results");
if (backToTopElement && resultsElement) {
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
const isScrolling = scrollTop >= 100;
resultsElement.classList.toggle("scrolling", isScrolling);
}
},
true
);

View File

@@ -0,0 +1,94 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import { listen } from "../toolkit.ts";
import { getElement } from "../util/getElement.ts";
const searchForm: HTMLFormElement = getElement<HTMLFormElement>("search");
const searchInput: HTMLInputElement = getElement<HTMLInputElement>("q");
const searchReset: HTMLButtonElement = getElement<HTMLButtonElement>("clear_search");
const isMobile: boolean = window.matchMedia("(max-width: 50em)").matches;
const isResultsPage: boolean = document.querySelector("main")?.id === "main_results";
const categoryButtons: HTMLButtonElement[] = Array.from(
document.querySelectorAll<HTMLButtonElement>("#categories_container button.category")
);
if (searchInput.value.length === 0) {
searchReset.classList.add("empty");
}
// focus search input on large screens
if (!(isMobile || isResultsPage)) {
searchInput.focus();
}
// On mobile, move cursor to the end of the input on focus
if (isMobile) {
listen("focus", searchInput, () => {
// Defer cursor move until the next frame to prevent a visual jump
requestAnimationFrame(() => {
const end = searchInput.value.length;
searchInput.setSelectionRange(end, end);
searchInput.scrollLeft = searchInput.scrollWidth;
});
});
}
listen("input", searchInput, () => {
searchReset.classList.toggle("empty", searchInput.value.length === 0);
});
listen("click", searchReset, (event: MouseEvent) => {
event.preventDefault();
searchInput.value = "";
searchInput.focus();
searchReset.classList.add("empty");
});
for (const button of categoryButtons) {
listen("click", button, (event: MouseEvent) => {
if (event.shiftKey) {
event.preventDefault();
button.classList.toggle("selected");
return;
}
// deselect all other categories
for (const categoryButton of categoryButtons) {
categoryButton.classList.toggle("selected", categoryButton === button);
}
});
}
if (document.querySelector("div.search_filters")) {
const safesearchElement = document.getElementById("safesearch");
if (safesearchElement) {
listen("change", safesearchElement, () => searchForm.submit());
}
const timeRangeElement = document.getElementById("time_range");
if (timeRangeElement) {
listen("change", timeRangeElement, () => searchForm.submit());
}
const languageElement = document.getElementById("language");
if (languageElement) {
listen("change", languageElement, () => searchForm.submit());
}
}
// override searchForm submit event
listen("submit", searchForm, (event: Event) => {
event.preventDefault();
if (categoryButtons.length > 0) {
const searchCategories = getElement<HTMLInputElement>("selected-categories");
searchCategories.value = categoryButtons
.filter((button) => button.classList.contains("selected"))
.map((button) => button.name.replace("category_", ""))
.join(",");
}
searchForm.submit();
});

View File

@@ -0,0 +1,93 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {
absDependencies,
addDependencies,
create,
divideDependencies,
eDependencies,
evaluateDependencies,
expDependencies,
factorialDependencies,
gcdDependencies,
lcmDependencies,
log1pDependencies,
log2Dependencies,
log10Dependencies,
logDependencies,
modDependencies,
multiplyDependencies,
nthRootDependencies,
piDependencies,
powDependencies,
roundDependencies,
signDependencies,
sqrtDependencies,
subtractDependencies
} from "mathjs/number";
import { Plugin } from "../Plugin.ts";
import { appendAnswerElement } from "../util/appendAnswerElement.ts";
import { getElement } from "../util/getElement.ts";
/**
* Parses and solves mathematical expressions. Can do basic arithmetic and
* evaluate some functions.
*
* @example
* "(3 + 5) / 2" = "4"
* "e ^ 2 + pi" = "10.530648752520442"
* "gcd(48, 18) + lcm(4, 5)" = "26"
*
* @remarks
* Depends on `mathjs` library.
*/
export default class Calculator extends Plugin {
public constructor() {
super("calculator");
}
/**
* @remarks
* Compare bundle size after adding or removing features.
*/
private static readonly math = create({
...absDependencies,
...addDependencies,
...divideDependencies,
...eDependencies,
...evaluateDependencies,
...expDependencies,
...factorialDependencies,
...gcdDependencies,
...lcmDependencies,
...log10Dependencies,
...log1pDependencies,
...log2Dependencies,
...logDependencies,
...modDependencies,
...multiplyDependencies,
...nthRootDependencies,
...piDependencies,
...powDependencies,
...roundDependencies,
...signDependencies,
...sqrtDependencies,
...subtractDependencies
});
protected async run(): Promise<string | undefined> {
const searchInput = getElement<HTMLInputElement>("q");
try {
const node = Calculator.math.parse(searchInput.value);
return `${node.toString()} = ${node.evaluate()}`;
} catch {
// not a compatible math expression
return;
}
}
protected async post(result: string): Promise<void> {
appendAnswerElement(result);
}
}

View File

@@ -0,0 +1,110 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import { Plugin } from "../Plugin.ts";
import { http, settings } from "../toolkit.ts";
import { assertElement } from "../util/assertElement.ts";
import { getElement } from "../util/getElement.ts";
/**
* Automatically loads the next page when scrolling to bottom of the current page.
*/
export default class InfiniteScroll extends Plugin {
public constructor() {
super("infiniteScroll");
}
protected async run(): Promise<void> {
const resultsElement = getElement<HTMLElement>("results");
const onlyImages: boolean = resultsElement.classList.contains("only_template_images");
const observedSelector = "article.result:last-child";
const spinnerElement = document.createElement("div");
spinnerElement.className = "loader";
const loadNextPage = async (callback: () => void): Promise<void> => {
const searchForm = document.querySelector<HTMLFormElement>("#search");
assertElement(searchForm);
const form = document.querySelector<HTMLFormElement>("#pagination form.next_page");
assertElement(form);
const action = searchForm.getAttribute("action");
if (!action) {
throw new Error("Form action not defined");
}
const paginationElement = document.querySelector<HTMLElement>("#pagination");
assertElement(paginationElement);
paginationElement.replaceChildren(spinnerElement);
try {
const res = await http("POST", action, { body: new FormData(form) });
const nextPage = await res.text();
if (!nextPage) return;
const nextPageDoc = new DOMParser().parseFromString(nextPage, "text/html");
const articleList = nextPageDoc.querySelectorAll<HTMLElement>("#urls article");
const nextPaginationElement = nextPageDoc.querySelector<HTMLElement>("#pagination");
document.querySelector("#pagination")?.remove();
const urlsElement = document.querySelector<HTMLElement>("#urls");
if (!urlsElement) {
throw new Error("URLs element not found");
}
if (articleList.length > 0 && !onlyImages) {
// do not add <hr> element when there are only images
urlsElement.appendChild(document.createElement("hr"));
}
urlsElement.append(...articleList);
if (nextPaginationElement) {
const results = document.querySelector<HTMLElement>("#results");
results?.appendChild(nextPaginationElement);
callback();
}
} catch (error) {
console.error("Error loading next page:", error);
const errorElement = Object.assign(document.createElement("div"), {
textContent: settings.translations?.error_loading_next_page ?? "Error loading next page",
className: "dialog-error"
});
errorElement.setAttribute("role", "alert");
document.querySelector("#pagination")?.replaceChildren(errorElement);
}
};
const intersectionObserveOptions: IntersectionObserverInit = {
rootMargin: "320px"
};
const observer: IntersectionObserver = new IntersectionObserver(async (entries: IntersectionObserverEntry[]) => {
const [paginationEntry] = entries;
if (paginationEntry?.isIntersecting) {
observer.unobserve(paginationEntry.target);
await loadNextPage(() => {
const nextObservedElement = document.querySelector<HTMLElement>(observedSelector);
if (nextObservedElement) {
observer.observe(nextObservedElement);
}
});
}
}, intersectionObserveOptions);
const initialObservedElement: HTMLElement | null = document.querySelector<HTMLElement>(observedSelector);
if (initialObservedElement) {
observer.observe(initialObservedElement);
}
}
protected async post(): Promise<void> {
// noop
}
}

View File

@@ -0,0 +1,93 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import "ol/ol.css";
import { Feature, Map as OlMap, View } from "ol";
import { GeoJSON } from "ol/format";
import { Point } from "ol/geom";
import { Tile as TileLayer, Vector as VectorLayer } from "ol/layer";
import { fromLonLat } from "ol/proj";
import { OSM, Vector as VectorSource } from "ol/source";
import { Circle, Fill, Stroke, Style } from "ol/style";
import { Plugin } from "../Plugin.ts";
/**
* MapView
*/
export default class MapView extends Plugin {
private readonly map: HTMLElement;
public constructor(map: HTMLElement) {
super("mapView");
this.map = map;
}
protected async run(): Promise<void> {
const { leafletTarget: target, mapLon = "0", mapLat = "0", mapGeojson } = this.map.dataset;
const lon = Number.parseFloat(mapLon);
const lat = Number.parseFloat(mapLat);
const view = new View({ maxZoom: 16, enableRotation: false });
const map = new OlMap({
target: target,
layers: [new TileLayer({ source: new OSM({ maxZoom: 16 }) })],
view: view
});
try {
const markerSource = new VectorSource({
features: [
new Feature({
geometry: new Point(fromLonLat([lon, lat]))
})
]
});
const markerLayer = new VectorLayer({
source: markerSource,
style: new Style({
image: new Circle({
radius: 6,
fill: new Fill({ color: "#3050ff" })
})
})
});
map.addLayer(markerLayer);
} catch (error) {
console.error("Failed to create marker layer:", error);
}
if (mapGeojson) {
try {
const geoSource = new VectorSource({
features: new GeoJSON().readFeatures(JSON.parse(mapGeojson), {
dataProjection: "EPSG:4326",
featureProjection: "EPSG:3857"
})
});
const geoLayer = new VectorLayer({
source: geoSource,
style: new Style({
stroke: new Stroke({ color: "#3050ff", width: 2 }),
fill: new Fill({ color: "#3050ff33" })
})
});
map.addLayer(geoLayer);
const geoSourceExtent = geoSource.getExtent();
if (geoSourceExtent) {
view.fit(geoSourceExtent, { padding: [20, 20, 20, 20] });
}
} catch (error) {
console.error("Failed to create GeoJSON layer:", error);
}
}
}
protected async post(): Promise<void> {
// noop
}
}

View File

@@ -0,0 +1,69 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import { load } from "./loader.ts";
import { Endpoints, endpoint, listen, ready, settings } from "./toolkit.ts";
ready(() => {
document.documentElement.classList.remove("no-js");
document.documentElement.classList.add("js");
listen("click", ".close", function (this: HTMLElement) {
(this.parentNode as HTMLElement)?.classList.add("invisible");
});
listen("click", ".searxng_init_map", async function (this: HTMLElement, event: Event) {
event.preventDefault();
this.classList.remove("searxng_init_map");
load(() => import("./plugin/MapView.ts").then(({ default: Plugin }) => new Plugin(this)), {
on: "endpoint",
where: [Endpoints.results]
});
});
if (settings.plugins?.includes("infiniteScroll")) {
load(() => import("./plugin/InfiniteScroll.ts").then(({ default: Plugin }) => new Plugin()), {
on: "endpoint",
where: [Endpoints.results]
});
}
if (settings.plugins?.includes("calculator")) {
load(() => import("./plugin/Calculator.ts").then(({ default: Plugin }) => new Plugin()), {
on: "endpoint",
where: [Endpoints.results]
});
}
});
ready(
() => {
void import("./main/keyboard.ts");
void import("./main/search.ts");
if (settings.autocomplete) {
void import("./main/autocomplete.ts");
}
},
{ on: [endpoint === Endpoints.index] }
);
ready(
() => {
void import("./main/keyboard.ts");
void import("./main/results.ts");
void import("./main/search.ts");
if (settings.autocomplete) {
void import("./main/autocomplete.ts");
}
},
{ on: [endpoint === Endpoints.results] }
);
ready(
() => {
void import("./main/preferences.ts");
},
{ on: [endpoint === Endpoints.preferences] }
);

View File

@@ -0,0 +1,133 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type { KeyBindingLayout } from "./main/keyboard.ts";
// synced with searx/webapp.py get_client_settings
type Settings = {
plugins?: string[];
autocomplete?: string;
autocomplete_min?: number;
doi_resolver?: string;
favicon_resolver?: string;
hotkeys?: KeyBindingLayout;
method?: "GET" | "POST";
query_in_title?: boolean;
results_on_new_tab?: boolean;
safesearch?: 0 | 1 | 2;
search_on_category_select?: boolean;
theme?: string;
theme_static_path?: string;
translations?: Record<string, string>;
url_formatting?: "pretty" | "full" | "host";
};
type HTTPOptions = {
body?: BodyInit;
timeout?: number;
};
type ReadyOptions = {
// all values must be truthy for the callback to be executed
on?: (boolean | undefined)[];
};
export type EndpointsKeys = keyof typeof Endpoints;
export const Endpoints = {
index: "index",
results: "results",
preferences: "preferences",
unknown: "unknown"
} as const;
export const mutable = {
closeDetail: undefined as (() => void) | undefined,
scrollPageToSelected: undefined as (() => void) | undefined,
selectImage: undefined as ((resultElement: HTMLElement) => void) | undefined,
selectNext: undefined as ((openDetailView?: boolean) => void) | undefined,
selectPrevious: undefined as ((openDetailView?: boolean) => void) | undefined
};
const getEndpoint = (): EndpointsKeys => {
const metaEndpoint = document.querySelector('meta[name="endpoint"]')?.getAttribute("content");
if (metaEndpoint && metaEndpoint in Endpoints) {
return metaEndpoint as EndpointsKeys;
}
return Endpoints.unknown;
};
const getSettings = (): Settings => {
const settings = document.querySelector("script[client_settings]")?.getAttribute("client_settings");
if (!settings) return {};
try {
return JSON.parse(atob(settings));
} catch (error) {
console.error("Failed to load client_settings:", error);
return {};
}
};
export const http = async (method: string, url: string | URL, options?: HTTPOptions): Promise<Response> => {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), options?.timeout ?? 30_000);
const res = await fetch(url, {
body: options?.body,
method: method,
signal: controller.signal
}).finally(() => clearTimeout(timeoutId));
if (!res.ok) {
throw new Error(res.statusText);
}
return res;
};
export const listen = <K extends keyof DocumentEventMap, E extends HTMLElement>(
type: string | K,
target: string | Document | E,
listener: (this: E, event: DocumentEventMap[K]) => void | Promise<void>,
options?: AddEventListenerOptions
): void => {
if (typeof target !== "string") {
target.addEventListener(type, listener as EventListener, options);
return;
}
document.addEventListener(
type,
(event: Event) => {
for (const node of event.composedPath()) {
if (node instanceof HTMLElement && node.matches(target)) {
try {
listener.call(node as E, event as DocumentEventMap[K]);
} catch (error) {
console.error(error);
}
break;
}
}
},
options
);
};
export const ready = (callback: () => void, options?: ReadyOptions): void => {
for (const condition of options?.on ?? []) {
if (!condition) {
return;
}
}
if (document.readyState === "loading") {
listen("DOMContentLoaded", document, callback, { once: true });
} else {
callback();
}
};
export const endpoint: EndpointsKeys = getEndpoint();
export const settings: Settings = getSettings();

View File

@@ -0,0 +1,34 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import { getElement } from "./getElement.ts";
export const appendAnswerElement = (element: HTMLElement | string | number): void => {
const results = getElement<HTMLDivElement>("results");
// ./searx/templates/elements/answers.html
let answers = getElement<HTMLDivElement>("answers", { assert: false });
if (!answers) {
// what is this?
const answersTitle = document.createElement("h4");
answersTitle.setAttribute("class", "title");
answersTitle.setAttribute("id", "answers-title");
answersTitle.textContent = "Answers : ";
answers = document.createElement("div");
answers.setAttribute("id", "answers");
answers.setAttribute("role", "complementary");
answers.setAttribute("aria-labelledby", "answers-title");
answers.appendChild(answersTitle);
}
if (!(element instanceof HTMLElement)) {
const span = document.createElement("span");
span.innerHTML = element.toString();
// biome-ignore lint/style/noParameterAssign: TODO
element = span;
}
answers.appendChild(element);
results.insertAdjacentElement("afterbegin", answers);
};

View File

@@ -0,0 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
type AssertElement = <T>(element?: T | null) => asserts element is T;
export const assertElement: AssertElement = <T>(element?: T | null): asserts element is T => {
if (!element) {
throw new Error("DOM element not found");
}
};

View File

@@ -0,0 +1,21 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import { assertElement } from "./assertElement.ts";
type Options = {
assert?: boolean;
};
export function getElement<T>(id: string, options?: { assert: true }): T;
export function getElement<T>(id: string, options?: { assert: false }): T | null;
export function getElement<T>(id: string, options: Options = {}): T | null {
options.assert ??= true;
const element = document.getElementById(id) as T | null;
if (options.assert) {
assertElement(element);
}
return element;
}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
.dialog-modal {
animation-name: dialogmodal;
animation-duration: 0.13s;

View File

@@ -1,8 +1,9 @@
/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */
// SPDX-License-Identifier: AGPL-3.0-or-later
.autocomplete {
position: absolute;
width: @search-width;
max-width: calc(100% - 2 * @search-padding-horizontal);
max-height: 0;
overflow-y: hidden;
.ltr-text-align-left();
@@ -53,7 +54,7 @@
color: var(--color-autocomplete-font);
max-height: 32rem;
overflow-y: auto;
z-index: 100;
z-index: 5000;
margin-top: 3.5rem;
border-radius: 0.8rem;
@@ -65,8 +66,6 @@
@media screen and (max-width: @phone) {
.autocomplete {
width: 100%;
> ul > li {
padding: 1rem;
}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/*
* SearXNG, A privacy-respecting, hackable metasearch engine
*
@@ -55,8 +57,12 @@
--color-autocomplete-background: #fff;
--color-autocomplete-background-hover: #e3e3e3;
/// Answer Colors
--color-answer-font: #444; // same as --color-base-font
--color-answer-font: #444; // same as --color-base-font
--color-answer-background: #fff;
// colors of the KeyValue result class
--color-result-keyvalue-col-table: #fdfbff;
--color-result-keyvalue-odd: #fdfbff;
--color-result-keyvalue-even: #fff;
/// Results Colors
--color-result-background: #fff;
--color-result-border: #ddd;
@@ -85,8 +91,8 @@
--color-result-detail-background: #242424;
--color-result-detail-hr: #555;
--color-result-detail-link: #8af;
--color-result-detail-loader-border: rgba(255, 255, 255, 0.2);
--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);
--color-result-detail-loader-border: rgb(255 255 255 / 20%);
--color-result-detail-loader-borderleft: rgb(0 0 0 / 0%);
/// Toolkit Colors
--color-toolkit-badge-font: #fff;
--color-toolkit-badge-background: #545454;
@@ -111,16 +117,16 @@
--color-toolkit-checkbox-input-border: #3050ff;
--color-toolkit-engine-tooltip-border: #ddd;
--color-toolkit-engine-tooltip-background: #fff;
--color-toolkit-loader-border: rgba(0, 0, 0, 0.2);
--color-toolkit-loader-borderleft: rgba(255, 255, 255, 0);
--color-toolkit-loader-border: rgb(0 0 0 / 20%);
--color-toolkit-loader-borderleft: rgb(255 255 255 / 0%);
--color-doc-code: #003;
--color-doc-code-background: #ddeaff;
/// Other misc colors
--color-bar-chart-primary: #5bc0de;
--color-bar-chart-secondary: #deb15b;
--color-image-resolution-background: rgba(0, 0, 0, 50%);
--color-image-resolution-background: rgb(0 0 0 / 50%);
--color-image-resolution-font: #fff;
--color-loading-indicator: rgba(255, 255, 255, 0.2);
--color-loading-indicator: rgb(255 255 255 / 20%);
--color-loading-indicator-gap: #fff;
--color-line-number: #64708d;
// Favicons Colors
@@ -180,6 +186,10 @@
/// Answer Colors
--color-answer-font: #bbb; // same as --color-base-font
--color-answer-background: #26292f;
// colors of the KeyValue result class
--color-result-keyvalue-col-table: #1e1e22;
--color-result-keyvalue-odd: #1e1e22;
--color-result-keyvalue-even: #26292f;
/// Results Colors
--color-result-background: #26292f;
--color-result-border: #333;
@@ -200,8 +210,8 @@
--color-result-detail-background: #1a1a1c;
--color-result-detail-hr: #555;
--color-result-detail-link: #8af;
--color-result-detail-loader-border: rgba(255, 255, 255, 0.2);
--color-result-detail-loader-borderleft: rgba(0, 0, 0, 0);
--color-result-detail-loader-border: rgb(255 255 255 / 20%);
--color-result-detail-loader-borderleft: rgb(0 0 0 / 0%);
// Images Colors
--color-result-image-span-font: #bbb;
--color-result-image-span-font-selected: #222;
@@ -234,8 +244,8 @@
--color-toolkit-checkbox-input-border: #58f;
--color-toolkit-engine-tooltip-border: #333;
--color-toolkit-engine-tooltip-background: #222;
--color-toolkit-loader-border: rgba(255, 255, 255, 0.2);
--color-toolkit-loader-borderleft: rgba(0, 0, 0, 0);
--color-toolkit-loader-border: rgb(255 255 255 / 20%);
--color-toolkit-loader-borderleft: rgb(0 0 0 / 0%);
--color-doc-code: #ddd;
--color-doc-code-background: #4d5a6f;
// Favicons Colors
@@ -279,12 +289,13 @@
@results-image-row-height: 12rem;
@results-image-row-height-phone: 10rem;
@search-width: 44rem;
// heigh of #search, see detail.less
@search-height: 7.6rem;
// height of #search, see detail.less
@search-height: 13rem;
@search-padding-horizontal: 0.5rem;
/// Device Size
/// @desktop > @tablet
@tablet: 79.75em; // see https://github.com/searxng/searxng/issues/874
@tablet: 79.75em; // see https://github.com/searxng/searxng/issues/874
@phone: 50em;
@small-phone: 35em;
@ultra-small-phone: 20rem;
@@ -293,12 +304,12 @@
@stacked-bar-chart: rgb(0, 0, 0);
/// Load fonts from this directory.
@icon-font-path: "../../../fonts/";
@icon-font-path: "../../../fonts/";
//** File name for all font files.
@icon-font-name: "glyphicons-halflings-regular";
@icon-font-name: "glyphicons-halflings-regular";
//** Element ID within SVG icon file.
@icon-font-svg-id: "glyphicons_halflingsregular";
@icon-font-svg-id: "glyphicons_halflingsregular";
// decoration of the select HTML elements
@select-light-svg-path: "../svg/select-light.svg";
@select-dark-svg-path: "../svg/select-dark.svg";
@select-light-svg-path: "../svg/select-light.svg";
@select-dark-svg-path: "../svg/select-dark.svg";

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
iframe[src^="https://w.soundcloud.com"] {
height: 120px;
}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
#main_index {
margin-top: 26vh;
}
@@ -6,7 +8,7 @@
text-align: center;
.title {
background: url('../img/searxng.png') no-repeat;
background: url("./img/searxng.png") no-repeat;
min-height: 4rem;
margin: 4rem auto;
background-position: center;

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
.info-page {
code {
font-family: monospace;

View File

@@ -2,9 +2,6 @@
// Mixins
.text-size-adjust (@property: 100%) {
-webkit-text-size-adjust: @property;
-ms-text-size-adjust: @property;
-moz-text-size-adjust: @property;
text-size-adjust: @property;
}
@@ -22,7 +19,6 @@
// disable user selection
.disable-user-select () {
-webkit-touch-callout: none;
user-select: none;
}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
table {
border-collapse: collapse;
@@ -48,6 +50,14 @@ table {
}
}
div.pref-group {
width: 100%;
font-weight: normal;
padding: 1rem 0.5rem;
.ltr-text-align-left();
background: var(--color-settings-table-group-background);
}
.value {
margin: 0;
padding: 0;

View File

@@ -1,4 +1,6 @@
@import "../generated/pygments.less";
// SPDX-License-Identifier: AGPL-3.0-or-later
@import "../../../generated/pygments.less";
.codelines {
margin: @results-margin 0 0 0;
@@ -18,12 +20,9 @@
cursor: default;
&::selection {
background: transparent; /* WebKit/Blink Browsers */
background: transparent;
}
&::-moz-selection {
background: transparent; /* Gecko Browsers */
}
margin-right: 8px;
text-align: right;
}
@@ -31,6 +30,12 @@
span.linenos {
color: var(--color-line-number);
}
.err {
// The code view in the result list should not act as a code-checker.
border: none;
color: inherit;
}
}
}

View File

@@ -0,0 +1,22 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/*
Layout of the Files result class
*/
#main_results .result-file {
border: 1px solid var(--color-result-border);
margin: 0 @results-tablet-offset 1rem @results-tablet-offset !important;
.rounded-corners;
video {
width: 100%;
aspect-ratio: 16 / 9;
padding: 10px 0 0 0;
}
audio {
width: 100%;
padding: 10px 0 0 0;
}
}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
#main_results #results.image-detail-open.only_template_images {
width: min(98%, 59.25rem) !important;
}
@@ -22,8 +24,9 @@ article.result-images .detail {
bottom: 0;
background: var(--color-result-detail-background);
border: 1px solid var(--color-result-detail-background);
z-index: 10000;
z-index: 1000;
padding: 4rem 3rem 3rem 3rem;
overflow-y: scroll;
a.result-images-source {
display: block;
@@ -42,7 +45,7 @@ article.result-images .detail {
height: inherit;
max-width: 100%;
min-height: inherit;
max-height: calc(100vh - 25rem - 7rem);
max-height: calc(100vh - 25rem - 17rem);
background: inherit;
}
}
@@ -93,8 +96,7 @@ article.result-images .detail {
p.result-url {
white-space: nowrap;
overflow-x: hidden;
overflow-y: hidden;
overflow: hidden hidden;
text-overflow: ellipsis;
}
@@ -149,7 +151,7 @@ article.result-images .detail {
height: 1.5rem;
position: absolute;
filter: opacity(40%);
z-index: 2000002;
z-index: 1200;
span {
display: block;
@@ -204,7 +206,9 @@ article.result-images .detail {
}
}
#results.image-detail-open.scrolling article.result-images[data-vim-selected] .detail {
#results.image-detail-open.scrolling
article.result-images[data-vim-selected]
.detail {
top: 0;
a.result-images-source img {
@@ -242,7 +246,7 @@ article.result-images .detail {
a.result-images-source img {
width: 100%;
max-height: calc(100vh - 20rem);
max-height: calc(100vh - 2rem);
margin: 0;
}

View File

@@ -0,0 +1,38 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/*
Layout of the KeyValue result class
*/
#main_results .result-keyvalue {
caption {
padding: 0.8rem 0.5rem;
font-style: italic;
caption-side: bottom;
background-color: var(--color-result-keyvalue-table);
}
.col-key {
width: 25%;
}
table {
word-break: break-all;
table-layout: fixed;
width: 100%;
background-color: var(--color-result-keyvalue-table);
}
tr.odd {
background-color: var(--color-result-keyvalue-odd);
}
tr.even {
background-color: var(--color-result-keyvalue-even);
}
th,
td {
padding: 0.3rem 0.5rem;
}
}

View File

@@ -0,0 +1,72 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/*
Layout of the Paper result class
*/
.result-paper {
.attributes {
display: table;
border-spacing: 0.125rem;
div {
display: table-row;
span {
font-size: 0.9rem;
margin-top: 0.25rem;
display: table-cell;
time {
font-size: 0.9rem;
}
}
span:first-child {
color: var(--color-base-font);
min-width: 10rem;
}
span:nth-child(2) {
color: var(--color-result-publishdate-font);
}
}
}
.content {
margin-top: 0.25rem;
}
.comments {
font-size: 0.9rem;
margin: 0.25rem 0 0 0;
padding: 0;
overflow-wrap: break-word;
line-height: 1.24;
font-style: italic;
}
}
@media screen and (max-width: @phone) {
.result-paper {
.attributes {
display: block;
div {
display: block;
span {
display: inline;
}
span:first-child {
font-weight: bold;
}
span:nth-child(2) {
.ltr-margin-left(0.5rem);
}
}
}
}
}

View File

@@ -1,12 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
@import (inline) "../../node_modules/normalize.css/normalize.css";
@import "definitions.less";
.text-size-adjust (@property: 100%) {
-webkit-text-size-adjust: @property;
-ms-text-size-adjust: @property;
-moz-text-size-adjust: @property;
text-size-adjust: @property;
}
@import "mixins.less";
// Reset padding and margin
html,

View File

@@ -1,6 +1,4 @@
/*
* SearXNG, A privacy-respecting, hackable metasearch engine
*/
// SPDX-License-Identifier: AGPL-3.0-or-later
#search {
padding: 0;
@@ -15,8 +13,7 @@
background: var(--color-header-background);
border-bottom: 1px solid var(--color-header-border);
display: grid;
column-gap: 1.2rem;
row-gap: 1rem;
gap: 1rem 1.2rem;
grid-template-columns: 3rem 1fr;
grid-template-areas:
"logo search"
@@ -84,7 +81,9 @@ button.category_button {
}
// only used when JavaScript is disabled
.no-js #categories_container:has(button.category_button:focus-within) button.category_button {
.no-js
#categories_container:has(button.category_button:focus-within)
button.category_button {
&.selected {
color: var(--color-base-font);
border-bottom: none;
@@ -130,7 +129,7 @@ button.category_button {
}
#search_view {
padding: 0.5rem 0.3rem 0 0.5rem;
padding: 0.5rem @search-padding-horizontal 0 @search-padding-horizontal;
grid-area: search;
body.results_endpoint & {
@@ -140,7 +139,8 @@ button.category_button {
.search_box {
border-radius: 0.8rem;
width: @search-width;
width: 100%;
max-width: @search-width;
display: inline-flex;
flex-direction: row;
white-space: nowrap;
@@ -159,7 +159,7 @@ button.category_button {
outline: none;
color: var(--color-search-font);
font-size: 1.1rem;
z-index: 10000;
z-index: 1000;
&:hover {
color: var(--color-search-background-hover);
@@ -178,13 +178,12 @@ html.no-js #clear_search.hide_if_nojs {
#send_search {
display: block;
margin: 0;
padding: 0.8rem;
background: none repeat scroll 0 0 var(--color-search-background);
border: none;
outline: none;
color: var(--color-search-font);
font-size: 1.1rem;
z-index: 2;
z-index: 100;
}
#q {
@@ -194,13 +193,9 @@ html.no-js #clear_search.hide_if_nojs {
.ltr-rounded-left-corners(0.8rem);
}
#q::-ms-clear,
#q::-webkit-search-cancel-button {
display: none;
}
#send_search {
.ltr-rounded-right-corners(0.8rem);
padding: 0.8rem;
&:hover {
cursor: pointer;
@@ -268,9 +263,7 @@ html.no-js #clear_search.hide_if_nojs {
#categories {
width: 100%;
.ltr-text-align-left();
overflow-x: scroll;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
overflow: scroll hidden;
}
}
}
@@ -280,8 +273,7 @@ html.no-js #clear_search.hide_if_nojs {
width: 100%;
margin: 0;
padding: 0.1rem 0 0 0;
column-gap: 0;
row-gap: 0;
gap: 0 0;
grid-template-areas:
"logo search"
"categories categories";
@@ -292,8 +284,7 @@ html.no-js #clear_search.hide_if_nojs {
}
.search_box {
width: 98%;
display: flex;
width: 100%;
}
#q {
@@ -335,7 +326,7 @@ html.no-js #clear_search.hide_if_nojs {
top: 0;
height: 100%;
width: 100%;
z-index: 10000;
z-index: 2000;
.search_box {
border-bottom: 1px solid var(--color-search-border);
@@ -375,11 +366,6 @@ html.no-js #clear_search.hide_if_nojs {
#categories {
.disable-user-select;
&::-webkit-scrollbar {
width: 0;
height: 0;
}
}
#categories_container {

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/*
--center-page-width overrides the less variable @results-width when the results are centered
see the CSS rules for #results in style.less ( grid-template-columns and gap).
@@ -14,7 +16,7 @@ on the /search URL and when the "center alignment" preference is enabled.
}
}
@media screen and (min-width: 62rem) {
@media screen and (width >= 62rem) {
.center-alignment-yes #main_results {
--center-page-width: 60rem;
}
@@ -63,9 +65,11 @@ on the /search URL and when the "center alignment" preference is enabled.
}
#search_header {
grid-template-columns: calc(50% - 4.5rem - var(--center-page-width) / 2) 3rem var(--center-page-width);
grid-template-columns:
calc(50% - 4.5rem - var(--center-page-width) / 2)
3rem var(--center-page-width);
grid-template-areas: "na logo search" "na spacer categories";
column-gap: 1.2rem; // from search.less
column-gap: 1.2rem; // from search.less
width: 100%;
padding-left: 0;
padding-right: 0;
@@ -91,10 +95,12 @@ on the /search URL and when the "center alignment" preference is enabled.
align-self: flex-start;
}
&:not(.only_template_images):not(.image-detail-open) {
&:not(.only_template_images, .image-detail-open) {
// the gap is set in style.less
.ltr-margin-left(1.5rem);
grid-template-columns: calc(var(--center-page-width) - @results-gap - @results-sidebar-width) @results-sidebar-width;
grid-template-columns:
calc(var(--center-page-width) - @results-gap - @results-sidebar-width)
@results-sidebar-width;
#backToTop {
.ltr-left(calc(50% - @results-sidebar-width - @results-gap + 1rem + var(--center-page-width) / 2));

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
.ltr-left(@offset) {
left: @offset;
}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
.ltr-left(@offset) {
right: @offset;
}
@@ -109,7 +111,11 @@
}
// Image detail
#results.image-detail-open article.result-images[data-vim-selected] .detail .result-images-labels p {
#results.image-detail-open
article.result-images[data-vim-selected]
.detail
.result-images-labels
p {
direction: rtl;
&.result-url {
@@ -125,7 +131,7 @@
}
// select HTML element
@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))) {
@supports ((background-position-x: 100%) and ((appearance: none))) {
select {
border-width: 0 0 0 2rem;
background-position-x: -2rem;

View File

@@ -1,24 +1,18 @@
/*
* SearXNG, A privacy-respecting, hackable metasearch engine
*
* To convert "style.less" to "style.css" run: $make styles
*/
// SPDX-License-Identifier: AGPL-3.0-or-later
// stylelint-disable no-descending-specificity
@import (inline) "../../node_modules/normalize.css/normalize.css";
@import "definitions.less";
@import "mixins.less";
@import "code.less";
@import "toolkit.less";
@import "autocomplete.less";
@import "detail.less";
@import "animations.less";
@import "embedded.less";
@import "info.less";
@import "new_issue.less";
@import "stats.less";
@import "result_templates.less";
@import "weather.less";
// for index.html template
@import "index.less";
@@ -32,8 +26,8 @@
// to center the results
@import "style-center.less";
// ion-icon
.ion-icon {
// sxng-icon-set
.sxng-icon-set {
display: inline-block;
vertical-align: bottom;
line-height: 1;
@@ -41,16 +35,16 @@
.ltr-transform();
}
.ion-icon-small {
.sxng-icon-set-small {
width: 1rem;
height: 1rem;
.ion-icon;
.sxng-icon-set;
}
.ion-icon-big {
.sxng-icon-set-big {
width: 1.5rem;
height: 1.5rem;
.ion-icon;
.sxng-icon-set;
}
// Main LESS-Code
@@ -80,6 +74,12 @@ body {
margin: 0;
}
@supports (height: 100dvh) {
body {
height: 100dvh;
}
}
main {
width: 100%;
margin-bottom: 2rem;
@@ -161,12 +161,22 @@ article[data-vim-selected].category-videos,
article[data-vim-selected].category-news,
article[data-vim-selected].category-map,
article[data-vim-selected].category-music,
article[data-vim-selected].category-files,
article[data-vim-selected].category-social {
border: 1px solid var(--color-result-vim-arrow);
.rounded-corners;
}
.image-label-bottom-right() {
position: absolute;
right: 0;
bottom: 0;
background: var(--color-image-resolution-background);
padding: 0.3rem 0.5rem;
font-size: 0.9rem;
color: var(--color-image-resolution-font);
border-top-left-radius: 0.3rem;
}
.result {
margin: @results-margin 0;
padding: @result-padding;
@@ -176,7 +186,7 @@ article[data-vim-selected].category-social {
h3 {
font-size: 1.2rem;
word-wrap: break-word;
overflow-wrap: break-word;
margin: 0.4rem 0 0.4rem 0;
padding: 0;
@@ -210,7 +220,7 @@ article[data-vim-selected].category-social {
margin: 0;
padding: 0;
max-width: 54em;
word-wrap: break-word;
overflow-wrap: break-word;
line-height: 1.24;
.highlight {
@@ -244,9 +254,8 @@ article[data-vim-selected].category-social {
align-items: center;
font-size: 1rem;
color: var(--color-result-url-font);
flex-wrap: nowrap;
flex-flow: row nowrap;
overflow: hidden;
flex-direction: row;
margin: 0;
padding: 0;
@@ -269,9 +278,7 @@ article[data-vim-selected].category-social {
.url_o2 {
overflow: hidden;
white-space: nowrap;
flex-basis: content;
flex-grow: 0;
flex-shrink: 1;
flex: 0 1 content;
text-align: right;
padding-bottom: 1px;
@@ -296,12 +303,22 @@ article[data-vim-selected].category-social {
color: var(--color-result-description-highlight-font);
}
img.thumbnail {
a.thumbnail_link {
position: relative;
margin-top: 0.6rem;
.ltr-margin-right(1rem);
.ltr-float-left();
padding-top: 0.6rem;
.ltr-padding-right(1rem);
width: 7rem;
height: unset; // remove height value that was needed for lazy loading
img.thumbnail {
width: 7rem;
height: unset; // remove height value that was needed for lazy loading
display: block;
}
.thumbnail_length {
.image-label-bottom-right();
right: 6px;
}
}
.break {
@@ -309,11 +326,11 @@ article[data-vim-selected].category-social {
}
}
.result-paper,
.result-packages {
.attributes {
display: table;
border-spacing: 0.125rem;
margin-top: 0.3rem;
div {
display: table-row;
@@ -347,18 +364,12 @@ article[data-vim-selected].category-social {
font-size: 0.9rem;
margin: 0.25rem 0 0 0;
padding: 0;
word-wrap: break-word;
overflow-wrap: break-word;
line-height: 1.24;
font-style: italic;
}
}
.result-packages {
.attributes {
margin-top: 0.3rem;
}
}
.template_group_images {
display: flex;
flex-wrap: wrap;
@@ -373,7 +384,6 @@ article[data-vim-selected].category-social {
.category-news,
.category-map,
.category-music,
.category-files,
.category-social {
border: 1px solid var(--color-result-border);
margin: 0 @results-tablet-offset 1rem @results-tablet-offset !important;
@@ -398,23 +408,19 @@ article[data-vim-selected].category-social {
}
.result-videos {
img.thumbnail {
.ltr-float-left();
padding-top: 0.6rem;
.ltr-padding-right(1rem);
a.thumbnail_link img.thumbnail {
width: 20rem;
height: unset; // remove height value that was needed for lazy loading
}
}
.result-videos .content {
overflow: hidden;
}
.content {
overflow: hidden;
}
.result-videos .embedded-video iframe {
width: 100%;
aspect-ratio: 16 / 9;
padding: 10px 0 0 0;
.embedded-video iframe {
width: 100%;
aspect-ratio: 16 / 9;
padding: 10px 0 0 0;
}
}
@supports not (aspect-ratio: 1 / 1) {
@@ -472,21 +478,14 @@ article[data-vim-selected].category-social {
padding: 0;
border: none;
height: 100%;
width: 100%;
width: auto;
object-fit: cover;
vertical-align: bottom;
background: var(--color-result-image-background);
}
.image_resolution {
position: absolute;
right: 0;
bottom: 0;
background: var(--color-image-resolution-background);
padding: 0.3rem 0.5rem;
font-size: 0.9rem;
color: var(--color-image-resolution-font);
border-top-left-radius: 0.3rem;
.image-label-bottom-right();
}
span.title,
@@ -546,14 +545,13 @@ article[data-vim-selected].category-social {
margin-bottom: 0;
.ltr-margin-left(@results-offset);
display: grid;
grid-template-columns: @results-width @results-sidebar-width;
grid-template-rows: min-content min-content 1fr min-content;
grid-template:
"corrections sidebar" min-content
"answers sidebar" min-content
"urls sidebar" 1fr
"pagination sidebar" min-content
/ @results-width @results-sidebar-width;
gap: 0 @results-gap;
grid-template-areas:
"corrections sidebar"
"answers sidebar"
"urls sidebar"
"pagination sidebar";
}
#results #sidebar *:first-child {
@@ -571,13 +569,16 @@ article[data-vim-selected].category-social {
#suggestions {
.wrapper {
display: flex;
flex-flow: column;
justify-content: flex-end;
padding-left: 0;
margin: 0;
list-style-position: inside;
li::marker {
color: var(--color-result-link-font);
}
form {
display: inline-block;
flex: 1 1 50%;
}
}
}
@@ -585,8 +586,8 @@ article[data-vim-selected].category-social {
#suggestions,
#infoboxes {
input {
padding: 0;
margin: 3px;
padding: 3px;
margin: 0;
font-size: 0.9em;
display: inline-block;
background: transparent;
@@ -676,10 +677,7 @@ summary.title {
}
.answer-url {
margin-left: auto;
margin-top: 5px;
margin-right: 10px;
margin-bottom: 10px;
margin: 5px 10px 10px auto;
}
}
@@ -691,7 +689,7 @@ summary.title {
#sidebar {
grid-area: sidebar;
word-wrap: break-word;
overflow-wrap: break-word;
color: var(--color-sidebar-font);
.infobox {
@@ -788,7 +786,7 @@ summary.title {
padding: 0.4rem;
margin-left: 0.5rem;
border-radius: 0.3rem;
display: none; // will be shown by JS.
display: none; // will be shown by JS.
}
}
@@ -979,19 +977,18 @@ summary.title {
margin: 0 auto;
justify-content: center;
display: grid;
grid-template-columns: @results-width;
grid-template-rows: min-content min-content min-content 1fr min-content min-content;
grid-template:
"corrections" min-content
"answers" min-content
"sidebar" min-content
"urls" 1fr
"pagination" min-content
/ @results-width;
gap: 0;
grid-template-areas:
"corrections"
"answers"
"sidebar"
"urls"
"pagination";
}
}
@media screen and (max-width: calc(@tablet - 0.5px)) {
@media screen and (width <= calc(@tablet - 0.5px)) {
#links_on_top {
span {
display: none;
@@ -999,7 +996,7 @@ summary.title {
}
}
@media screen and (max-width: 52rem) {
@media screen and (width <= 52rem) {
body.results_endpoint {
#links_on_top {
.link_on_top_about,
@@ -1024,19 +1021,14 @@ summary.title {
#main_results div#results.only_template_images {
margin: 1rem @results-tablet-offset 0 @results-tablet-offset;
display: grid;
grid-template-columns: 100%;
grid-template-rows: min-content min-content min-content 1fr min-content;
grid-template:
"corrections" min-content
"answers" min-content
"sidebar" min-content
"urls" 1fr
"pagination" min-content
/ 100%;
gap: 0;
grid-template-areas:
"corrections"
"answers"
"sidebar"
"urls"
"pagination";
#sidebar {
display: none;
}
#urls {
margin: 0;
@@ -1124,7 +1116,6 @@ summary.title {
display: none;
}
.result-paper,
.result-packages {
.attributes {
display: block;
@@ -1167,3 +1158,10 @@ summary.title {
pre code {
white-space: pre-wrap;
}
// import layouts of the Result types
@import "result_types/keyvalue.less";
@import "result_types/code.less";
@import "result_types/paper.less";
@import "result_types/file.less";
@import "result_types/image.less";

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
// other solution : http://stackoverflow.com/questions/1577598/how-to-hide-parts-of-html-when-javascript-is-disabled/13857783#13857783
// stylelint-disable no-descending-specificity
@@ -156,9 +158,7 @@ div.selectable_url {
td {
padding: 0 1em 0 0;
padding-top: 0;
.ltr-padding-right(1rem);
padding-bottom: 0;
.ltr-padding-left(0);
}
@@ -193,6 +193,15 @@ div.selectable_url {
border-color: var(--color-warning);
}
.dialog-warning-block {
.dialog();
display: block;
color: var(--color-warning);
background: var(--color-warning-background);
border-color: var(--color-warning);
}
.dialog-modal {
.dialog();
@@ -203,7 +212,7 @@ div.selectable_url {
left: 50%;
margin: 0 auto;
transform: translate(-50%, -50%);
z-index: 10000000;
z-index: 5000;
h3 {
margin-top: 0;
@@ -217,8 +226,7 @@ div.selectable_url {
//
.scrollx {
overflow-x: auto;
overflow-y: hidden;
overflow: auto hidden;
display: block;
padding: 0;
margin: 0;
@@ -250,7 +258,7 @@ ul.tabs {
order: 2;
}
& > input[type=radio] {
& > input[type="radio"] {
display: none;
}
@@ -308,7 +316,7 @@ html body .tabs > input:checked {
}
~ label {
position: inherited;
position: inherit;
background: inherit;
border-bottom: 2px solid transparent;
font-weight: normal;
@@ -340,7 +348,7 @@ select {
padding: 0.2rem !important;
color: var(--color-search-font);
font-size: 0.9rem;
z-index: 2;
z-index: 100;
&:hover,
&:focus {
@@ -348,14 +356,13 @@ select {
}
}
@supports ((background-position-x: 100%) and ((appearance: none) or (-webkit-appearance: none) or (-moz-appearance: none))) {
@supports ((background-position-x: 100%) and ((appearance: none))) {
select {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
border-width: 0 2rem 0 0;
border-color: transparent;
background: data-uri('image/svg+xml;charset=UTF-8', @select-light-svg-path) no-repeat;
background: data-uri("image/svg+xml;charset=UTF-8", @select-light-svg-path)
no-repeat;
background-position-x: calc(100% + 2rem);
background-size: 2rem;
background-origin: content-box;
@@ -377,19 +384,23 @@ select {
@media (prefers-color-scheme: dark) {
html.theme-auto select,
html.theme-dark select {
background-image: data-uri('image/svg+xml;charset=UTF-8', @select-dark-svg-path);
background-image: data-uri(
"image/svg+xml;charset=UTF-8",
@select-dark-svg-path
);
}
}
html.theme-dark select {
background-image: data-uri('image/svg+xml;charset=UTF-8', @select-dark-svg-path);
background-image: data-uri(
"image/svg+xml;charset=UTF-8",
@select-dark-svg-path
);
}
}
/* -- checkbox-onoff -- */
input.checkbox-onoff[type="checkbox"] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
cursor: pointer;
display: inline-block;
@@ -414,7 +425,7 @@ input.checkbox-onoff[type="checkbox"] {
border: 1px solid var(--color-btn-background);
border-radius: 12px;
box-shadow: var(--color-btn-background) 0 0 3px;
z-index: 10000;
z-index: 1200;
top: -0.55em;
left: -0.6em;
}
@@ -462,9 +473,7 @@ input.checkbox-onoff.reversed-checkbox[type="checkbox"] {
/* -- checkbox -- */
@supports (transform: rotate(-45deg)) {
input[type=checkbox]:not(.checkbox-onoff) {
-webkit-appearance: none;
-moz-appearance: none;
input[type="checkbox"]:not(.checkbox-onoff) {
appearance: none;
width: 20px;
@@ -477,7 +486,7 @@ input.checkbox-onoff.reversed-checkbox[type="checkbox"] {
.rounded-corners(0.3em);
&::after {
content: '';
content: "";
width: 9px;
height: 5px;
position: absolute;
@@ -498,14 +507,18 @@ input.checkbox-onoff.reversed-checkbox[type="checkbox"] {
}
// disabled : can't be focused, show only the check mark
input[type=checkbox][disabled]:not(.checkbox-onoff) {
input[type="checkbox"][disabled]:not(.checkbox-onoff) {
border: inherit;
background-color: transparent !important;
cursor: inherit;
}
// if not checked and possible to checked then display a "light" check mark on hover
input.checkbox[type=checkbox]:not(:checked):not([disabled]):not(.checkbox-onoff):hover::after {
input.checkbox[type="checkbox"]:not(
:checked,
[disabled],
.checkbox-onoff
):hover::after {
opacity: 0.5;
}
}
@@ -533,33 +546,16 @@ input.checkbox-onoff.reversed-checkbox[type="checkbox"] {
border-right: 0.5em solid var(--color-toolkit-loader-border);
border-bottom: 0.5em solid var(--color-toolkit-loader-border);
border-left: 0.5em solid var(--color-toolkit-loader-borderleft);
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
-webkit-animation: load8 1.2s infinite linear;
animation: load8 1.2s infinite linear;
}
@-webkit-keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@@ -574,7 +570,7 @@ input.checkbox-onoff.reversed-checkbox[type="checkbox"] {
background: var(--color-toolkit-engine-tooltip-background);
font-size: 14px;
font-weight: normal;
z-index: 1000000;
z-index: 5000;
text-align: left;
.rounded-corners;
}
@@ -590,11 +586,7 @@ td:hover .engine-tooltip,
margin: 0;
padding: 0 0.125rem 0 4rem;
width: 100%;
width: -moz-available;
width: -webkit-fill-available;
width: fill;
flex-direction: row;
flex-wrap: nowrap;
flex-flow: row nowrap;
align-items: center;
display: inline-flex;
}
@@ -618,7 +610,7 @@ td:hover .engine-tooltip,
.stacked-bar-chart-base();
background: var(--color-base-font);
border: 1px solid rgba(var(--color-base-font-rgb), 0.9);
border: 1px solid rgb(var(--color-base-font-rgb), 0.9);
padding: 0.3rem 0;
}
@@ -626,7 +618,7 @@ td:hover .engine-tooltip,
.stacked-bar-chart-base();
background: transparent;
border: 1px solid rgba(var(--color-base-font-rgb), 0.3);
border: 1px solid rgb(var(--color-base-font-rgb), 0.3);
padding: 0.3rem 0;
}
@@ -634,7 +626,7 @@ td:hover .engine-tooltip,
.stacked-bar-chart-base();
background: transparent;
border-bottom: 1px dotted rgba(var(--color-base-font-rgb), 0.5);
border-bottom: 1px dotted rgb(var(--color-base-font-rgb), 0.5);
padding: 0;
}
@@ -642,7 +634,7 @@ td:hover .engine-tooltip,
.stacked-bar-chart-base();
background: transparent;
border-left: 1px solid rgba(var(--color-base-font-rgb), 0.9);
border-left: 1px solid rgb(var(--color-base-font-rgb), 0.9);
padding: 0.4rem 0;
width: 1px;
}

View File

@@ -1,3 +1,5 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
.loader,
.loader::after {
border-radius: 50%;
@@ -14,33 +16,16 @@
border-right: 1.1em solid var(--color-loading-indicator);
border-bottom: 1.1em solid var(--color-loading-indicator);
border-left: 1.1em solid var(--color-loading-indicator-gap);
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
-webkit-animation: load8 1.1s infinite linear;
animation: load8 1.1s infinite linear;
}
@-webkit-keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}

View File

@@ -0,0 +1,44 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
#answers .weather {
summary {
display: block;
list-style: none;
}
div.summary {
margin: 0;
padding: 0.5rem 1rem;
background-color: var(--color-header-background);
.rounded-corners-tiny;
}
table {
font-size: 0.9rem;
table-layout: fixed;
margin-top: 0.5rem;
margin-bottom: 0.5rem;
border-collapse: separate;
border-spacing: 0.1em 0;
}
td {
padding: 0;
overflow: hidden;
text-overflow: ellipsis;
}
img.symbol {
width: 5rem;
margin: auto;
display: block;
}
.title {
// background-color: var(--color-result-keyvalue-even);
}
.measured {
// background-color: var(--color-result-keyvalue-odd);
}
}

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<path fill="#58f" d="M11 20.85a.92.92 0 0 1-1.1.93A10 10 0 0 1 2.06 13c-.06-.55.4-1 .95-1h3a1 1 0 0 1 1 1 3 3 0 0 0 3 3 1 1 0 0 1 1 1v3.85Zm6-1.92c0 .77.83 1.23 1.42.74a10 10 0 0 0 2.03-2.32c.39-.61-.09-1.35-.81-1.35H18a1 1 0 0 0-1 1v1.93ZM12 2a10 10 0 0 1 6.65 2.53c.61.55.17 1.47-.65 1.47h-.15A2.85 2.85 0 0 0 15 8.85c0 .33-.18.62-.47.77l-.08.04a1 1 0 0 1-.9 0l-.08-.04a.85.85 0 0 1-.47-.77A2.85 2.85 0 0 0 10.15 6H10a1 1 0 0 1-1-1V3.2c0-.44.28-.84.7-.94C10.45 2.1 11.22 2 12 2Z"/>
<path fill="#58f" d="M3.42 10c-.63 0-1.1-.58-.9-1.18.6-1.8 1.7-3.36 3.12-4.53C6.2 3.82 7 4.26 7 5a3 3 0 0 0 3 3h.15c.47 0 .85.38.85.85 0 1.09.61 2.07 1.58 2.56l.08.04a3 3 0 0 0 2.68 0l.08-.04A2.85 2.85 0 0 0 17 8.85c0-.47.38-.85.85-.85h2.66c.4 0 .77.23.9.6a9.98 9.98 0 0 1 .52 4.6.94.94 0 0 1-.95.8H18a3 3 0 0 0-3 3v3.8c0 .44-.28.84-.7.94l-.2.04a.92.92 0 0 1-1.1-.93V17a3 3 0 0 0-3-3 1 1 0 0 1-1-1 3 3 0 0 0-3-3H3.42Z"/>
</svg>

After

Width:  |  Height:  |  Size: 989 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M248 64C146.39 64 64 146.39 64 248s82.39 184 184 184 184-82.39 184-184S349.61 64 248 64z" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="32"/>
<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M220 220h32v116"/>
<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="32" d="M208 340h88"/>
<path d="M248 130a26 26 0 1026 26 26 26 0 00-26-26z" fill="currentColor" stroke="currentColor" stroke-miterlimit="10" stroke-width="1"/>
</svg>

After

Width:  |  Height:  |  Size: 648 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path d="M368 415.86V72a24.07 24.07 0 00-24-24H72a24.07 24.07 0 00-24 24v352a40.12 40.12 0 0040 40h328" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="32"/>
<path d="M416 464h0a48 48 0 01-48-48V128h72a24 24 0 0124 24v264a48 48 0 01-48 48z" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="32"/>
<path d="M240 128h64M240 192h64M112 256h192M112 320h192M112 384h192" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/>
<path d="M176 208h-64a16 16 0 01-16-16v-64a16 16 0 0116-16h64a16 16 0 0116 16v64a16 16 0 01-16 16z" fill="currentColor" stroke="currentColor" stroke-linejoin="round" stroke-width="1" />
</svg>

After

Width:  |  Height:  |  Size: 787 B

View File

Before

Width:  |  Height:  |  Size: 196 B

After

Width:  |  Height:  |  Size: 196 B

View File

Before

Width:  |  Height:  |  Size: 184 B

After

Width:  |  Height:  |  Size: 184 B

View File

@@ -0,0 +1,84 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/**
* Generate icons.html for the jinja templates of the simple theme.
*/
import { dirname, resolve } from "node:path";
import { argv } from "node:process";
import type { Config as SvgoConfig } from "svgo";
import { type IconSet, type JinjaMacro, jinja_svg_sets } from "./tools/jinja_svg_catalog.ts";
const HERE = `${dirname(argv[1] || "")}/`;
const dest: string = resolve(HERE, "../../searx/templates/simple/icons.html");
const searxng_jinja_macros: JinjaMacro[] = [
{ name: "icon", class: "sxng-icon-set" },
{ name: "icon_small", class: "sxng-icon-set-small" },
{ name: "icon_big", class: "sxng-icon-set-big" }
];
const sxng_icon_opts: SvgoConfig = {
multipass: true,
plugins: [
"removeTitle",
"removeXMLNS",
{
name: "addAttributesToSVGElement",
params: {
attributes: [{ "aria-hidden": "true" }]
}
}
]
};
const simple_icons: IconSet[] = [
{
base: resolve(HERE, "node_modules/ionicons/dist/svg"),
set: {
alert: "alert-outline.svg",
appstore: "apps-outline.svg",
book: "book-outline.svg",
close: "close-outline.svg",
download: "download-outline.svg",
"ellipsis-vertical": "ellipsis-vertical-outline.svg",
"file-tray-full": "file-tray-full-outline.svg",
film: "film-outline.svg",
globe: "globe-outline.svg",
heart: "heart-outline.svg",
image: "image-outline.svg",
layers: "layers-outline.svg",
leecher: "arrow-down.svg",
location: "location-outline.svg",
magnet: "magnet-outline.svg",
"musical-notes": "musical-notes-outline.svg",
"navigate-down": "chevron-down-outline.svg",
"navigate-left": "chevron-back-outline.svg",
"navigate-right": "chevron-forward-outline.svg",
"navigate-up": "chevron-up-outline.svg",
people: "people-outline.svg",
play: "play-outline.svg",
radio: "radio-outline.svg",
save: "save-outline.svg",
school: "school-outline.svg",
search: "search-outline.svg",
seeder: "swap-vertical.svg",
settings: "settings-outline.svg",
tv: "tv-outline.svg"
},
svgo_opts: sxng_icon_opts
},
// some of the ionicons are not suitable for a dark theme, we fixed the svg
// manually in src/svg/ionicons
// - https://github.com/searxng/searxng/pull/4284#issuecomment-2680550342
{
base: resolve(HERE, "src/svg/ionicons"),
set: {
"information-circle": "information-circle-outline.svg",
newspaper: "newspaper-outline.svg"
},
svgo_opts: sxng_icon_opts
}
];
jinja_svg_sets(dest, searxng_jinja_macros, simple_icons);

View File

@@ -0,0 +1,69 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import fs from "node:fs";
import path from "node:path";
import sharp from "sharp";
import type { Config } from "svgo";
import { optimize as svgo } from "svgo";
// Mapping of src to dest
export type Src2Dest = {
// Name of the source file.
src: string;
// Name of the destination file.
dest: string;
};
/**
* Convert a list of SVG files to PNG.
*
* @param items - Array of SVG files (src: SVG, dest:PNG) to convert.
* @param width - (optional) width of the PNG pictures
* @param height - (optional) height of the PNG pictures.
*/
export const svg2png = (items: Src2Dest[], width?: number, height?: number): void => {
for (const item of items) {
fs.mkdirSync(path.dirname(item.dest), { recursive: true });
sharp(item.src)
.png({
force: true,
compressionLevel: 9,
palette: true
})
.resize(width, height, {
fit: "contain"
})
.toFile(item.dest)
.then((info) => {
console.log(`[svg2png] created ${item.dest} -- bytes: ${info.size}, w:${info.width}px, h:${info.height}px`);
})
.catch((error) => {
console.error(`ERROR: ${item.dest} -- ${error}`);
throw error;
});
}
};
/**
* Optimize SVG images for WEB.
*
* @param items - Array of SVG files (src:SVG, dest:SVG) to optimize.
* @param svgo_opts - Options passed to svgo.
*/
export const svg2svg = (items: Src2Dest[], svgo_opts: Config): void => {
for (const item of items) {
try {
fs.mkdirSync(path.dirname(item.dest), { recursive: true });
const raw = fs.readFileSync(item.src, "utf8");
const opt = svgo(raw, svgo_opts);
fs.writeFileSync(item.dest, opt.data);
console.log(`[svg2svg] optimized: ${item.dest} -- src: ${item.src}`);
} catch (error) {
console.error(`ERROR: optimize src: ${item.src} -- ${error}`);
throw error;
}
}
};

View File

@@ -0,0 +1,28 @@
{{--
SPDX-License-Identifier: AGPL-3.0-or-later
This is a EDGE https://edgejs.dev/ template to generate a HTML Jinja template
for the backend. Example output of this EDGE template:
- https://github.com/searxng/searxng/blob/master/searx/templates/simple/icons.html
--}}
{#
Catalog of SVG symbols that can be inserted into the HTML output of a Jinja
template. This file from:
client/simple/tools/icon_catalog.edge.html
#}
{%-
set catalog = {
@each((svg, name) in svg_catalog)
'{{{name}}}' : '{{{svg}}}',
@end
}
-%}
@each(macro in macros)
{% macro {{ macro.name }}(action, alt) -%}
{{ open_curly_brace }} catalog[action] | replace("{{__jinja_class_placeholder__}}", "{{ macro.class }}") | safe {{ close_curly_brace }}
{%- endmacro %}
@end

View File

@@ -0,0 +1,118 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import fs from "node:fs";
import { dirname, resolve } from "node:path";
import { Edge } from "edge.js";
import { type Config as SvgoConfig, optimize as svgo } from "svgo";
const __jinja_class_placeholder__ = "__jinja_class_placeholder__";
// A set of icons
export type IconSet = {
// Object of SVG icons, where property name is the name of the icon and value is the src of the SVG (relative to base)
set: Record<string, string>;
// Folder in which the SVG src files are located
base: string;
// svgo options for this set
svgo_opts: SvgoConfig;
};
// Mapping of icon name to SVG source file
type IconSVG = {
// Name of the icon isource file
name: string;
// Name of the destination file
src: string;
// Options passed to svgo
svgo_opts: SvgoConfig;
};
// Arguments to create a jinja macro
export type JinjaMacro = {
// Name of the jinja macro
name: string;
// SVG's class name (value of XML class attribute)
class: string;
};
/**
* Generate a jinja template with a catalog of SVG icons that can be
* used in other HTML jinja templates.
*
* @param dest - filename of the generate jinja template.
* @param macros - Jinja macros to create.
* @param items - Array of SVG items.
*/
export const jinja_svg_catalog = (dest: string, macros: JinjaMacro[], items: IconSVG[]): void => {
const svg_catalog: Record<string, string> = {};
const edge_template = resolve(import.meta.dirname, "jinja_svg_catalog.html.edge");
for (const item of items) {
// JSON.stringify & JSON.parse are used to create a deep copy of the item.svgo_opts object
const svgo_opts: SvgoConfig = JSON.parse(JSON.stringify(item.svgo_opts));
svgo_opts.plugins?.push({
name: "addClassesToSVGElement",
params: {
classNames: [__jinja_class_placeholder__]
}
});
try {
const raw = fs.readFileSync(item.src, "utf8");
const opt = svgo(raw, svgo_opts);
svg_catalog[item.name] = opt.data;
} catch (error) {
console.error(`ERROR: jinja_svg_catalog processing ${item.name} src: ${item.src} -- ${error}`);
throw error;
}
}
fs.mkdirSync(dirname(dest), { recursive: true });
const ctx = {
svg_catalog: svg_catalog,
macros: macros,
edge_template: edge_template,
__jinja_class_placeholder__: __jinja_class_placeholder__,
// see https://github.com/edge-js/edge/issues/162
open_curly_brace: "{{",
close_curly_brace: "}}"
};
const jinjatmpl = Edge.create().renderRawSync(fs.readFileSync(edge_template, "utf-8"), ctx);
fs.writeFileSync(dest, jinjatmpl);
console.log(`[jinja_svg_catalog] created: ${dest}`);
};
/**
* Calls jinja_svg_catalog for a collection of icon sets where each set has its
* own parameters.
*
* @param dest - filename of the generate jinja template.
* @param macros - Jinja macros to create.
* @param sets - Array of SVG sets.
*/
export const jinja_svg_sets = (dest: string, macros: JinjaMacro[], sets: IconSet[]): void => {
const items: IconSVG[] = [];
const all: string[] = [];
for (const obj of sets) {
for (const [name, file] of Object.entries(obj.set)) {
if (all.includes(name)) {
throw new Error(`ERROR: ${name} has already been defined`);
}
all.push(name);
items.push({
name: name,
src: resolve(obj.base, file),
svgo_opts: obj.svgo_opts
});
}
}
jinja_svg_catalog(dest, macros, items);
};

View File

@@ -0,0 +1,47 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/**
* Custom vite plugins to build the web-client components of the simple theme.
*
* HINT:
* This is an initial implementation for the migration of the build process
* from grunt to vite. For fully support (vite: build & serve) more work is
* needed.
*/
import type { Config } from "svgo";
import type { Plugin } from "vite";
import { type Src2Dest, svg2png, svg2svg } from "./img.ts";
/**
* Vite plugin to convert a list of SVG files to PNG.
*
* @param items - Array of SVG files (src: SVG, dest:PNG) to convert.
* @param width - (optional) width of the PNG picture
* @param height - (optional) height of the PNG picture
*/
export const plg_svg2png = (items: Src2Dest[], width?: number, height?: number): Plugin => {
return {
name: "searxng-simple-svg2png",
apply: "build",
writeBundle: () => {
svg2png(items, width, height);
}
};
};
/**
* Vite plugin to optimize SVG images for WEB.
*
* @param items - Array of SVG files (src:SVG, dest:SVG) to optimize.
* @param svgo_opts - Options passed to svgo.
*/
export const plg_svg2svg = (items: Src2Dest[], svgo_opts: Config): Plugin => {
return {
name: "searxng-simple-svg2svg",
apply: "build",
writeBundle: () => {
svg2svg(items, svgo_opts);
}
};
};

View File

@@ -0,0 +1,39 @@
{
"$schema": "https://json.schemastore.org/tsconfig.json",
"compilerOptions": {
"lib": ["DOM", "DOM.Iterable", "ES2022"],
"module": "ESNext",
"moduleResolution": "Bundler",
"target": "ES2022",
"allowImportingTsExtensions": true,
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"incremental": true,
"noEmit": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"strict": true,
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"exactOptionalPropertyTypes": false,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true,
"noFallthroughCasesInSwitch": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noPropertyAccessFromIndexSignature": false,
"noUncheckedIndexedAccess": true,
"noUncheckedSideEffectImports": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"verbatimModuleSyntax": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.tsbuildinfo",
"types": ["vite/client"]
},
"include": ["./"],
"exclude": ["./node_modules/"]
}

View File

@@ -0,0 +1,210 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
/**
* CONFIG: https://vite.dev/config/
*/
import { resolve } from "node:path";
import { constants as zlibConstants } from "node:zlib";
import browserslistToEsbuild from "browserslist-to-esbuild";
import { browserslistToTargets } from "lightningcss";
import type { PreRenderedAsset } from "rolldown";
import type { Config } from "svgo";
import type { UserConfig } from "vite";
import analyzer from "vite-bundle-analyzer";
import manifest from "./package.json" with { type: "json" };
import { plg_svg2png, plg_svg2svg } from "./tools/plg.ts";
const ROOT = "../../"; // root of the git repository
const PATH = {
brand: "src/brand/",
dist: resolve(ROOT, "searx/static/themes/simple/"),
modules: "node_modules/",
src: "src/",
templates: resolve(ROOT, "searx/templates/simple/")
} as const;
const svg2svg_opts: Config = {
plugins: [{ name: "preset-default" }, "sortAttrs", "convertStyleToAttrs"]
};
const svg2svg_favicon_opts: Config = {
plugins: [{ name: "preset-default" }, "sortAttrs"]
};
export default {
base: "./",
publicDir: "static/",
build: {
target: browserslistToEsbuild(manifest.browserslist),
assetsDir: "",
outDir: PATH.dist,
manifest: "manifest.json",
emptyOutDir: true,
sourcemap: true,
rolldownOptions: {
input: {
// entrypoint
core: `${PATH.src}/js/index.ts`,
// stylesheets
ltr: `${PATH.src}/less/style-ltr.less`,
rtl: `${PATH.src}/less/style-rtl.less`,
rss: `${PATH.src}/less/rss.less`
},
// file naming conventions / pathnames are relative to outDir (PATH.dist)
output: {
entryFileNames: "sxng-[name].min.js",
chunkFileNames: "chunk/[hash].min.js",
assetFileNames: ({ names }: PreRenderedAsset): string => {
const [name] = names;
switch (name?.split(".").pop()) {
case "css":
return "sxng-[name].min[extname]";
default:
return "sxng-[name][extname]";
}
},
sanitizeFileName: (name: string): string => {
return name
.normalize("NFD")
.replace(/[^a-zA-Z0-9.-]/g, "_")
.toLowerCase();
},
comments: {
legal: true
}
}
}
}, // end: build
plugins: [
// -- bundle analyzer
analyzer({
enabled: process.env.VITE_BUNDLE_ANALYZE === "true",
analyzerPort: "auto",
summary: true,
reportTitle: manifest.name,
// sidecars with max compression
gzipOptions: {
level: zlibConstants.Z_BEST_COMPRESSION
},
brotliOptions: {
params: {
[zlibConstants.BROTLI_PARAM_QUALITY]: zlibConstants.BROTLI_MAX_QUALITY
}
}
}),
// -- svg images
plg_svg2svg(
[
{
src: `${PATH.src}/svg/empty_favicon.svg`,
dest: `${PATH.dist}/img/empty_favicon.svg`
},
{
src: `${PATH.src}/svg/select-dark.svg`,
dest: `${PATH.dist}/img/select-dark.svg`
},
{
src: `${PATH.src}/svg/select-light.svg`,
dest: `${PATH.dist}/img/select-light.svg`
}
],
svg2svg_opts
),
// SearXNG brand (static)
plg_svg2png([
{
src: `${PATH.brand}/searxng-wordmark.svg`,
dest: `${PATH.dist}/img/favicon.png`
},
{
src: `${PATH.brand}/searxng.svg`,
dest: `${PATH.dist}/img/searxng.png`
}
]),
// SearXNG PWA Icons (static)
plg_svg2png(
[
{
src: `${PATH.brand}/searxng-wordmark.svg`,
dest: `${PATH.dist}/img/512.png`
}
],
512,
512
),
plg_svg2png(
[
{
src: `${PATH.brand}/searxng-wordmark.svg`,
dest: `${PATH.dist}/img/192.png`
}
],
192,
192
),
// -- svg
plg_svg2svg(
[
{
src: `${PATH.brand}/searxng.svg`,
dest: `${PATH.dist}/img/searxng.svg`
},
{
src: `${PATH.brand}/img_load_error.svg`,
dest: `${PATH.dist}/img/img_load_error.svg`
}
],
svg2svg_opts
),
// -- favicon
plg_svg2svg(
[
{
src: `${PATH.brand}/searxng-wordmark.svg`,
dest: `${PATH.dist}/img/favicon.svg`
}
],
svg2svg_favicon_opts
),
// -- simple templates
plg_svg2svg(
[
{
src: `${PATH.brand}/searxng-wordmark.svg`,
dest: `${PATH.templates}/searxng-wordmark.min.svg`
}
],
svg2svg_opts
)
], // end: plugins
// FIXME: missing CCS sourcemaps!!
// see: https://github.com/vitejs/vite/discussions/13845#discussioncomment-11992084
//
// what I have tried so far (see config below):
//
// - build.sourcemap
// - esbuild.sourcemap
// - css.preprocessorOptions.less.sourceMap
css: {
transformer: "lightningcss",
lightningcss: {
targets: browserslistToTargets(manifest.browserslist)
},
devSourcemap: true
} // end: css
} satisfies UserConfig;

15
container/.env.example Normal file
View File

@@ -0,0 +1,15 @@
# Read the documentation before using the `docker-compose.yml` file:
# https://docs.searxng.org/admin/installation-docker.html
#
# Additional ENVs:
# https://docs.searxng.org/admin/settings/settings_general.html#settings-general
# https://docs.searxng.org/admin/settings/settings_server.html#settings-server
# Use a specific version tag. E.g. "latest" or "2026.3.25-541c6c3cb".
#SEARXNG_VERSION=latest
# Listen to a specific address.
#SEARXNG_HOST=[::]
# Listen to a specific port.
#SEARXNG_PORT=8080

View File

@@ -0,0 +1,31 @@
FROM docker.io/searxng/base:searxng-builder AS builder
COPY ./requirements.txt ./requirements-server.txt ./
ENV UV_NO_MANAGED_PYTHON="true"
ENV UV_NATIVE_TLS="true"
ARG TIMESTAMP_VENV="0"
RUN --mount=type=cache,id=uv,target=/root/.cache/uv set -eux -o pipefail; \
export SOURCE_DATE_EPOCH="$TIMESTAMP_VENV"; \
uv venv; \
uv pip install --requirements ./requirements.txt --requirements ./requirements-server.txt; \
uv cache prune --ci; \
find ./.venv/lib/ -type f -exec strip --strip-unneeded {} + || true; \
find ./.venv/lib/ -type d -name "__pycache__" -exec rm -rf {} +; \
find ./.venv/lib/ -type f -name "*.pyc" -delete; \
python -m compileall -q -f -j 0 --invalidation-mode=unchecked-hash ./.venv/lib/; \
find ./.venv/lib/python*/site-packages/*.dist-info/ -type f -name "RECORD" -exec sort -t, -k1,1 -o {} {} \;; \
find ./.venv/ -exec touch -h --date="@$TIMESTAMP_VENV" {} +
COPY --exclude=./searx/version_frozen.py ./searx/ ./searx/
RUN set -eux -o pipefail; \
python -m compileall -q -f -j 0 --invalidation-mode=unchecked-hash ./searx/; \
find ./searx/static/ -type f \
\( -name "*.html" -o -name "*.css" -o -name "*.js" -o -name "*.svg" \) \
-exec gzip -9 -k {} + \
-exec brotli -9 -k {} + \
-exec gzip --test {}.gz + \
-exec brotli --test {}.br +

44
container/dist.dockerfile Normal file
View File

@@ -0,0 +1,44 @@
ARG CONTAINER_IMAGE_ORGANIZATION="searxng"
ARG CONTAINER_IMAGE_NAME="searxng"
FROM localhost/$CONTAINER_IMAGE_ORGANIZATION/$CONTAINER_IMAGE_NAME:builder AS builder
FROM docker.io/searxng/base:searxng AS dist
COPY --chown=977:977 --from=builder /usr/local/searxng/.venv/ ./.venv/
COPY --chown=977:977 --from=builder /usr/local/searxng/searx/ ./searx/
COPY --chown=977:977 ./container/ ./
COPY --chown=977:977 ./searx/version_frozen.py ./searx/
ARG CREATED="0001-01-01T00:00:00Z"
ARG VERSION="unknown"
ARG VCS_URL="unknown"
ARG VCS_REVISION="unknown"
LABEL org.opencontainers.image.created="$CREATED" \
org.opencontainers.image.description="SearXNG is a metasearch engine. Users are neither tracked nor profiled." \
org.opencontainers.image.documentation="https://docs.searxng.org/admin/installation-docker" \
org.opencontainers.image.licenses="AGPL-3.0-or-later" \
org.opencontainers.image.revision="$VCS_REVISION" \
org.opencontainers.image.source="$VCS_URL" \
org.opencontainers.image.title="SearXNG" \
org.opencontainers.image.url="https://searxng.org" \
org.opencontainers.image.version="$VERSION"
ENV __SEARXNG_VERSION="$VERSION" \
__SEARXNG_SETTINGS_PATH="$__SEARXNG_CONFIG_PATH/settings.yml" \
GRANIAN_PROCESS_NAME="searxng" \
GRANIAN_INTERFACE="wsgi" \
GRANIAN_HOST="::" \
GRANIAN_PORT="8080" \
GRANIAN_WEBSOCKETS="false" \
GRANIAN_BLOCKING_THREADS="4" \
GRANIAN_WORKERS_KILL_TIMEOUT="30s" \
GRANIAN_BLOCKING_THREADS_IDLE_TIMEOUT="5m"
# "*_PATH" ENVs are defined in base images
VOLUME $__SEARXNG_CONFIG_PATH
VOLUME $__SEARXNG_DATA_PATH
EXPOSE 8080
ENTRYPOINT ["/usr/local/searxng/entrypoint.sh"]

View File

@@ -0,0 +1,28 @@
# Read the documentation before using the `docker-compose.yml` file:
# https://docs.searxng.org/admin/installation-docker.html
name: searxng
services:
core:
container_name: searxng-core
image: docker.io/searxng/searxng:${SEARXNG_VERSION:-latest}
restart: always
ports:
- ${SEARXNG_HOST:+${SEARXNG_HOST}:}${SEARXNG_PORT:-8080}:${SEARXNG_PORT:-8080}
env_file: ./.env
volumes:
- ./core-config/:/etc/searxng/:Z
- core-data:/var/cache/searxng/
valkey:
container_name: searxng-valkey
image: docker.io/valkey/valkey:9-alpine
command: valkey-server --save 30 1 --loglevel warning
restart: always
volumes:
- valkey-data:/data/
volumes:
core-data:
valkey-data:

117
container/entrypoint.sh Executable file
View File

@@ -0,0 +1,117 @@
#!/bin/sh
# shellcheck shell=dash
set -u
# Check if it's a valid file
check_file() {
local target="$1"
if [ ! -f "$target" ]; then
cat <<EOF
!!!
!!! ERROR
!!! "$target" is not a valid file, exiting...
!!!
EOF
exit 127
fi
}
# Check if it's a valid directory
check_directory() {
local target="$1"
if [ ! -d "$target" ]; then
cat <<EOF
!!!
!!! ERROR
!!! "$target" is not a valid directory, exiting...
!!!
EOF
exit 127
fi
}
setup_ownership() {
local target="$1"
local type="$2"
case "$type" in
file | directory) ;;
*)
cat <<EOF
!!!
!!! ERROR
!!! "$type" is not a valid type, exiting...
!!!
EOF
exit 1
;;
esac
target_ownership=$(stat -c %U:%G "$target")
if [ "$target_ownership" != "searxng:searxng" ]; then
if [ "${FORCE_OWNERSHIP:-true}" = true ] && [ "$(id -u)" -eq 0 ]; then
chown -R searxng:searxng "$target"
else
cat <<EOF
!!!
!!! WARNING
!!! "$target" $type is not owned by "searxng:searxng"
!!! This may cause issues when running SearXNG
!!!
!!! Expected "searxng:searxng"
!!! Got "$target_ownership"
!!!
EOF
fi
fi
}
# Handle volume mounts
volume_handler() {
local target="$1"
check_directory "$target"
setup_ownership "$target" "directory"
}
setup() {
local template_settings="/usr/local/searxng/settings.template.yml"
local target_settings="$__SEARXNG_CONFIG_PATH/settings.yml"
if [ ! -f "$target_settings" ]; then
cat <<EOF
...
... INFORMATION
... "$target_settings" does not exist, creating from template...
...
EOF
cp -pfT "$template_settings" "$target_settings"
sed -i "s/ultrasecretkey/$(head -c 24 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9')/g" "$target_settings"
fi
check_file "$target_settings"
}
cat <<EOF
SearXNG $__SEARXNG_VERSION
EOF
# Check for volume mounts
volume_handler "$__SEARXNG_CONFIG_PATH"
volume_handler "$__SEARXNG_DATA_PATH"
setup
# root only features
if [ "$(id -u)" -eq 0 ]; then
update-ca-certificates
fi
# ENVs aliases
export GRANIAN_PORT="${SEARXNG_PORT:-$GRANIAN_PORT}"
exec /usr/local/searxng/.venv/bin/granian searx.webapp:app

View File

@@ -0,0 +1,8 @@
# Read the documentation before extending the defaults:
# https://docs.searxng.org/admin/settings/
use_default_settings: true
server:
secret_key: "ultrasecretkey"
image_proxy: true

View File

@@ -1,178 +0,0 @@
#!/bin/sh
help() {
cat <<EOF
Command line:
-h Display this help
-d Dry run to update the configuration files.
-f Always update on the configuration files (existing files are renamed with
the .old suffix). Without this option, the new configuration files are
copied with the .new suffix
Environment variables:
INSTANCE_NAME settings.yml : general.instance_name
AUTOCOMPLETE settings.yml : search.autocomplete
BASE_URL settings.yml : server.base_url
MORTY_URL settings.yml : result_proxy.url
MORTY_KEY settings.yml : result_proxy.key
BIND_ADDRESS uwsgi bind to the specified TCP socket using HTTP protocol.
Default value: ${DEFAULT_BIND_ADDRESS}
Volume:
/etc/searxng the docker entry point copies settings.yml and uwsgi.ini in
this directory (see the -f command line option)"
EOF
}
export DEFAULT_BIND_ADDRESS="0.0.0.0:8080"
export BIND_ADDRESS="${BIND_ADDRESS:-${DEFAULT_BIND_ADDRESS}}"
# Parse command line
FORCE_CONF_UPDATE=0
DRY_RUN=0
while getopts "fdh" option
do
case $option in
f) FORCE_CONF_UPDATE=1 ;;
d) DRY_RUN=1 ;;
h)
help
exit 0
;;
*)
echo "unknow option ${option}"
exit 42
;;
esac
done
get_searxng_version(){
su searxng -c \
'python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)"' \
2>/dev/null
}
SEARXNG_VERSION="$(get_searxng_version)"
export SEARXNG_VERSION
echo "SearXNG version ${SEARXNG_VERSION}"
# helpers to update the configuration files
patch_uwsgi_settings() {
CONF="$1"
# update uwsg.ini
sed -i \
-e "s|workers = .*|workers = ${UWSGI_WORKERS:-%k}|g" \
-e "s|threads = .*|threads = ${UWSGI_THREADS:-4}|g" \
"${CONF}"
}
patch_searxng_settings() {
CONF="$1"
# Make sure that there is trailing slash at the end of BASE_URL
# see https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion
export BASE_URL="${BASE_URL%/}/"
# update settings.yml
sed -i \
-e "s|base_url: false|base_url: ${BASE_URL}|g" \
-e "s/instance_name: \"SearXNG\"/instance_name: \"${INSTANCE_NAME}\"/g" \
-e "s/autocomplete: \"\"/autocomplete: \"${AUTOCOMPLETE}\"/g" \
-e "s/ultrasecretkey/$(openssl rand -hex 32)/g" \
"${CONF}"
# Morty configuration
if [ -n "${MORTY_KEY}" ] && [ -n "${MORTY_URL}" ]; then
sed -i -e "s/image_proxy: false/image_proxy: true/g" \
"${CONF}"
cat >> "${CONF}" <<-EOF
# Morty configuration
result_proxy:
url: ${MORTY_URL}
key: !!binary "${MORTY_KEY}"
EOF
fi
}
update_conf() {
FORCE_CONF_UPDATE=$1
CONF="$2"
NEW_CONF="${2}.new"
OLD_CONF="${2}.old"
REF_CONF="$3"
PATCH_REF_CONF="$4"
if [ -f "${CONF}" ]; then
if [ "${REF_CONF}" -nt "${CONF}" ]; then
# There is a new version
if [ "$FORCE_CONF_UPDATE" -ne 0 ]; then
# Replace the current configuration
printf '⚠️ Automatically update %s to the new version\n' "${CONF}"
if [ ! -f "${OLD_CONF}" ]; then
printf 'The previous configuration is saved to %s\n' "${OLD_CONF}"
mv "${CONF}" "${OLD_CONF}"
fi
cp "${REF_CONF}" "${CONF}"
$PATCH_REF_CONF "${CONF}"
else
# Keep the current configuration
printf '⚠️ Check new version %s to make sure SearXNG is working properly\n' "${NEW_CONF}"
cp "${REF_CONF}" "${NEW_CONF}"
$PATCH_REF_CONF "${NEW_CONF}"
fi
else
printf 'Use existing %s\n' "${CONF}"
fi
else
printf 'Create %s\n' "${CONF}"
cp "${REF_CONF}" "${CONF}"
$PATCH_REF_CONF "${CONF}"
fi
}
# searx compatibility: copy /etc/searx/* to /etc/searxng/*
SEARX_CONF=0
if [ -f "/etc/searx/settings.yml" ]; then
if [ ! -f "${SEARXNG_SETTINGS_PATH}" ]; then
printf '⚠️ /etc/searx/settings.yml is copied to /etc/searxng\n'
cp "/etc/searx/settings.yml" "${SEARXNG_SETTINGS_PATH}"
fi
SEARX_CONF=1
fi
if [ -f "/etc/searx/uwsgi.ini" ]; then
printf '⚠️ /etc/searx/uwsgi.ini is ignored. Use the volume /etc/searxng\n'
SEARX_CONF=1
fi
if [ "$SEARX_CONF" -eq "1" ]; then
printf '⚠️ The deprecated volume /etc/searx is mounted. Please update your configuration to use /etc/searxng ⚠️\n'
cat << EOF > /etc/searx/deprecated_volume_read_me.txt
This Docker image uses the volume /etc/searxng
Update your configuration:
* remove uwsgi.ini (or very carefully update your existing uwsgi.ini using https://github.com/searxng/searxng/blob/master/dockerfiles/uwsgi.ini )
* mount /etc/searxng instead of /etc/searx
EOF
fi
# end of searx compatibility
# make sure there are uwsgi settings
update_conf "${FORCE_CONF_UPDATE}" "${UWSGI_SETTINGS_PATH}" "/usr/local/searxng/dockerfiles/uwsgi.ini" "patch_uwsgi_settings"
# make sure there are searxng settings
update_conf "${FORCE_CONF_UPDATE}" "${SEARXNG_SETTINGS_PATH}" "/usr/local/searxng/searx/settings.yml" "patch_searxng_settings"
# dry run (to update configuration files, then inspect them)
if [ $DRY_RUN -eq 1 ]; then
printf 'Dry run\n'
exit
fi
unset MORTY_KEY
# Start uwsgi
printf 'Listen on %s\n' "${BIND_ADDRESS}"
exec uwsgi --master --uid searxng --gid searxng --http-socket "${BIND_ADDRESS}" "${UWSGI_SETTINGS_PATH}"

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