Compare commits

..

1006 commits

Author SHA1 Message Date
Spencer
dae9f31b19
Merge pull request #629 from neon-mmd/FEAT/427_export-import-settings-to-and-from-a-json-file-support-for-the-ui
 Export/Import settings to and from a `json` file support for the UI
2025-01-18 02:37:05 +00:00
Spencerjibz
fa57233e5d
use cows just as before 2025-01-18 01:45:38 +00:00
Spencerjibz
765dcbda5c
Revert "♻️ refactor(API): provide a minor redesign to the internal api to support parsing of json data (#427)"
This reverts commit 729c550688.
2025-01-17 23:12:09 +00:00
Spencerjibz
14d8bf9fde
rebase and merge conflicts 2025-01-17 22:59:08 +00:00
codefactor-io
04cac02f3d
[CodeFactor] Apply fixes 2025-01-17 22:15:30 +00:00
neon_arch
cca1115b0f
🔖 chore(release): bump the app version (#427) 2025-01-17 22:15:28 +00:00
neon_arch
729c550688
♻️ refactor(API): provide a minor redesign to the internal api to support parsing of json data (#427) 2025-01-17 22:12:35 +00:00
neon_arch
dc34d51877
feat(routes): add new route /download & update the /settings route to handle post requests (#427)
- Add a new route `/download` which handles the export functionality of
  the user preferences as a `json` file.
- Update the `/settings` route to handle post requests for handling the
  import functionality of the user preferences. Also, taking care of the
  sanitization of the user provided `json` values.
2025-01-17 22:12:34 +00:00
neon_arch
b911eaec54
💄 feat(UI): provide a theme for the buttons (#427) 2025-01-17 22:12:34 +00:00
neon_arch
07370f7238
💄 feat(UI): add buttons for exporting & importing json preferences file (#427) 2025-01-17 22:12:33 +00:00
neon_arch
5280806b7e
build(deps): add the actix-multipart dependency (#427) 2025-01-17 22:12:11 +00:00
dependabot[bot]
a3d5ca0112
build(deps): bump async-once-cell from 0.5.3 to 0.5.4 (#643) 2025-01-15 19:23:23 +00:00
dependabot[bot]
82e7669310
build(deps): bump env_logger from 0.11.5 to 0.11.6 (#644) 2025-01-15 19:18:27 +00:00
dependabot[bot]
5ea1372f91
build(deps): bump itertools from 0.13.0 to 0.14.0 (#645) 2025-01-15 19:13:37 +00:00
dependabot[bot]
94a364daad
build(deps): bump tokio from 1.41.0 to 1.43.0 (#649) 2025-01-14 19:30:17 +00:00
dependabot[bot]
05a8ee5281
build(deps): bump serde_json from 1.0.128 to 1.0.134 (#647) 2025-01-14 19:25:07 +00:00
Zsombor
ca6b271bc9
Add Wikipedia as a search engine (#633)
Currently, it only search in the English wikipedia, but it can be
customized to use different ones.

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2024-12-24 20:49:27 +00:00
Jann Marc Villablanca
ab126b9d70
👽 fix: mojeek parser update due to upstream breaking api changes (#640) 2024-12-13 23:40:16 +03:00
Evan Yang
2e64fd5cbc
feat(config): config option to use operating system certificates alongside rustls certificates (#620)
* TLS certificates

* 🚨 fix: make cargo checks happy (#523)

* 🚨 fix: make cargo format checks happy (#557)

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2024-12-05 23:09:01 +03:00
dependabot[bot]
ce5c794ce2
build(deps): bump blake3 from 1.5.4 to 1.5.5 (#638) 2024-12-02 20:35:45 +00:00
dependabot[bot]
ac4adab00b
build(deps): bump serde from 1.0.210 to 1.0.215 (#637) 2024-12-02 20:24:15 +00:00
dependabot[bot]
0715c2226b
build(deps): bump keyword_extraction from 1.4.3 to 1.5.0 (#636) 2024-12-02 20:19:05 +00:00
dependabot[bot]
fe796c676e
build(deps): bump scraper from 0.20.0 to 0.21.0 (#635) 2024-12-02 20:11:58 +00:00
dependabot[bot]
ba78d8e2c8
build(deps): bump tempfile from 3.13.0 to 3.14.0 (#634) 2024-12-02 19:25:46 +00:00
mergify[bot]
cac82d1986
👷 ci(mergify): upgrade configuration to the new format (#632)
Co-authored-by: Mergify <37929162+mergify[bot]@users.noreply.github.com>
2024-12-02 22:15:36 +03:00
Jorge Botto
ef0ae2f0aa
Fixing Librex SearchResultParser results selector (#619) 2024-11-02 15:36:14 +00:00
dependabot[bot]
4fa9a7491e
build(deps): bump regex from 1.11.0 to 1.11.1 (#628) 2024-11-02 13:14:02 +00:00
dependabot[bot]
e08c0754f8
build(deps): bump redis from 0.27.2 to 0.27.5 (#627) 2024-11-02 13:08:35 +00:00
dependabot[bot]
ee4bc00576
build(deps): bump futures from 0.3.30 to 0.3.31 (#626) 2024-11-02 13:03:31 +00:00
dependabot[bot]
d75e7d07ec
build(deps): bump actix-governor from 0.6.0 to 0.7.0 (#625) 2024-11-02 11:32:26 +00:00
dependabot[bot]
718e172b6d
build(deps): bump tokio from 1.40.0 to 1.41.0 (#624) 2024-11-02 11:27:27 +00:00
Laptop
56bfcbba0e
less javascript (#621) 2024-10-18 10:16:32 +00:00
neon_arch
d52da3aeb4
Clear button for the search bar (#608)
* feat(icons): add a new icon for clear button on the search bar (#394)

*  feat: add clear button near the search bar input field (#394)

*  feat: add a function to clear search input text on click event (#394)

*  feat: disable unstable webkit search and clear button (#394)

* 🔖 chore(release): bump the app version (#394)

* 🩹 fix: rename the pseudo css selector according to the `mdn` docs (#394)

Co-authored-by: Jann Marc Villablanca <31008330+jfvillablanca@users.noreply.github.com>

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Jann Marc Villablanca <31008330+jfvillablanca@users.noreply.github.com>
2024-10-08 12:09:41 +00:00
Zacherina
42c30aaaba
🐛 fix(search): Resolve random delay condition during search for individual/non-production self-hosted server (#617) 2024-10-07 02:58:06 +03:00
Jurijs Bibicevs
959d0c52b1
♻️ refactor: replace deprecated per_second with seconds_per_request in rate-limiting middleware code (#616) 2024-10-06 19:30:11 +03:00
Łukasz Mariański
c796ae8bb7
Option to use a proxy for outgoing upstream search engine requests (#573)
* Add option to use a proxy for outgoing (search engine) requests.

* Enable socks feature in reqwest

* Fix formatting

* add proxy feature

* Update src/config/parser.rs

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update websurfx/config.lua

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update Cargo.toml

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* fix

* Update Cargo.toml

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-10-05 03:47:36 +00:00
dependabot[bot]
913ca1b075
build(deps): bump tempfile from 3.12.0 to 3.13.0 (#612) 2024-10-02 08:24:27 +00:00
dependabot[bot]
5d59a2c7be
build(deps): bump error-stack from 0.4.1 to 0.5.0 (#611) 2024-10-02 04:50:58 +00:00
dependabot[bot]
ecc6875a21
build(deps): bump actix-governor from 0.5.0 to 0.6.0 (#609) 2024-10-02 04:45:58 +00:00
dependabot[bot]
d75693ce4e
build(deps): bump regex from 1.10.6 to 1.11.0 (#610) 2024-10-02 02:09:30 +00:00
dependabot[bot]
e7efca4a4e
build(deps): bump redis from 0.25.4 to 0.27.2 (#613) 2024-10-02 02:04:26 +00:00
Kekma
2a4dd07752
feat: config option to configure the number of connections to have in the reqwest pool (#552)
* 🔧 Config: Updated `number_of_https_connections` for the HTTPS connection pool.

* (feat) : added the max idle pool per host option

* 📝 docs(config): add documentation back to the `http_adaptive_window_size` option (#532)

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2024-09-30 15:22:25 +03:00
alamin655
193b4e36db
Merge pull request #604 from neon-mmd/PERF/603_several-optimizations-to-improve-search-engine-performance
 Several optimizations to improve search engine performance
2024-09-10 21:32:52 +05:30
alamin655
e582960402
Merge branch 'rolling' into PERF/603_several-optimizations-to-improve-search-engine-performance 2024-09-10 21:23:26 +05:30
neon_arch
1883093dc7 🚨 chore: make rust format checks happy (#603) 2024-09-06 18:16:02 +05:30
Jann Marc Villablanca
9984ba0d12
🐛 fix: update nix flake lock (#602)
- this updates rustc to 1.80.1
- `eslint` has been moved as a top-level package in upstream NixOS/nixpkgs
  Context: package maintainers are slowly de-bloating
  `node-packages.nix`

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2024-09-06 10:38:41 +05:30
neon_arch
98e817c0a8 🔖 chore(release): bump the app version (#603) 2024-09-05 22:19:39 +05:30
neon_arch
28231d99b8 perf: move the random delay code in the search function (#603) 2024-09-05 22:14:15 +05:30
neon_arch
4afc07f1d5 perf: reduce the usage of clones (#603) 2024-09-05 22:12:34 +05:30
neon_arch
f2d2068bcf perf: replace String & vectors with Cow data types (#603) 2024-09-05 22:10:02 +05:30
neon_arch
b1bcf41061 perf: replace Vec<T> with Box<[T]> & refactor calculate_tfidf function (#603) 2024-09-05 22:07:10 +05:30
neon_arch
39af9096ef perf: replace Vec<T> with Box<T> & initialize vectors with capacity by default (#603) 2024-09-05 22:03:23 +05:30
neon_arch
4bb6c5e90b perf: initialize vectors with capacity by default & use Arc<T> to partially clone memory cache struct (#603) 2024-09-05 21:57:18 +05:30
neon_arch
494ff27b49 ♻️ build(deps): refactor cargo dependencies for the app (#603)
- remove `smallvec` crate.
- add `bincode` crate,
- replace `mini-moka` with `moka` crate.
- enable `rayon` feature on the `keyword_extraction` & `tcp_nodelay` on
  the `redis` crates by default.
2024-09-05 21:46:00 +05:30
alamin655
948d20d8fb
Merge pull request #599 from neon-mmd/FIX/592_redis-does-not-invalidate-cached-results
🐛 Redis does not invalidate cached search results
2024-09-04 21:18:54 +05:30
alamin655
4315221385
Merge branch 'rolling' into FIX/592_redis-does-not-invalidate-cached-results 2024-09-04 21:14:22 +05:30
dependabot[bot]
3a1ff0f307
build(deps): bump quinn-proto from 0.11.6 to 0.11.8 (#600) 2024-09-04 01:17:18 +00:00
neon_arch
b22d60f166 🔖 chore(release): bump the app version (#592) 2024-09-02 21:40:49 +05:30
neon_arch
acee5d892d 🐛 fix: replace deprecated set_ex command with set_options in cache_json function (#592) 2024-09-02 21:17:31 +05:30
neon_arch
9a5f1c5f44 🐛 fix: reimplement caching code within the search function (#592)
- reduce resource usage &
- only cache search results which has not been cached before.
2024-09-02 21:10:54 +05:30
neon_arch
ebee1f4a6c build(deps): add itertools crate (#592) 2024-09-02 20:57:50 +05:30
alamin655
4847a6eed2
Merge pull request #567 from neon-mmd/FEAT/566_initial-support-for-low-powered-devices-with-other-architectures
 Initial support for low powered devices with other architectures
2024-09-02 18:36:23 +05:30
neon_arch
951060dc45
Merge branch 'rolling' into FEAT/566_initial-support-for-low-powered-devices-with-other-architectures 2024-09-02 18:00:20 +05:30
dependabot[bot]
2693cd18d2
build(deps): bump scraper from 0.18.1 to 0.20.0 (#597) 2024-09-02 07:51:28 +00:00
dependabot[bot]
838d1b6958
build(deps): bump async-compression from 0.4.11 to 0.4.12 (#596) 2024-09-02 05:13:22 +00:00
dependabot[bot]
c527897a4d
build(deps): bump actix-web from 4.8.0 to 4.9.0 (#595) 2024-09-02 05:08:37 +00:00
dependabot[bot]
2141b88c35
build(deps): bump blake3 from 1.5.1 to 1.5.4 (#594) 2024-09-02 02:19:10 +00:00
dependabot[bot]
b0c99f25e5
build(deps): bump serde from 1.0.203 to 1.0.209 (#593) 2024-09-02 02:13:42 +00:00
dependabot[bot]
d5c4206afe
⬆️ Bump actix-web from 4.6.0 to 4.8.0 (#582) 2024-08-16 09:46:54 +00:00
dependabot[bot]
4950106871
⬆️ Bump mlua from 0.9.8 to 0.9.9 (#583) 2024-08-16 09:39:54 +00:00
dependabot[bot]
0b48f671cb
⬆️ Bump mimalloc from 0.1.42 to 0.1.43 (#585) 2024-08-16 08:22:03 +00:00
dependabot[bot]
16717bc27d
⬆️ Bump reqwest from 0.12.4 to 0.12.5 (#586) 2024-08-16 08:17:12 +00:00
dependabot[bot]
f51d2e6881
⬆️ Bump openssl from 0.10.64 to 0.10.66 (#587) 2024-08-16 08:00:09 +00:00
dependabot[bot]
ad5b754741
⬆️ Bump serde_json from 1.0.117 to 1.0.122 (#588) 2024-08-16 07:54:54 +00:00
dependabot[bot]
d5524d7eae
⬆️ build(deps): bump reqwest from 0.11.25 to 0.12.4 (#575) 2024-06-08 19:05:09 +00:00
dependabot[bot]
3c2533f69a
build(deps): bump async-compression from 0.4.6 to 0.4.11 (#579) 2024-06-08 18:28:42 +00:00
dependabot[bot]
8225d34a9c
build(deps): bump lightningcss from 1.0.0-alpha.55 to 1.0.0-alpha.57 (#578) 2024-06-08 18:23:44 +00:00
dependabot[bot]
d2954862ea
build(deps): bump mlua from 0.9.6 to 0.9.8 (#577) 2024-06-08 18:19:00 +00:00
dependabot[bot]
f55abf934d
build(deps): bump redis from 0.24.0 to 0.25.4 (#576) 2024-06-07 19:08:26 +00:00
dependabot[bot]
052d9fd167
build(deps): bump rust from 1.77.2-alpine3.18 to 1.78.0-alpine3.18 (#574) 2024-06-07 19:01:29 +00:00
Alex Curtis-Slep
bf7e73f9ff
📝 docs(readme): list three new features provided by the search engine (#570) 2024-05-15 20:47:17 +00:00
alamin655
2f4e4038b1
Merge branch 'rolling' into FEAT/566_initial-support-for-low-powered-devices-with-other-architectures 2024-05-11 21:14:41 +05:30
ddotthomas
5d06cce220
feat(config): option to keep the websurfx server connection alive for a certain period for subsequent requests (#568) 2024-05-09 17:24:12 +00:00
neon_arch
33363a83ef
Merge branch 'rolling' into FEAT/566_initial-support-for-low-powered-devices-with-other-architectures 2024-05-06 20:35:17 +00:00
neon_arch
6200c5d53c 🚨 chore: make clippy checks happy (#566) 2024-05-06 23:19:25 +03:00
neon_arch
bbc49cbf42 🔖 chore(release): bump the app version (#566) 2024-05-04 20:29:43 +03:00
ddotthomas
408858a91e
:bandage: fix: temporary fix for minifying js files (#565) 2024-05-04 19:57:40 +03:00
neon_arch
4993da4d89 feat: multiple profiles to support various devices with other architectures (#566)
- Add 2 profiles with binary size reduction feature to allow devices
  with low storage to compile/build the app with smaller size.
- Add 3 profiles to allow devices with low powered cpus or other
  architectures like arm to compile apps using less cpu usage.
- Add 6 profiles with hybrid of both for both low powered cpu and low
  storage devices.
2024-05-04 18:54:37 +03:00
dependabot[bot]
2e50fa4edb
build(deps): bump rust from 1.76.0-alpine3.18 to 1.77.2-alpine3.18 (#564) 2024-05-02 14:31:00 +00:00
dependabot[bot]
9058b68f78
build(deps): bump lightningcss from 1.0.0-alpha.54 to 1.0.0-alpha.55 (#563) 2024-05-02 14:25:11 +00:00
dependabot[bot]
9f90caf262
build(deps): bump keyword_extraction from 1.3.0 to 1.4.3 (#562) 2024-05-02 14:11:45 +00:00
dependabot[bot]
1386cd6739
build(deps): bump serde_json from 1.0.114 to 1.0.116 (#561) 2024-05-02 14:06:17 +00:00
dependabot[bot]
fe959efd0e
build(deps): bump async-trait from 0.1.77 to 0.1.80 (#560) 2024-05-02 13:59:45 +00:00
dependabot[bot]
5b6afb0b67
build(deps): bump maud from 0.25.0 to 0.26.0 (#559) 2024-05-02 13:54:52 +00:00
Todor Todorov
93fd8f8565
🎨 style: change http/https header word/sentence casing (#555)
Currently all HTTP request headers are in snake case and upper case.
The adopted standard is kebab case and title case.

Here you will find more details:
https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Standard_request_fields
2024-04-25 20:31:47 +03:00
dependabot[bot]
9efcf0b079
build(deps): bump rustls from 0.21.10 to 0.21.11 (#554) 2024-04-20 09:10:14 +00:00
dependabot[bot]
c077e39ae7
build(deps): bump softprops/action-gh-release from 1 to 2 (#553) 2024-04-02 20:32:37 +00:00
Kekma
b1df4f1154
feat(config): config option to timeout idle connections within the reqwest pool (#551) 2024-03-30 16:05:44 +03:00
Spencer
bb50e8bb25
Ranking of aggregated search results based on relevancy of the search result to the user's search query (#549)
* add sorting by relevance and merge new changes

* fix conflicts

* Update src/models/aggregation_models.rs

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update src/models/aggregation_models.rs

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update Cargo.toml

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update Cargo.toml

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update Cargo.toml

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* enable non-static-synonyms features

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-03-25 09:16:49 +00:00
Kekma
c584a7d601
feat(config): config option to keep tcp connection alive for a certain period for subsequent requests (#548)
* Added new HTTP connection setting to the reqwest::ClientBuilder to timeout requests for fetching the search results from the upstream search engines.

* Provided a config option under the server section of the config to allow users to keep tcp connections alive for each request for a certain period of time

* Update src/results/aggregator.rs

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update src/results/aggregator.rs

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Fixed import issue in `tcp_connection_keepalive`

* updated size to u8

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Fixed sizer eror in `parser.rs`

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: alamin655 <129589283+alamin655@users.noreply.github.com>
2024-03-25 12:11:56 +03:00
Phetzy
ce4912b9c5
Rose pine colorscheme variants for the search engine (#550)
* created 3 rose pine color schemes for more customization

* adjusted simple.css about logo container svg to use the logo color variable and match the search container
2024-03-24 07:31:17 +00:00
alamin655
236e8871c6
Merge pull request #547 from phetzy/rolling
🚸 Further strip away debug symbols to reduce binary size
2024-03-21 12:22:17 +05:30
alamin655
f78c6d7660
🔖 chore(release): bump the app version (#547) 2024-03-21 12:18:09 +05:30
alamin655
9c6729c931
🔖 chore(release): bump the app version (#547) 2024-03-21 12:17:38 +05:30
phetzy
8779c03afa resolved issue 520: reducing binary size by using symbols instead of debug info 2024-03-18 17:59:37 -04:00
Kekma
2149e32c9e
feat: config option to timeout requests for fetching search results from the upstream search engines (#545) 2024-03-18 22:33:52 +03:00
Evan Yang
4a990c537b
🚸 chore: thin lto for the compilation instead of fat lto to improve build times 2024-03-13 11:25:54 +03:00
neon_arch
d110f72c18
feat: new experimental feature to improve performance using io_uring on linux distributions (#541)
*  feat: provide a new experimental conditional compilation feature to enable io-uring support (#528)

* 🔖 chore(release): bump the app version (#528)
2024-03-12 15:36:13 +03:00
neon_arch
991f3f59de
perf: several optimizations for improving the performance of the engine (#540)
* ♻️ refactor: initialize & store the config & cache structs as a constant (#486)
- initializes & stores the config & cache structs as a static constant.
- Pass the config & cache structs as a static reference to all the
  functions handling their respective route.

*  perf: replace hashmaps with vectors for fetching & aggregating results (#486)
- replace hashmaps with vectors for fetching, collecting & aggregating results as it tends to be contigous & cache efficient data structure.
- refactor & redesign algorithms for fetching & aggregating results
  centered around vectors in aggregate function.

*  build: add the future crate (#486)

*  perf: use `futureunordered` for collecting results fetched from the tokio spawn tasks (#486)
- using the `futureunordered` instead of vector for collecting results
  reduces the time it takes to fetch the results as the results do not
  need to come in specific order so any result that gets fetched first
  gets collected in the `futureunordered` type.

Co-authored-by: Spencerjibz <spencernajib2@gmail.com>

*  perf: initialize new async connections parallely using tokio spawn tasks (#486)

*  perf: initialize redis pipeline struct once with the default size of 3 (#486)

*  perf: reduce branch predictions by reducing conditional code branches (#486)

*  test(unit): provide unit test for the `get_safesearch_level` function (#486)

*  perf: reduce clones & use index based loop to improve search results filtering performance (#486)

* 🚨 fix(clippy): make clippy/format checks happy (#486)

* 🚨 fix(build): make the cargo build check happy (#486)

*  perf: reduce the amount of clones, to_owneds & to_strings (#486)

*  perf: use async crates & methods & make functions async (#486)

* 🔖 chore(release): bump the app version (#486)

---------

Co-authored-by: Spencerjibz <spencernajib2@gmail.com>
2024-03-11 12:01:30 +03:00
dependabot[bot]
8d9b660eb1
build(deps): bump rust from 1.75.0-alpine3.18 to 1.76.0-alpine3.18 (#539) 2024-03-02 11:23:07 +00:00
dependabot[bot]
9c51128af2
build(deps): bump peterjgrainger/action-create-branch (#538) 2024-03-02 10:42:37 +00:00
dependabot[bot]
c494edcaff
build(deps): bump reqwest from 0.11.23 to 0.11.24 (#537) 2024-03-02 09:50:36 +00:00
dependabot[bot]
6aab9c85b9
build(deps): bump tempfile from 3.9.0 to 3.10.1 (#536) 2024-03-02 09:46:09 +00:00
dependabot[bot]
1d133ed2a8
build(deps): bump log from 0.4.20 to 0.4.21 (#535) 2024-03-02 09:09:20 +00:00
dependabot[bot]
d020895a51
build(deps): bump actix-cors from 0.6.5 to 0.7.0 (#534) 2024-03-02 09:04:34 +00:00
dependabot[bot]
b7a3a8d855
build(deps): bump dhat from 0.3.2 to 0.3.3 (#533) 2024-03-02 06:57:42 +00:00
aocosmic
11d23fd1b2
💄 chore(simple): modernize the appearance of about page & make it responsive. (#530)
* lazyload search result text with css content-visibility

* typo, lightning-fast is grammatically correct

* revamped logo to look more modern

* added class to control how new logo looks and behaves

* added class to control how new logo looks and behaves

* Replace old websurfx logo in readme file

* major visual revamp

* removed logo files and switched to inline svg

* added `--logo-color` to make svg logo colorscheme adaptive

* Update public/static/themes/simple.css

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* [CodeFactor] Apply fixes

* chores: fix duplicate footer selector and remove unknown pseudo-class

* chores: remove missed  duplicate footer selector

* chores: pass formatter check by deleting empty line at 18

* fix search result title disappearing after being visited

* 💄 style: revamped the about page to look more modern and responsive

* [CodeFactor] Apply fixes

* chore: remove invalid css property

* chore: remove lines between or after svg string literals to conform with proper rust formatting

* chore: remove blank lines between svg literals to conform with proper Rust formatting

* refactor: changed decimal values to percentage, added quotation in urls, add blank lines to before rule declarations and between font-face rules

* refactor: correctly remove blank lines between and after svg string literals to conform with proper rust formatting

* chore: revert percentage values into decimals and trimmed blank lines before first rule inside media queries

* combine font face queries into one

* fix: added missing quotation marks on font face url

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: alamin655 <mdalamin655@outlook.com>
Co-authored-by: codefactor-io <support@codefactor.io>
Co-authored-by: alamin655 <129589283+alamin655@users.noreply.github.com>
2024-03-02 09:50:35 +03:00
ddotthomas
41ab8a2a76
config option to configure the https adaptive window size for requests (#529)
* Added config option to enable the reqwest client adaptive window

* Change adaptive window config name

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Modified documentation

* Trimmed down aggregate parameters

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-02-28 15:08:29 +03:00
alamin655
2df6499fb2
📝 docs(instances): more instances with the rolling/edge version (#495)
* add 2 additional instance

Added two new instance
- https://websurfx.instance.pp.ua
- https://alamin655-spacex.hf.space

Changed the `Managed by` column to `Status`

* 🔖 chore(release): bump the app version (#495)

* 🔖 chore(release): bump the app version (#495)

* 🔖 chore(release): bump the app version (#495)

* 🔖 chore(release): bump the app version (#495)

* Remove unnecessary line

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update docs/instances.md

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update instances.md

* bump version

* bump version

* Update instances.md

* Update instances.md

* use shields.io

* Update instances.md

* change websurfx.co to websurfx.pp.ua

* update the status badge

* bump app version

v1.9.20

* Add maintained by

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-02-08 07:52:16 +03:00
Scott
280c7e2b5e
🐛 Auto release github action failure due to missing permissions (#506)
* ci: add release.yml to help automate release versions

* ci: add release.yml to help automate release versions - edited file further to cover edge cases

* ci: add release.yml to help automate release versions - I had a typo in a line which pointed at a different variable

* ci: add release.yml to help automate release versions - Fixing the release portion to prepend a v

* ci: add release.yml to help automate release versions. Lowercased V so it looks like v1.1.0 instead of V1.1.0

* ci: changing structure of release.yml to be easier to understand

* ci: #minor changes made

* ci: #minor changes made to make rolling and stable both release branches

* ci: #minor changes to hopefully turn off pre-release

* ci: #minor change - trying to make pre-release suffic set to nothing

* ci: #minor change - removed older release action for a better up to date one

* ci: #minor change

* ci: #minor change to fixed the pre-release issue

* ci: #minor change to fixed the pre-release issue again

* ci: #minor change to fixed the pre-release issue again2

* ci: changed action for tag. I believe it was causing errors

* ci: missing }

* ci: testing some things

* ci: fixing self inflicted error where I forgot to put an ID in

* ci: fixing to make the release branch rolling

* major: testing updating major

* BREAKING CHANGE: removed changelog action

* ci: reset commit and removed changelog

* ci: changed action for tag. I believe it was causing errors

* ci: missing }

* ci: testing some things

* ci: fixing self inflicted error where I forgot to put an ID in

* ci: fixing to make the release branch rolling

* ci: reset commit and removed changelog

* ci: added step to change Cargo.toml app version to the latest tag version without the v

* ci: using echo and double quotes in the appversion variable. Testing now

* ci: testing autocommit

* Apply automatic changes

* ci: testing autocommit further

* ci: testing autocommit: removing tagging since it creates another tag instead of using that tag

* Apply automatic changes

* ci: testing autocommit with branch protection and doing a PR to rolling

* Apply automatic changes

* ci: testing PR create and merge - removed the if that was causing it not to run

* ci: testing PR create and merge - removed the if that was causing it not to run

* Apply automatic changes

* ci: testing PR create and merge - fixed permission issues

* ci: testing PR create and merge - fixed permission issues

* Apply automatic changes

* ci: testing PR create and merge - potentially fixed PR issue

* Apply automatic changes

* ci: testing PR create and merge - potentially fixed PR issue2

* ci: testing PR create and merge - potentially fixed PR issue + fixing what branch it targets

* ci: testing PR create and merge - testing PAT

* ci: testing PR create and merge - testing to see if merge loop stops

* ci: adding in cargo.toml version in auto git commit

* Update Cargo.toml

Co-authored-by: alamin655 <129589283+alamin655@users.noreply.github.com>

* ci: adding in steps to regenerate the Cargo.lock file

* ci: adding in steps to regenerate the Cargo.lock file - fixing commit issue with cargo.toml

* ci: testing permissions

* ci: testing permissions with PAT

* ci: testing permissions with PAT again

---------

Co-authored-by: scottc943 <scottc943@users.noreply.github.com>
Co-authored-by: alamin655 <129589283+alamin655@users.noreply.github.com>
2024-02-03 03:17:38 +00:00
dependabot[bot]
8790f5f719
build(deps): bump actix-files from 0.6.2 to 0.6.5 (#511) 2024-02-02 07:29:35 +00:00
dependabot[bot]
0f19ade40c
build(deps): bump env_logger from 0.10.1 to 0.11.1 (#512) 2024-02-02 07:24:55 +00:00
dependabot[bot]
ae5b3370bc
build(deps): bump smallvec from 1.11.2 to 1.13.1 (#514) 2024-02-02 07:20:11 +00:00
dependabot[bot]
3d76b1bd86
build(deps): bump lightningcss from 1.0.0-alpha.51 to 1.0.0-alpha.52 (#513) 2024-02-02 07:14:54 +00:00
dependabot[bot]
6c3d9ecd50
⬆️ build(deps): bump serde from 1.0.193 to 1.0.196 (#510)
Bumps [serde](https://github.com/serde-rs/serde) from 1.0.193 to 1.0.196.
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.193...v1.0.196)

---
updated-dependencies:
- dependency-name: serde
  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>
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-02-02 10:10:08 +03:00
dependabot[bot]
57267827f5
build(deps): bump peterjgrainger/action-create-branch (#509) 2024-02-02 06:53:56 +00:00
dependabot[bot]
1909cc36a8
build(deps): bump actions/cache from 3 to 4 (#508) 2024-02-02 06:44:35 +00:00
dependabot[bot]
ca425f9ef5
build(deps): bump hennejg/github-tag-action from 4.3.1 to 4.4.0 (#507) 2024-02-02 06:39:32 +00:00
Scott
a92550e050
👷 GitHub action to automate release based on semantic versioning (#499)
* ci: add release.yml to help automate release versions

* ci: add release.yml to help automate release versions - edited file further to cover edge cases

* ci: add release.yml to help automate release versions - I had a typo in a line which pointed at a different variable

* ci: add release.yml to help automate release versions - Fixing the release portion to prepend a v

* ci: add release.yml to help automate release versions. Lowercased V so it looks like v1.1.0 instead of V1.1.0

* ci: changing structure of release.yml to be easier to understand

* ci: #minor changes made

* ci: #minor changes made to make rolling and stable both release branches

* ci: #minor changes to hopefully turn off pre-release

* ci: #minor change - trying to make pre-release suffic set to nothing

* ci: #minor change - removed older release action for a better up to date one

* ci: #minor change

* ci: #minor change to fixed the pre-release issue

* ci: #minor change to fixed the pre-release issue again

* ci: #minor change to fixed the pre-release issue again2

* ci: changed action for tag. I believe it was causing errors

* ci: missing }

* ci: testing some things

* ci: fixing self inflicted error where I forgot to put an ID in

* ci: fixing to make the release branch rolling

* major: testing updating major

* BREAKING CHANGE: removed changelog action

* ci: reset commit and removed changelog

* ci: changed action for tag. I believe it was causing errors

* ci: missing }

* ci: testing some things

* ci: fixing self inflicted error where I forgot to put an ID in

* ci: fixing to make the release branch rolling

* ci: reset commit and removed changelog

* ci: added step to change Cargo.toml app version to the latest tag version without the v

* ci: using echo and double quotes in the appversion variable. Testing now

* ci: testing autocommit

* Apply automatic changes

* ci: testing autocommit further

* ci: testing autocommit: removing tagging since it creates another tag instead of using that tag

* Apply automatic changes

* ci: testing autocommit with branch protection and doing a PR to rolling

* Apply automatic changes

* ci: testing PR create and merge - removed the if that was causing it not to run

* ci: testing PR create and merge - removed the if that was causing it not to run

* Apply automatic changes

* ci: testing PR create and merge - fixed permission issues

* ci: testing PR create and merge - fixed permission issues

* Apply automatic changes

* ci: testing PR create and merge - potentially fixed PR issue

* Apply automatic changes

* ci: testing PR create and merge - potentially fixed PR issue2

* ci: testing PR create and merge - potentially fixed PR issue + fixing what branch it targets

* ci: testing PR create and merge - testing PAT

* ci: testing PR create and merge - testing to see if merge loop stops

* ci: adding in cargo.toml version in auto git commit

* Update Cargo.toml

Co-authored-by: alamin655 <129589283+alamin655@users.noreply.github.com>

* ci: adding in steps to regenerate the Cargo.lock file

* ci: adding in steps to regenerate the Cargo.lock file - fixing commit issue with cargo.toml

---------

Co-authored-by: scottc943 <scottc943@users.noreply.github.com>
Co-authored-by: alamin655 <129589283+alamin655@users.noreply.github.com>
2024-01-31 07:08:37 +00:00
Jann Marc Villablanca
669e365913
feat: add new helper function to fetch upstream search engine JSON response (#504)
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-01-30 13:37:50 +00:00
abdulahad5112
b2cbc5eaa5
📝 Maintained badge/shield status in the readme from stale to yes/maintained #500 (#503)
Co-authored-by: alamin655 <129589283+alamin655@users.noreply.github.com>
2024-01-30 07:20:14 +00:00
abdulahad5112
851ea314a7
🐛 parsed_cet not found in scope error when building the app with the no-cache feature #498 (#502)
Co-authored-by: alamin655 <129589283+alamin655@users.noreply.github.com>
2024-01-30 07:14:31 +00:00
abdulahad5112
fbf73634ee
🐛 Undeclared mini-mocha crate error when building the app with features other than memory-cache #493 (#501) 2024-01-30 07:09:33 +00:00
Yogen P
779908cb11
updated stargazer link (#496) 2024-01-27 16:15:32 +00:00
alamin655
78858b0e04
Merge pull request #492 from spencerjibz/optimize-caching-code
️ Improve page load by optimizing the caching code
2024-01-26 15:08:07 +05:30
Spencer
660f85620d
Merge branch 'rolling' into optimize-caching-code 2024-01-24 23:09:20 +00:00
Spencerjibz
51214dc23a add support for caching N number of key-values pairs instead of only 3 2024-01-24 22:56:11 +00:00
Spencerjibz
29b76be459 dump up package version 2024-01-24 12:47:19 +00:00
Spencerjibz
6b9469e4b3 cache the next, current and previous results in a separate task 2024-01-22 19:29:08 +00:00
Spencerjibz
f5cf5f9151 changed cache_results method to support multiple values 2024-01-22 19:26:35 +00:00
Spencerjibz
c762f9cf8e use redis pipeline to set multiple values at once 2024-01-22 19:20:16 +00:00
alamin655
705ba81026
Merge pull request #491 from Siddh744542/Clippy/Format-checking/linting-GitHub-action-to-analyze-code-for-all-the-features
👷 Clippy/Format checking/linting GitHub action to analyze code for all the features
2024-01-21 16:00:46 +05:30
alamin655
0f717cc976
🔖 chore(release): bump the app version (#491) 2024-01-21 15:56:41 +05:30
alamin655
b2971c1829
🔖 chore(release): bump the app version (#491) 2024-01-21 15:56:16 +05:30
Siddharth Tiwari
99f0cf1113 fixed issue #490 2024-01-21 12:22:15 +05:30
TheNortheWind
c25cd9c3fe
📝 note Highlighting in the readme file (#488)
Changed the Note highlighting from: **Note** to [!Note]

Affected lines: 144, 169, 221
2024-01-16 11:21:12 +03:00
alamin655
388aaf4bfd
Merge pull request #470 from ddotthomas/FIX/463_results_from_different_search_engines_get_cached_as_the_same_key
🐛 Different cache keys when different search engines are selected
2024-01-13 20:34:11 +05:30
ddotthomas
31c9c676ee Change get_safe_search_level logic back 2024-01-12 09:51:31 -07:00
ddotthomas
ca96a76958 change: renamed get_safesearch_level variables 2024-01-11 11:58:09 -07:00
alamin655
326131aac4
Merge branch 'rolling' into FIX/463_results_from_different_search_engines_get_cached_as_the_same_key 2024-01-11 16:47:15 +05:30
Evan Yang
efa8efc6c7
Compression and encryption for the cached search results (#443)
* attempt1

* rough draft

* add features and their optional dependancies

* add encryption and compression error variants

* add  a sample implementation to cache trait

* Update src/cache/cacher.rs

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* adjust comment so feature flag would apply?

* adjust feature flag so it applies?

* formatting

* Update src/cache/cacher.rs

update documentation

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* [features]Add base64 and chacha20 dependencies for compress-cache-results and encrypt-cache-results

* move encryption key and cipher logic to separate sub module

* added cacha20 and cec-results feature

* added cacha20 and cec-results feature

* added compression and encryption helper functions to trait implementations

* added compression and encryption  implementation for inMemoryCache

* base64 is only requried when redis-cache feature is enabled

* add error case for base64 and encryption/compression implementation to redisCache

* Refactor cacher to remove regex dependency

* fmt cache error and cacher

* Update Cargo.toml

disabling the unneeded default-features

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* fix unused import warning for mimalloc

* remove deprecated method

* add doc comments for encryption module

* fix known bugs and use cfg-if module

* make cfg-if an optional dependency

* use feature-flag instead of maco lint

* add comment to explain type complexity

* bump app version

* Update src/cache/encryption.rs

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* fixed type complexity and add docs for types

---------

Co-authored-by: Spencer Najib <spencernajib2@gmail.com>
Co-authored-by: alamin655 <mdalamin655@outlook.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: Spencerjibz <=spencernajib2@gmail.com>
Co-authored-by: spencer <spencer@DESKTOP-SIF13AR>
2024-01-11 11:10:35 +00:00
ddotthomas
80e950de3b refactor: changed Cookie to use Cow to facilitate using references when building 2024-01-10 14:14:14 -07:00
neon_arch
a47e28587c
Merge branch 'rolling' into FIX/463_results_from_different_search_engines_get_cached_as_the_same_key 2024-01-10 07:25:30 +03:00
ddotthomas
d912bff94e change: revert Cookie Strings back to &str 2024-01-08 11:46:21 -07:00
ddotthomas
6e9250c03a fix: safe search url parameter ignored 2024-01-08 09:19:36 -07:00
ddotthomas
7d762b3726 refactor: moved settings parsing out of results 2024-01-07 16:29:39 -07:00
Леонтий Вартанян
33846cee34
💄 style: replace the search button with a magnifying glass (#483)
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-01-06 21:17:11 +03:00
ddotthomas
dde117e7e6 modify: changed cache_key format data 2024-01-04 11:05:09 -07:00
ddotthomas
86b0d3d6c9 Moved parsing of cookie_value, config to cache_key 2024-01-02 16:26:04 -07:00
neon_arch
36e2ac93be
Merge branch 'rolling' into FIX/463_results_from_different_search_engines_get_cached_as_the_same_key 2024-01-02 12:29:54 +03:00
dependabot[bot]
3a97a6f621
⬆️ build(deps): bump async-trait from 0.1.75 to 0.1.76 (#481)
Bumps [async-trait](https://github.com/dtolnay/async-trait) from 0.1.75 to 0.1.76.
- [Release notes](https://github.com/dtolnay/async-trait/releases)
- [Commits](https://github.com/dtolnay/async-trait/compare/0.1.75...0.1.76)

---
updated-dependencies:
- dependency-name: async-trait
  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>
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-01-02 10:21:40 +03:00
dependabot[bot]
92a141c1c5
⬆️ build(deps): bump redis from 0.23.3 to 0.24.0 (#480)
Bumps [redis](https://github.com/redis-rs/redis-rs) from 0.23.3 to 0.24.0.
- [Release notes](https://github.com/redis-rs/redis-rs/releases)
- [Commits](https://github.com/redis-rs/redis-rs/compare/redis-0.23.3...redis-0.24.0)

---
updated-dependencies:
- dependency-name: redis
  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>
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-01-02 10:15:12 +03:00
dependabot[bot]
c73cb838e2
⬆️ build(deps): bump minify-js from 0.5.6 to 0.6.0 (#479)
Bumps [minify-js](https://github.com/wilsonzlin/minify-js) from 0.5.6 to 0.6.0.
- [Commits](https://github.com/wilsonzlin/minify-js/compare/v0.5.6...v0.6.0)

---
updated-dependencies:
- dependency-name: minify-js
  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>
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-01-02 10:08:59 +03:00
dependabot[bot]
ebd69ff427
⬆️ build(deps): bump serde_json from 1.0.108 to 1.0.109 (#478)
Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.108 to 1.0.109.
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.108...v1.0.109)

---
updated-dependencies:
- dependency-name: serde_json
  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>
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2024-01-02 09:40:46 +03:00
dependabot[bot]
af3385d1c2
build(deps): bump actions/stale from 8 to 9 (#476)
Bumps [actions/stale](https://github.com/actions/stale) from 8 to 9.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v8...v9)

---
updated-dependencies:
- dependency-name: actions/stale
  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>
2024-01-02 09:31:29 +03:00
dependabot[bot]
649e0db5cb
build(deps): bump actions/labeler from 4 to 5 (#477) 2024-01-02 06:11:14 +00:00
dependabot[bot]
62459c68e8
build(deps): bump rust from 1.74.0-alpine3.18 to 1.75.0-alpine3.18 (#475) 2024-01-02 06:05:57 +00:00
ddotthomas
db1115f19e fix: add comma separator and format macro 2024-01-01 19:36:18 -07:00
Jann Marc Villablanca
50aa52c485
Bing for the search engine (#473) (#473)
fix: add closing curly brace

- accidentally removed from previous PR. i hope i did not ruin some
  build

* feat: implement mojeek engine

* Merge branch 'rolling' into FEAT_316_bing_search_engine

*  feat: implement bing engine

* Fix: include cookie string to header_map

* Fix: include <strong> tags from upstream search

* Merge branch 'rolling' into FEAT_316_bing_search_engine

Co-authored-by: neon-mmd <132049916+neon-mmd@users.noreply.github.com>
2024-01-01 14:57:31 +03:00
Леонтий Вартанян
5020f36c90
♻️ refactor: standardize the content-type header by using an enum value over typing it manually (#474)
* ♻️  refactor: change content-type

* 🐛  fix: change parameters that were passed to the settings function

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-12-31 13:31:07 +03:00
Siddharth Tiwari
5b4864424a
perf: Compression for the page responses of the search engine (#472) 2023-12-31 12:57:50 +03:00
ddotthomas
4f4cb220cc fix: changed dereferencing 2023-12-30 22:18:15 -07:00
ddotthomas
286bcf1bd3 fix: added a config parse backup 2023-12-30 22:12:43 -07:00
ddotthomas
bfeb81270c fix: modify cache key with engines used for search 2023-12-30 19:19:22 -07:00
alamin655
ddb10f6584
Merge pull request #469 from neon-mmd/FIX/468_pagination-for-the-upstream-search-engines-not-working
🚑️ Pagination code for the upstream search engines
2023-12-30 21:37:06 +05:30
neon_arch
61393ba7c4
Merge branch 'rolling' into FIX/468_pagination-for-the-upstream-search-engines-not-working 2023-12-30 13:17:44 +03:00
neon_arch
f2907641d2 🔖 chore(release): bump the app version (#468) 2023-12-30 13:08:55 +03:00
neon_arch
7d42c84aaf 🚑️ fix(engine): fix the pagination code for startpage engine (#468) 2023-12-30 13:07:18 +03:00
neon_arch
72da32383e 🚑️ fix(engine): fix the pagination code for searx engine (#468) 2023-12-30 13:06:57 +03:00
neon_arch
2bdddaf928 🚑️ fix(engine): fix the pagination code for librex engine (#468) 2023-12-30 13:06:35 +03:00
neon_arch
0dd25aacb6 🚑️ fix(engine): fix the pagination code for duckduckgo engine (#468) 2023-12-30 13:05:04 +03:00
alamin655
41f3fe7485
Merge pull request #462 from neon-mmd/CHORE/461_display-the-user-provided-settings-from-the-config-or-the-ui-in-the-settings-page
🚸 Display the user provided settings from the config or the UI in the settings page
2023-12-30 12:27:50 +05:30
alamin655
7f84c6346d
Merge branch 'rolling' into CHORE/461_display-the-user-provided-settings-from-the-config-or-the-ui-in-the-settings-page 2023-12-30 12:23:47 +05:30
ddotthomas
d073aa247a
♻️ refactor: start tracking page numbers from 0 instead of 1 in the backend (#467)
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-12-29 21:20:38 +03:00
Jann Marc Villablanca
9f23a1c70b
feat(engine): mojeek for the search engine (#464)
* 🧑‍💻 fix: add closing curly brace in the nix build step

*  feat: add code to provide search results from `mojeek` engine

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2023-12-29 19:21:06 +03:00
neon_arch
d8943709c7 🚨 chore: make cargo format checks happy (#461) 2023-12-28 21:08:42 +03:00
neon_arch
93afb6b8c9
Merge branch 'rolling' into CHORE/461_display-the-user-provided-settings-from-the-config-or-the-ui-in-the-settings-page 2023-12-28 21:04:21 +03:00
neon_arch
83c3981697 🔖 chore: bump the app version (#461) 2023-12-28 20:22:05 +03:00
neon_arch
40138572be 🚨 chore: make clippy checks happy (#461) 2023-12-28 20:15:38 +03:00
neon_arch
7b392b369d 💄 chore: add style for the new message when a setting is managed by the config cannot be altered/modified (#461) 2023-12-28 20:09:35 +03:00
neon_arch
26aa345f06 🚸 chore: pass the safe_search_level & upstream_search_engines as a hashmap in the settings view function (#461) 2023-12-28 19:58:18 +03:00
neon_arch
b7a23f1826 🚸 chore: add code to display saved settings from the config on the settings page (#461) 2023-12-28 19:54:47 +03:00
neon_arch
34468202f9 🚸 chore: add code to display saved user settings from the cookies on the settings page (#461) 2023-12-28 19:54:28 +03:00
maokwen
9f5213cf42
🐛 fix: explicit content-type header for the search page response (#458) 2023-12-28 07:05:21 +03:00
maokwen
43357493d5
🐛 fix: explicit Content-Type header for HTTP response (#457) 2023-12-27 11:24:44 +03:00
alamin655
1d9718798f
Merge pull request #455 from neon-mmd/DOCS/439_revise-the-docs-to-remain-in-sync-with-the-current-changes
📝 Revise the `docs` to remain in sync with the current changes
2023-12-25 18:43:11 +05:30
alamin655
8312d21f9f
Merge branch 'rolling' into DOCS/439_revise-the-docs-to-remain-in-sync-with-the-current-changes 2023-12-25 18:37:38 +05:30
Jann Marc Villablanca
0943b8b8c4
📝 Developer environment setup on NixOS (#454)
* 🧑‍💻feat: update nix flake dev environment

- This removes installing `docker`, `rust-analyzer`, `rustfmt`
  imperatively. `nodejs` is used to install dev dependencies
  `stylelint-config-standard` and `postcss-lit`
- The `shellHook`s adds `rusty-hook` CLI to the PATH and the node
  dev dependencies to the NODE_PATH.

* 📝 docs(developing): update NixOS dev environment setup

* fix: remove nonvital guide and improve grammar

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-12-24 07:27:54 +03:00
neon_arch
3b127d26a1
Merge branch 'rolling' into DOCS/439_revise-the-docs-to-remain-in-sync-with-the-current-changes 2023-12-23 21:25:03 +03:00
neon_arch
96ed04c298 🔖 chore: bump the app version (#439) 2023-12-23 20:23:41 +03:00
neon_arch
e8f9ad2479 📝 docs: provide a note on the pkg_env environment variable & update the example config file (#439) 2023-12-23 20:05:33 +03:00
neon_arch
fb46d2c6f2 📝 docs: update the theme example & add a new animation section (#439) 2023-12-23 19:42:43 +03:00
neon_arch
a66362bce1 📝 docs: provide explanation for the new config file options (#439) 2023-12-23 19:34:40 +03:00
Jann Marc Villablanca
12843414f8
🧑‍💻 feat: add cargo-watch to nix dev shell (#452)
- Contributors using NixOS won't need to install cargo-watch
  imperatively via `cargo` since it is already packaged up in `nixpkgs`
2023-12-23 09:45:30 +03:00
neon_arch
493696f4e2 📝 docs: update the project structure and the associated explaination (#439) 2023-12-23 00:09:11 +03:00
Jann Marc Villablanca
b95c3c8afe
🐛 fix: add openssl runtime dependencies (#451)
- OpenSSL dependencies are usually readily available for
  non-Nix distros but not for NixOS users.
2023-12-22 07:32:05 +03:00
aocosmic
c698f4e0ef
💄 Different text color for the visited search results title links in the search page (#445)
* lazyload search result text with css content-visibility

* typo, lightning-fast is grammatically correct

* revamped logo to look more modern

* added class to control how new logo looks and behaves

* added class to control how new logo looks and behaves

* Replace old websurfx logo in readme file

* major visual revamp

* removed logo files and switched to inline svg

* added `--logo-color` to make svg logo colorscheme adaptive

* Update public/static/themes/simple.css

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* [CodeFactor] Apply fixes

* chores: fix duplicate footer selector and remove unknown pseudo-class

* chores: remove missed  duplicate footer selector

* chores: pass formatter check by deleting empty line at 18

* fix search result title disappearing after being visited

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: alamin655 <mdalamin655@outlook.com>
Co-authored-by: codefactor-io <support@codefactor.io>
2023-12-20 18:25:13 +03:00
alamin655
67c3e39d4e
Merge pull request #442 from neon-mmd/imgbot
️ Optimize images
2023-12-14 22:55:12 +05:30
alamin655
6d497fcf81
🔖 chore(release): bump the app version (#442) 2023-12-14 22:51:17 +05:30
alamin655
e45122288d
🔖 chore(release): bump the app version (#442) 2023-12-14 22:50:45 +05:30
ImgBotApp
5e4ed070d2
[ImgBot] Optimize images
*Total -- 280.85kb -> 233.74kb (16.78%)

/images/websurfx_logo.png -- 44.51kb -> 35.87kb (19.41%)
/images/main_page.png -- 55.11kb -> 44.72kb (18.85%)
/images/search_page.png -- 96.52kb -> 79.81kb (17.31%)
/images/404_error_page.png -- 84.71kb -> 73.33kb (13.43%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2023-12-14 16:41:11 +00:00
alamin655
21591d2a0d
Merge pull request #441 from neon-mmd/DOCS/430_new-preview-demo-images-of-the-search-engine-on-the-readme
📝 New preview/demo images of the search engine on the `readme`
2023-12-14 22:07:35 +05:30
neon_arch
d61ab883d9
Merge branch 'rolling' into DOCS/430_new-preview-demo-images-of-the-search-engine-on-the-readme 2023-12-14 15:21:32 +03:00
neon_arch
4f27a5c9de 🔖 chore(release): bump the app version (#430) 2023-12-14 15:12:12 +03:00
neon_arch
94a92ae30c 📝 docs(readme): update the preview images according to the new redesign of the themes (#430) 2023-12-14 15:09:26 +03:00
alamin655
bb06797dec
Merge pull request #438 from neon-mmd/CHORE/432_duckduckgo-engine-code-according-to-the-new-html-changes
👽️  `Duckduckgo` engine code according to the new `html` changes
2023-12-13 18:59:08 +05:30
alamin655
22d0ff789e
Merge branch 'rolling' into CHORE/432_duckduckgo-engine-code-according-to-the-new-html-changes 2023-12-13 18:55:42 +05:30
alamin655
64ca6a30c1
Merge pull request #437 from neon-mmd/FEAT/424_reduce-animations-effects-support-for-the-themes
 Animations/effects support for the search engine
2023-12-13 18:54:05 +05:30
neon_arch
11c4b8c21d
✏️ fix: fix the animation names list in the config (#424)
Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-12-13 16:04:51 +03:00
neon_arch
3bb7614256 🔖 chore(release): bump the app version (#432) 2023-12-12 22:03:36 +03:00
neon_arch
582f8aee5b 👽️ chore: update the search result selectors in accordance with the html changes (#432) 2023-12-12 21:57:59 +03:00
neon_arch
b00f76627b
Merge branch 'rolling' into FEAT/424_reduce-animations-effects-support-for-the-themes 2023-12-12 15:24:42 +03:00
neon_arch
c59596511f 🔖 chore(release): bump the app version (#424) 2023-12-12 15:10:35 +03:00
neon_arch
0bc96b167c feat: add code to handle the parsing and storing of the new settings option (#424) 2023-12-12 15:07:31 +03:00
neon_arch
19081b72c0 feat: provide a new settings option to change or disable animations (#424) 2023-12-12 15:06:27 +03:00
neon_arch
1a2a833597 feat: pass the new animation config option (#424) 2023-12-12 15:04:44 +03:00
neon_arch
7206e7d6a1 feat: provide a condition based handling to only import the animation when the config option has a value (#424) 2023-12-11 21:17:23 +03:00
neon_arch
9a4e450766 test(integration): fix the integration by providing an extra function argument (#424) 2023-12-11 21:15:11 +03:00
neon_arch
c0d2d1ac65 feat(animations): provide a default frosted glow animation for the simple theme (#424) 2023-12-11 21:11:48 +03:00
neon_arch
76419a7353 feat: provide code to parse the new config option (#424) 2023-12-11 21:10:28 +03:00
neon_arch
0da1b9e1db feat(config): provide a new config option animation (#424) 2023-12-11 20:59:08 +03:00
neon_arch
1c5a317c4d feat: add a new field animation to the struct style (#424) 2023-12-11 12:27:29 +03:00
alamin655
2b41fb9735
Merge pull request #436 from diogocanut/fix-useless-use-of-format!
🛠️ Useless use of `format!` (cargo clippy warning)
2023-12-11 09:40:10 +05:30
alamin655
86b1f62393
🔖 chore(release): bump the app version (#436)
v1.5.3
2023-12-11 09:35:39 +05:30
alamin655
b718fb131c
🔖 chore(release): bump the app version (#436)
v1.5.3
2023-12-11 09:35:07 +05:30
alamin655
2c985b8db5
Merge branch 'rolling' into fix-useless-use-of-format! 2023-12-11 09:17:15 +05:30
alamin655
cface54414
Merge pull request #435 from diogocanut/434/provide-a-more-resilient-searx-instance
🚚 Provide a more resilient and reliable `searx` instance
2023-12-11 09:15:30 +05:30
alamin655
918d142d24
🔖 chore(release): bump the app version (#435)
v1.5.2
2023-12-11 09:10:25 +05:30
alamin655
44f51487c2
🔖 chore(release): bump the app version (#435)
v1.5.2
2023-12-11 09:09:41 +05:30
Diogo Canut
c6ae86dbb4 Fix: useless use of format! (cargo clippy warning) 2023-12-10 21:34:10 -03:00
Diogo Canut
15b0505b96 Provide a more resilient and reliable searx instance 2023-12-10 21:24:17 -03:00
aocosmic
397a805ffd
💄 Improved visual fidelity for the simple theme (#426)
* lazyload search result text with css content-visibility

* typo, lightning-fast is grammatically correct

* revamped logo to look more modern

* added class to control how new logo looks and behaves

* added class to control how new logo looks and behaves

* Replace old websurfx logo in readme file

* major visual revamp

* removed logo files and switched to inline svg

* added `--logo-color` to make svg logo colorscheme adaptive

* Update public/static/themes/simple.css

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* [CodeFactor] Apply fixes

* chores: fix duplicate footer selector and remove unknown pseudo-class

* chores: remove missed  duplicate footer selector

* chores: pass formatter check by deleting empty line at 18

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: alamin655 <mdalamin655@outlook.com>
Co-authored-by: codefactor-io <support@codefactor.io>
2023-12-09 17:34:17 +03:00
alamin655
c02006c297
LibreX for the search engine (#429)
*  feat(engine): provide librex search engine (#318)

*  feat(engine): provide librex search engine (#318)

*  feat(engine): provide librex search engine (#318)

* 🔖 chore(release): bump the app version (#318)

* 🔖 chore(release): bump the app version (#318)

*  feat(engine): provide librex search engine (#318)

*  feat(engine): provide librex search engine (#429)

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

*  feat(engine): provide librex search engine (#429)

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

*  feat(engine): provide librex search engine (#429)

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

*  feat(engine): provide librex search engine (#429)

*  feat(engine): provide librex search engine (#429)

*  feat(engine): provide librex search engine (#429)

*  feat(engine): provide librex search engine (#429)

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-12-09 14:25:28 +03:00
Ananth
1143846ca6
💡 Module comment text to better describe the module code (#428)
* better description

* 🔖 chore(release): bump the app version (#428)

* 🔖 chore(release): bump the app version (#428)

---------

Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-12-08 17:35:22 +03:00
aocosmic
11166b4876
📝 New websurfx logo for the readme (#423)
* lazyload search result text with css content-visibility

* typo, lightning-fast is grammatically correct

* revamped logo to look more modern

* added class to control how new logo looks and behaves

* added class to control how new logo looks and behaves

* Replace old websurfx logo in readme file

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2023-12-06 19:21:18 +03:00
Ananth
62682911fc
💄 Spacing between the names of the search engines in the search results (#422)
* spacing between names fixed

* 🔖 chore(release): bump the app version (#422)

* 🔖 chore(release): bump the app version (#422)

---------

Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-12-06 14:15:06 +03:00
alamin655
4cd1810527
Merge pull request #419 from neon-mmd/FEAT/314_startpage-for-the-search-engine
 `Startpage` for the search engine
2023-12-06 08:15:00 +05:30
alamin655
b68e06c883
Merge branch 'rolling' into FEAT/314_startpage-for-the-search-engine 2023-12-06 08:11:40 +05:30
neon_arch
89032e63bd 🔖 chore(release): bump the app version (#314) 2023-12-05 20:50:30 +03:00
neon_arch
e8a64f5874 feat(engine): provide startpage search engine in the config (#314) 2023-12-05 20:49:28 +03:00
neon_arch
e1e426c517 feat(engine): provide startpage search engine (#314) 2023-12-05 20:47:28 +03:00
aocosmic
fb2b6608fe
💄websurfx logo redesign for better understandability (#418)
* lazyload search result text with css content-visibility

* typo, lightning-fast is grammatically correct

* revamped logo to look more modern

* added class to control how new logo looks and behaves

* added class to control how new logo looks and behaves

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-12-05 15:29:44 +03:00
alamin655
f11d35f057
Merge pull request #413 from neon-mmd/CHORE/remove-unneeded-github-actions-and-configs
🔥 Unneeded GitHub actions and associated config files
2023-12-02 16:53:23 +05:30
neon_arch
3ca8f63c1e 🔖 chore: bump the app version 2023-12-02 11:50:59 +03:00
neon_arch
3565dcea39 🔥 chore: remove unneeded github actions & their configs 2023-12-02 11:48:02 +03:00
dependabot[bot]
9a53329dc6
build(deps): bump actions/checkout from 3 to 4 (#409) 2023-12-02 04:17:45 +00:00
dependabot[bot]
6b71e71df8
build(deps): bump docker/setup-buildx-action from 2 to 3 (#411) 2023-12-02 04:13:21 +00:00
dependabot[bot]
1cd336c7dc
build(deps): bump docker/login-action from 2 to 3 (#410) 2023-12-02 04:08:47 +00:00
dependabot[bot]
026f7794d1
build(deps): bump dessant/label-actions from 3 to 4 (#408) 2023-12-02 04:04:18 +00:00
dependabot[bot]
15c71cbfba
build(deps): bump rust from 1.73.0-alpine3.18 to 1.74.0-alpine3.18 (#407) 2023-12-02 03:57:57 +00:00
Ashwin Vinod
5a8d61f231
Config option to customize the cache invalidation/expiry time (#403) 2023-11-30 15:09:17 +03:00
alamin655
3c6632246e
📝 More Websurfx Instances with the edge/rolling version (#401)
* Update README.md

* bump websurfx version to 1.2.3

* bump websurfx version to 1.2.3

* Update instances.md

* 🔖 chore: bump the app version (#401)

* 🔖 chore: bump the app version (#401)

* Update docs/instances.md

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-11-30 06:54:14 +03:00
Ashwin Vinod
e704c26ed3
♻️ Refactor cache system (#399)
* ♻️ Refactor cache system

* 🐛 Fix cache not getting set

This patch also makes it that cookies are eagerly evaluated. This is
done to figure out the safe search level set by the user. The
performance hit wouldn't be much of a deal as the cookie is a small
json string

* 🔖 chore: bump the app version (#399)

* 🔖 chore: bump the app version (#399)

---------

Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-11-28 09:17:35 +03:00
aocosmic
90f010359d
📝 typo in footer (#398)
* lazyload search result text with css content-visibility

* typo, lightning-fast is grammatically correct

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-11-27 17:59:41 +03:00
aocosmic
35dc276fd2
️ lazyload search result text with css content-visibility (#397) 2023-11-27 14:29:46 +03:00
víctor
5e2669b6de
♻️ Clean some code, fix bug (#396)
* ♻️ Improve src/handler

Removes unnecessary submoduling & adjusts some weird code

* ♻️ Cleaner code

* 🐛 Fixed issue where code would overflow if page=0
2023-11-27 09:45:28 +03:00
alamin655
7e1a80dc7e
Merge pull request #391 from neon-mmd/CI/323_github-actions-to-release-docker-image
👷 Automate the new docker image release process
2023-11-25 10:22:15 +05:30
neon_arch
26f73d5611
Merge branch 'rolling' into CI/323_github-actions-to-release-docker-image 2023-11-24 16:12:00 +03:00
neon_arch
a142aa75cd 🔖 chore: bump the app version (#323) 2023-11-24 16:09:20 +03:00
neon_arch
95c6beeb47 👷 ci: automate the docker image build & uploading process (#323)
Co-authored-by: leon3s <7750950+leon3s@users.noreply.github.com>
2023-11-24 16:04:40 +03:00
alamin655
33507e4c09
Merge pull request #389 from neon-mmd/rolling-cf-autofix
🎨 Code style changes for the style files
2023-11-23 19:09:12 +05:30
alamin655
5fa1febf5f
🔖 chore: bump the app version (#389) 2023-11-23 19:03:59 +05:30
alamin655
5367dd39df
🔖 chore: bump the app version (#389) 2023-11-23 19:03:26 +05:30
codefactor-io
69eb815d25
[CodeFactor] Apply fixes 2023-11-21 20:30:47 +00:00
alamin655
9bb1544bd7
Merge pull request #386 from SaranaDheeraj/rolling
🔒️ More secure hashing algorithm like `BLAKE3` instead of `md5` hashing algorithm
2023-11-20 21:42:39 +05:30
alamin655
abc59b2858
🧹 chore: make clippy happy (#386) 2023-11-20 21:38:20 +05:30
alamin655
d28cbb96a1
Merge branch 'rolling' into rolling 2023-11-20 21:12:47 +05:30
alamin655
07bbea8f9b
Merge pull request #388 from neon-mmd/PERF/384_optimize-the-performance-of-fetching-results-in-the-websurfx-search-engine-backend
️ Optimize the performance of fetching results in the `websurfx` search engine backend
2023-11-20 21:10:52 +05:30
alamin655
fc830c4683
Update redis_cacher.rs 2023-11-20 21:09:27 +05:30
alamin655
a2360d1f65
🔖 chore: bump the app version (#386) 2023-11-20 21:06:51 +05:30
alamin655
f62b821422
🔖 chore: bump the app version (#386) 2023-11-20 21:05:57 +05:30
alamin655
ae9fa5b388
Merge branch 'rolling' into PERF/384_optimize-the-performance-of-fetching-results-in-the-websurfx-search-engine-backend 2023-11-20 21:03:12 +05:30
mergify[bot]
e1a837f6b0
Merge branch 'rolling' into rolling 2023-11-20 15:30:55 +00:00
alamin655
0139fc568b
Merge pull request #383 from neon-mmd/REFACTOR/302_rewrite-the-search-engine-frontend-with-maud-html-framework
♻️ Rewrite the search engine frontend with `maud` html framework
2023-11-20 21:00:11 +05:30
neon_arch
a46a2231c3 🔖 chore: bump the app version (#384) 2023-11-20 15:32:24 +03:00
neon_arch
fe74f2eef7 ♻️ refactor: code to take prebuilt client to request search results (#384) 2023-11-20 15:30:00 +03:00
neon_arch
b42adaa5a3 ️ perf: rewrite the code by using a constant storing a prebuilt client globally for each thread (#384) 2023-11-20 15:27:49 +03:00
neon_arch
05bf05b0dd ⬆️ build: enable gzip and brotli features for the reqwest crate (#384) 2023-11-20 15:11:58 +03:00
S Dheeraj
89542072c8
Updated redis_cacher.rs 2023-11-20 08:53:30 +05:30
S Dheeraj
dc5fa842c0 #385 issue resolved
replaced md5 hashing algorithm with sha-256 hashing algorithm
2023-11-19 22:09:34 +05:30
neon_arch
9b1d89404e 🔖 chore: bump the app version (#302) 2023-11-18 21:56:00 +03:00
neon_arch
03d649b97b 🔥 chore: remove the debug macro from the code (#302) 2023-11-18 21:51:21 +03:00
neon_arch
eee2f110b8 🚨 chore: make cargo clippy linter happy (#302) 2023-11-18 21:50:37 +03:00
neon_arch
c39d9ff0b0 ♻️ refactor: rewrite the parsing of the upstream search engines option (#302) 2023-11-18 21:46:36 +03:00
neon_arch
686e26ad6d ⚰️ chore: remove the serialize & deserialize traits on the struct (#302) 2023-11-18 21:43:28 +03:00
neon_arch
5c60d733cd ♻️ refactor: remove the code to pass the query data into the SearchResults struct (#302) 2023-11-18 21:41:08 +03:00
neon_arch
141ae26066 ♻️ refactor: remove the code to add the query & style in the SearchResults struct & also remove the associated fields from the struct (#302) 2023-11-18 21:38:02 +03:00
neon_arch
47905f1e22 test: update the integration with the new changes (#302) 2023-11-18 21:29:35 +03:00
neon_arch
ca1c72c3dc ♻️ refactor: remove handlebar related code & add the templates module (#302) 2023-11-18 21:27:49 +03:00
neon_arch
c1a5b7086a 💡 chore: add documentation to the code (#302) 2023-11-18 21:23:22 +03:00
neon_arch
38ba4bd6cb ♻️ refactor(routes): serve the new maud file for search page and remove unwanted functions and pass values to the maud html template directly (#302) 2023-11-17 22:16:17 +03:00
neon_arch
64c4d2c23a ♻️ refactor(routes): serve new the maud files instead of handlebars files (#302) 2023-11-17 22:12:25 +03:00
neon_arch
0ec89146c8 ♻️ refactor(maud): rewrite the frontend code with maud html framework (#302) 2023-11-17 22:10:06 +03:00
neon_arch
beb5e6012a build: replace handlebars crate with maud crate (#302) 2023-11-17 22:07:32 +03:00
will
0facfdbd56
📝 Additional commands required for the setup of the local development environment (#379)
* docs:  Add additional commands in developing.md

* Update docs/developing.md

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

* Update developing.md

* 🔖 chore: bump the app version (#379)

* 🔖 chore: bump the app version (#379)

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-11-10 06:35:52 +00:00
alamin655
67487a51ee
Merge pull request #381 from neon-mmd/BUILD/380_reduce-the-time-it-takes-to-build-compile-the-app
️ Reduce the time it takes to `build/compile` the app
2023-11-10 10:16:59 +05:30
alamin655
692ac48708
Merge branch 'rolling' into BUILD/380_reduce-the-time-it-takes-to-build-compile-the-app 2023-11-10 10:02:47 +05:30
neon_arch
ad514398fa 🔖 chore: bump the app version (#380) 2023-11-08 19:12:16 +03:00
neon_arch
3742893c19 ♻️ refactor: reimplement the random delay code without the rand crate (#380) 2023-11-08 19:09:50 +03:00
neon_arch
89ee79cd0f ️ build: improve non-release build time by changing the dev profile build flag (#380) 2023-11-08 19:04:57 +03:00
neon_arch
3aee141d0e build: remove unneeded features & remove the rand crate (#380) 2023-11-08 19:01:38 +03:00
alamin655
3189de6fb9
Merge pull request #376 from neon-mmd/FIX/375_improve-the-stylint-checks-in-the-pre-commit-hook
🩹 Improve `Stylelint` checks in the pre-commit hook
2023-11-03 15:47:48 +05:30
neon_arch
bbc226829e 🚨 chore: make build and clippy checks happy (#375) 2023-11-03 12:41:13 +03:00
neon_arch
4dd44aec3f
Merge branch 'rolling' into FIX/375_improve-the-stylint-checks-in-the-pre-commit-hook 2023-11-03 12:31:01 +03:00
neon_arch
66669a0cd8 🔖 chore: bump the app version (#375) 2023-11-03 12:08:29 +03:00
neon_arch
faf9995962 🩹 fix: remove unnecessary stylelint checks by disabling them in the stylelint config file (#375) 2023-11-03 12:04:31 +03:00
dependabot[bot]
68a2b955d8
build(deps): bump actions/setup-node from 3 to 4 (#370) 2023-11-02 15:40:07 +00:00
dependabot[bot]
42f0dc1bc7
build(deps): bump scraper from 0.17.1 to 0.18.1 (#373) 2023-11-02 15:23:25 +00:00
dependabot[bot]
2e0def777c
build(deps): bump actix-governor from 0.4.1 to 0.5.0 (#372) 2023-11-02 15:15:48 +00:00
dependabot[bot]
4dd455e185
build(deps): bump stefanzweifel/git-auto-commit-action from 4 to 5 (#371) 2023-11-02 15:06:53 +00:00
dependabot[bot]
9d070141ff
build(deps): bump peter-evans/create-pull-request from 4.2.4 to 5.0.2 (#369) 2023-11-02 14:57:25 +00:00
Spandan Tripathy
68f701265f
📝 More typo correction and Grammatical correction in the documentation page (#368) 2023-11-01 04:58:43 +03:00
Spandan Tripathy
24fda29358
📝 Typo and Grammatical correction in the documentation page (#366)
* 📝 docs: typo & grammatical correction under the `motivations` & `solutions` sections (#365) 

* 📝 docs: typo & grammatical correction under the `motivations` section (#365)

* 🔖 chore: bump the app version (#365)

* 🔖 chore: bump the app version (#365)

---------

Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-10-31 20:32:51 +03:00
alamin655
9282e30efd
Merge pull request #364 from neon-mmd/PERF/359_custom-build-file-to-minify-js-and-css-files
️Custom `build.rs` to minify JS and CSS during the build process
2023-10-31 11:08:33 +05:30
neon_arch
41c57bd070 🚨 chore: make clippy linter happy (#359) 2023-10-30 19:44:28 +03:00
neon_arch
bca2ba17b9 🔖 chore: bump the app version (#359) 2023-10-30 19:23:31 +03:00
neon_arch
3f367d0b5e build: add lightningcss and minify-js as build dependencies (#359) 2023-10-30 19:20:19 +03:00
neon_arch
da03037ca4 ️ perf: add code minify js and css during the initial build process when the pkg_env enviroment variable is set to prod (#359) 2023-10-30 19:16:43 +03:00
Vaibhav
b123fbbdab
📝 Typo correction in the contributing documentation (#363) 2023-10-29 17:04:52 +03:00
Jagadeesh Kumar Ch
cfe57a430b
📝 Typo correction in the readme of the project (362)
Typo correction in the readme of the project:

foolproof -> full-proof
2023-10-29 12:55:05 +03:00
Shivam Kumar
344e641161
📝 Typo correction and Grammatical correction in the developing documentation page (#360) 2023-10-28 21:42:04 +03:00
Spandan Tripathy
82802ba552
📝 Typo correction in the developing documentation page (#357) 2023-10-28 13:06:09 +03:00
Shivam Kumar
5301d09894
📝 Typo correction and Grammatical in the features and installation documentation page (#355)
* 📝 docs: Fix typos in the `features` documentation page (#355)

* 📝 docs: Fix typos in the `installation` documentation page (#355)
2023-10-27 23:38:45 +03:00
Shivam Kumar
6963d00074
📝 New command with explanation in the developing documentation page (#353)
* Update developing.md

* Update developing.md

* Update developing.md

Removed the +
2023-10-26 19:37:08 +03:00
alamin655
0c2dbb3a9f
Merge pull request #350 from anevski-stefan/fix/349-type-in-developing-documentation
📝 Fix typo in the `developing` documentation page
2023-10-24 11:12:17 +05:30
Stefan Anevski
41799006e3 Refactor: Fix typo in the developing documentation page 2023-10-23 22:56:30 +02:00
Tejas Raskar
d4be2957b8
📝 warning note in the manual deployment section (#348) 2023-10-23 22:27:22 +03:00
imgbot[bot]
bfd4dbec22
[ImgBot] Optimize images (#346)
*Total -- 1,409.87kb -> 1,322.67kb (6.19%)

/public/images/no_selection.png -- 92.41kb -> 70.81kb (23.37%)
/public/images/info.svg -- 0.52kb -> 0.40kb (23.12%)
/public/images/warning.svg -- 0.73kb -> 0.57kb (22.27%)
/images/404_error_page.png -- 85.84kb -> 71.48kb (16.73%)
/images/search_page.png -- 158.26kb -> 134.19kb (15.21%)
/images/websurfx_logo.png -- 17.29kb -> 14.73kb (14.8%)
/images/main_page.png -- 36.41kb -> 32.18kb (11.63%)
/images/intro.png -- 10.98kb -> 9.78kb (10.95%)
/public/images/websurfx_logo.png -- 8.07kb -> 7.22kb (10.49%)
/images/websurfx_docs_image.png -- 5.40kb -> 5.07kb (6.18%)
/public/images/filter.png -- 102.20kb -> 100.26kb (1.9%)
/public/images/barricade.png -- 891.76kb -> 875.97kb (1.77%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
Co-authored-by: ImgBotApp <ImgBotHelp@gmail.com>
2023-10-23 16:45:17 +00:00
alamin655
9dcd79611e
Merge pull request #345 from neon-mmd/CHORE/344_improve-the-project-logo
💄 Make logo image HD with a transparent background
2023-10-23 19:04:59 +05:30
neon_arch
d67ee863e1 🔖 chore: bump the app version (#344) 2023-10-23 15:54:10 +03:00
neon_arch
19eab639f8 💄 chore: improve the websurfx logo by improving its resolution and making its background transparent (#344) 2023-10-23 15:52:16 +03:00
alamin655
08de9c7358
Merge pull request #343 from neon-mmd/add-new-development-doc-page
📝 `Developing` Guide page for the `docs`
2023-10-23 14:01:31 +05:30
neon_arch
97067bf35f
Merge branch 'rolling' into add-new-development-doc-page 2023-10-22 23:39:20 +03:00
neon_arch
07f4b25ebc 🚀 chore: bump the app version (#340) 2023-10-22 23:31:57 +03:00
neon_arch
f1a12d0b87 📝 docs: add a link to the new development guide page (#340) 2023-10-22 22:58:21 +03:00
neon_arch
e6c956f29d 📝 docs: add a new development guide page (#340) 2023-10-22 22:56:44 +03:00
alamin655
7f8404e341
📝 Revise the readme for making general improvements (#341)
* Update README.md

* bump websurfx version to 1.2.3

* bump websurfx version to 1.2.3
2023-10-19 18:11:45 +03:00
dependabot[bot]
a6383ee113
build(deps): bump rustix from 0.38.15 to 0.38.19 (#339) 2023-10-18 18:52:44 +00:00
alamin655
466ed1bbb1
🤖 Improve the rules used by the Mergify bot. (#338)
* 🤖 ci: replace the approval rule to 2 & improve the checks rule (#338)

Signed-off-by: null <null>

* 🤖 ci: revert the one approval rule (#338)

Co-Authored-By: neon_arch <mustafadhuleb53@gmail.com>

* 🤖 ci: replace status checks rule to only check for success of the important checks (#338)

Co-Authored-By: neon_arch <mustafadhuleb53@gmail.com>

* 🚀 chore: bump the app version (#338)

---------

Signed-off-by: null <null>
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-10-18 17:37:55 +03:00
leone
c80ae2fd14
Docker compose for development (#336)
* feat: development docker compose

* chore: update readme.md to mention docker compose

* refactor: requested change

* revert: README.md

---------

Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-10-17 19:47:53 +03:00
jkaczmarkiewicz
27bc52c008
Brave for the search engine (#335)
* feat: implement brave engine

* refactor: correct indentations in stylelint config

* docs: add dummy config option to config.lua

* feat: implement safe_search_level in brave engine

* refactor: move var to format

* fix: make strict search above level 1
2023-10-16 20:25:15 +03:00
Aditya Phasu
fc3b416970
🔧 remove unnecessary clone call (#333) 2023-10-15 01:07:59 +03:00
Uday Sagar
405d00612f
🔧 Restricts the visibility of the user-agent helper module (#331) 2023-10-14 22:14:28 +03:00
Ron Green
092a38fc40
🔧 Remove the unwanted once_cell crate 2023-10-14 19:13:32 +03:00
leone
ad297a0a96
Build arguments to make writing GitHub action for auto releasing new docker images easier (#324)
*  feat: Dockerfile with arch and feature build arguments

* 🛠️ fix: missing issuer certificate error

* ⚙️ refactor: replace `--update` with new `--no-cache` option
2023-10-14 17:18:22 +03:00
Ajeet Singh
a912ac0724
📝 Remove the two unnecessary lines from the code snippet (#312)
* Removed unnecessary lines(issue:310)
- #   ports:
- #     - 6379:6379

* Update docs/installation.md

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>

---------

Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2023-10-13 18:30:38 +03:00
alamin655
40b7e6d2ea
Merge pull request #273 from gzsombor/search-result-parse-refactor
⚙️ Rewrite the search result parser code to make the engine code more concise
2023-10-13 09:44:52 +05:30
alamin655
dac2c0c488
Merge branch 'rolling' into search-result-parse-refactor 2023-10-10 18:18:13 +05:30
Ananth B Prathap
8156f7ea79
🔧 Remove the unused mapped ports for docker deployment (#309)
* removed-ports

* 🚀 chore: bump the app version (#309)

* 🚀 chore: bump the app version (#309)

---------

Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-10-09 20:09:12 +03:00
Zsombor Gegesy
f56002dca6 Rename the error to NoSuchEngineFound and add the name of missing engine to it 2023-10-08 22:30:42 +02:00
Zsombor Gegesy
8ed4c9e206 Propagate errors upward, if an engine can't be initialized 2023-10-07 10:31:58 +02:00
Zsombor Gegesy
32abacb4c3 Fix missing doc errors 2023-10-07 00:33:44 +02:00
Zsombor Gegesy
57c73d38c8 Refactor the search result parsing 2023-10-07 00:33:44 +02:00
Zsombor Gegesy
75a77d25f0 Create separate search_result_parser 2023-10-07 00:33:44 +02:00
dependabot[bot]
769d870803
Merge pull request #297 from neon-mmd/dependabot/cargo/mlua-0.9.1 2023-10-05 03:37:56 +00:00
mergify[bot]
3ad5444e27
Merge branch 'rolling' into dependabot/cargo/mlua-0.9.1 2023-10-04 19:04:09 +00:00
João Mota
5e63f37d70
📝 Three points listed under the Features section (#304)
* Add additional features to README

* 🚀 chore: bump the app version (#304)

* 🚀 chore: bump the app version (#304)

---------

Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-10-04 21:17:42 +03:00
alamin655
79b0aec66b
Merge pull request #301 from Niloth-p/docs/CodeFactor
📝 Codefactor code coverage shield badge
2023-10-04 09:37:13 +05:30
alamin655
01cb86dedd
🚀 chore: bump the app version (#301) 2023-10-04 09:29:47 +05:30
alamin655
074975bc20
🚀 chore: bump the app version (#301) 2023-10-04 09:29:18 +05:30
alamin655
57410378a4
📝 Codefactor code coverage shield badge (#301) 2023-10-04 09:28:05 +05:30
alamin655
5d26a2ec6d
📝 Codefactor code coverage shield badge (#301) 2023-10-04 09:17:21 +05:30
alamin655
7ae554e62d
Merge branch 'rolling' into docs/CodeFactor 2023-10-04 09:11:49 +05:30
alamin655
4f0d00bde0
Merge pull request #298 from neon-mmd/mergify/neon-mmd/config-update
🤖 Mergify config to automate the handling of pull requests
2023-10-04 09:10:29 +05:30
Niloth P
6bc434cebd
docs(readme): Add Codefactor badge 2023-10-04 01:00:19 +05:30
neon_arch
a9f54b4027 🚀 chore: bump the app version (#299) 2023-10-03 21:11:29 +03:00
neon_arch
0fbb523082 ci(Mergify): configuration update
Signed-off-by: neon_arch <mustafadhuleb53@gmail.com>
2023-10-03 20:52:16 +03:00
dependabot[bot]
f9ac87bdba
Merge pull request #296 from neon-mmd/dependabot/cargo/reqwest-0.11.21 2023-10-03 06:08:13 +00:00
alamin655
b3fab88b6f
Merge branch 'rolling' into dependabot/cargo/reqwest-0.11.21 2023-10-03 11:31:25 +05:30
dependabot[bot]
f1375abff9
Merge pull request #295 from neon-mmd/dependabot/github_actions/wow-actions/contributors-list-1.2.0 2023-10-03 06:00:00 +00:00
dependabot[bot]
c324c74411
build(deps): bump wow-actions/contributors-list from 1.1.0 to 1.2.0
Bumps [wow-actions/contributors-list](https://github.com/wow-actions/contributors-list) from 1.1.0 to 1.2.0.
- [Release notes](https://github.com/wow-actions/contributors-list/releases)
- [Changelog](https://github.com/wow-actions/contributors-list/blob/master/CHANGELOG.md)
- [Commits](b9e91f91a5...242b538350)

---
updated-dependencies:
- dependency-name: wow-actions/contributors-list
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 05:53:06 +00:00
dependabot[bot]
6362d0f733
Merge pull request #294 from neon-mmd/dependabot/github_actions/actions/checkout-4 2023-10-03 05:52:26 +00:00
dependabot[bot]
89e5895519
build(deps): bump actions/checkout from 2 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v2...v4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 05:44:41 +00:00
dependabot[bot]
9960bc3315
Merge pull request #292 from neon-mmd/dependabot/github_actions/actions/stale-8 2023-10-03 05:44:00 +00:00
dependabot[bot]
6cf4a63db7
build(deps): bump actions/stale from 5 to 8
Bumps [actions/stale](https://github.com/actions/stale) from 5 to 8.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v5...v8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 05:36:44 +00:00
alamin655
4f92262a05
Merge pull request #291 from neon-mmd/dependabot/github_actions/actions/setup-node-3
build(deps): bump actions/setup-node from 2 to 3
2023-10-03 11:06:04 +05:30
dependabot[bot]
2803471821
build(deps): bump mlua from 0.8.10 to 0.9.1
Bumps [mlua](https://github.com/khvzak/mlua) from 0.8.10 to 0.9.1.
- [Changelog](https://github.com/khvzak/mlua/blob/master/CHANGELOG.md)
- [Commits](https://github.com/khvzak/mlua/compare/v0.8.10...v0.9.1)

---
updated-dependencies:
- dependency-name: mlua
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 03:32:57 +00:00
dependabot[bot]
4155a23e66
build(deps): bump reqwest from 0.11.20 to 0.11.21
Bumps [reqwest](https://github.com/seanmonstar/reqwest) from 0.11.20 to 0.11.21.
- [Release notes](https://github.com/seanmonstar/reqwest/releases)
- [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/seanmonstar/reqwest/compare/v0.11.20...v0.11.21)

---
updated-dependencies:
- dependency-name: reqwest
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 03:32:07 +00:00
dependabot[bot]
6ec79144a0
build(deps): bump actions/setup-node from 2 to 3
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 2 to 3.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v2...v3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 03:30:56 +00:00
alamin655
8a2a9ffc43
Merge pull request #290 from neon-mmd/ci-dependabot-auto-version-updates
🤖 Dependabot to auto bump version numbers
2023-10-03 09:00:30 +05:30
neon_arch
b577f6909d 🤖 ci: enable auto-updates for docker, cargo and github actions 2023-10-02 19:54:22 +03:00
alamin655
055de8bd3c
🚀 chore: Bump the app version (#290) 2023-10-02 22:00:59 +05:30
alamin655
8787e06d7d
🚀 chore: Bump the app version (#290) 2023-10-02 22:00:24 +05:30
neon_arch
c3a90031fd
🤖 ci: add dependabot auto version bumping action 2023-10-02 18:03:46 +03:00
alamin655
99ec846d18
Merge pull request #287 from neon-mmd/improve-comments-in-dockerfile-and-compose-file
🔧 Provide comments in the two files
2023-10-01 09:00:54 +05:30
alamin655
1948a5e7a6
Merge branch 'rolling' into improve-comments-in-dockerfile-and-compose-file 2023-10-01 08:54:58 +05:30
alamin655
b0f82c00e2
Merge pull request #285 from neon-mmd/readme-revision
📝 Replace the `warning` with an appropriate `note`
2023-10-01 08:52:00 +05:30
alamin655
9ae87ddefa
Merge branch 'rolling' into readme-revision 2023-10-01 08:44:39 +05:30
alamin655
2824d9e4d1
Merge pull request #284 from neon-mmd/docs-revision
📝 Revise the `docs` to remain in sync with the current changes
2023-10-01 08:43:51 +05:30
neon_arch
0bee92238b
Merge branch 'rolling' into improve-comments-in-dockerfile-and-compose-file 2023-09-30 20:17:19 +03:00
neon_arch
21792dc232 🚀 chore: Bump the app version (#277) 2023-09-30 20:14:12 +03:00
neon_arch
62fdbfe133 🔧 refactor: add documentation for the new set of commands (#286) 2023-09-30 19:29:56 +03:00
neon_arch
33de4380ae 🚀 chore: bump the app version (#277) 2023-09-30 19:05:25 +03:00
neon_arch
08f92b13a4 📝 docs: update the warning note with a normal note for the first release (#277) 2023-09-30 19:02:48 +03:00
neon_arch
026304613e 🚀 chore: bump the app version (#281) 2023-09-30 18:37:44 +03:00
neon_arch
e8ac5467d5 📝 docs: update & improve the installation documentation (#281) 2023-09-30 18:36:07 +03:00
neon_arch
5bcf396959 📝 docs: rename the file & update the contents (#281) 2023-09-30 18:35:28 +03:00
neon_arch
e4b8d16c9c 📝 docs: rename the name of the file & the link (#281) 2023-09-30 18:35:05 +03:00
neon_arch
35d5976b0d
Merge pull request #282 from evanyang1/evan-280
🛠️ Remove unused volume from yml
2023-09-30 04:36:38 +03:00
Evan Yang
538274fae0 fix: remove unused volume from yml 2023-09-29 16:43:03 -07:00
neon_arch
e16f7a5cde
Merge pull request #279 from evanyang1/evanyang-274
🔧 Volumes for docker deployment to make editing config files easier
2023-09-27 21:35:21 +03:00
Evan Yang
d900baddab feat: olumes for docker deployment to make editing config files easier 2023-09-27 10:20:56 -07:00
neon_arch
4243db9d49
Merge pull request #276 from dr460nf1r3/rolling
  Initial NixOS support via `flake.nix`
2023-09-27 18:31:42 +03:00
Nico Jensch
3cc4d1784a
version: 0.23.5 -> 0.23.6 2023-09-27 14:25:05 +02:00
Nico Jensch
838d0fd76a
feat: add redis to devshell, fix comments 2023-09-27 14:23:27 +02:00
Nico Jensch
bf0a22ccde
docs: apply suggestion and move information next to Archlinux, provide working example 2023-09-27 14:22:55 +02:00
Nico Jensch
47bbbcd3c4
docs: add NixOS installation 2023-09-27 09:07:33 +02:00
Nico Jensch
ba4c3b0612
fix: pass nix flake check; ignore result 2023-09-27 09:04:36 +02:00
Nico Jensch
32b2b27509
feat: add flake.nix to allow building NixOS packages 2023-09-27 08:37:45 +02:00
alamin655
d110f404a9
Merge pull request #272 from neon-mmd/docs-revision
📝 Revise the `docs` to remain in sync with the current changes
2023-09-26 17:26:04 +05:30
neon_arch
4a34c56ed3
Merge branch 'rolling' into docs-revision 2023-09-24 21:13:14 +03:00
neon_arch
da7a0ed854 🚀 chore: bump the app version (#265) 2023-09-24 21:06:19 +03:00
neon_arch
d59d147cd5 📝 docs: update the Themes section (#265) 2023-09-24 21:04:28 +03:00
neon_arch
74d64ce483 📝 docs: explain the newly added config options (#265) 2023-09-24 21:03:18 +03:00
neon_arch
a5362569da 📝 docs: update install from source documentation (#265) 2023-09-24 21:00:44 +03:00
neon_arch
1398a18c69 📝 docs: add new building page explaining different build options (#265) 2023-09-24 20:59:54 +03:00
neon_arch
05899997fd 📝 docs: add a navigation link for the new building page (#265) 2023-09-24 20:58:40 +03:00
alamin655
05b4cf35e4
Merge pull request #270 from Honey2339/newB
📝 Organize the links in the table of contents
2023-09-24 14:39:51 +05:30
alamin655
e1a63fc93d
📝 Organize the links in the table of contents (#270) 2023-09-24 14:31:31 +05:30
alamin655
475d4090be
🚀 chore: bump the app version (#270) 2023-09-24 13:21:08 +05:30
alamin655
b82355bb85
🚀 chore: bump the app version (#270) 2023-09-24 13:20:34 +05:30
Prasoon
8ef01a9358 Fixes #263 Formatted ReadMe File 2023-09-24 12:55:26 +05:30
neon_arch
add56bdf35
Merge pull request #268 from Siddh744542/Change-the-location-to-match-the-emoticon
📝 Changed the location to match the emoticon
2023-09-24 10:03:11 +03:00
neon_arch
a4036c3a92
Merge branch 'rolling' into Change-the-location-to-match-the-emoticon 2023-09-24 09:56:30 +03:00
neon_arch
617ae92ecf
Merge pull request #267 from Siddh744542/An-instances-section-pointing-to-the-instances-documentation-page
📝 An instances section pointing to the instances documentation page
2023-09-24 09:54:07 +03:00
Siddharth Tiwari
74b0c6e1ea Changed the location to match the emoticon 2023-09-24 10:15:33 +05:30
Siddharth Tiwari
19a94b4306 Added instances section pointing to the instances documentation page 2023-09-24 10:06:54 +05:30
alamin655
808439a670
Merge pull request #262 from viccj/fix-issue-255
📝 A link to the `Websurfx` instances documentation page
2023-09-23 18:52:49 +05:30
alamin655
7abbf0fe61
🚀 chore: bump the app version 2023-09-23 18:47:11 +05:30
alamin655
a728995a0c
Update Cargo.lock 2023-09-23 18:46:36 +05:30
alamin655
5e89699f0b
🚀 chore: bump the app version 2023-09-23 18:46:02 +05:30
Vic Chang
6eee68c822 fix issue 255 2023-09-23 21:04:18 +08:00
alamin655
d150832672
Merge pull request #260 from neon-mmd/feat-inform-user-when-no-engines-are-selected
 Inform user with appropriate error message when none of the engines are selected
2023-09-23 17:56:48 +05:30
neon_arch
3d489208db 🧹 chore: make github actions happy (#227) 2023-09-23 15:03:48 +03:00
alamin655
017036ed00
Merge branch 'rolling' into feat-inform-user-when-no-engines-are-selected 2023-09-23 17:12:58 +05:30
alamin655
5c9559b88a
Merge pull request #258 from neon-mmd/feat-safe-search-setting-ui
 `Safe Search` setting for the website UI
2023-09-23 16:54:10 +05:30
neon_arch
de91f7651f 🚀 chore: bump the app version (#227) 2023-09-23 13:08:16 +03:00
neon_arch
d97129beb4 feat: add image to show with the error message (#227) 2023-09-23 13:06:44 +03:00
neon_arch
90f2fac59f feat: theme the new error message (#227) 2023-09-23 13:05:35 +03:00
neon_arch
69adc893d0 feat: add new error message to show when no engines are selected (#227) 2023-09-23 12:53:18 +03:00
neon_arch
173c6ba821 feat: add code to handle aggregation when no engines are selected (#227) 2023-09-23 12:50:36 +03:00
neon_arch
b428cedd7a feat: add new check value for no engine selected (#227) 2023-09-23 12:48:01 +03:00
alamin655
1ec26d6e93
Merge branch 'rolling' into feat-safe-search-setting-ui 2023-09-23 09:58:10 +05:30
neon_arch
831ab5afbd
Merge pull request #259 from Vidhanvyrs/DotlasherBranch
📝 A link to the(#251) user showcase
2023-09-23 06:20:32 +03:00
Vidhanvyrs
eceef031f5 Added a link to the(#251) user showcase 2023-09-23 08:02:56 +05:30
neon_arch
f874f819f2 🚀 chore: bump the app version (#210) 2023-09-22 20:02:44 +03:00
neon_arch
1654f743bf feat: fix code formatting (#210) 2023-09-22 20:00:57 +03:00
neon_arch
a727d389ae feat: implement code to query the engine based on the options selected under the search bar (#210) 2023-09-22 19:59:06 +03:00
neon_arch
9253d9e48f feat: replace consts with lets (#210) 2023-09-22 19:57:49 +03:00
neon_arch
1ff51af224 feat: add section headings (#210) 2023-09-22 19:56:26 +03:00
neon_arch
72fec47892 feat: implement code to fetch results based on parameters, cookies & config (#210) 2023-09-22 19:54:26 +03:00
neon_arch
d2e482251e feat: add the safe search field in the Cookie struct (#210) 2023-09-22 19:53:34 +03:00
neon_arch
5c8cbee5d9 feat: implement code to pass safe search option in the json results (#210) 2023-09-22 19:51:10 +03:00
neon_arch
81a21d0b26 feat: add code to store the safe search as a cookie & fix code formatting (#210) 2023-09-22 19:39:50 +03:00
neon_arch
1b352ecda0 feat: provide a new settings option safe_search (#210) 2023-09-22 19:37:01 +03:00
neon_arch
b2c14826a5 feat: theme the new safe search menu (#210) 2023-09-22 19:34:27 +03:00
neon_arch
ea3205226c feat: provide code to handle the change of selected value in the safe search menu (#210) 2023-09-22 19:33:15 +03:00
neon_arch
b35cb868a6 feat: add code to handle the change of the selected value from the safe search menu (#210) 2023-09-22 19:31:52 +03:00
neon_arch
4ae4e2b8f2 feat: add safe search menu option under the search bar (#210) 2023-09-22 19:28:01 +03:00
alamin655
9271090851
Merge pull request #254 from viccj/issue250
📝 Awesome self-hosted shields badge
2023-09-22 10:55:13 +05:30
alamin655
a993264aa5
Merge branch 'rolling' into issue250 2023-09-22 10:42:57 +05:30
alamin655
7ae88e5869
Merge pull request #253 from neon-mmd/docs-websurfx-instances-page
📝 Community driven `Websurfx` instances page
2023-09-22 10:41:58 +05:30
alamin655
c08f075761
🚀 chore: bump the app version (#250) 2023-09-22 10:40:32 +05:30
alamin655
bc408e45d4
🚀 chore: bump the app version (#250) 2023-09-22 10:39:46 +05:30
alamin655
8aff55166b
📝 Awesome self-hosted shields badge #250 2023-09-22 10:32:36 +05:30
Vic Chang
b7fc4e3954 fix #issue250 2023-09-22 11:49:06 +08:00
Vic Chang
c077f097c2 fix the issue #250 2023-09-22 11:42:56 +08:00
neon_arch
bc4c6a9b29 📝 docs: revert the table formatting & update the column heading (#252) 2023-09-21 18:44:49 +03:00
neon_arch
b412f5b7f6
📝 docs: fix spelling mistake (#252)
Co-authored-by: alamin655 <mdalamin655@outlook.com>
2023-09-21 18:09:50 +03:00
alamin655
810b588844
📝 docs: add instances page with an official instance in a tabular form ( #252) 2023-09-21 20:36:13 +05:30
neon_arch
3a98f2a060 📝 docs: change the instance location (#252) 2023-09-21 17:41:35 +03:00
neon_arch
b6671480e6 🚀 chore: bump the app version (#252) 2023-09-21 17:11:56 +03:00
neon_arch
92ad99e6f0 📝 docs: add instances page with an official instance in a tabular form (#252) 2023-09-21 16:33:21 +03:00
alamin655
3a5a52f994
Merge pull request #249 from boris-lok/dockerfile
🛠️ Provide a fix for Docker deployment process
2023-09-20 19:45:44 +05:30
alamin655
c3f6e3c66d
🚀 chore: bump the app version 2023-09-20 19:39:44 +05:30
alamin655
b8ebc8256f
🚀 chore: bump the app version 2023-09-20 19:38:50 +05:30
boris
82cc061d07 Provide a fix for Docker deployment process 2023-09-20 22:00:17 +08:00
alamin655
daa6fd9515
Merge pull request #248 from boris-lok/gitpod
🛠️ Use the correct command to run the app in `GitPod`
2023-09-20 18:54:45 +05:30
alamin655
19621d32a8
🚀 chore: bump the app version 2023-09-20 18:48:19 +05:30
alamin655
ee66a2ccbc
🚀 chore: bump the app version 2023-09-20 18:46:33 +05:30
boris
1f78bddf11 Use the correct command to run the app in GitPod 2023-09-20 21:07:51 +08:00
neon_arch
79034eac6e
Merge pull request #245 from neon-mmd/fix-hybrid-cache-implementation
🛠️ Proper working implementation for the `hybrid` caching feature
2023-09-20 12:58:34 +03:00
alamin655
69eb2e5631
Merge branch 'rolling' into fix-hybrid-cache-implementation 2023-09-20 15:22:19 +05:30
alamin655
e19e3f082f
Merge pull request #247 from Sweetdevil144/rolling
🛠️ Make `style` checking and `testing` GitHub action work on conditional compiling app
2023-09-20 15:21:38 +05:30
Abhinav Pandey
a7aaedd566 Fixes #246 2023-09-20 14:49:13 +05:30
neon_arch
d33129c4c9 🧹 chore: make clippy happy (#244) 2023-09-17 19:56:48 +03:00
neon_arch
1726ccc8ce 🚀 chore: bump the app version (#244) 2023-09-17 12:52:51 +03:00
neon_arch
fcfd112e59 🛠️ fix: improve the documentation & move code in the correct files (#244) 2023-09-17 12:51:32 +03:00
neon_arch
8c239e2313 🛠️ fix: make the redis_url option only available on redis-cache feature (#244) 2023-09-17 12:50:25 +03:00
neon_arch
578c7bcf77 🛠️ fix: improve the documentation for the code (#244) 2023-09-17 12:48:11 +03:00
neon_arch
03384d4e04 🛠️ fix: implement hybrid caching and improve documentation (#244) 2023-09-17 12:47:02 +03:00
neon_arch
12a7eebeb6 🛠️ fix: remove unnecessary feature hybrid (#244) 2023-09-17 12:41:29 +03:00
neon_arch
351f39aebc
Merge pull request #223 from gzsombor/cache-refactor
  A four caching options for the search engine based on feature based compilation
2023-09-16 18:36:08 +03:00
Zsombor Gegesy
e69126c5ea Fix git rebase problems, and the failing doctest 2023-09-15 23:25:17 +02:00
Zsombor Gegesy
1e7805cf42 Rename features, make the memory-cache the default 2023-09-15 23:21:19 +02:00
Zsombor Gegesy
76795c43cc Make the cache types compile time feature flags too, and make it more configurable! 2023-09-15 23:21:19 +02:00
Zsombor Gegesy
320f5f4720 Remove unnecessary clones 2023-09-15 23:21:19 +02:00
Zsombor Gegesy
519ebe0fd8 Instead of caching jsons, we can cache the original structure 2023-09-15 23:21:19 +02:00
Zsombor Gegesy
996ff84c5b Cache refactor - add an in-memory cache, so redis is not needed 2023-09-15 23:21:19 +02:00
neon_arch
d1d2d4e44d
Merge pull request #240 from alamin655/stargazers
📝 Credits for the stargazers with `roaster` widget
2023-09-15 16:33:25 +03:00
alamin655
23d5bc4c7c
Merge pull request #38 from alamin655/alamin655-patch-1
🚀 chore: bump the app version
2023-09-15 18:32:52 +05:30
alamin655
6ba3695285
🚀 chore: bump the app version 2023-09-15 18:30:11 +05:30
alamin655
8ee9d02bc2
Merge pull request #37 from alamin655/alamin655-patch-1
🚀 chore: bump the app version
2023-09-15 18:29:09 +05:30
alamin655
f3b1b38508
🚀 chore: bump the app version 2023-09-15 18:26:33 +05:30
alamin655
7eba88c1e3
Merge pull request #36 from alamin655/alamin655-patch-1
📝 Credits for the stargazers with roaster widget (deeznuts)
2023-09-15 18:06:47 +05:30
alamin655
77cd4a6f13
📝 Credits for the stargazers with roaster widget 2023-09-15 18:05:18 +05:30
alamin655
e5a37d1866
Merge pull request #237 from neon-mmd/github-ci-to-auto-triage-issues
🤖 GitHub action to automate the process of triaging issues
2023-09-15 16:55:48 +05:30
alamin655
fcf60f0d70
Merge branch 'rolling' into github-ci-to-auto-triage-issues 2023-09-15 16:48:52 +05:30
alamin655
0d0c304b6f
Merge pull request #235 from neon-mmd/github-ci-to-auto-label-PRs
🤖 GitHub action to automate the task of labeling pull requests
2023-09-15 16:47:34 +05:30
alamin655
a08e17c4cd
Merge branch 'rolling' into github-ci-to-auto-label-PRs 2023-09-15 16:37:00 +05:30
alamin655
26dbc47380
Merge pull request #234 from neon-mmd/improve-issue-management
🔧 Move from `issue templates` to `issue forms`
2023-09-15 16:35:05 +05:30
alamin655
3bc80f09cc
Merge branch 'rolling' into improve-issue-management 2023-09-15 16:20:29 +05:30
neon_arch
574a85c36a
Merge pull request #238 from boris-lok/docker
🛠️ Steps to add two files in the Docker image
2023-09-15 12:38:10 +03:00
boris
9a4bb12246 Steps to add two files in the Docker image 2023-09-15 14:40:13 +08:00
neon_arch
7c8b7a9463 🚀 chore: bump the app version (#234) 2023-09-14 20:46:05 +03:00
neon_arch
0eb21727d8 🤖 ci: add config for the auto triaging github action (#234) 2023-09-14 20:45:10 +03:00
neon_arch
e7bbd7004f 🤖 ci: add github action to auto triage issues (#234) 2023-09-14 20:43:53 +03:00
neon_arch
50dad0adeb 🚀 chore: bump the app version (#233) 2023-09-14 20:24:51 +03:00
neon_arch
63d8b413c7 🤖 ci: add labeler github action config (#233) 2023-09-14 20:23:27 +03:00
neon_arch
360f415ca0 🤖 ci: add auto pull request labeling github action (#233) 2023-09-14 20:21:45 +03:00
neon_arch
0e56fe6086 🚀 chore: bump the app version (#232) 2023-09-14 19:28:37 +03:00
neon_arch
831c50ae9c 🔧 chore: move from issue templates to issue forms (#232) 2023-09-14 19:27:06 +03:00
alamin655
658505cea1
Merge pull request #230 from boris-lok/doc
🛠️ Docs link by pointing it to the correct location
2023-09-14 13:50:51 +05:30
alamin655
079dcbaccc
Merge branch 'rolling' into doc 2023-09-14 13:39:21 +05:30
boris
74d2db881d Docs link by pointing it to the correct location 2023-09-14 16:05:44 +08:00
alamin655
03e8f5483b
Merge pull request #226 from neon-mmd/fix-gitpod-setup
🛠️ `Luajit` installation step for the `Gitpod` setup
2023-09-14 12:41:33 +05:30
alamin655
2a04e647d5
Merge branch 'rolling' into fix-gitpod-setup 2023-09-14 12:34:52 +05:30
alamin655
e19038b82c
Merge pull request #208 from neon-mmd/reorganize-code-and-restructure-the-codebase
⚙️ Improve the project structure for better maintainability of code
2023-09-14 12:29:43 +05:30
neon_arch
ca4447fcdf Merge branch 'rolling' into reorganize-code-and-restructure-the-codebase 2023-09-13 18:31:37 +03:00
alamin655
7a644549d2
Merge pull request #206 from neon-mmd/change-document-style-with-linter-warnings
⚙️ Change document style with `linter` warnings
2023-09-13 18:29:20 +05:30
neon_arch
c60fdb8366 🧹 chore: make github actions happy (#205) 2023-09-12 18:53:32 +03:00
neon_arch
1a222217c4 🧹 chore: make github actions happy (#205) 2023-09-12 17:59:33 +03:00
neon_arch
fb231de416
Merge branch 'rolling' into change-document-style-with-linter-warnings 2023-09-12 17:49:46 +03:00
alamin655
61eaa4710c
Merge pull request #204 from neon-mmd/feat-rate-limiter-for-websurfx
 Configurable rate limiting middleware for the app
2023-09-12 14:48:17 +05:30
neon_arch
f20ac50918 🚀 chore: bump the app version (#225) 2023-09-11 20:31:56 +03:00
neon_arch
75511ead56 🛠️ fix: add luajit installation step (#225) 2023-09-11 20:28:09 +03:00
neon_arch
b9d651c378 🧹 chore: make github actions happy (#203) 2023-09-11 20:16:42 +03:00
neon_arch
30ca95a217 🧹 chore: make github actions happy (#203) 2023-09-11 20:02:09 +03:00
alamin655
8e56ac8ba2
Update parser.rs 2023-09-11 12:05:13 +05:30
alamin655
0132a63e6f
Apply suggestions from code review 2023-09-11 11:58:31 +05:30
alamin655
3c1aaf63f8
Update src/config/parser.rs 2023-09-11 11:56:12 +05:30
alamin655
531611f077
Update src/config/parser.rs 2023-09-11 11:54:21 +05:30
alamin655
70a5a2463b
Update src/config/parser.rs 2023-09-11 11:46:56 +05:30
alamin655
0c0442da25
Update Cargo.toml 2023-09-11 11:43:09 +05:30
alamin655
2790eefba8
Merge branch 'rolling' into feat-rate-limiter-for-websurfx 2023-09-11 11:40:10 +05:30
alamin655
867753a135
Merge pull request #202 from neon-mmd/feat-disallow-user-to-search-via-lists
 `Safe search` levels and `filter lists` for the app
2023-09-11 11:25:12 +05:30
alamin655
6c94b92717
Merge branch 'rolling' into feat-disallow-user-to-search-via-lists 2023-09-11 11:18:39 +05:30
neon_arch
d3a7435341
Merge pull request #222 from arctic-byte/patch-1
🛠️ Point to the correct installation and testing section
2023-09-11 00:30:30 +03:00
arctic-byte
b0f4b7ec88
Fix README installation link 2023-09-10 19:37:24 +02:00
neon_arch
12bfc5276a 🧹 chore: make clippy happy (#201) 2023-09-10 18:56:54 +03:00
neon_arch
ac4e29a93f 🧹 chore: make github actions happy (#201) 2023-09-10 18:41:24 +03:00
alamin655
86991a2f9a
Merge branch 'rolling' into feat-rate-limiter-for-websurfx 2023-09-10 20:56:21 +05:30
alamin655
60b2fcc27a
Merge branch 'rolling' into feat-disallow-user-to-search-via-lists 2023-09-10 20:51:10 +05:30
alamin655
e581de3def
Merge pull request #192 from neon-mmd/optimize-and-make-code-idiomatic
⚙️ Optimize and make code more idiomatic (part - III)
2023-09-10 20:47:23 +05:30
neon_arch
82a78e3b42
Merge branch 'rolling' into optimize-and-make-code-idiomatic 2023-09-10 18:11:12 +03:00
alamin655
b3b914d97c
Merge pull request #195 from neon-mmd/optimize-and-make-code-idiomatic-3
⚙️ Optimize and make code more idiomatic (part - II)
2023-09-10 20:39:11 +05:30
neon_arch
d14a5d4e4d 🧹 chore: make github actions happy (#180)(#178) 2023-09-10 18:02:04 +03:00
neon_arch
8dfe2e1b2d
Merge branch 'rolling' into optimize-and-make-code-idiomatic-3 2023-09-10 17:58:28 +03:00
alamin655
9cded973f0
Merge pull request #194 from neon-mmd/optimize-and-make-code-idiomatic-2
⚙️ Optimize and make code more idiomatic (part - I)
2023-09-10 20:20:50 +05:30
alamin655
260dcb5e9a
Merge branch 'rolling' into optimize-and-make-code-idiomatic-2 2023-09-10 20:13:57 +05:30
neon_arch
2324475e62
Merge pull request #219 from Siddh744542/rename-the-redis_connection_url-to-redis_url-in-the-sample-config-file
🛠️ Rename the `redis_connection_url` to `redis_url` in the sample config file
2023-09-10 11:11:12 +03:00
Siddharth Tiwari
adcebb57de fixed the issue 2023-09-10 09:36:44 +05:30
neon_arch
17bed23f18
Merge pull request #216 from boris-lok/209
🛠️ Bump the version of Debian distroless container
2023-09-08 19:14:35 +03:00
boris.lok
8f64f97613 Bump the version of Debian distroless container 2023-09-08 23:54:04 +08:00
neon_arch
07c1ebbde7
Merge pull request #215 from Lissy93/Lissy93-docs-link
📝 Fix link to Documentation in Readme
2023-09-07 22:13:53 +03:00
Alicia Sykes
5dc4d98e5a
📝 Fix link to Documentation in Readme 2023-09-07 18:42:25 +01:00
neon_arch
485a5a1e8a 🚀 chore: bump the app version (#207) 2023-09-03 21:05:31 +03:00
neon_arch
db009454c8 ⚙️ refactor: change import path for search route (#207) 2023-09-03 21:03:58 +03:00
neon_arch
493c56bd02 ⚙️ refactor: reorganize code & restructure codebase for better maintainability (#207) 2023-09-03 20:50:50 +03:00
neon_arch
453dbdc47d 🧹 chore: make rustfmt happy (#205) 2023-09-03 19:34:22 +03:00
neon_arch
0672b55349 🚀 chore: bump the app version (#205) 2023-09-03 19:25:33 +03:00
neon_arch
049b1c1ddd ⚙️ refactor: change & add documentation to the code based on the lints (#205) 2023-09-03 19:23:34 +03:00
neon_arch
0d2d449889 ⚙️ refactor: add lints to the codebase to ensure proper code style (#205) 2023-09-03 19:21:23 +03:00
neon_arch
9fec52f784 🚀 chore: bump the app version & bump the crates version (#203) 2023-09-02 20:25:17 +03:00
neon_arch
88e569bca7 feat: add actix-governor crate (#203) 2023-09-02 20:22:59 +03:00
neon_arch
51937a0d49 feat: pass the new config option into the middleware config (#203) 2023-09-02 20:22:24 +03:00
neon_arch
8cba040d80 feat: add code to parse the new config option (#203) 2023-09-02 20:21:48 +03:00
neon_arch
4eb75a8cb1 feat: add code to parse the new config option (#203) 2023-09-02 20:19:43 +03:00
neon_arch
d451fddf49 feat: add new config option to configure rate limiting middleware (#203) 2023-09-02 20:18:09 +03:00
neon_arch
15d52b519b
Merge branch 'rolling' into feat-disallow-user-to-search-via-lists 2023-09-02 19:09:56 +03:00
neon_arch
3f73e85455 🧹 chore: make rustfmt happy (#201) 2023-09-02 19:07:23 +03:00
neon_arch
67dcf53dc9 🚀 chore: bump the app version & update crates version (#201) 2023-09-02 17:55:58 +03:00
neon_arch
d6350546ea feat: provide new images for the new messages (#201) 2023-09-02 17:53:33 +03:00
neon_arch
0209114859 feat: theme the new messages provided (#201) 2023-09-02 17:52:51 +03:00
neon_arch
dd74a90e6b feat: provide new messages when results are filtered/dissallowed (#201) 2023-09-02 17:51:29 +03:00
neon_arch
05c3e6cc12 feat: implement new search parameter safe_search & code to disallow
users when safe_search is set to 4 (#201)
2023-09-02 17:50:06 +03:00
neon_arch
410257c276 feat: implement new fields, traits and functions (#201) 2023-09-02 17:48:27 +03:00
neon_arch
f4c496c02c feat: implement default trait for style struct (#201) 2023-09-02 17:46:32 +03:00
neon_arch
cbad560139 feat: pass new safe search option in the results function in the
trait (#201)
2023-09-02 17:45:17 +03:00
neon_arch
6fa45ecb12 feat: pass the config option into the results function (#201) 2023-09-02 17:44:05 +03:00
neon_arch
37e650eb8a feat: add code to parse the new config option (#201) 2023-09-02 17:42:55 +03:00
neon_arch
d6463f0872 feat: add condition to filter results only when safe_search level is
set to 3 or above (#201)
2023-09-02 17:38:46 +03:00
neon_arch
8eeaf19cbd feat: add new config option safe_search (#201) 2023-09-02 17:35:58 +03:00
neon_arch
49ca188bef
Merge branch 'rolling' into optimize-and-make-code-idiomatic-2 2023-08-31 11:31:09 +03:00
zhou fan
65f5a4ab0a
Merge pull request #196 from neon-mmd/fix-github-actions
🛠️ LuaJIT installation step for GitHub actions
2023-08-31 09:20:47 +08:00
neon_arch
55a7125cea ⚙️ refactor: add build time binary file optimization (#180)(#178) 2023-08-30 19:05:38 +03:00
neon_arch
3baabc07a2
Merge branch 'rolling' into optimize-and-make-code-idiomatic-2 2023-08-30 18:49:24 +03:00
neon_arch
a799af3125 🧹 chore: add fixes to code & make rustfmt & clippy happy (#180)(#178) 2023-08-30 18:09:58 +03:00
neon_arch
6613d5d7ac 🚀 chore: bump the app version 2023-08-30 18:02:03 +03:00
neon_arch
7ebd0cd780 🛠️ fix: fix luajit installation step 2023-08-30 17:58:16 +03:00
neon_arch
4a3dac6ec5
Merge branch 'rolling' into optimize-and-make-code-idiomatic-3 2023-08-30 13:36:51 +03:00
neon_arch
0e1cb6f2e8
Merge branch 'rolling' into optimize-and-make-code-idiomatic 2023-08-30 13:32:28 +03:00
neon_arch
5f20b31616 🚀 chore: bump the app version (#180)(#178) 2023-08-30 13:22:54 +03:00
neon_arch
7fd9246ee4 🚀 chore: bump the app version (#180)(#178) 2023-08-30 13:18:31 +03:00
neon_arch
b508e6009f 🚀 chore: bump the app version (#180)(#178) 2023-08-30 13:14:53 +03:00
zhou fan
b97f58a6fa
Merge pull request #193 from neon-mmd/fix-github-actions
🛠️ LuaJIT installation step for GitHub actions
2023-08-30 07:32:24 +08:00
neon_arch
9fdb1a3407 🚀 chore: bump the app version 2023-08-29 20:52:56 +03:00
neon_arch
6f369b88bd 🛠️ fix: add luajit installation step 2023-08-29 20:52:02 +03:00
neon_arch
4157ba8b7f ⚙️ refactor: add new crates (#180)(#178) 2023-08-29 20:16:51 +03:00
neon_arch
4c298ce18c ⚙️ refactor: add code to initialize redis cache struct only once (#180)(#178) 2023-08-29 20:15:06 +03:00
neon_arch
7b1f93b232 ⚙️ refactor: add compress middleware to reduce memory usage (#180)(#178) 2023-08-29 20:12:15 +03:00
neon_arch
1de52decd3 ⚙️ refactor: add clone trait to RedisCache struct (#180)(#178) 2023-08-29 20:10:32 +03:00
neon_arch
028463bb36 ⚙️ refactor: replace jemalloc with mimalloc (#178)(#180) 2023-08-29 20:07:28 +03:00
neon_arch
fceacdb916 🧹 chore: make cargo format happy (#180)(#178) 2023-08-27 21:17:21 +03:00
neon_arch
3db6c1017c 🚀 chore: bump the app version (#180)(#178) 2023-08-27 21:12:55 +03:00
neon_arch
33f5b5e8cc ⚙️ refactor: remove & added some crates & add a new feature (#180)(#178) 2023-08-27 21:10:36 +03:00
neon_arch
699e0ecaa9 ⚙️ refactor: update gitignore to ignore profiler results (#180)(#178) 2023-08-27 21:08:50 +03:00
neon_arch
fd6cb46f87 ⚙️ refactor: replace string type to &str type (#180)(#178) 2023-08-27 21:07:57 +03:00
neon_arch
b2c72bdfc3 ⚙️ refactor: replace pass by value with pass by reference (#180)(#178) 2023-08-27 21:06:25 +03:00
neon_arch
13ce420642 ⚙️ refactor: add several minor optimizations (#180)(#178) 2023-08-27 21:04:41 +03:00
neon_arch
2885f23ec9 ⚙️ refactor: replace vecs with smallvecs for smaller data sizes & replace to_strings with to_owned (#180)(#178) 2023-08-27 21:02:23 +03:00
neon_arch
2a68081ae2 ⚙️ refactor: remove deprecated intoreport functions & add minor optimizations (#180)(#178) 2023-08-27 21:00:22 +03:00
neon_arch
f5f0488954 ⚙️ refactor: add several optimizations to the engine code (#180)(#178) 2023-08-27 20:59:08 +03:00
neon_arch
4ccd0486e7 ⚙️ refactor: replace oncecell with oncelock from std library (#180)(#178) 2023-08-27 20:57:33 +03:00
neon_arch
7b33744c9d ⚙️ refactor: implement default trait for Style struct (#180)(#178) 2023-08-27 20:56:29 +03:00
neon_arch
e4476aae28 ⚙️ refactor: replace rlua with mlua code implementation (#180)(#178) 2023-08-27 20:55:34 +03:00
neon_arch
5f1a43976f ⚙️ refactor: add error.rs module (#180)(#178) 2023-08-27 20:53:55 +03:00
neon_arch
01d8c7ae4c ⚙️ refactor: add new pooling error type for pooling code (#180)(#178) 2023-08-27 20:52:16 +03:00
neon_arch
db93c31603 ⚙️ refactor: implement async pooling for redis connections (#180)(#178) 2023-08-27 20:50:42 +03:00
neon_arch
4afc0d16f0 ⚙️ refactor: add dhat profiler configuration with feat flag (#180)(#178) 2023-08-27 20:46:19 +03:00
neon_arch
7a8bf022d4
Merge pull request #191 from xffxff/unit_tests
🧹 Unit tests for the function `filter_with_lists`
2023-08-24 15:49:34 +03:00
xffxff
64948b84f1 bump version 2023-08-24 17:11:09 +08:00
xffxff
e5a0227762 put tempfile under dev.dependencies 2023-08-24 17:10:40 +08:00
xffxff
c3a7c917f6 make format happy 2023-08-24 09:50:19 +08:00
xffxff
23ff24bdf3 add a test to check if the regex wildcard .* matches any character 2023-08-24 09:46:01 +08:00
xffxff
a2fc10ca39 add a test for invalid regex 2023-08-24 09:36:08 +08:00
xffxff
4280545e8c add a test for non-existent file 2023-08-24 09:32:22 +08:00
xffxff
5c0397c456 add some comments to filter_with_lists and add a basic test 2023-08-24 09:29:08 +08:00
zhou fan
7f371bf91b
Merge pull request #189 from neon-mmd/feat-error-box-for-engine-errors
 Error box UI to show which engines failed with several UI improvements
2023-08-24 09:11:53 +08:00
zhou fan
2f1fa00f87
Merge branch 'rolling' into feat-error-box-for-engine-errors 2023-08-24 08:16:32 +08:00
zhou fan
11ba09a781
Merge pull request #190 from neon-mmd/feat-content-blocking-using-lists
 Filter user specified content from search results using a `blacklist` and `Allowlist`.
2023-08-24 08:16:22 +08:00
zhou fan
575a7f95ba
Merge branch 'rolling' into feat-error-box-for-engine-errors 2023-08-24 08:02:03 +08:00
neon_arch
d1eea5b0e3 feat: replace no results gif with a new gif (#185) 2023-08-23 18:10:46 +03:00
neon_arch
9f75e258e2 feat: change template name (#185) 2023-08-23 18:09:52 +03:00
neon_arch
d530410e42 feat: rename search_page_search_bar to search_bar (#185) 2023-08-23 18:08:30 +03:00
neon_arch
44216e4d4c feat: optimise search results filtering code (#163) 2023-08-23 13:11:09 +03:00
neon_arch
9c71c9f617 🧹 chore: make rustfmt happy 2023-08-22 19:29:13 +03:00
neon_arch
e8998a4be2 🚀 chore: bump the app & crates version & add regex crate (#163) 2023-08-22 19:23:39 +03:00
neon_arch
b17057471b feat: rename functions (#163) 2023-08-22 19:22:37 +03:00
neon_arch
09227d8c93 feat: move implementation of config file path to reduce duplication (#163) 2023-08-22 19:20:29 +03:00
neon_arch
df09ed9f48 feat: add lists file to filter search results (#163) 2023-08-22 19:19:31 +03:00
neon_arch
fda6c3a9be feat: rename public_paths to paths (#163) 2023-08-22 19:18:43 +03:00
neon_arch
4f28711218 feat: add code to filter aggregated search results using lists (#163) 2023-08-22 19:16:37 +03:00
neon_arch
0e14c7d80f feat: provide a partial (template) for the two search bars (#185) 2023-08-21 17:36:05 +03:00
neon_arch
7a92345bf0 feat: provide seperate search bars for the home & search pages (#185) 2023-08-21 17:35:09 +03:00
neon_arch
4d74b81e95 feat: change the name of the search bar template (#185) 2023-08-21 17:33:50 +03:00
neon_arch
68215efb9f feat: add websurfx heading to allow navigation to the homepage (#185) 2023-08-21 17:31:10 +03:00
neon_arch
f4bcb32cee feat: add the code to allow the button to toggle the error-box (#185) 2023-08-21 17:29:52 +03:00
neon_arch
6bfdc75365 feat: add & change styling for the error-box & the navbar (#185) 2023-08-21 17:28:40 +03:00
alamin655
9d2fb6c946
Merge pull request #188 from MilimTheTrueOne/rolling
🛠️ Some major fixes
2023-08-19 15:50:19 +05:30
Milim
02b8419ad0
Merge pull request #2 from alamin655/rolling
🚀 chore: bump the app version
2023-08-19 10:11:14 +00:00
MD AL AMIN TALUKDAR
160b0db15d Bump app version
Co-Authored-By: Milim <81323548+milimthetrueone@users.noreply.github.com>
2023-08-19 14:57:00 +05:30
Milim
1fa0629465 fix handelbars template 2023-08-19 11:26:53 +02:00
Milim
fe3d5735f2 bump version and remove wild fix wildcard version dependencys 2023-08-19 09:25:58 +02:00
Milim
87e230d731 fix debug level not being set properly 2023-08-19 09:09:09 +02:00
Milim
21403d0a48 fix dumb rustfmt version and bump dependency versions 2023-08-18 22:04:34 +02:00
Milim
5aca5c0d0d Improve aggregation
Adds the EngineHandler struct
Removes vulnerability where an attacker could send requests cookies with fake engine names and crash the server.
Merged RawSearchResult and SearchResult, as they were functionally identical.
2023-08-18 10:43:53 +02:00
Milim
15dfda6ea9 Improve Aggregation function & config parser
Refactor aggregation function
Rename visiting_url to url, as they are always the same (see upstream engine scalping).
Refactor parsing function to be more readable.
2023-08-17 22:48:20 +02:00
Milim
af3b1cb308 Use non-blocking sleep function
std:🧵:sleep blocks the entire thread and thus also forces all other current requests to be halted.
2023-08-17 21:45:48 +02:00
neon_arch
c4935f202a feat: add images, error_box & new message when no results are provided (#185) 2023-08-10 04:32:47 +03:00
alamin655
23f8c482dc
Merge pull request #184 from neon-mmd/improve-results-caching
🔧 Cache next and previous pages on search
2023-08-07 22:40:40 +05:30
alamin655
f8bd25b523
Merge branch 'rolling' into improve-results-caching 2023-08-07 20:22:51 +05:30
neon_arch
9fd8275b17
Merge pull request #187 from AapoSoukkio/update-README.md
🛠️ Change the number of colorschemes available
2023-08-07 17:26:40 +03:00
Aapo Soukkio
62e644d536
Update README.md 2023-08-07 12:28:47 +03:00
neon_arch
272fdefff5
Merge branch 'rolling' into improve-results-caching 2023-08-06 20:53:14 +03:00
neon_arch
f68d9ab442 🚀 chore: bump the app version (#160) 2023-08-06 20:33:42 +03:00
neon_arch
a596c07547 🔧 chore: add code to cache the previous & next pages (#160) 2023-08-06 20:31:30 +03:00
neon_arch
a50eb61954
Merge pull request #183 from alamin655/rolling
🔧 Gitpod configuration to improve developer experience
2023-08-06 19:27:26 +03:00
alamin655
cca54ade86
Merge pull request #35 from alamin655/alamin655-patch-1
Update .gitpod.yml
2023-08-06 21:13:41 +05:30
alamin655
23864c01c1
Update .gitpod.yml 2023-08-06 21:13:28 +05:30
alamin655
d4bb6ecb57
Add gitlens extension
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-08-06 20:52:29 +05:30
alamin655
efe3bbd177
Merge pull request #34 from alamin655/alamin655-patch-1
Update .gitpod.yml
2023-08-06 17:59:51 +05:30
alamin655
2adf9aa9c3
Update .gitpod.yml 2023-08-06 17:59:37 +05:30
alamin655
4f4205bc80
Merge pull request #33 from alamin655/alamin655-patch-1
chore: bump the app version
2023-08-06 17:51:25 +05:30
alamin655
cb473cf9f2
chore: bump the app version 2023-08-06 17:51:11 +05:30
alamin655
a0046f4de0
Merge pull request #32 from alamin655/alamin655-patch-1
chore: bump the app version
2023-08-06 17:45:13 +05:30
alamin655
9b4833aaa2
chore: bump the app version 2023-08-06 17:44:03 +05:30
alamin655
a768b40ede
Merge branch 'neon-mmd:rolling' into rolling 2023-08-06 14:12:32 +05:30
alamin655
7af48ba626
Merge pull request #177 from neon-mmd/readme-revision
📜 Revise the `docs` to remain in sync with the current changes
2023-08-06 14:02:22 +05:30
alamin655
1282d22327
Merge pull request #31 from alamin655/alamin655-patch-1
Create .gitpod.Dockerfile
2023-08-06 13:59:10 +05:30
alamin655
a2146861a8
Create .gitpod.Dockerfile 2023-08-06 13:56:52 +05:30
alamin655
5b12b7bbe8
Update .gitpod.yml 2023-08-06 13:55:51 +05:30
alamin655
8e7fa6bb97
Update .gitpod.yml 2023-08-06 12:38:17 +05:30
alamin655
f3aedb1ffd
Merge branch 'rolling' into readme-revision 2023-08-06 11:07:20 +05:30
zhou fan
58bc5789ca
Merge pull request #176 from neon-mmd/improve-logging-based-on-levels-and-opts
🔧 Config options to change the logging level with improved logging
2023-08-06 08:32:43 +08:00
neon_arch
efa61ea952 🚀 chore: bump the app version (#175) 2023-08-05 19:49:54 +03:00
neon_arch
3d9455297f 📜 docs: add documentation for the new config option (#175) 2023-08-05 19:37:29 +03:00
neon_arch
ca13fb7ad4 Merge branch 'improve-logging-based-on-levels-and-opts' of github.com:neon-mmd/websurfx into improve-logging-based-on-levels-and-opts 2023-08-05 19:20:58 +03:00
neon_arch
653d08c801 🔧 chore: fix link in the logs & add logs for engine error (#170) 2023-08-05 19:16:27 +03:00
neon_arch
0d8c12e26b
Merge branch 'rolling' into improve-logging-based-on-levels-and-opts 2023-08-04 12:55:05 +03:00
zhou fan
a5b7d08dc6
Merge pull request #174 from neon-mmd/patch-csrf-security-with-cors
🛠️ Provide CORS protection against CSRF attacks
2023-08-04 17:44:07 +08:00
neon_arch
9d3a8e065a
Merge branch 'rolling' into patch-csrf-security-with-cors 2023-08-04 12:35:26 +03:00
zhou fan
01b1b88d1d
Merge branch 'rolling' into improve-logging-based-on-levels-and-opts 2023-08-04 07:51:51 +08:00
zhou fan
c4a2d878a2
Merge pull request #171 from neon-mmd/feat-add-threads-opt
 Config option to allow users to customize the number of threads used by the app
2023-08-04 07:50:22 +08:00
neon_arch
246d043e4a 🚀 chore: bump the app version (#173) 2023-08-03 23:11:49 +03:00
neon_arch
8b0f2f50f0 🔧 chore: improve logging based on levels & config options (#173) 2023-08-03 23:09:08 +03:00
neon_arch
cad5307b82 🚀 chore: bump the app version 2023-08-03 18:22:51 +03:00
neon_arch
bef8956da6 🛠️ fix: add code to prevent csrf attacks using cors (#172) 2023-08-03 17:44:13 +03:00
neon_arch
e02fafd69c feat: fix doc tests 2023-08-03 01:03:56 +03:00
neon_arch
4b4dc28cd2 feat: add control check to avoid reinitializing logging & fix tests 2023-08-03 00:12:09 +03:00
neon_arch
26b59078b8 🚀 bump the app version 2023-08-02 20:09:07 +03:00
neon_arch
11bcf9c98a feat: remove space from the end of the line 2023-08-02 20:07:29 +03:00
neon_arch
d8bd2feb6e feat: add new config option to manage threads and improve logging 2023-08-02 20:05:39 +03:00
alamin655
5b4e7c75c0
Merge pull request #166 from xffxff/fix_search_button
fix: ensure that the search functions properly when it is clicked
2023-08-01 14:57:10 +05:30
alamin655
84e136b49e
chore: bump the app version 2023-08-01 14:50:45 +05:30
alamin655
e1ae7d2607
chore: bump the app version 2023-08-01 14:41:31 +05:30
xffxff
fd636a4eaa fix: ensure that the search functions properly when it is clicked 2023-08-01 08:53:55 +08:00
neon_arch
372a5145b6
Merge pull request #165 from neon-mmd/patch-searx-results-on-first-page
🛠️ Handle page value returned from search query parameter
2023-07-31 18:12:28 +03:00
neon_arch
a8b6a9bce2
Merge branch 'rolling' into patch-searx-results-on-first-page 2023-07-31 13:57:34 +03:00
zhou fan
b29976625e
Merge pull request #162 from neon-mmd/readme-revision
📜 Revise the `docs` to remain in sync with the current changes
2023-07-31 17:41:01 +08:00
neon_arch
47504cccd4
Merge branch 'rolling' into readme-revision 2023-07-31 11:16:32 +03:00
zhou fan
571b7ce51a
Merge pull request #159 from neon-mmd/feat-add-timeout-opt
 Config option to control the time for server request timeout
2023-07-31 08:51:52 +08:00
neon_arch
9d32f4a326 🚀 chore: bump the app version 2023-07-30 20:16:41 +03:00
neon_arch
a8791deb13 🛠️ fix: add & improve code to handle page handling in searx & duckduckgo 2023-07-30 20:14:40 +03:00
neon_arch
82d0fd5e91 🚀 chore: bump the app version 2023-07-30 17:59:52 +03:00
neon_arch
130e9a19e5 📜 docs: update the docs to provide information on the new config option 2023-07-30 17:57:55 +03:00
neon_arch
9cb582a10d feat: improve code documentation 2023-07-30 17:08:47 +03:00
neon_arch
25d6af0251 🧹 chore: reformat code to make rustfmt happy 2023-07-30 16:58:19 +03:00
neon_arch
c77b16d1ad 🚀 bump the app version 2023-07-30 10:55:21 +03:00
neon_arch
2d47e8d730 feat: provide the functionality to use the new config option 2023-07-30 10:53:48 +03:00
neon_arch
6d3396b6f9 feat: provide functionality to parse the new config option 2023-07-30 10:52:03 +03:00
neon_arch
d3007e3e88 feat: add new config option 2023-07-30 10:50:52 +03:00
neon_arch
71c890ba05
Merge pull request #157 from AapoSoukkio/patch-1
🔧  Colorschemes option documentation updated in config.lua
2023-07-29 14:08:32 +03:00
Aapo Soukkio
89ee2e48ed
Colorschemes updated in config.lua 2023-07-28 18:52:01 +03:00
alamin655
3ac8465f4c
Merge pull request #154 from exalented/fix-links
Fix result links
2023-07-19 20:22:48 +05:30
alamin655
5cc28ad5eb
Merge branch 'rolling' into fix-links 2023-07-19 19:55:53 +05:30
zhou fan
9964be472e
Merge pull request #151 from neon-mmd/readme-revision
📜 Revise the `docs` to remain in sync with the current changes
2023-07-19 17:03:47 +08:00
zhou fan
512fea0321
Merge branch 'rolling' into readme-revision 2023-07-19 16:46:15 +08:00
zhou fan
e4d92166ec
Update docs/configuration.md 2023-07-19 16:41:55 +08:00
Curtis S. Alexander
f883e78146
Fix result links 2023-07-18 12:04:35 -07:00
neon_arch
b3467f6eab 🚀 chore: Bump the app version 2023-07-18 18:28:28 +03:00
neon_arch
55e1672883 📜 docs: update the theming and customisation explainations (#148) 2023-07-18 18:21:54 +03:00
neon_arch
7a33ee03d6 📜 docs: update the installation instructions (#148) 2023-07-18 18:21:13 +03:00
neon_arch
5bed9e735e 📜 docs: update & add option names & revise the explaination (#148) 2023-07-18 18:12:47 +03:00
neon_arch
221f38c705
Merge pull request #146 from neon-mmd/improve-async-multithreading
 Provide a way to allow users to select different engines
2023-07-18 10:59:30 +03:00
neon_arch
a28d559426 feat: add documentation for the outputs.iter() code block 2023-07-17 17:03:50 +03:00
neon_arch
987e667c3d feat: rename results_json to results 2023-07-17 13:17:24 +03:00
neon_arch
7e3b59e8c0 feat: remove the empty_result_set option and helper functions 2023-07-17 13:03:20 +03:00
neon_arch
c5fca32553 feat: fix spelling mistake in the comment 2023-07-17 10:50:15 +03:00
neon_arch
cff7de9d0f feat: rephrase the comment to break it into smaller sentences. 2023-07-17 10:47:29 +03:00
neon_arch
74e4fc6169 Merge branch 'rolling' into improve-async-multithreading 2023-07-15 19:50:31 +03:00
neon_arch
1c2ea24024 🚀 chore: bump the app version 2023-07-15 13:43:49 +03:00
neon_arch
0096154bdd feat: add documentation for the new config option 2023-07-15 13:37:53 +03:00
neon_arch
94ef62eec9 feat: add documentation to code 2023-07-15 13:36:46 +03:00
neon_arch
8133de1758 feat: add check to conditionaly pass empty_result_set to true to UI 2023-07-14 21:29:01 +03:00
neon_arch
a3edf70d1e feat: add code to pass engine errors to the UI 2023-07-14 21:27:23 +03:00
neon_arch
3aeb3b3e73 feat: add setter functions to SearchResults struct 2023-07-14 21:26:29 +03:00
neon_arch
9ee516e9b1 feat: fix code for clippy suggestions 2023-07-14 21:18:26 +03:00
neon_arch
3e6f7867eb feat: add code to parse cookies and handle engine selection from UI 2023-07-14 17:20:46 +03:00
neon_arch
27247baf0c feat: define common behaviour for all engines 2023-07-14 17:17:05 +03:00
neon_arch
c223fed394 feat: remove the time crate import 2023-07-14 17:16:13 +03:00
neon_arch
23abe619d7 feat: enable cookies feature for actix-web 2023-07-14 17:14:41 +03:00
neon_arch
2f01651be0 feat: fix bugs and add code to handle engine selections
Co-authored-by: Sabrina Jewson <58880148+SabrinaJewson@users.noreply.github.com>
2023-07-14 12:56:06 +03:00
neon_arch
0781385393 feat: implement async multithreading and engine selection code 2023-07-11 19:44:38 +03:00
neon_arch
897ab0807f feat: fix the argument type used 2023-07-11 19:43:32 +03:00
neon_arch
f9b9e87a0e feat: rewrite code by implementing common engine trait SearchEngine 2023-07-11 19:42:17 +03:00
neon_arch
b72af01e0e feat: implement common engine trait 2023-07-11 19:41:34 +03:00
neon_arch
1bccffce54 feat: add async_trait crate 2023-07-11 19:40:21 +03:00
neon_arch
ff79c1fcfb feat: code to parse and handle the new config option 2023-07-11 19:38:59 +03:00
neon_arch
7def2964b7 feat: add new config file option to choose upstream search engines 2023-07-11 19:37:31 +03:00
alamin655
e4625c3fd0
Merge pull request #144 from neon-mmd/patch-and-improve-dockerfile
Patch and improve the `Docker` deployment process
2023-07-11 19:55:53 +05:30
neon_arch
a0565f1893
Merge branch 'rolling' into patch-and-improve-dockerfile 2023-07-10 19:49:29 +03:00
neon_arch
4349d90ad5 🧹 chore: bump the app version 2023-07-10 19:32:49 +03:00
neon_arch
aab12695f0 🛠️ fix: changing from relative to absolute paths and changing the paths to be copied to and from 2023-07-10 19:27:40 +03:00
neon_arch
c5db7cc685
Merge pull request #139 from alamin655/JSDocs
🧹 chore: Enhance JS Code Documentation with Comprehensive Comments and Docstrings
2023-07-09 09:23:12 +03:00
alamin655
f341bbab9a
Merge pull request #25 from alamin655/alamin655-patch-1
Update Cargo.lock
2023-07-09 08:52:35 +05:30
alamin655
d1d1186ca6
Update Cargo.lock 2023-07-09 08:52:19 +05:30
alamin655
acc2a7e764
Merge pull request #24 from alamin655/alamin655-patch-1
Bump version to "0.13.16"
2023-07-09 08:28:55 +05:30
alamin655
e789abe1b5
Bump version to "0.13.16" 2023-07-09 08:28:38 +05:30
alamin655
dd24aec825
Merge branch 'rolling' into JSDocs 2023-07-09 08:23:15 +05:30
neon_arch
eb4ed31c9a
Merge pull request #142 from Trickshotblaster/rolling
🛠️  fix: update the colorschemes in `public/static/colorschemes`
2023-07-08 19:55:52 +03:00
neon_arch
7de44ba9d9
Merge branch 'rolling' into rolling 2023-07-08 13:20:53 +03:00
neon_arch
dd558a5a1d
Merge pull request #141 from phoffmeister/issue-140
🧹  chore: add dashes to yaml files
2023-07-08 13:03:18 +03:00
Trickshotblaster
037befaaac Make searchbar text more readable in solarized themes 2023-07-07 15:12:43 -07:00
Pierre
cc4fc0a417 add dashes to YAML files 2023-07-07 21:20:36 +00:00
alamin655
a06b23566b
Merge pull request #22 from alamin655/alamin655-patch-3
Add comments and docstrings to the code
2023-07-07 20:20:53 +05:30
alamin655
6ba8d867e9
Merge pull request #21 from alamin655/alamin655-patch-2
Add comments and docstrings to the code
2023-07-07 20:20:37 +05:30
alamin655
27776b355e
Merge pull request #20 from alamin655/alamin655-patch-1
Add comments and docstrings to the code
2023-07-07 20:20:11 +05:30
alamin655
a615fffdf3
Add comments and docstrings to the code 2023-07-07 20:09:43 +05:30
alamin655
f103e4643c
Add comments and docstrings to the code 2023-07-07 20:08:47 +05:30
alamin655
6bc06a34f5
Add comments and docstrings to the code 2023-07-07 20:05:55 +05:30
Trickshotblaster
d45d2e5c63 Update theme colors 2023-07-06 16:15:36 -07:00
neon_arch
09d9573c55
Merge pull request #111 from alamin655/check
🤖  ci: configure MegaLinter for automated code linting
2023-07-06 20:14:49 +03:00
alamin655
0d9e2ba3ac
Update Cargo.lock 2023-07-06 20:45:32 +05:30
alamin655
b11260dedb
Bump version 2023-07-06 20:23:26 +05:30
alamin655
5cdbb62aba
Merge branch 'neon-mmd:rolling' into check 2023-07-06 20:18:11 +05:30
neon_arch
77e0f21dec
Merge pull request #138 from abhikumar63/63abhikumar
🧹  chore: Rename variables' name to make them kebab cased
2023-07-06 17:35:57 +03:00
abhikumar63
7682d9f3b6 Completed the modification of variable names. 2023-07-06 18:58:22 +05:30
alamin655
1ee7661d96
Update .mega-linter.yml 2023-07-06 18:05:07 +05:30
alamin655
ac49d0c784
Update mega-linter.yml 2023-07-06 18:04:17 +05:30
alamin655
94046cbd3a
Merge branch 'rolling' into check 2023-07-06 17:09:42 +05:30
alamin655
098ae8eb46
Merge pull request #136 from Trickshotblaster/rolling
Rename getter functions to follow Rust naming convention
2023-07-05 14:52:35 +05:30
Trickshotblaster
99936bcb1a Rename getter functions 2023-07-04 15:11:30 -07:00
neon_arch
2dbffcc6b7
Merge pull request #132 from alamin655/improving-gitpod
🧹 chore: improve the `Gitpod` setup
2023-07-04 20:21:45 +03:00
alamin655
29b1376cde
Merge branch 'rolling' into improving-gitpod 2023-07-04 13:27:36 +05:30
alamin655
5761bcae14
Merge branch 'neon-mmd:rolling' into check 2023-07-04 13:26:16 +05:30
alamin655
9c8b826398
Merge pull request #133 from MilimTheTrueOne/rolling
Renaming and Refactoring
2023-07-04 13:19:53 +05:30
Milim
7339fa58b8
Merge pull request #1 from neon-mmd/rolling
Renaming and Refactoring
2023-07-03 19:40:39 +02:00
Milim
4cb38b1b54 Fix docs 2023-07-03 19:38:17 +02:00
Milim
440216871d Rename Things, refactor some code
BREAKING: renames `binding_ip_addr` to `binding_ip` and `redis_connection_url` to `redis_url`.

Renames a lot of internals as well, but they are to many to mention.
2023-07-03 19:30:25 +02:00
alamin655
bf01f1f189
Update .gitpod.yml 2023-07-03 21:27:11 +05:30
alamin655
6ccef40a82
Update .gitpod.yml 2023-07-03 21:25:46 +05:30
alamin655
55fc65a031
Update .gitpod.yml 2023-07-03 20:14:36 +05:30
neon_arch
7be6c6fedc
Merge pull request #121 from KekmaTime/xss-fix
🛠️ fix: add changes to fix xss vulnerabilities
2023-07-03 17:15:50 +03:00
alamin655
8fc1b06cca
Merge branch 'rolling' into check 2023-07-03 18:41:09 +05:30
alamin655
8ddb6bd1b1
Merge branch 'rolling' into xss-fix 2023-07-02 11:45:32 +05:30
alamin655
07ea0b0e35
Merge pull request #128 from neon-mmd/fix-gitpod-config-file
Make Gitpod work by fixing the config file
2023-07-02 11:38:06 +05:30
alamin655
b083f844eb
Apply suggestions from code review 2023-07-02 11:29:42 +05:30
alamin655
5fa5495601
Merge branch 'rolling' into xss-fix 2023-06-30 21:26:12 +05:30
neon_arch
957ff6975d 🚀 chore: bump the app version 2023-06-30 18:32:56 +03:00
neon_arch
aa43b3f2dc 🧹 chore: replace dashes with spaces 2023-06-30 18:27:26 +03:00
neon_arch
1893e85365
Merge pull request #125 from MilimTheTrueOne/rolling
🔧  refactor: Improve code quality
2023-06-30 18:07:11 +03:00
Milim
b18db5414a
Update README.md
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-06-30 14:47:15 +00:00
Milim
dbe5b533d6 fix spelling 2023-06-29 19:40:49 +02:00
Milim
e2907edf6e refactor config helper function 2023-06-29 19:10:09 +02:00
Milim
1f90b4e15c refactor search route and change default page to 0
that thing was utterly insane, and i am not sorry for saying this
2023-06-29 18:49:38 +02:00
alamin655
bb65e4e018
Merge pull request #122 from neon-mmd/add-gitpod-config
Provide config file for gitpod
2023-06-28 14:20:41 +05:30
alamin655
49eaa78803
Merge branch 'rolling' into add-gitpod-config 2023-06-28 14:14:29 +05:30
KekmaTime
564662ba08 forwardslash-cwe79 2023-06-27 19:09:28 +05:30
KekmaTime
abed62ba3f href-fixed 2023-06-27 18:59:05 +05:30
neon_arch
6efc528588 🧹 chore: add config file for gitpod 2023-06-26 19:24:15 +03:00
KekmaTime
574b21e5fa
updated-search.html
added triple brackets in 'this.url' & 'this'
2023-06-25 22:59:15 +05:30
neon_arch
e03881d443
Merge pull request #120 from spoloxs/patch-1
chore: add criterion crate
2023-06-25 19:16:16 +03:00
spoloxs
c6696720d0
Update Cargo.toml 2023-06-25 14:57:35 +05:30
neon_arch
0495c84384 🧹 chore: add config file for Gitpod 2023-06-24 20:52:20 +03:00
alamin655
91e9c89d5f
Merge branch 'neon-mmd:rolling' into check 2023-06-23 14:55:46 +05:30
alamin655
95d258ff23
Merge pull request #117 from CYBWEBALI/newContribution
Fix: font case in engines_tab.html
2023-06-23 14:53:51 +05:30
Alimurtuza
9c2ae19de9
Change font case in engines_tab.html 2023-06-22 22:20:08 +05:30
neon_arch
3c28114f4c
Merge pull request #116 from CYBWEBALI/newContribution
Fix: Typo in cookies.js
2023-06-22 19:33:37 +03:00
Alimurtuza
196109af72
Typo in cookies.js 2023-06-22 21:44:43 +05:30
alamin655
a728ac20f6
Merge branch 'neon-mmd:rolling' into check 2023-06-22 21:13:52 +05:30
alamin655
7c39a9889b
Merge pull request #115 from CYBWEBALI/newContribution
FIX:Replace hashes with appropriate links
2023-06-22 20:54:50 +05:30
CYBWEBALI
4310bb73e6 FIX:Replace hashes with appropriate links 2023-06-22 10:27:53 +05:30
alamin655
37b0996139
Merge branch 'rolling' into check 2023-06-20 19:17:37 +05:30
alamin655
311a8d5b1f
Merge pull request #110 from neon-mmd/improve-and-fix-settings-page
Improve the code associated with the settings page
2023-06-20 18:47:40 +05:30
alamin655
e7a0d11a1e
chore: Bump version number 2023-06-20 18:35:57 +05:30
alamin655
367831e3e0
chore: Bump the app version number 2023-06-20 18:32:00 +05:30
neon_arch
3be0c65109 feat: use ternary condition statement and add error-handling 2023-06-19 19:38:45 +03:00
alamin655
c48856a280
Merge pull request #14 from alamin655/alamin655-patch-1
Update mega-linter.yml
2023-06-19 21:19:16 +05:30
alamin655
1f3fd07e40
Delete .jscpd.json 2023-06-19 21:01:15 +05:30
alamin655
0b48512b6a
Update .mega-linter.yml 2023-06-19 21:00:57 +05:30
alamin655
8313fcc7d9
Update .gitignore 2023-06-19 19:11:05 +05:30
alamin655
abbe0b2ac8
Create .cspell.json 2023-06-19 19:10:26 +05:30
alamin655
5559b77915
Create .jscpd.json 2023-06-19 19:08:58 +05:30
alamin655
6e843f06c5
Create .mega-linter.yml 2023-06-19 19:08:14 +05:30
alamin655
fab6b8964f
Update mega-linter.yml 2023-06-19 19:04:13 +05:30
neon_arch
2b7e28c963
Merge branch 'rolling' into improve-and-fix-settings-page 2023-06-18 20:48:38 +03:00
neon_arch
83845602a6 feat: bump the app version (#36) (#37) 2023-06-18 20:29:03 +03:00
neon_arch
8a1d3777a2 feat: fix the styling of the cookies tab 2023-06-18 20:22:10 +03:00
neon_arch
87eb0d9552 feat: improve the cookies tab under the settings page 2023-06-18 20:19:25 +03:00
neon_arch
75f02d7245 feat: add documentation to code 2023-06-18 20:12:20 +03:00
neon_arch
8e9fe4d03a feat: Reducing the amount of js used and improving code functionality (#36) (#37) 2023-06-18 19:50:32 +03:00
alamin655
508024e2d9
Merge pull request #13 from alamin655/alamin655-patch-1
Create mega-linter.yml
2023-06-16 16:06:50 +05:30
alamin655
4cabe21440
Create mega-linter.yml 2023-06-16 16:01:05 +05:30
alamin655
c37a9b4c6f
Merge pull request #106 from neon-mmd/make-cargo-toml-consistent
Improve the consisteny of toml file
2023-06-16 14:59:46 +05:30
alamin655
58fb4070c7
Merge branch 'rolling' into make-cargo-toml-consistent 2023-06-16 14:55:24 +05:30
alamin655
672c8b3005
Merge pull request #105 from neon-mmd/bump-the-cargo-toml-version
Bump the app version number
2023-06-16 14:50:24 +05:30
neon_arch
695688daa2 🚀 chore: bump the app version 2023-06-15 18:24:31 +03:00
neon_arch
d2967a90cb 🛠️ style: make cargo.toml consistent 2023-06-15 18:19:10 +03:00
neon_arch
2d6f141514 🛠️ fix: bump the version number 2023-06-15 18:09:12 +03:00
neon_arch
42686b92f3
Merge pull request #104 from xffxff/error_stack
improve error handling by using `error-stack` crate
2023-06-15 10:45:10 +00:00
xffxff
ebb9e9ee2b make format happy 2023-06-15 06:48:37 +08:00
zhou fan
b6faa09750
Update src/engines/engine_models.rs
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-06-15 06:28:21 +08:00
xffxff
1ebf888085 log the error from engines 2023-06-15 06:27:45 +08:00
xffxff
9a4cf949e4 improve error handling by using error-stack crate 2023-06-14 21:23:00 +08:00
zhou fan
e8935bc52d
Merge pull request #103 from alamin655/js
Streamline search and navigation logic for better code maintainability
2023-06-11 06:33:29 +08:00
alamin655
08e64b368a
Merge branch 'rolling' into js 2023-06-10 20:57:02 +05:30
neon_arch
d03ec00eb8
Merge pull request #102 from Bruhadeesh/rolling
chore: fixed typos, and grammatical mistakes and made Readme friendlier
2023-06-10 15:18:24 +00:00
Bruhadeesh Siva
8392a87a8b Update README.md
Updated grammar, fixed sentence structure, and made a few sentences more engaging. A little bit of work was also done to make the language more confident as well as welcoming to new contributors. Cheers!
2023-06-10 15:34:19 +05:30
alamin655
611cad7223
Update pagination.js 2023-06-07 22:07:35 +05:30
alamin655
73c7954283
Merge pull request #11 from alamin655/alamin655-patch-1
Update search functionality with improved code
2023-06-07 16:18:20 +05:30
alamin655
5689d372c3
Update search functionality with improved code
This commit updates the search functionality on the website with improved code that is more readable and maintainable. The code has been refactored to use more descriptive variable and function names, and comments have been added to clarify the purpose of each block of code. Template literals and encodeURIComponent have been used to ensure proper formatting of the search query parameter, and a check has been added to ensure that the search query is not empty before redirecting the user. This update should improve the user experience by providing more reliable and consistent search functionality. The code has been tested locally to ensure that it works as intended, and no changes were made to the UI or design of the search box and results page.
2023-06-07 16:14:54 +05:30
zhou fan
fad1fd34d9
Merge pull request #98 from neon-mmd/optimise-releases
Optimize build profiles for development and production use
2023-06-06 07:27:31 +08:00
zhou fan
2cdfadcb2b
Merge branch 'rolling' into optimise-releases 2023-06-06 07:09:37 +08:00
neon_arch
851b144304
Merge pull request #89 from neon-mmd/handle-reqwest-errors
chore: add code to handle reqwest errors and bump the version number
2023-06-05 09:55:24 +00:00
neon_arch
39da8e8d63 build: optimise build profiles and add necessary information under package section 2023-06-05 12:30:14 +03:00
zhou fan
4ed127bf5a
Merge branch 'rolling' into handle-reqwest-errors 2023-06-05 08:26:54 +08:00
zhou fan
5f9cc3079c
Merge pull request #62 from LX5321/master
UPDATED: Removed Deprecated API
2023-06-05 07:35:33 +08:00
neon_arch
d65958924f
Merge pull request #88 from sam-sunder/rolling
feat: provide a settings page
2023-06-04 16:43:05 +00:00
Sam sunder
3cbe1cbf00 Added detailed documentation to JS functions and fixed a mistake while loading css from cookie. 2023-06-04 14:31:02 +00:00
neon_arch
c2280b7349 chore: add source and an appropriate message to different error variants 2023-06-04 11:56:07 +03:00
Sam sunder
ef7567b454 Removed unnecessary selector from simple.css 2023-06-03 14:04:24 +05:30
MD AL AMIN TALUKDAR
93f81633fc
Merge branch 'rolling' into master 2023-06-03 13:23:24 +05:30
Sam sunder
c6e833c235 Provide settings page with full functionality. 2023-06-03 12:56:42 +05:30
Sam sunder
1e7f646260
Merge branch 'neon-mmd:rolling' into rolling 2023-06-03 12:56:09 +05:30
neon_arch
e7701e1014
Merge pull request #90 from neon-mmd/add-pre-commit-checks
chore: add pre-commit checks to ensure better code quality
2023-06-01 13:34:38 +00:00
neon_arch
8dd18ebed8 chore: add pre-commit checks for writting better code 2023-06-01 12:25:36 +03:00
neon_arch
4460730ca6 chore: make clippy github action happy 2023-06-01 12:21:45 +03:00
neon_arch
975e8a480b
Merge branch 'rolling' into handle-reqwest-errors 2023-05-31 17:20:08 +00:00
neon_arch
5b4a6a8282 chore: bump version to v0.12.0 2023-05-31 20:14:26 +03:00
neon_arch
5962cca294 chore: provide a better and more standardized way to handle engine errors 2023-05-31 19:54:51 +03:00
Sam sunder
4a70e0220d
Merge branch 'rolling' into rolling 2023-05-31 19:36:07 +05:30
neon_arch
662cbcf12e
Merge pull request #87 from alamin655/rolling
feat: provide more famous colorschemes.
2023-05-31 13:28:22 +00:00
Sam sunder
fd798e665f Merge branch 'rolling' of https://github.com/sam-sunder/websurfx into rolling 2023-05-31 18:36:53 +05:30
Sam sunder
a98f3fa2f5 Added settings in settings page and added search link to navbar 2023-05-31 18:35:02 +05:30
MD AL AMIN TALUKDAR
37187b5b46
Merge pull request #3 from alamin655/colorscheme
New: Include Tokyo Night, One Dark, and Dark Chocolate colorschemes
2023-05-31 17:04:51 +05:30
MD AL AMIN TALUKDAR
59013c83e4
Create dark-chocolate.css 2023-05-31 16:51:00 +05:30
MD AL AMIN TALUKDAR
bc43e15467
Create one-dark.css 2023-05-31 16:50:13 +05:30
MD AL AMIN TALUKDAR
8c4d359e26
Create tokyo-night.css 2023-05-31 16:48:50 +05:30
zhou fan
9cf532e5d5
Merge pull request #84 from neon-mmd/contributors-list-automation-ci
Provide appropriate permissions for contributors' list generation ci
2023-05-31 08:15:42 +08:00
zhou fan
e6023d4c7e
Merge branch 'rolling' into contributors-list-automation-ci 2023-05-31 07:16:43 +08:00
zhou fan
1d6884552d
Merge pull request #86 from neon-mmd/update-docs-with-debug-opt
Revise the docs to explain the new debug option
2023-05-31 07:15:58 +08:00
neon_arch
af145e9d85 docs: update docs to explain about the new option debug 2023-05-30 14:55:11 +03:00
neon_arch
8839c5518e
Merge branch 'rolling' into contributors-list-automation-ci 2023-05-30 10:08:26 +00:00
neon_arch
aeb2510de8 ci: fix contributors list autogeneration by appropriate permissions 2023-05-30 13:00:08 +03:00
zhou fan
c7aefca53f
Merge pull request #82 from XFFXFF/fix_contributor_action
fix the contributor list action
2023-05-30 17:48:19 +08:00
XFFXFF
af8b3ce71b fix the contributor list action 2023-05-30 09:23:42 +00:00
zhou fan
e45093bc9e
Merge pull request #79 from neon-mmd/contributors-list-automation-ci
Github CI to automate the generation of contributors list
2023-05-30 15:57:43 +08:00
zhou fan
5250cfb138
Merge branch 'rolling' into contributors-list-automation-ci 2023-05-30 15:53:34 +08:00
zhou fan
1976b76d3c
Merge pull request #80 from neon-mmd/feat-add-debug-opt
Provide a debug option in the config
2023-05-30 08:11:26 +08:00
neon_arch
13632f1f99 feat: remove random delays when debug is set to true 2023-05-29 21:28:09 +03:00
neon_arch
eb44ff7cfa chore: Bump version to v0.11.0 2023-05-29 21:17:00 +03:00
neon_arch
60317a3b75 chore: make format ci happy 2023-05-29 21:13:07 +03:00
neon_arch
d4df90160d feat: add an option to enable/disable debug mode 2023-05-29 21:09:07 +03:00
neon_arch
6ef6b32325 ci: add CI to automate the generation of contributors list 2023-05-29 19:45:00 +03:00
zhou fan
141aacc82a
Merge pull request #74 from neon-mmd/update-docs-with-logging-opt
Update the docs for new logging option and bump the version
2023-05-29 07:37:41 +08:00
neon_arch
7aa1394e7c chore: bump version to v0.10.0 2023-05-28 11:30:08 +03:00
neon_arch
68da0d854a docs: improve the wording of the configuration page 2023-05-28 11:24:28 +03:00
neon_arch
473ada2871 docs: update docs to explain about the new option logging 2023-05-28 11:23:11 +03:00
zhou fan
5cb53c7422
Merge pull request #70 from neon-mmd/feat-add-logging-option
Provide an option to enable or disable logs
2023-05-28 10:20:11 +08:00
zhou fan
680ffd1631
Merge branch 'rolling' into feat-add-logging-option 2023-05-28 10:01:50 +08:00
neon_arch
8e7dc68d2d feat: add an option to enable or disable logs 2023-05-27 19:50:20 +03:00
neon_arch
67287c3d67
Merge pull request #69 from sam-sunder/rolling
chore: center the About page content
2023-05-27 16:03:27 +00:00
Sam sunder
6006a983b3 Centered about div 2nd commit 2023-05-27 15:38:47 +00:00
Sam sunder
294dfe74a9 Centered About page content 2023-05-27 15:01:52 +00:00
neon_arch
1d638ffeea chore: fix the installation instructions under installation section 2023-05-27 17:07:26 +03:00
neon_arch
87ac0b7cfe docs: fix the installation instructions 2023-05-27 17:06:45 +03:00
neon_arch
f7c1df268f chore: fix the docs link 2023-05-27 17:01:47 +03:00
neon_arch
403166c0dd Merge branch 'stable' into rolling 2023-05-27 16:36:46 +03:00
zhou fan
05eda69a0a
Merge pull request #64 from neon-mmd/readme-revision
Revise and improve the Readme
2023-05-27 15:16:10 +08:00
zhou fan
9fc5300bd1
Merge pull request #63 from neon-mmd/documentation-revision
Revise and improve the documentation
2023-05-27 15:11:47 +08:00
neon_arch
5b706701d0 chore: fix the installation instructions under installation section 2023-05-27 10:11:42 +03:00
neon_arch
be453e6653
docs: fix the installation instructions under install from source for rolling subsection
Co-authored-by: zhou fan <1247714429@qq.com>
2023-05-27 07:06:45 +00:00
neon_arch
175e0c25b3
docs: fix the installation instructions under install from source
Co-authored-by: zhou fan <1247714429@qq.com>
2023-05-27 07:06:03 +00:00
zhou fan
2ab1ee1962
Merge pull request #66 from neon-mmd/reorder-config-file-options
Reorder config file options and make headings stand out
2023-05-27 14:28:30 +08:00
neon_arch
5003c8e61f chore: reorder config file options under appropriate headings and make headings standout 2023-05-26 19:27:15 +03:00
neon_arch
995b9ae42f chore: add installation intructions on how to install cargo 2023-05-26 13:34:14 +03:00
neon_arch
1bf2e0e6f9 docs: add instructions on how to install cargo 2023-05-26 13:29:17 +03:00
neon_arch
34ae87e4a4 chore: revise and improve the readme 2023-05-26 13:15:39 +03:00
neon_arch
eee06b92d7 docs: revise and improve the documentation 2023-05-26 12:50:50 +03:00
neon_arch
1a310ca650
Merge pull request #60 from sathiyaIbe/master
docs: fix issue #56 removed the meta search engine link
2023-05-26 09:33:25 +00:00
LX5321
6556e0fdad UPDATED: Removed Deprecated API 2023-05-26 13:08:17 +05:30
sathiyaIbe
de3d88c476 fix issue: #56 removed the meta seach engine link 2023-05-26 11:38:53 +05:30
neon_arch
85d463f41a
Merge pull request #58 from Coollaitar/master
chore: update the Why Websurf section under FAQ section
2023-05-25 15:08:31 +00:00
Aadit Palande
2877970935
Update README.md
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-05-25 20:31:27 +05:30
Aadit Palande
0187d1f0fa Solves #56 Updated the Why Websurf section under FAQ section 2023-05-25 14:44:56 +00:00
zhou fan
b3348b2e7c
Merge pull request #55 from neon-mmd/put-the-themes-on-different-paths
Ability to have themes on different paths
2023-05-25 17:05:52 +08:00
neon_arch
dc3308cb5f chore: rename from theme to public 2023-05-25 11:50:37 +03:00
neon_arch
211f170178 chore: fix lock error during build 2023-05-24 17:46:35 +03:00
neon_arch
42feda0c46 chore: Bump version to v0.9.0 2023-05-24 17:40:21 +03:00
neon_arch
29456650f1 feat: add ability to put the themes folder on different paths 2023-05-24 17:37:41 +03:00
neon_arch
707bf153cd
Merge pull request #52 from neon-mmd/ability-to-have-config-on-diff-paths
add the ability to put config file on different paths
2023-05-24 09:15:05 +00:00
zhou fan
e6bb981133
Merge branch 'rolling' into ability-to-have-config-on-diff-paths 2023-05-24 17:10:07 +08:00
neon_arch
a7a28ed8c6 chore: make websurfx directory and config file names as constants 2023-05-24 12:01:36 +03:00
neon_arch
ea3f21139f chore: fix the lock error during build 2023-05-24 11:53:40 +03:00
zhou fan
35f709fe7e
Merge pull request #53 from neon-mmd/move-docs-from-wiki-to-docs-folder
Move docs from wiki to docs folder in the codebase
2023-05-24 16:42:06 +08:00
neon_arch
0d271a0fcf docs: move docs from wiki to docs folder & add an image for docs 2023-05-24 11:25:25 +03:00
neon_arch
c5b62f1087 chore: Bump version to v0.8.0 2023-05-24 10:50:08 +03:00
neon_arch
89796a054f feat: add ability to put config file on different paths 2023-05-23 23:47:36 +03:00
neon_arch
8904f34c6e
Merge pull request #40 from XFFXFF/random_delay
feat: support the option to choose whether to enable or disable production mode.
2023-05-23 10:08:01 +00:00
XFFXFF
ea013e718e make format happy 2023-05-23 10:00:35 +00:00
zhou fan
4b70a74ff6 Update websurfx/config.lua
Co-authored-by: neon_arch <mustafadhuleb53@gmail.com>
2023-05-23 10:00:09 +00:00
XFFXFF
9773cee38d change the 'aggregator' option to 'production_use' 2023-05-23 10:00:05 +00:00
XFFXFF
05272884ba supports the option to add a random delay 2023-05-23 10:00:03 +00:00
neon_arch
018f92526e
Merge pull request #50 from XFFXFF/ci_format_and_clippy
fix: add missing format and clippy checks to the CI jobs
2023-05-23 09:51:09 +00:00
XFFXFF
cecffe4155 make format happy 2023-05-23 09:34:46 +00:00
XFFXFF
ff325153f0 add format and clippy checks to the CI jobs 2023-05-23 00:31:46 +00:00
neon_arch
9f91e75784
Merge pull request #49 from gotoworq/rolling
Add logo on the main page
2023-05-22 20:05:05 +00:00
gotoworq
ab20f08e42 Added logo, and changed logon to be on main page 2023-05-22 14:44:46 -04:00
zhou fan
3c313543f3
Merge pull request #39 from neon-mmd/addition-of-logo-to-the-readme
Put a logo
2023-05-22 08:18:22 +08:00
neon_arch
27de45a1f9 chore: add a logo 2023-05-21 20:13:02 +03:00
zhou fan
b80a226e6e
Merge pull request #33 from neon-mmd/gitpod-shield-addition
Gitpod cloud development shield/badge for the Readme
2023-05-21 08:27:37 +08:00
neon_arch
1b04bf136d
add gitpod cloud development shield/badge 2023-05-19 16:39:36 +00:00
neon_arch
2ffcce3ea8
Merge pull request #32 from alamin655/master
Fix typos, spelling and make installation section more accurate
2023-05-19 16:32:07 +00:00
MD AL AMIN TALUKDAR
69f4424371
Merge pull request #2 from alamin655/readme.md
Update README.md
2023-05-19 20:00:38 +05:30
MD AL AMIN TALUKDAR
6a4935af40
Update README.md 2023-05-19 19:38:45 +05:30
neon_arch
84dc6a9c61 ci: add github action/ci to greet and thanks first time contributors 2023-05-17 16:57:55 +03:00
neon_arch
612382b9b5 ci: add github ci to thanks first time contributors 2023-05-17 16:57:02 +03:00
neon_arch
389349f1b6
ci: set the option to clear existing tags/labels to false 2023-05-17 13:37:22 +00:00
neon_arch
5d6f50a109 chore: add how to fork section and add some images to explain it 2023-05-17 16:31:39 +03:00
neon_arch
4685b7f952 chore: add github actions section 2023-05-16 19:43:11 +03:00
neon_arch
96f93e8074 chore: add github actions 2023-05-16 19:42:10 +03:00
neon_arch
30102cc6f9
ci: remove force flag to not clear existing tags/labels 2023-05-16 16:37:33 +00:00
neon_arch
22638b88ca chore: restructure and rewrite contributing.md to make it more clear 2023-05-16 19:30:25 +03:00
neon_arch
019b3322e7 chore: add enum to handle different reqwest errors & add timeout to requests 2023-05-16 12:22:00 +03:00
neon_arch
0b196ed3f2
ci: fix automatic releases ci using conventional commits 2023-05-15 09:34:39 +00:00
156 changed files with 12340 additions and 2435 deletions

40
.github/ISSUE_TEMPLATE/bug.yml vendored Normal file
View file

@ -0,0 +1,40 @@
name: 🐛 Bug
description: Report an issue to help improve the project.
title: "🐛 <description>"
labels: ["🛠️ goal: fix","🚦 status: awaiting triage"]
body:
- type: textarea
id: description
attributes:
label: Description
description: A brief description of the question or issue, also include what you tried and what didn't work
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Please add screenshots if applicable
validations:
required: false
- type: dropdown
id: assignee
attributes:
label: Do you want to work on this issue?
multiple: false
options:
- "Yes"
- "No"
validations:
required: false
- type: textarea
id: extrainfo
attributes:
label: Additional information
description: Is there anything else we should know about this bug?
validations:
required: false
- type: markdown
attributes:
value: |
You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)

View file

@ -1,36 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG] <your bug report title>"
labels: bug
assignees: ''
---
<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF Websurfx -->
**Version of Websurfx, commit number if you are using on master branch**
<!-- If you are running on master branch using git execute this command
in order to fetch the latest commit ID:
```
git log -1
```
-->
**How did you install Websurfx?**
<!-- Did you install Websurfx following the README ? -->
**What happened?**
<!-- A clear and concise description of what the bug is. -->
**Steps To Reproduce**
<!-- How can we reproduce this issue? (as minimally and as precisely as possible) -->
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Screenshots**
<!-- If applicable, provide screenshots to help explain your problem better. -->
**Additional context**
<!-- Add any other context about the problem here. -->

View file

@ -1 +1,5 @@
blank_issues_enabled: true
blank_issues_enabled: false
contact_links:
- name: Question?
url: https://discord.gg/SWnda7Mw5u
about: Feel free to ask your question by joining our Discord server.

40
.github/ISSUE_TEMPLATE/docs.yml vendored Normal file
View file

@ -0,0 +1,40 @@
name: 📝 Documentation issue
description: Found an issue in the documentation? You can use this one!
title: "📝 <description>"
labels: ["📄 aspect: text","🚦 status: awaiting triage"]
body:
- type: textarea
id: description
attributes:
label: Description
description: A brief description of the question or issue, also include what you tried and what didn't work
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Please add screenshots if applicable
validations:
required: false
- type: dropdown
id: assignee
attributes:
label: Do you want to work on this issue?
multiple: false
options:
- "Yes"
- "No"
validations:
required: false
- type: textarea
id: extrainfo
attributes:
label: Additional information
description: Is there anything else we should know about this issue?
validations:
required: false
- type: markdown
attributes:
value: |
You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)

View file

@ -1,27 +0,0 @@
---
name: Engine request
about: 'Suggest a new engine to be add '
title: "[ENGINE] <your engine request title>"
labels: engine
assignees: ''
---
<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF Websurfx -->
**Working URL of the engine**
<!-- Please check if the engine is responding correctly before submitting it. -->
**Why do you want to add this engine?**
<!-- What's special about this engine? Is it open source or libre? -->
**Features of this engine**
<!-- Features of this engine: Doesn't track its users, fast, easy to integrate, ... -->
**Applicable category of this engine**
<!-- Where should this new engine fit in Websurfx? Current categories in Websurfx:
general, files, images, it, map, music, news, science, social media and videos.
You can add multiple categories at the same time. -->
**Additional context**
<!-- Add any other context about this engine here. -->

72
.github/ISSUE_TEMPLATE/engine.yml vendored Normal file
View file

@ -0,0 +1,72 @@
name: ✨ Engine
description: Have a new engine to suggest for Websurfx? Please suggest!
title: '✨ <your engine request title>'
labels: ['⭐ goal: addition', '🚦 status: awaiting triage']
body:
- type: textarea
id: workingUrl
attributes:
label: Working URL of the engine
description: Please check if the engine is responding correctly before submitting it.
validations:
required: true
- type: textarea
id: reason
attributes:
label: Why do you want to add this engine?
description: What's special about this engine? Is it open source or libre?
validations:
required: true
- type: textarea
id: features
attributes:
label: Features of this engine
description: Features of this engine: Doesn't track its users, fast, easy to integrate, or anything else that we can know about.
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Please add screenshots if applicable
validations:
required: false
- type: dropdown
id: assignee
attributes:
label: Do you want to work on this issue?
multiple: true
options:
- 'General'
- 'Files'
- 'Images'
- 'IT'
- 'Map'
- 'Music'
- 'News'
- 'Science'
- 'Social Media'
- 'Videos'
validations:
required: true
- type: dropdown
id: assignee
attributes:
label: Do you want to work on this issue?
multiple: false
options:
- 'Yes'
- 'No'
validations:
required: false
- type: textarea
id: extrainfo
attributes:
label: Additional information
description: Is there anything else we should know about this idea?
validations:
required: false
- type: markdown
attributes:
value: |
You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)

40
.github/ISSUE_TEMPLATE/feature.yml vendored Normal file
View file

@ -0,0 +1,40 @@
name: 💡 General Feature Request
description: Have a new idea/feature for Websurfx? Please suggest!
title: "✨ <description>"
labels: ["⭐ goal: addition", "🚦 status: awaiting triage"]
body:
- type: textarea
id: description
attributes:
label: Description
description: A brief description of the enhancement you propose, also include what you tried and what worked.
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Please add screenshots if applicable
validations:
required: false
- type: dropdown
id: assignee
attributes:
label: Do you want to work on this issue?
multiple: false
options:
- "Yes"
- "No"
validations:
required: false
- type: textarea
id: extrainfo
attributes:
label: Additional information
description: Is there anything else we should know about this idea?
validations:
required: false
- type: markdown
attributes:
value: |
You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)

View file

@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE] <your feature request title>"
labels: enhancement
assignees: ''
---
**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 [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**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.

36
.github/ISSUE_TEMPLATE/other.yml vendored Normal file
View file

@ -0,0 +1,36 @@
name: 🧱 Other
description: Use this for any other issues. Please do NOT create blank issues
title: "🧱 <Add your title here>"
labels: ["🚦 status: awaiting triage"]
body:
- type: markdown
attributes:
value: "# Other issue"
- type: textarea
id: issuedescription
attributes:
label: What would you like to share?
description: Provide a clear and concise explanation of your issue.
validations:
required: true
- type: dropdown
id: assignee
attributes:
label: Do you want to work on this issue?
multiple: false
options:
- "Yes"
- "No"
validations:
required: false
- type: textarea
id: extrainfo
attributes:
label: Additional information
description: Is there anything else we should know about this issue?
validations:
required: false
- type: markdown
attributes:
value: |
You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)

14
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,14 @@
version: 2
updates:
- package-ecosystem: "cargo"
directory: "/"
schedule:
interval: "monthly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "monthly"

11
.github/label-actions.yml vendored Normal file
View file

@ -0,0 +1,11 @@
"🚦 status: awaiting triage":
issues:
comment: >
To reduce notifications, issues are locked until they are https://github.com/neon-mmd/websurfx/labels/%F0%9F%8F%81%20status%3A%20ready%20for%20dev and to be assigned. You can learn more in our contributing guide https://github.com/neon-mmd/websurfx/blob/rolling/CONTRIBUTING.md
lock: true
"🏁 status: ready for dev":
issues:
comment: >
The issue has been unlocked and is now ready for dev. If you would like to work on this issue, you can comment to have it assigned to you. You can learn more in our contributing guide https://github.com/neon-mmd/websurfx/blob/rolling/CONTRIBUTING.md
unlock: true

27
.github/labeler.yml vendored Normal file
View file

@ -0,0 +1,27 @@
'💻 aspect: code':
- src/*
- Cargo.toml
- Cargo.lock
- Dockerfile
- docker-compose.yml
- websurfx/*
'🤖 aspect: dx':
- '**/*.json'
- .dockerignore
- .gitignore
- .gitpod.Dockerfile
- .gitpod.yml
- .rusty-hook.toml
- PULL_REQUEST_TEMPLATE.md
- SECURITY.md
- .github/*
- .mega-linter.yml
- tests/*
'📄 aspect: text':
- any: ['**/*.md', '!PULL_REQUEST_TEMPLATE.md', '!SECURITY.md']
- LICENSE
'🕹️ aspect: interface':
- public/*

79
.github/workflows/docker.yml vendored Normal file
View file

@ -0,0 +1,79 @@
name: Release stable image
on:
push:
branches:
- "release/stable/**"
pull_request:
branches:
- "release/stable/**"
types: [opened, synchronize]
env:
CARGO_TERM_COLOR: always
jobs:
release_image:
strategy:
fail-fast: false
matrix:
cache:
- memory
- redis
- hybrid
- no-cache
name: Release ${{ matrix.cache }} image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Install buildx
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# Set buildx cache
- name: Cache register
uses: actions/cache@v4
with:
path: /tmp/.buildx-cache
key: buildx-cache
# Login to ghcr.io
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: neonmmd
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Extract branch info
- name: Set info
run: |
echo "VERSION=$(echo ${GITHUB_REF} | awk -F/ '{print $6}')" >> $GITHUB_ENV
# Print info for debug
- name: Print Info
run: |
echo $VERSION
# Create buildx multiarch
- name: Create buildx multiarch
run: docker buildx create --use --name=buildx-multi-arch --driver=docker-container --driver-opt=network=host
# Modify cache variable in the dockerfile.
- name: Modify Cache variable
run: |
sed -i "s/ARG CACHE=[a-z]*/ARG CACHE=${{ matrix.cache }}/g" Dockerfile
# Publish image
- name: Publish image
run: docker buildx build --builder=buildx-multi-arch --platform=linux/amd64,linux/arm64 --build-arg CACHE=${{ matrix.cache }} --push -t neonmmd/websurfx:$VERSION-${{ matrix.cache }} -t neon-mmd/websurfx:${{matrix.cache}} -f Dockerfile .
- name: Publish latest
if: ${{ matrix.cache }} == 'hybrid'
run: docker buildx build --builder=buildx-multi-arch --platform=linux/amd64,linux/arm64 --build-arg CACHE=${{ matrix.cache }} --push -t neon-mmd/websurfx:latest -f Dockerfile .
# Upload it to release
- name: Test if release already exists
id: release-exists
continue-on-error: true
run: gh release view $BINARY_NAME-$VERSION
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create new draft release
if: steps.release-exists.outcome == 'failure' && steps.release-exists.conclusion == 'success'
run: gh release create -t $VERSION -d $VERSION
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

19
.github/workflows/hello.yml vendored Normal file
View file

@ -0,0 +1,19 @@
---
name: Welcome first time contributors
on:
pull_request_target:
types:
- opened
jobs:
welcome:
name: Welcome
runs-on: ubuntu-latest
steps:
- uses: actions/first-interaction@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
pr-message: |-
Congrats on making your first Pull Request and thanks for taking the time to improve Websurfx! ❤️!
Say hello by joining the conversation in our [Discord](https://discord.gg/SWnda7Mw5u)

16
.github/workflows/issue-lock-unlock.yml vendored Normal file
View file

@ -0,0 +1,16 @@
name: "lock/unlock issue"
on:
issues:
types: labeled
permissions:
issues: write
jobs:
action:
runs-on: ubuntu-latest
steps:
- uses: dessant/label-actions@v4
with:
process-only: issues

View file

@ -1,9 +1,10 @@
---
name: Import open source standard labels
on:
push:
branches:
- master
- rolling
jobs:
labels:
@ -11,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: '14'
- uses: EddieHubCommunity/gh-action-open-source-labels@main
@ -19,4 +20,4 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
owner-name: ${{ github.repository_owner }}
repository-name: ${{ github.event.repository.name }}
force: true # optional to clear existing labels, default to true
force: false

15
.github/workflows/pr_labeler.yml vendored Normal file
View file

@ -0,0 +1,15 @@
name: "Pull Request Auto Labeler"
on:
- pull_request_target
jobs:
triage:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v5
with:
sync-labels: true
dot: true

72
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,72 @@
name: Bump release version
on:
pull_request:
branches: [rolling]
types:
- closed
permissions:
contents: write
pull-requests: write
repository-projects: write
concurrency: production
jobs:
build:
name: bump tag version and release
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.sha }}
fetch-depth: 0
- name: Bump version and push tag
id: version-bump
uses: hennejg/github-tag-action@v4.4.0
with:
github_token: ${{ secrets.ADMIN_RIGHTS_TOKEN }}
release_branches: rolling
- name: create branch
uses: peterjgrainger/action-create-branch@v3.0.0
env:
GITHUB_TOKEN: ${{ secrets.ADMIN_RIGHTS_TOKEN }}
with:
branch: update-from-${{ github.sha }}
- name: update cargo.toml
run: |
appversion=$(echo "${{ steps.version-bump.outputs.new_tag }}" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
sed -i -e "s/^version = .*/version = \"$appversion\"/" Cargo.toml
- run: rustup toolchain install stable --profile minimal
- run: rustup update stable && rustup default stable
- name: regenerate cargo.lock
run: cargo generate-lockfile
- name: auto commit
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "[skip ci] updating app version to ${{ steps.version-bump.outputs.new_tag }}"
branch: update-from-${{ github.sha }}
# create PR using GitHub CLI
- name: create PR with update info
id: create-pr
run: gh pr create --base rolling --head update-from-${{ github.sha }} --title 'Merge new update into rolling' --body 'Created by Github action'
env:
GH_TOKEN: ${{ secrets.ADMIN_RIGHTS_TOKEN }}
# merge PR using GitHub CLI
- name: merge PR with update info
id: merge-pr
run: gh pr merge --admin --merge --subject 'Merge update info' --delete-branch
env:
GH_TOKEN: ${{ secrets.ADMIN_RIGHTS_TOKEN }}
- name: Create Release
uses: softprops/action-gh-release@v2
with:
token: ${{ secrets.ADMIN_RIGHTS_TOKEN }}
generate_release_notes: true
name: ${{ steps.version-bump.outputs.new_tag }}
tag_name: ${{ steps.version-bump.outputs.new_tag }}
prerelease: false
env:
GITHUB_REPOSITORY: ${{ github.repository }}

View file

@ -1,12 +1,13 @@
---
name: Rust
on:
push:
branches:
- "**"
- '**'
pull_request:
branches:
- "rolling"
- 'rolling'
env:
CARGO_TERM_COLOR: always
@ -20,23 +21,27 @@ jobs:
- stable
steps:
- uses: actions/checkout@v3
- run: rustup toolchain install stable --profile minimal
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ""
shared-key: ""
key: ""
env-vars: ""
workspaces: ""
cache-directories: ""
cache-targets: ""
cache-on-failure: ""
cache-all-crates: ""
save-if: ""
- uses: actions/checkout@v3
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
- name: Install LuaJIT and Lua
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends liblua5.4-dev liblua5.3-dev liblua5.2-dev liblua5.1-0-dev libluajit-5.1-dev
- uses: actions/checkout@v4
- run: rustup toolchain install stable --profile minimal
- uses: Swatinem/rust-cache@v2
with:
prefix-key: ''
shared-key: ''
key: ''
env-vars: ''
workspaces: ''
cache-directories: ''
cache-targets: ''
cache-on-failure: ''
cache-all-crates: ''
save-if: ''
- uses: actions/checkout@v4
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose

View file

@ -1,3 +1,4 @@
---
name: Rust format and clippy checks
on:
push:
@ -12,14 +13,27 @@ jobs:
name: Rust project
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install LuaJIT and Lua
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends liblua5.4-dev liblua5.3-dev liblua5.2-dev liblua5.1-0-dev libluajit-5.1-dev
- uses: actions/checkout@v4
- name: Install minimal stable with clippy and rustfmt
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
components: rustfmt, clippy
- name: Format
uses: actions-rs/cargo@v1
with:
command: fmt
args: -- --check
- name: Clippy
uses: actions-rs/cargo@v1
with:
command: clippy
args: --all-targets --all-features --all
- name: Run cargo check
uses: actions-rs/cargo@v1
with:

View file

@ -1,3 +1,4 @@
---
# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
#
# You can adjust the behavior by modifying this file.
@ -18,7 +19,7 @@ jobs:
pull-requests: write
steps:
- uses: actions/stale@v5
- uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'Stale issue message'

9
.gitignore vendored
View file

@ -1,3 +1,8 @@
.vscode
/target
dump.rdb
dhat-heap.json
dump.rdb
megalinter-reports/
package-lock.json
package.json
result

3
.gitpod.Dockerfile vendored Normal file
View file

@ -0,0 +1,3 @@
FROM gitpod/workspace-rust
RUN sudo install-packages redis-server nodejs npm liblua5.4-dev liblua5.3-dev liblua5.2-dev liblua5.1-0-dev libluajit-5.1-dev

50
.gitpod.yml Normal file
View file

@ -0,0 +1,50 @@
---
image:
file: .gitpod.Dockerfile
# Commands that will run on workspace start
tasks:
- name: Start Redis Server
command: redis-server --port 8082
- name: Run The App
init: cargo build
command: PKG_ENV=dev ./target/debug/websurfx
- name: Tests
command: cargo test
- name: Clippy Checks
command: cargo clippy
# vscode IDE setup
vscode:
extensions:
- vadimcn.vscode-lldb
- cschleiden.vscode-github-actions
- rust-lang.rust-analyzer
- bungcip.better-toml
- serayuzgur.crates
- usernamehw.errorlens
- DavidAnson.vscode-markdownlint
- esbenp.prettier-vscode
- stylelint.vscode-stylelint
- dbaeumer.vscode-eslint
- evgeniypeshkov.syntax-highlighter
- ms-azuretools.vscode-docker
- Catppuccin.catppuccin-vsc
- PKief.material-icon-theme
- oderwat.indent-rainbow
- formulahendry.auto-rename-tag
- swellaby.vscode-rust-test-adapter
- belfz.search-crates-io
- hbenl.test-adapter-converter
- hbenl.vscode-test-explorer
- eamodio.gitlens
github:
prebuilds:
master: true
branches: true
pullRequests: true
pullRequestsFromForks: true
addCheck: true
addComment: false
addBadge: true

25
.mergify.yml Normal file
View file

@ -0,0 +1,25 @@
queue_rules:
- name: default
queue_conditions:
- "#approved-reviews-by>=2"
- check-success=build (stable)
- check-success=CodeFactor
- check-success=Rust project
merge_conditions: []
merge_method: squash
pull_request_rules:
- name: automatic update of pull requests where more 5 commits behind
conditions:
- "#commits-behind>5"
actions:
update:
- name: delete head branch after merge
conditions:
- merged
actions:
delete_head_branch: {}
- name: Automatic merge on approval
conditions: []
actions:
queue:

5
.rusty-hook.toml Normal file
View file

@ -0,0 +1,5 @@
[hooks]
pre-commit = "cargo test && cargo fmt -- --check && cargo clippy && stylelint ./public/static/themes/*.css ./public/static/colorschemes/*.css ./public/static/*.js"
[logging]
verbose = true

16
.stylelintrc.json Normal file
View file

@ -0,0 +1,16 @@
{
"extends": "stylelint-config-standard",
"rules": {
"alpha-value-notation": "number",
"selector-class-pattern": null,
"no-descending-specificity": null
},
"fix": true,
"cache": true,
"overrides": [
{
"files": ["*.js"],
"customSyntax": "postcss-lit"
}
]
}

View file

@ -1,34 +1,54 @@
# Things to Consider Before Contributing
# What You Can Contribute To?
## Knowledge Required
## Documentation/Wiki
- Rust basics
- Actix-web crate basics
- Tokio crate and async/await
- Reqwest crate basics
- Serde and serde~json~ crate basics
- fake~useragent~ crate basics
- pyo3/hlua/rlua crates basics
Found a typo, or something that isn't as clear as it could be? Maybe I've missed something off altogether, or you hit a roadblock that took you a while to figure out. Edit the [docs](./docs/) to add to or improve the documentation. This will help future users get Websurfx up and running more easily.
## Readme
Did you find a typo, or the Readme is not as clear as it should be? Consider Submitting a Pull request to the [Readme](https://github.com/neon-mmd/websurfx/blob/master/README.md) to add to or improve the Readme. This will help future users to better understand the project more clearly.
## Help Improve GitHub Actions
Know how to fix or improve a GitHub action? Consider Submitting a Pull request to help make automation and testing better.
## Source Code
You should know at least one of the things below to start contributing:
- Rust basics
- Actix-web crate basics
- Tokio crate and async/await
- Reqwest crate basics
- Serde and serde_json crate basics
- Scraper crate basics
- Frontend (handlebars, css and js).
- Fake useragent crate basics
- pyo3/hlua/rlua crates basics
## Report a Bug/Issue
If you've found a bug, then please consider raising it as an issue [here](https://github.com/neon-mmd/websurfx/issues). This will help me know if there's something that needs fixing. Try and include as much detail as possible, such as your environment, steps to reproduce, any console output and maybe an example screenshot or recording if necessary.
## Spread the word
Websurfx is still a relatively young project, and as such not many people know of it. It would be great to see more users, and so it would be awesome if you could consider sharing with your friends or on social platforms.
## Guidelines
- Please be patient.
- Please be patient.
- Treat everyone with respect -- \"give respect and take respect.\"
- Document your code properly with Rust coding conventions in mind.
- Provide a brief description of the changes you made in the pull request.
- Provide an appropriate header for the pull request.
- Treat everyone with respect -- \"give respect and take respect.\"
## Join the discussion
- Document your code properly with Rust coding conventions in mind.
We have a [Discord](https://discord.gg/SWnda7Mw5u) channel, feel free to join and share your ideas and ask questions about the project, we would be glad to hear you out.
- Provide a brief description of the changes you made in the pull
request.
# Where To Contribute?
- Provide an appropriate header for the pull request.
The _rolling branch_ is where we intend all contributions should go.
**NOTE:** The rolling branch is where all contributions should go.
In other words, it is the working branch for this project.
We appreciate any contributions and suggestions to help improve the
Websurfx project. Please keep in mind the above requirements and
guidelines before submitting a pull request and also if you have any
doubts/concerns/questions about the project, its source code or anything
related to the project than feel free to ask by opening an
\[issue\](<https://github.com/neon-mmd/websurfx/issues>).
We appreciate any contributions whether of any size or topic and suggestions to help improve the Websurfx project. Please keep in mind the above requirements and guidelines before submitting a pull request and also if you have any doubts/concerns/questions about the project, its source code or anything related to the project then feel free to ask by opening an [issue](https://github.com/neon-mmd/websurfx/issues) or by asking us on our [Discord](https://discord.gg/SWnda7Mw5u) channel.

3827
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,24 +1,191 @@
[package]
name = "websurfx"
version = "0.6.0"
version = "1.21.0"
edition = "2021"
description = "An open-source alternative to Searx that provides clean, ad-free, and organic results with incredible speed while keeping privacy and security in mind."
repository = "https://github.com/neon-mmd/websurfx"
license = "AGPL-3.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[[bin]]
name = "websurfx"
test = true
bench = false
path = "src/bin/websurfx.rs"
[dependencies]
reqwest = {version="*",features=["json"]}
tokio = {version="*",features=["full"]}
serde = {version="*",features=["derive"]}
handlebars = { version = "4.3.6", features = ["dir_source"] }
scraper = {version="*"}
actix-web = {version="4.3.1"}
actix-files = {version="0.6.2"}
serde_json = {version="*"}
fake-useragent = {version="*"}
env_logger = {version="0.10.0"}
log = {version="0.4.17"}
rlua = {version="*"}
redis = {version="*"}
md5 = {version="*"}
rand={version="*"}
once_cell = {version="*"}
reqwest = { version = "0.12.5", default-features = false, features = [
"rustls-tls",
"brotli",
"gzip",
"http2",
"socks",
] }
tokio = { version = "1.43.0", features = [
"rt-multi-thread",
"macros",
"fs",
"io-util",
], default-features = false }
serde = { version = "1.0.215", default-features = false, features = ["derive"] }
serde_json = { version = "1.0.134", default-features = false }
bincode = {version="1.3.3", default-features=false}
maud = { version = "0.26.0", default-features = false, features = [
"actix-web",
] }
scraper = { version = "0.21.0", default-features = false }
actix-web = { version = "4.9.0", features = [
"cookies",
"macros",
"compress-brotli",
], default-features = false }
actix-files = { version = "0.6.5", default-features = false }
actix-cors = { version = "0.7.0", default-features = false }
fake-useragent = { version = "0.1.3", default-features = false }
env_logger = { version = "0.11.6", default-features = false }
log = { version = "0.4.21", default-features = false }
mlua = { version = "0.10.2", features = [
"luajit",
"vendored",
], default-features = false }
redis = { version = "0.28.1", features = [
"tokio-comp",
"connection-manager",
"tcp_nodelay"
], default-features = false, optional = true }
blake3 = { version = "1.5.4", default-features = false }
error-stack = { version = "0.4.0", default-features = false, features = [
"std",
] }
async-trait = { version = "0.1.80", default-features = false }
regex = { version = "1.11.1", features = ["perf"], default-features = false }
futures = { version = "0.3.31", default-features = false, features = ["alloc"] }
dhat = { version = "0.3.2", optional = true, default-features = false }
mimalloc = { version = "0.1.43", default-features = false }
async-once-cell = { version = "0.5.4", default-features = false }
actix-governor = { version = "0.8.0", default-features = false }
moka = { version = "0.12.8", optional = true, default-features = false, features = [
"future",
] }
async-compression = { version = "0.4.12", default-features = false, features = [
"brotli",
"tokio",
], optional = true }
chacha20poly1305 = { version = "0.10.1", default-features = false, features = [
"alloc",
"getrandom",
], optional = true }
chacha20 = { version = "0.9.1", default-features = false, optional = true }
base64 = { version = "0.21.5", default-features = false, features = [
"std",
], optional = true }
cfg-if = { version = "1.0.0", default-features = false, optional = true }
keyword_extraction = { version = "1.5.0", default-features = false, features = [
"tf_idf",
"rayon",
] }
stop-words = { version = "0.8.0", default-features = false, features = ["iso"] }
thesaurus = { version = "0.5.2", default-features = false, optional = true, features = [
"moby",
]}
actix-multipart = { version = "0.7.2", default-features = false, features = [
"derive",
"tempfile",
]}
itertools = {version = "0.14.0", default-features = false}
[dev-dependencies]
rusty-hook = { version = "^0.11.2", default-features = false }
criterion = { version = "0.5.1", default-features = false }
tempfile = { version = "3.14.0", default-features = false }
[build-dependencies]
lightningcss = { version = "1.0.0-alpha.57", default-features = false, features = [
"grid",
] }
# Disabled until bug fixing update
# minify-js = { version = "0.6.0", default-features = false }
# Temporary fork with fix
minify-js = { git = "https://github.com/RuairidhWilliamson/minify-js", branch = "master", version = "0.6.0", default-features = false}
[profile.dev]
opt-level = 0
debug = true
split-debuginfo = 'unpacked'
debug-assertions = true
overflow-checks = true
lto = false
panic = 'unwind'
incremental = true
codegen-units = 256
rpath = false
[profile.release]
opt-level = 3
debug = false # This should only be commented when testing with dhat profiler
# debug = 1 # This should only be uncommented when testing with dhat profiler
split-debuginfo = '...'
debug-assertions = false
overflow-checks = false
lto = 'thin'
panic = 'abort'
incremental = false
codegen-units = 1
rpath = false
strip = "symbols"
[profile.bsr1]
inherits = "release"
opt-level = "s"
[profile.bsr2]
inherits = "bsr1"
opt-level = "z"
[profile.lpcb1]
inherits = "release"
codegen-units = 16
[profile.lpcb2]
inherits = "lpcb1"
lto = "off"
[profile.lpcb3]
inherits = "lpcb2"
opt-level = 2
[profile.bsr_and_lpcb1]
inherits = "lpcb1"
opt-level = "s"
[profile.bsr_and_lpcb2]
inherits = "lpcb2"
opt-level = "s"
[profile.bsr_and_lpcb3]
inherits = "lpcb3"
opt-level = "s"
[profile.bsr_and_lpcb4]
inherits = "lpcb1"
opt-level = "z"
[profile.bsr_and_lpcb5]
inherits = "lpcb1"
opt-level = "z"
[profile.bsr_and_lpcb6]
inherits = "lpcb1"
opt-level = "z"
[features]
use-synonyms-search = ["thesaurus/static"]
default = ["memory-cache"]
dhat-heap = ["dep:dhat"]
memory-cache = ["dep:moka"]
redis-cache = ["dep:redis", "dep:base64"]
compress-cache-results = ["dep:async-compression", "dep:cfg-if"]
encrypt-cache-results = ["dep:chacha20poly1305", "dep:chacha20"]
cec-cache-results = ["compress-cache-results", "encrypt-cache-results"]
experimental-io-uring = ["actix-web/experimental-io-uring"]
use-non-static-synonyms-search = ["thesaurus"]

View file

@ -1,26 +1,43 @@
FROM rust:latest AS chef
FROM --platform=$BUILDPLATFORM rust:1.78.0-alpine3.18 AS chef
# We only pay the installation cost once,
# it will be cached from the second build onwards
RUN cargo install cargo-chef
RUN apk add --no-cache alpine-sdk musl-dev g++ make libcrypto3 libressl-dev upx perl build-base
RUN cargo install cargo-chef --locked
WORKDIR app
WORKDIR /app
FROM chef AS planner
COPY . .
COPY ./Cargo.toml ./Cargo.lock ./
RUN cargo chef prepare --recipe-path recipe.json
FROM chef AS builder
FROM --platform=$BUILDPLATFORM chef AS builder
COPY --from=planner /app/recipe.json recipe.json
# Build dependencies - this is the caching Docker layer!
RUN cargo chef cook --release --recipe-path recipe.json
# Specify the cache type to use (memory, redis, hybrid, no-cache)
ARG CACHE=memory
ENV CACHE=${CACHE}
# Cook the dependencies
RUN export ARCH=$(uname -m) && \
if [ "$CACHE" = "memory" ] ; then cargo chef cook --release --target=$ARCH-unknown-linux-musl --recipe-path recipe.json ; \
else if [ "$CACHE" = "redis" ] ; then cargo chef cook --release --target=$ARCH-unknown-linux-musl --no-default-features --features redis-cache --recipe-path recipe.json ; \
else if [ "$CACHE" = "hybrid" ] ; then cargo chef cook --release --target=$ARCH-unknown-linux-musl --features redis-cache --recipe-path recipe.json ; \
else if [ "$CACHE" = "no-cache" ] ; then cargo chef cook --release --target=$ARCH-unknown-linux-musl --no-default-features --recipe-path recipe.json ; fi ; fi ; fi ; fi
# Copy the source code and public folder
COPY ./src ./src
COPY ./public ./public
# Build the application
RUN export ARCH=$(uname -m) && \
if [ "$CACHE" = "memory" ] ; then cargo build --release --target=$ARCH-unknown-linux-musl ; \
else if [ "$CACHE" = "redis" ] ; then cargo build --release --target=$ARCH-unknown-linux-musl --no-default-features --features redis-cache ; \
else if [ "$CACHE" = "hybrid" ] ; then cargo build --release --target=$ARCH-unknown-linux-musl --features redis-cache ; \
else if [ "$CACHE" = "no-cache" ] ; then cargo build --release --target=$ARCH-unknown-linux-musl --no-default-features ; fi ; fi ; fi ; fi
# Optimise binary size with UPX
RUN export ARCH=$(uname -m) \
&& upx --lzma --best /app/target/$ARCH-unknown-linux-musl/release/websurfx \
&& cp /app/target/$ARCH-unknown-linux-musl/release/websurfx /usr/local/bin/websurfx
# Build application
COPY . .
RUN cargo install --path .
# We do not need the Rust toolchain to run the binary!
FROM gcr.io/distroless/cc-debian11
COPY --from=builder ./public/ ./public/
COPY --from=builder ./websurfx/ ./websurfx/
COPY --from=builder /usr/local/cargo/bin/* /usr/local/bin/
FROM --platform=$BUILDPLATFORM scratch
COPY --from=builder /app/public/ /opt/websurfx/public/
VOLUME ["/etc/xdg/websurfx/"]
COPY --from=builder /usr/local/bin/websurfx /usr/local/bin/websurfx
CMD ["websurfx"]

View file

@ -16,7 +16,7 @@
## Author's checklist
<!-- additional notes for reviewiers -->
<!-- additional notes for reviewers -->
## Related issues

247
README.md
View file

@ -1,27 +1,21 @@
<h1 align="center">Websurfx</h1>
<h1 align="center">
<img src="./images/websurfx_logo.png" alt="websurfx logo" align="center" />
</h1>
<p align="center">
<b align="center"><a href="README.org">Readme</a></b> |
<b align="center"><a href="README.md">Readme</a></b> |
<b><a href="https://discord.gg/SWnda7Mw5u">Discord</a></b> |
<b><a href="docs/instances.md">Instances</a></b> |
<b><a href="https://discord.gg/VKCAememnr">User Showcase</a></b> |
<b><a href="https://github.com/neon-mmd/websurfx">GitHub</a></b> |
<b><a href="https://github.com/neon-mmd/websurfx/wiki">Documentation</a></b>
<b><a href="docs">Documentation</a></b>
<br /><br />
<a href="./LICENSE">
<img
alt="GitHub"
src="https://img.shields.io/github/license/neon-mmd/websurfx?style=flat-square"
/>
</a>
<a href="https://github.com/neon-mmd/websurfx/stargazers">
<img
alt="GitHub Repo stars"
src="https://img.shields.io/github/stars/neon-mmd/websurfx?style=flat-square"
/>
</a>
<a href="https://github.com/neon-mmd/websurfx/forks">
<img
alt="GitHub forks"
src="https://img.shields.io/github/forks/neon-mmd/websurfx?style=flat-square"
/>
<a
href="https://github.com/awesome-selfhosted/awesome-selfhosted#search-engines"
>
<img
src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg"
alt="Awesome Self-Hosted"
/>
</a>
<a href="#">
<img
@ -29,40 +23,28 @@
src="https://img.shields.io/github/languages/code-size/neon-mmd/websurfx?style=flat-square"
/>
</a>
<a href="https://github.com/neon-mmd/websurfx/issues">
<img
alt="GitHub issues"
src="https://img.shields.io/github/issues/neon-mmd/websurfx?style=flat-square"
/>
</a>
<a href="https://github.com/neon-mmd/websurfx/pulls">
<img
alt="GitHub pull requests"
src="https://img.shields.io/github/issues-pr/neon-mmd/websurfx?style=flat-square"
/>
</a>
<a href="https://github.com/neon-mmd/websurfx/actions">
<img
alt="GitHub Workflow Status"
src="https://img.shields.io/github/actions/workflow/status/neon-mmd/websurfx/rust.yml?style=flat-square"
/>
</a>
<a href="">
<img
alt="GitHub release (latest by date including pre-releases)"
src="https://img.shields.io/github/v/release/neon-mmd/websurfx?include_prereleases"
/>
</a>
<a href=""
><img
alt="Maintenance"
src="https://img.shields.io/maintenance/yes/2023?style=flat-square"
src="https://img.shields.io/maintenance/yes/2024?style=flat-square"
/>
</a>
<a href="">
<a href="https://www.codefactor.io/repository/github/neon-mmd/websurfx">
<img
alt="GitHub contributors"
src="https://img.shields.io/github/contributors-anon/neon-mmd/websurfx?style=flat-square"
alt="CodeFactor"
src="https://www.codefactor.io/repository/github/neon-mmd/websurfx/badge"
/>
</a>
<a href="https://gitpod.io/#https://github.com/neon-mmd/websurfx">
<img
alt="Gitpod"
src="https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod"
/>
</a>
<br />
@ -73,7 +55,7 @@
>meta search engine</a
>
(pronounced as websurface or web-surface /wɛbˈːrfəs/.) written in Rust. It
provides a fast and secure search experience while respecting user
provides a quick and secure search experience while completely respecting user
privacy.</i
>
</p>
@ -83,30 +65,31 @@
<p>
- **Getting Started**
- [🔭 Preview](#preview-)
- [🌈 Features](#features-)
- [🛠️ Installation and Testing](#installation-and-testing-)
- [🔧 Configuration](#configuration-)
- [🔭 Preview](#preview-)
- [🚀 Features](#features-)
- [🔗 Instances](#instances-)
- [🛠️ Installation and Testing](#installation-and-testing-%EF%B8%8F)
- [🔧 Configuration](#configuration-)
- **Feature Overview**
- [🎨 Theming](#theming-)
- [🌍 Multi-Language Support](#multi-language-support-)
- [🎨 Theming](#theming-)
- [🌍 Multi-Language Support](#multi-language-support-)
- **Community**
- [📊 System Requirements](#system-requirements-)
- [🗨️ FAQ (Frequently Asked Questions)](#faq-frequently-asked-questions-)
- [📣 More Contributers Wanted](#more-contributers-wanted-)
- [💖 Supporting Websurfx](#supporting-websurfx-)
- [📘 Documentation](#documentation-)
- [🛣️ Roadmap](#roadmap-)
- [🙋 Contributing](#contributing-)
- [📜 License](#license-)
- [🤝 Credits](#credits-)
- [📊 System Requirements](#system-requirements-)
- [🗨️ FAQ (Frequently Asked Questions)](#faq-frequently-asked-questions-%EF%B8%8F)
- [📣 More Contributors Wanted](#more-contributors-wanted-)
- [💖 Supporting Websurfx](#supporting-websurfx-)
- [📘 Documentation](#documentation-)
- [🛣️ Roadmap](#roadmap-%EF%B8%8F)
- [🙋 Contributing](#contributing-)
- [📜 License](#license-)
- [🤝 Credits](#credits-)
</p>
</details>
# Preview 🔭
# Preview 🔭
## Main Page
## Home Page
<img align="center" src="./images/main_page.png" />
@ -118,122 +101,140 @@
<img align="center" src="./images/404_error_page.png" />
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Features 🌈
# Instances 🔗
- 🎨 High level customizability with 9 colorchemes provided by default with a simple theme, also supporting creation of your custom themes and colorschemes very quickly and easily
- 🔐 Fast, private and secure
> For a full list of publicly available community driven `websurfx` instances to test or for daily use. see [**Instances**](docs/instances.md)
**[⬆️ Back to Top](#--)**
# Features 🚀
- 🎨 Make Websurfx uniquely yours with the twelve color schemes provided by default. It also supports the creation of custom themes and color schemes in a quick and easy way, so unleash your creativity!
- 🚀 Easy to setup with Docker or on bare metal with various installation and deployment options.
- ⛔ Search filtering to filter search results based on four different levels.
- 💾 Different caching levels focusing on reliability, speed and resiliancy.
- ⬆️ Organic Search results (with ranking algorithm builtin to rerank the search results according to user's search query.).
- 🔒 Different compression and encryption levels focusing on speed and privacy.
- 🧪 Experimental IO-uring feature for Linux operating systems focused on performance of the engine.
- 🔐 Fast, private, and secure
- 🆓 100% free and open source
- 🧹 Ad free and clean results
- 🌈 and lots more...
- 💨 Ad-free and clean results
- 🌟 and lots more...
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Installation and Testing 🛠️
# Installation and Testing 🛠️
> For full setup instructions, see: [**Installation**](https://github.com/neon-mmd/websurfx/wiki/installation)
> For full setup instructions, see: [**Installation**](docs/installation.md)
To get started with Websurfx, clone the repository, edit the config file which is located in the `websurfx`{.verbatim} directory and install redis server by following the instructions located [here](https://redis.io/docs/getting-started/) and then run the websurfx server and redis server using the following commands:
Before you can start building `websurfx`, you will need to have `Cargo` installed on your system. You can find the installation instructions [here](https://doc.rust-lang.org/cargo/getting-started/installation.html).
``` shell
To get started with Websurfx, clone the repository, edit the config file, which is located in the `websurfx/` directory, and install the Redis server by following the instructions located [here](https://redis.io/docs/getting-started/) and then run the websurfx server and redis server using the following commands:
```shell
git clone https://github.com/neon-mmd/websurfx.git
cd websurfx
cargo build
redis-server -p 8082 &
./target/debug/websurfx
git checkout stable
cargo build -r
redis-server --port 8082 &
./target/release/websurfx
```
Once you have started the server, open your preferred web browser and navigate to <http://127.0.0.1:8080> to start using Websurfx.
> **Warning**
> Please be aware that the project is still in the testing phase and is not ready for production use.
> [!Note]
>
> 1. The project is no longer in the testing phase and is now ready for production use.
> 2. There are many features still missing, like `support for image search`, `different categories`, `quick apps`, etc., but they will be added soon as part of future releases.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Configuration 🔧
# Configuration 🔧
> For full configuration instructions, see: [**Configuration**](https://github.com/neon-mmd/websurfx/wiki/configuration)
> For full configuration instructions, see: [**Configuration**](docs/configuration.md)
Websurfx is configured through the config.lua file, located at `websurfx/config.lua`.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Theming 🎨
# Theming 🎨
> For full theming and customization instructions, see: [**Theming**](https://github.com/neon-mmd/websurfx/wiki/theming)
> For full theming and customization instructions, see: [**Theming**](docs/theming.md)
Websurfx comes with several themes and colorschemes by default which you can apply and edit through the config file. Support for custom themes and colorschemes using css and develop your own unique-looking website.
Websurfx comes loaded with several themes and color schemes, which you can apply and edit through the config file. It also supports custom themes and color schemes using CSS, allowing you to make it truly yours.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Multi-Language Support 🌍
> **Note**
> Currently, we do not support other languages but in future we would start accepting contributions regarding language support because we believe that language should not be a barrier for entry.
> [!Note]
> Currently, we do not support other languages, but we will start accepting contributions regarding language support in the future. We believe language should never be a barrier to entry.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# System Requirements 📊
At present, we only support x86_64 architecture systems but will love to have contributions to extend to other architectures as well.
At present, we only support x86_64 architecture systems, but we would love to have contributions that extend to other architectures as well.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# FAQ (Frequently Asked Questions) 🗨️
## Why Websurfx?
The main goal of the Websurfx project is to provide a fast, secure, and privacy-focused [meta search engine](https://en.wikipedia.org/wiki/Metasearch_engine). While there are many meta search engines available, they do not always guarantee the security of their search engine, which is essential for ensuring privacy. For example, memory vulnerabilities can leak private or sensitive information, which is never good. Websurfx is written in Rust, which guarantees memory safety and eliminates such problems. Many meta search engines also lack key features such as advanced image search, which is required by many graphic designers, content creators, and others. Websurfx aims to provide these features and others, such as proper NSFW blocking, to improve the user experience.
The primary purpose of the Websurfx project is to create a fast, secure, and privacy-focused meta-search engine. There are numerous meta-search engines available, but not all guarantee the security of their search engines, which is critical for maintaining privacy. Memory flaws, for example, can expose private or sensitive information, which is understandably bad. There is also the added problem of spam, ads, and inorganic results, which most engines don't have a full-proof answer to. Until now. With Websurfx, I finally put a full stop to this problem. Websurfx is based on Rust, which ensures memory safety and removes such issues. Many meta-search engines also lack important features like advanced picture search, required by graphic designers, content providers, and others. Websurfx improves the user experience by providing these and other features, such as proper NSFW blocking and micro-apps or quick results (providing a calculator, currency exchanges, etc. in the search results).
## Why AGPLv3?
Websurfx is released under the **AGPLv3** license to ensure that the source code remains open and transparent. This helps to prevent the inclusion of spyware, telemetry, or other malicious code in the project. **AGPLv3** is a strong copyleft license that ensures the source code of the software remains open and available to everyone, including any modifications or improvements made to the code.
Websurfx is distributed under the **AGPLv3** license to keep the source code open and transparent. This helps keep malware, telemetry, and other dangers out of the project. **AGPLv3** is a strong copyleft license that ensures the software's source code, including any modifications or improvements made to the code, remains open and available to everyone.
## Why Rust?
Rust was chosen as the programming language for Websurfx due to its memory safety features, which can help prevent vulnerabilities and make the codebase more secure. Rust is also faster than C++, which helps to make Websurfx fast and responsive. In addition, Rust\'s ownership and borrowing system allows for safe concurrency and thread safety in the codebase.
Websurfx is based on Rust due to its memory safety features, which prevent vulnerabilities and make the codebase more secure. Rust is also faster than C++, contributing to Websurfx's speed and responsiveness. Finally, the Rust ownership and borrowing system enables secure concurrency and thread safety in the program.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# More Contributers Wanted 📣
# More Contributors Wanted 📣
We are looking for more willing contributors to help grow this project.For more information on how you can contribute, check out the [project board](https://github.com/neon-mmd/websurfx/projects?query=is%3Aopen) and the [CONTRIBUTING.org](CONTRIBUTING.org) file for guidelines and rules for making contributions.
We are looking for more willing contributors to help grow this project. For more information on how you can contribute, check out the [project board](https://github.com/neon-mmd/websurfx/projects?query=is%3Aopen) and the [CONTRIBUTING.md](CONTRIBUTING.md) file for guidelines and rules for making contributions.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Supporting Websurfx 💖
> For full details and other ways you can help out, see: [**Contributing**]()
> For full details and other ways you can help out, see: [**Contributing**](CONTRIBUTING.md)
If you're using Websurfx and would like to help support its development, then that would be awesome! Contributions of any type, any size, are always very much appreciated, and we will appropriately credit you for your effort.
If you use Websurfx and would like to contribute to its development, we're glad to have you on board! Contributions of any size or type are always welcome, and we will always acknowledge your efforts.
Several areas that we need a bit of help with at the moment are:
- **Better and more colorchemes** - Help fix colorchemes and add other famous colorchemes.
- **Improve evasion code for bot detection** - Help improve code related to evade ip blocking and emulate human behaviours located in everyone engine file.
- **Logo** - Help create a logo for the project and website.
- **Docker Support** - Help write a docker compose file for the project.
- Submit a PR to add a new feature, fix a bug, update the docs, add a theme, widget or something else.
- **Better and more color schemes**: Help fix color schemes and add other famous color schemes.
- **Improve evasion code for bot detection**: Help improve code related to evading IP blocking and emulating human behaviors located in everyone's engine file.
- **Logo**: Help create a logo for the project and website.
- **Docker Support**: Help write a Docker Compose file for the project.
- Submit a PR to add a new feature, fix a bug, update the docs, add a theme, widget, or anything else.
- Star Websurfx on GitHub.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Documentation 📘
> **Note**
> We are willing to have any contribution regarding [documentation](https://github.com/neon-mmd/websurfx/wiki) as this helps everyone using this project.
> [!Note]
> We welcome any contributions to the [documentation](docs) as this will benefit everyone who uses this project.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Roadmap 🛣️
> Coming soon!! 🙂.
> Coming soon! 🙂.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Contributing 🙋
# Contributing 🙋
Contributions are welcome from anyone. It doesn\'t matter who you are; you can still contribute to the project in your way.
Contributions are welcome from anyone. It doesn't matter who you are; you can still contribute to the project in your own way.
## Not a developer but still want to contribute?
@ -241,20 +242,22 @@ Check out this [video](https://youtu.be/FccdqCucVSI) by Mr. Nick on how to contr
## Developer
If you are a developer, have a look at the [CONTRIBUTING.org](CONTRIBUTING.org) document for more information.
If you are a developer, have a look at the [CONTRIBUTING.md](CONTRIBUTING.md) document for more information.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# License 📜
# License 📜
Websurfx is available under the [AGPLv3](LICENSE) license.
Websurfx is licensed under the [AGPLv3](LICENSE) license.
**[⬆️ Back to Top](#websurfx)**
**[⬆️ Back to Top](#--)**
# Credits 🤝
# Credits 🤝
We would like to thank the following people for their contributions and support:
**Contributors**
<p>
<br />
<a href="https://github.com/neon-mmd/websurfx/graphs/contributors">
@ -263,7 +266,15 @@ We would like to thank the following people for their contributions and support:
<br />
</p>
**[⬆️ Back to Top](#websurfx)**
**Stargazers**
<p>
<a href="https://github.com/neon-mmd/websurfx/stargazers">
<img src="http://reporoster.com/stars/dark/neon-mmd/websurfx"/>
</a>
</p>
**[⬆️ Back to Top](#--)**
---

85
build.rs Normal file
View file

@ -0,0 +1,85 @@
//! A build module of the application which minifies the project's css and js files on build which
//! helps reduce the initial page by loading the files faster.
#![forbid(unsafe_code, clippy::panic)]
#![deny(missing_docs, clippy::missing_docs_in_private_items, clippy::perf)]
#![warn(clippy::cognitive_complexity, rust_2018_idioms)]
// ------- Imports -------
use lightningcss::stylesheet::{MinifyOptions, ParserOptions, PrinterOptions, StyleSheet};
use minify_js::{minify, Session, TopLevelMode};
use std::{
fs::{read_dir, read_to_string, File, OpenOptions},
io::{Read, Write},
};
// ------- Constants -------
/// A constant for the path to the public/theme folder in the codebase.
const COMMON_STATIC_SOURCE_CODE_FOLDER: &str = "./public/static/";
/// A constant for the names of the folders located in the "/public/static/"
/// folder in the codebase which contains the css files to be minified.
const STYLE_FOLDERS: [&str; 2] = ["themes", "colorschemes"];
/// A constant for the environment variable name.
const PACKAGE_ENVIRONMENT_VARIABLE: &str = "PKG_ENV";
/// A constant for the `prod` value of the `pkg_env` environment variable.
const PRODUCTION_PKG_ENV_VARIABLE_VALUE: &str = "prod";
/// A main function which minifies both css and js files using `lightningcss` and `minify_js` when
/// the `PKG_ENV` environment and it is set to the value of `prod`.
///
/// # Error
///
/// This function returns the unit type when the minification process runs successfully otherwise
/// it returns a standard error.
fn main() -> Result<(), Box<dyn std::error::Error>> {
if let Ok(pkg_env_var) = std::env::var(PACKAGE_ENVIRONMENT_VARIABLE) {
if pkg_env_var.to_lowercase() == PRODUCTION_PKG_ENV_VARIABLE_VALUE {
// A for loop that loops over each file name containing in the `colorschemes` and `themes` folders
// and minifies it using the `lightningcss` minifier.
for folder_name in STYLE_FOLDERS {
for file in read_dir(format!("{COMMON_STATIC_SOURCE_CODE_FOLDER}{folder_name}/"))? {
let file_path = file?.path();
let source = read_to_string(file_path.clone())?;
let mut stylesheet = StyleSheet::parse(&source, ParserOptions::default())
.map_err(|err| format!("{err}\n{:?}", file_path.file_name().unwrap()))?;
stylesheet.minify(MinifyOptions::default())?;
let minified_css = stylesheet.to_css(PrinterOptions::default())?;
let mut old_css_file = OpenOptions::new()
.write(true)
.truncate(true)
.open(file_path)?;
old_css_file.write_all(minified_css.code.as_bytes())?;
old_css_file.flush()?;
}
}
// A for loop that loops over each file name containing in the `public/static` folder and minifies
// it using the `minify-js` minifier.
for file in read_dir(COMMON_STATIC_SOURCE_CODE_FOLDER)? {
let file_path = file?.path();
if file_path.is_file() {
let mut code = Vec::new();
let mut js_file = File::open(file_path.clone())?;
js_file.read_to_end(&mut code)?;
drop(js_file);
let mut out = Vec::new();
minify(&Session::new(), TopLevelMode::Global, &code, &mut out)
.map_err(|err| format!("{err}\n{:?}", file_path.file_name().unwrap()))?;
let mut old_js_file = OpenOptions::new()
.write(true)
.truncate(true)
.open(file_path)?;
old_js_file.write_all(&out)?;
old_js_file.flush()?;
}
}
}
}
Ok(())
}

15
dev.Dockerfile Normal file
View file

@ -0,0 +1,15 @@
# Create Builder image
FROM --platform=$BUILDPLATFORM rust:1.78.0-alpine3.18
# Install required dependencies
RUN apk add --no-cache alpine-sdk musl-dev g++ make libcrypto3 libressl-dev perl build-base
RUN cargo install cargo-watch --locked
# Create project directory
RUN mkdir -p /project
WORKDIR /project
ENV RUSTFLAGS="-C target-feature=-crt-static"
ENTRYPOINT ["cargo"]

26
dev.docker-compose.yml Normal file
View file

@ -0,0 +1,26 @@
---
version: "3.9"
services:
redis:
container_name: redis
image: redis:6.2.5-alpine
tty: true
hostname: surfx-redis
websurx:
container_name: websurx-dev
image: websurfx:dev
working_dir: /project
tty: true
build:
context: .
dockerfile: dev.Dockerfile
ports:
- 8080:8080
volumes:
- type: bind
source: .
target: /project
command:
- watch
- -x
- run

View file

@ -1,3 +1,4 @@
---
version: "3.9"
services:
app:
@ -5,11 +6,13 @@ services:
build: .
ports:
- 8080:8080
depends_on:
- redis
links:
- redis
redis:
image: redis:latest
ports:
- 6379:6379
# Uncomment the following lines if you are using the `hybrid` or `redis` caching feature.
# depends_on:
# - redis
# links:
# - redis
volumes:
- ./websurfx/:/etc/xdg/websurfx/
# Uncomment the following lines if you are using the `hybrid` or `redis` caching feature.
# redis:
# image: redis:latest

20
docs/README.md Normal file
View file

@ -0,0 +1,20 @@
<h1 align="center"><img src="../images/websurfx_docs_image.png" alt="Websurfx Docs" align="center"></h1>
# General
- [Introduction](./introduction.md)
- [**FAQ**](./faq.md)
# Users
- [Instances](./instances.md)
- [Installation](./installation.md)
- [Features](./features.md)
- [Configuration](./configuration.md)
- [Theming](./theming.md)
# Developers
- [Developing](./developing.md)
- [**Contribute**](https://github.com/neon-mmd/websurfx/blob/master/CONTRIBUTING.md)
- [**Coding style**](https://rust-lang.github.io/api-guidelines/naming.html)

93
docs/configuration.md Normal file
View file

@ -0,0 +1,93 @@
# Configuration
## Installed From Source
If you have built `websurfx` from the source then the configuration file will be located under the project directory (codebase) at `websurfx/`
> [!Note]
> If you have built websurfx with an unstable/rolling/edge branch then you can copy the configuration file from `websurfx/config.lua` located under the project directory (codebase) to `~/.config/websurfx/` and make the changes there and rerun the websurfx server. _This is only available from unstable/rolling/edge version_.
## Installed From Package
If you have installed `websurfx` using the package manager of your Linux distro then the default configuration file will be located at `/etc/xdg/websurfx/`. You can copy the default config to `~/.config/websurfx/` make the changes there and rerun the websurfx server.
Some of the configuration options provided in the file are stated below. These are subdivided into the following categories:
- General
- Server
- Search
- Website
- Cache
- Search Engines
# General
- **logging:** An option to enable or disable logs.
- **debug:** An option to enable or disable debug mode.
- **threads:** The amount of threads that the app will use to run (the value should be greater than 0).
## Server
- **port:** Port number on which server should be launched.
- **binding_ip_addr:** IP address on the which server should be launched.
- **production_use:** Whether to use production mode or not (in other words this option should be used if it is to be used to host it on the server to provide a service to a large number of users). If production_use is set to true. There will be a random delay before sending the request to the search engines, this is to prevent DDoSing the upstream search engines from a large number of simultaneous requests.
- **request_timeout:** Timeout for the search requests sent to the upstream search engines to be fetched (value in seconds).
- **rate_limiter:** The configuration option to configure rate limiting on the search engine website.
## Search
- **safe_search:** This option is used to configure the search filtering based on different safe search levels. (value a number between 0 to 4)
> This option provides 4 levels of search filtering:
>
> - Level 0 - With this level no search filtering occurs.
> - Level 1 - With this level some search filtering occurs.
> - Level 2 - With this level the upstream search engines are restricted to sending sensitive content like NSFW search results, etc.
> - Level 3 - With this level the regex-based filter lists are used alongside level 2 to filter more search results that have slipped in or custom results that need to be filtered using the filter lists.
> - Level 4 - This level is similar to level 3 except in this level the regex-based filter lists are used to disallow users to search sensitive or disallowed content. This level could be useful if you are a parent or someone who wants to completely disallow their kids or yourself from watching sensitive content.
## Website
- **colorscheme:** The colorscheme name which should be used for the website theme (the name should be by the colorscheme file name present in the `public/static/colorschemes` folder).
> By Default we provide 12 colorschemes to choose from these are:
>
> 1. catppuccin-mocha
> 2. dark-chocolate
> 3. dracula
> 4. gruvbox-dark
> 5. monokai
> 6. nord
> 7. oceanic-next
> 8. one-dark
> 9. solarized-dark
> 10. solarized-light
> 11. tokyo-night
> 12. tomorrow-night
- **theme:** The theme name that should be used for the website (again, the name should be by the theme file name present in the `public/static/themes` folder).
> By Default we provide 1 theme to choose from these are:
>
> 1. simple
- **animation:** The animation name that should be used for the website (again, the name should be by the animation file name present in the `public/static/animations` folder).
> By Default we provide 1 animation to choose from these are:
>
> 1. simple-frosted-glow
## Cache
- **redis_url:** Redis connection URL address on which the client should connect.
> **Note**
> This option can be commented out if you have compiled the app without the `redis-cache` feature. For more information, See [**building**](./building.md).
- **cache_expiry_time:** The maximum time the server will store the cache for, after which it flushs/removes/expires/invalidates the cached results. (value provided to this option should be in seconds and the value should be greater than or equal to 60 seconds).
## Search Engines
- **upstream_search_engines:** Select from the different upstream search engines from which the results should be fetched.
[⬅️ Go back to Home](./README.md)

643
docs/developing.md Normal file
View file

@ -0,0 +1,643 @@
# Developing
This page of the docs outlines how to get **Websurfx** up and running in a development environment, and outlines the common workflow, different ways to work on the project, a high-level overview of how the project works, project structure, and the best practices that should be followed when working on the project.
<details>
<summary><b>Table of Contents</b></summary>
<p>
- [Setting up the Development Environment](#setting-up-the-development-environment)
- [Local Development](#local-development-)
- [Gitpod](#gitpod-)
- [NixOS Dev Shell using Nix Flake](#nixos-dev-shell-using-nix-flake-)
- [Local Development with Docker Compose](#local-development-with-docker-compose-)
- [Project Commands](#project-commands)
- [Environment Variables](#environment-variables)
- [Git Strategy](#git-strategy)
- [Flow](#git-flow)
- [Branches](#git-branch-naming)
- [Commit emojis](#commit-emojis)
- [PR Guidelines](#pr-guidelines)
- [Resources for Beginners](#resources-for-beginners)
- [App Info](#app-info)
- [Code Style Guide](#style-guide)
- [Application Structure](#application-structure)
- [Development Tools](#development-tools)
- [Misc / Notes](#notes)
</p>
</details>
## Setting up the Development Environment
By default, we provide four different ways to work on the project. These are as follows:
- [Local Development](#local-development-)
- [Gitpod](#gitpod-)
- [NixOS Dev Shell using Nix Flake](#nixos-dev-shell-using-nix-flake-)
- [Local Development with Docker Compose](#local-development-with-docker-compose-)
The different methods are explained in depth below.
### Local Development
This section covers how to set up the project for development on your local machine (bare metal).
#### Prerequisites
Before you start working on the project. You will need the following packages installed on your system:
- The latest version of `cargo` installed on your system which is required to manage building and running the project. The installation instructions for this can be found [here](https://doc.rust-lang.org/cargo/getting-started/installation.html).
- The latest version of `npm` installed on your system which is required to allow the installation of other tools necessary for the project. The installation for this can be found [here](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm).
- The latest version of `redis` installed on your system which will be used to avoid introducing unexpected issues when working on the project. The installation for this can be found [here](https://redis.io/docs/getting-started/installation/).
- The latest version of `stylelint` should be installed on your system which will be used by the pre-commit checks to lint the code before a commit can be made to ensure better code quality. Before you install `stylelint` on your system, make sure you have `npm` installed on your system. To install `stylelint` and plugins run the following command:
```shell
$ npm i -g stylelint
$ npm i -g stylelint stylelint-config-standard postcss-lit
```
> [!Note]
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
- `Cargo-watch` installed on your system which will allow you to auto-build the project when any checks occur in the source code files in the codebase (`websurfx` directory). Before you install `cargo-watch` on your system, make sure you have `cargo` installed on your system. To install `cargo-watch` run the following command:
```shell
cargo install cargo-watch
```
- `Git` installed on your system. The installation instructions for this can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
- Finally, The latest version of `Docker` is installed on your system which will be used to avoid introducing unexpected issues when working on the project. The installation instructions for this can be found [here](https://docs.docker.com/engine/install/).
> [!Note]
> For **rolling release Linux distributions (distros)**, the above-mentioned required packages except for `stylelint` and `cargo-watch` can also be installed via the distro-specific package manager.
>
> **For Example:**
>
> On `arch linux` the following packages can be installed by following the link to the installation instructions provided below:
>
> - `Cargo`: https://wiki.archlinux.org/title/rust
> - `Npm`: https://wiki.archlinux.org/title/Node.js
> - `Redis`: https://wiki.archlinux.org/title/redis
> - `Git`: https://wiki.archlinux.org/title/git
> - `Docker`: https://wiki.archlinux.org/title/docker
>
> But we do not recommend this method for **stable release Linux distros** as they tend to not provide very up-to-date versions of the required packages.
#### Setting up Pre-commit Checks
Before you set `pre-commit` checks, you will first need to clone **your fork of the project** and navigate into the cloned repository by running the following command:
```shell
git clone https://github.com/<your_github_username>/websurfx.git
cd websurfx
```
Once you have finished running the above commands then run the following command to set the `pre-commit` checks:
```shell
cargo test
```
By running the above-mentioned command, it will automatically set up all the pre-commit checks in the project.
#### Running the Project
If you have followed the above section then you should have a cloned repository folder present on your system. In the same directory run the following command to run the project:
```shell
cargo watch -q -x "run" -w "."
```
This will compile the app by default with the **In-Memory caching** feature. To compile, run, and test the app with other features follow the build options listed below:
##### Hybrid Cache
To build and run the app with the `Hybrid caching` feature. Run the following command:
```shell
cargo watch -q -x "run --features redis-cache" -w .
```
##### No Cache
To build and run the search engine with the `No caching` feature. Run the following command:
```shell
cargo watch -q -x "run --no-default-features" -w .
```
##### Redis Cache
To build the search engine with the `Redis caching` feature. Run the following command:
```shell
cargo watch -q -x "run --no-default-features --features redis-cache" -w .
```
> Optionally, If you have build and run the app with the `Redis cache`or `Hybrid cache` feature (as mentioned above) then you will need to start the redis server alongside the app which can be done so by running the following command:
>
> ```shell
> redis-server --port 8082 &
> ```
Once you have finished running the above command, Websurfx should now be served on the address http://127.0.0.1:8080. Hot reload is enabled, so making changes to any of the files will trigger the project to be rebuilt.
> For more info on all the project commands. See: [**Project Commands**](#project-commands-)
### Gitpod
This section covers how to use and set up the Gitpod development environment for working on the project.
> [!Note]
> By default the project only supports the Vscode **IDE/Editor** for Gitpod.
#### Launching Gitpod
> For a full guide on how to fork the project. See: [**Forking**](#)
To launch gitpod and start working on the project from your fork of the Websurfx, Just navigate to the following link:
```text
https://gitpod.io/#https://github.com/<your_github_username>/websurfx
```
> For a full guide on how to use it and how to use it in different ways. See [**Learn Gitpod**](https://piped.kavin.rocks/playlist?list=PL3TSF5whlprXVp-7Br2oKwQgU4bji1S7H)
#### Default Plugins
The project by default provides a set of pre-installed plugins for gitpod which is done to improve productivity and efficiency while working on the project. Also to make working on the project more fun and engaging which can be customized from within the `Gitpod` instance.
The list of all the pre-installed plugins are listed below:
**Productivity**
- [CodeLLDB](https://open-vsx.org/extension/vadimcn/vscode-lldb): Provides a native debugger for rust programming langauge.
- [GitHub Actions](https://open-vsx.org/extension/cschleiden/vscode-github-actions): Provides an easy to work with github actions.
- [rust-analyzer](https://open-vsx.org/extension/rust-lang/rust-analyzer): Provides a language server for rust programming langauge.
- [better-toml](https://open-vsx.org/extension/bungcip/better-toml): Provides support for toml files.
- [crates](https://open-vsx.org/extension/serayuzgur/crates): Makes managing rust dependencies easier.
- [Error Lens](https://open-vsx.org/extension/usernamehw/errorlens): Provides better highlighting of errors.
- [markdownlint](https://open-vsx.org/extension/DavidAnson/vscode-markdownlint): Provides a linter for linting markdown documents.
- [Prettier](https://open-vsx.org/extension/esbenp/prettier-vscode): Provides a code formatter.
- [Stylelint](https://open-vsx.org/extension/stylelint/vscode-stylelint): Provides a linter for CSS files.
- [ESLint](https://open-vsx.org/extension/dbaeumer/vscode-eslint): Provides a linter for JS files.
- [Syntax Highlighter](https://open-vsx.org/extension/evgeniypeshkov/syntax-highlighter): A better syntax highlighting for code.
- [Docker](https://open-vsx.org/extension/ms-azuretools/vscode-docker): Makes handling docker files easier.
- [indent-rainbow](https://open-vsx.org/extension/oderwat/indent-rainbow): Highlightes code idents for better visualization.
- [Auto Rename Tag](https://open-vsx.org/extension/formulahendry/auto-rename-tag): Provides a way to easily and quickly rename html tags.
- [Rust Test Explorer](https://open-vsx.org/extension/Swellaby/vscode-rust-test-adapter): View and run cargo tests easily from a convenient sidebar.
- [Search crates-io](https://open-vsx.org/extension/belfz/search-crates-io): Provides crates suggestions in the `cargo.toml` file.
- [Test Adapter Converter](https://open-vsx.org/extension/hbenl/test-adapter-converter): A vscode native way to view and run tests.
- [Test Explorer UI](https://open-vsx.org/extension/hbenl/vscode-test-explorer): Provides a way to run any test from a convenient sidebar.
- [GitLens](https://open-vsx.org/extension/eamodio/gitlens): Provides a better and more efficient way to manage common git workflows.
> Optionally, if you prefer a more keyboard-centric workflow then we would recommend using the following extension:
>
> - [VSCode Neovim](https://open-vsx.org/extension/asvetliakov/vscode-neovim): Provides complete vim emulation for vscode.
**Theming**
- [Catppuccin for VSCode](https://open-vsx.org/extension/Catppuccin/catppuccin-vsc): Provides the catpuccin theme for vscode.
- [Material Icon Theme](https://open-vsx.org/extension/PKief/material-icon-theme): Provides material design icons for files dependening on the file extension.
> If you have more ideas and ways to improve Gitpod for development purposes then feel free to do so by contributing a PR to this project [**here**](https://github.com/neon-mmd/websurfx/pulls).
### NixOS Dev Shell using Nix Flake
This section covers how to setup the project for development using the `NixOS dev-shell`.
#### Pre Setup Requirements
Before you start working on the project. You will need the following packages installed on your system:
- `Git` installed on your system. The installation instructions for this can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
#### Setting up Pre-commit Checks
Before you setup `pre-commit` checks, you will first need to clone **your fork of the project** and navigate into the cloned repository by running the following command:
```shell
git clone https://github.com/<your_github_username>/websurfx.git
cd websurfx
```
Then run the following command to setup the `NixOS dev-shell`:
```shell
nix develop
```
> You can use `nix-direnv` to simplify entering into the `nix-shell`. Its setup is beyond the scope of this guide. Read more about it here: [nix-direnv](https://github.com/nix-community/nix-direnv)
This will add `docker`, `cargo-watch`, and other dev environment essentials to your `nix-shell` so you don't have to install everything imperatively.
After finishing the commands above, run the following command to setup the `pre-commit` checks:
```shell
cargo test
```
By running the above-mentioned command, it will automatically set up all the pre-commit checks in the project.
#### Post Setup Requirements
The final step is to run
```shell
npm i -D stylelint-config-standard postcss-lit`
```
This will add `node_modules` in the current directory.
Run `git commit` and if every thing is setup correctly, it should say that your branch is up to date.
#### Running the Project
If you have followed the above section then you should now be inside a `dev-shell` environment. In the same environment run the following command to run the project:
```shell
cargo watch -q -x "run" -w "."
```
This will compile the app by default with the **In-Memory caching** feature. To compile, run, and test the app with other features follow the build options listed below:
##### Hybrid Cache
To build and run the app with the `Hybrid caching` feature. Run the following command:
```shell
cargo watch -q -x "run --features redis-cache" -w .
```
##### No Cache
To build and run the search engine with the `No caching` feature. Run the following command:
```shell
cargo watch -q -x "run --no-default-features" -w .
```
##### Redis Cache
To build the search engine with the `Redis caching` feature. Run the following command:
```shell
cargo watch -q -x "run --no-default-features --features redis-cache" -w .
```
> Optionally, If you have build and run the app with the `Redis cache`or `Hybrid cache` feature (as mentioned above) then you will need to start the redis server alongside the app which can be done by running the following command:
>
> ```shell
> redis-server --port 8082 &
> ```
Once you have finished running the above command, Websurfx should now be served on the address http://127.0.0.1:8080. Hot reload is enabled, so making changes to any of the files will trigger the project to be rebuilt.
### Local Development with Docker Compose
This section covers how to set up the project for development on your local machine (bare metal) using `docker compose`.
#### Prerequisites
Before you start working on the project. You will need the following packages installed on your system:
- The latest version of `cargo` installed on your system which is required to manage the building and running the project. The installation instructions for this can be found [here](https://doc.rust-lang.org/cargo/getting-started/installation.html).
- The latest version of `npm` installed on your system which is required to allow the installation of other tools necessary for the project. The installation for this can be found [here](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm).
- The latest version of `stylelint` should be installed on your system which will be used by the pre-commit checks to lint the code before a commit can be made to ensure better code quality. Before you install `stylelint` on your system, make sure you have `npm` installed on your system. To install `stylelint` run the following command:
```shell
$ npm i -g stylelint
```
> [!Note]
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
- `Git` installed on your system. The installation instructions for this can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
- Finally, The latest version of `Docker` is installed on your system which will be used to avoid introducing unexpected issues when working on the project. The installation instructions for this can be found [here](https://docs.docker.com/engine/install/).
> [!Note]
> For **rolling release Linux distributions (distros)**, the above-mentioned all required packages can also be installed via the distro-specific package manager.
>
> **For Example:**
>
> On `arch linux` the following packages can be installed by following the link to the installation instructions provided below:
>
> - `Cargo`: https://wiki.archlinux.org/title/rust
> - `Npm`: https://wiki.archlinux.org/title/Node.js
> - `Git`: https://wiki.archlinux.org/title/git
> - `Docker`: https://wiki.archlinux.org/title/docker
>
> But we do not recommend this method for **stable release Linux distros** as they tend to not provide very up-to-date versions of the required packages.
#### Setting up Pre-commit Checks
Before you setup `pre-commit` checks, you will first need to clone **your fork of the project** and navigate into the cloned repository by running the following command:
```shell
git clone https://github.com/<your_github_username>/websurfx.git
cd websurfx
```
Once you have finished running the above commands then run the following command to setup the `pre-commit` checks:
```shell
cargo test
```
By running the above-mentioned command, it will automatically set up all the pre-commit checks in the project.
#### Running the Project
If you have followed the above section then you should have a cloned repository folder present on your system. In the same directory, edit the `dev.docker-compose.yml` file as required before running the following command to run the project:
```shell
$ docker compose -f dev.docker-compose.yml up
```
> [!Note]
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
Once you have finished running the above command, Websurfx should now be served on the address http://127.0.0.1:8080. Hot reload is enabled, so making changes to any of the files will trigger the project to be rebuilt.
### Project Commands
#### Basics
- `cargo build`: Builds the project.
> [!Note]
> When you build the project first time with the above command it will require the app to compile every dependency in the project which will then be cached on your system. So when you compile the app next time it will only compile for the new changes.
- `cargo run`: Starts the app and serves the project on http://127.0.0.1:8080.
> [!Important]
> You must run the build command first.
#### Development
- `cargo watch -q -x "run" -w .`: Starts the development server with hot reloading.
- `cargo fmt -- --check`: Checks the code for proper formatting.
- `cargo clippy`: Lints code to ensure it follows a consistent, neat style.
- `cargo test`: Runs unit tests, integrations tests and doc tests.
### Environment Variables
All environment variables are optional. Currently, there are not many environment variables used, as most of the user preferences are stored under the `websurfx` folder (located under the codebase (`websurfx` directory)) in the `config.lua` file.
The list of all the available environment variables are listed below:
- `PKG_ENV`: Sets the logging level for the app to **Trace** which can be useful for better debugging of the app. These environment variables accept two values `dev` or `prod` as strings.
- `RUST_BACKTRACE`: Rust-specific environment variable useful for getting more elaborate error messages with an error stack to better diagnose the issue. This environment variable accepts three values `0` (off), `1` (on), and `full` (for long error stack to being printed out).
## Git Strategy
### Git Flow
Like most Git repos, we are following the [Github Flow](https://guides.github.com/introduction/flow) standard.
1. Create a branch (or fork if you don't have write access)
2. Code some awesome stuff 🧑‍💻
3. Add, commit, and push your changes to your branch/ fork
4. Head over to GitHub and create a Pull Request
5. Fill in the required sections in the template, and hit submit
6. Follow up with any reviews on your code
7. Merge 🎉
### Git Branch Naming
The format of your branch name should be something similar to: `[TYPE]/[TICKET]_[TITLE]`
For example, `FEATURE/420_Awesome-feature` or `FIX/690_login-server-error`
### Commit Emojis
Using a single emoji at the start of each commit message, issue title, and pull request title, to indicate the type of task, makes the commit ledger, issue, and pull request easier to understand, it looks cool.
- 🎨 `:art:` - Improve the structure/format of the code.
- ⚡️ `:zap:` - Improve performance.
- 🔥 `:fire:` - Remove code or files.
- 🐛 `:bug:` - Fix a bug.
- 🚑️ `:ambulance:` - Critical hotfix
- ✨ `:sparkles:` - Introduce new features.
- 📝 `:memo:` - Add or update documentation.
- 🚀 `:rocket:` - Deploy stuff.
- 💄 `:lipstick:` - Add or update the UI and style files.
- 🎉 `:tada:` - Begin a project.
- ✅ `:white_check_mark:` - Add, update, or pass tests.
- 🔒️ `:lock:` - Fix security issues.
- 🔖 `:bookmark:` - Make a Release or Version tag.
- 🚨 `:rotating_light:` - Fix compiler/linter warnings.
- 🚧 `:construction:` - Work in progress.
- ⬆️ `:arrow_up:` - Upgrade dependencies.
- 👷 `:construction_worker:` - Add or update the CI build system.
- ♻️ `:recycle:` - Refactor code.
- 🩹 `:adhesive_bandage:` - Simple fix for a non-critical issue.
- 🔧 `:wrench:` - Add or update configuration files.
- 🍱 `:bento:` - Add or update assets.
- 🗃️ `:card_file_box:` - Perform database schema-related changes.
- ✏️ `:pencil2:` - Fix typos.
- 🌐 `:globe_with_meridians:` - Internationalization and translations.
For a full list of options, see [gitmoji.dev](https://gitmoji.dev/)
### PR Guidelines
Once you've made your changes, and pushed them to your fork or branch, you're ready to open a pull request!
For a pull request to be merged, it must:
- The build, lint, and tests (run by GH actions) must pass
- There must not be any merge conflicts
When you submit your pull request, include the required info, by filling out the pull request template. Including:
- A brief description of your changes.
- The issue or ticket number (if applicable).
- For UI-related updates include a screenshot.
- If any dependencies were added, explain why it was needed, and state the cost. associated, and confirm it does not introduce any security, privacy, or speed issues
- Optionally, provide a checklist of all the changes that were included in the pull request.
> [!Important]
> Make sure to fill all the required/mandatory sections of the pull request as filling them helps us distinguish between spam pull requests and legitimate pull requests.
> [!Note]
> The pull request template contains comments in the following form `<!-- -->` which are used to provide a guide on what should be provided under each heading of the template. These comments are never rendered when the pull request is either created or updated and hence anything provided in such comments is never displayed.
## Resources for Beginners
New to Web Development? Or New to GitHub? Glad to see you're here!! :slightly_smiling_face: Websurfx is a pretty simple app, so it should make a good candidate for your first PR. The following articles (which have been divided into parts for convenience) should point you in the right direction for getting up to speed with the technologies used in this project:
**Development**
- [Basics of Rust](https://piped.kavin.rocks/playlist?list=PLai5B987bZ9CoVR-QEIN9foz4QCJ0H2Y8)
- [Introduction and deep dive into async/await in rust](https://piped.kavin.rocks/watch?v=ThjvMReOXYM)
- [Getting Started to Actix Guide](https://actix.rs/docs/getting-started)
- [Basics of Lua](https://learn.coregames.com/courses/intro-to-lua/)
- [Complete course on CSS](https://piped.kavin.rocks/watch?v=1Rs2ND1ryYc)
- [Complete course on JS](https://piped.kavin.rocks/playlist?list=PL_c9BZzLwBRLVh9OdCBYFEql6esA6aRsi)
- [Responsive web design](https://piped.kavin.rocks/watch?v=srvUrASNj0s)
- [Complete beginners guide to Docker](https://docker-curriculum.com/)
- [Docker Classroom - Interactive Tutorials](https://training.play-with-docker.com/)
- [Docker Compose Tutorial](https://docs.docker.com/compose/gettingstarted/)
- [ES6 Tutorial](https://piped.kavin.rocks/watch?v=nZ1DMMsyVyI)
- [Cargo Guide Book](https://doc.rust-lang.org/cargo/index.html)
**GitHub**
- [Complete Guide to Open Source - How to Contribute](https://piped.kavin.rocks/watch?v=yzeVMecydCE)
- [Forking a Project](https://piped.kavin.rocks/watch?v=FnxFwyzm4Z4)
- [A Tutorial on Git](https://piped.kavin.rocks/playlist?list=PL4lTrYcDuAfxAgSefXftJXbhw0qvjfOFo)
- [Git cheat sheet](http://git-cheatsheet.com/)
For Rust, CSS, JS, HTML, Git, and Docker- you'll need an IDE (e.g. [VSCode](https://code.visualstudio.com/) or [Neovim](https://neovim.io/) and a terminal (Windows users may find [WSL](https://docs.microsoft.com/en-us/windows/wsl/) more convenient).
## App Info
### Style Guides
Linting is done using [Cargo Clippy](https://doc.rust-lang.org/clippy/) and [StyleLint](https://stylelint.io/) or [ESLint](https://eslint.org/). Also, linting is run as a git pre-commit hook.
> [!Important]
> All lint checks must pass before any PR can be merged.
Styleguides to follow:
- [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/naming.html)
- [Airbnb JS Guidelines](https://github.com/airbnb/javascript)
- [Google's Html and CSS Guidelines](https://google.github.io/styleguide/htmlcssguide.html)
## Application Structure
> [!Important]
> We follow the Unix style naming conventions for all the files and folders in the project (except for all files under the `themes` and `colorschemes` folder in the frontend's source code which requires that the names of the files and folders should be in lowercase and the words be separated with a hyphen.) which includes the name of the files and folders should be in lowercase and every word should be separated with an underscore.
**Files in the root of the codebase:** `./`
```
./
├── .dockerignore # Docker ignore file to ignore stuff being included in the file docker image.
├── .gitignore # Git ignore file to ignore stuff from being
├── Cargo.lock # Auto-generated list of current packages and version numbers.
├── Cargo.toml # Project meta-data and dependencies.
├── Dockerfile # The blueprint for building the Docker container.
├── LICENSE # License for use.
├── README.md # Readme, basic info for getting started.
├── dev.Dockerfile # The blueprint for building the Docker container for development purposes.
├── dev.docker-compose.yml # A Docker run command for development environments.
├── docker-compose.yml # A Docker run command.
├── flake.lock # NixOS auto-generated flake configuration.
├── flake.nix # Nix flake package configuration.
├── docs # Markdown documentation
├── public # Project front-end source code
├── src # Project back-end source code
├── tests # Project integration tests for the back-end source code.
└── websurfx # Project folder containing config files for the app.
```
**Frontend Source:** `./public/`
```
./public/
├── robots.txt # Robots file for the Website.
├── images # Images for the Website.
└── static # The directory containing all the UI handlers.
├── cookies.js # Handles the loading of saved cookies.
├── error_box.js # Handles the toggling functionality of the error box on the search page.
├── index.js # Functions to handle the search functionality of the search bar.
├── pagination.js # Functions to handle the navigation between the previous and next page in the search page.
├── search_area_options.js # Changes the search options under the search bar in the search page according to the safe search level set using the URL safesearch parameter.
├── settings.js # Handles the settings and saving of all the settings page options as a cookie.
├── colorschemes # A folder containing all the popular colorscheme files as CSS files.
└── themes # A folder containing all the popular theme files as CSS files.
```
**Fronted Maud HTML Framework Source:** `./src/templates/`
```
./src/templates/
├── mod.rs # A module file for the rust project.
├── partials # A folder containing the code for partials for the views.
│ ├── bar.rs # Provides partial code for the search bar.
│ ├── footer.rs # Provides partial code for the footer section.
│ ├── header.rs # Provides partial code for the header section.
│ ├── mod.rs # A module file for the rust project.
│ ├── navbar.rs # Provides partial code for the navbar inside the header section.
│ ├── search_bar.rs # Provides partial code for the search bar present in the search page.
│ └── settings_tabs # A folder containing all the partials for the settings page tabs.
│ ├── cookies.rs # Provides partial code for the cookies tab.
│ ├── engines.rs # Provides partial code for the engines tab.
│ ├── general.rs # Provides partial code for the general tab.
│ ├── mod.rs # A module file for the rust project.
│ └── user_interface.rs # Provides partial code for the user interface tab.
└── views # A folder containing the code for the views.
├── about.rs # Provides code for the about page view.
├── index.rs # Provides code for the homepage view.
├── mod.rs # A module file for the rust project.
├── not_found.rs # Provides code for the 404 page view.
├── search.rs # Provides code for the search page view.
└── settings.rs # Provides code for the settings page view.
```
**Backend Source:** `./src/`
```
./src/
├── lib.rs # A library file for the rust project.
├── bin # A folder containing the source code that would produce the binary file when compiled.
│ └── websurfx.rs # A file that would be compiled into a binary file.
├── cache # A folder that contains code to handle the caching functionality of the search engine.
│ ├── cacher.rs # Handles the different caching features.
│ ├── error.rs # Provides custom error messages for different types of caches and their related errors.
│ ├── mod.rs # A module file for the rust project.
│ └── redis_cacher.rs # Provides custom asynchronous pool implementation with auto background reconnection functionality.
├── config # A folder that holds the code to help parse the lua config file that would be used in the app.
│ ├── mod.rs # A module file for the rust project.
│ └── parser.rs # Provides the code to parse the config file.
├── engines # A folder that holds code to handle fetching data from different upstream engines.
│ ├── brave.rs # Provides code to fetch and remove unnecessary or waste results from the fetched results from the brave search engine.
│ ├── duckduckgo.rs # Provides code to fetch and remove unnecessary or waste results from the fetched results from the duckduckgo search engine.
│ ├── mod.rs # A module file for the rust project.
│ ├── search_result_parser.rs # Provides helper function to help ease the process of defining different result selection selectors.
│ └── searx.rs # Provides code to fetch and remove unnecessary or waste results from the fetched results from the searx engine.
├── handler # A folder that provides helper code to provide a proper path to the public (theme) folder, config file, blocklist file, and allowlist file based on where they are located.
│ ├── mod.rs # A module file for the rust project.
│ └── paths.rs # Provides helper code to handle different paths.
├── models # A folder that provides different models for the different modules in the backend code.
│ ├── aggregation_models.rs # Provides different models (enums, structs) for handling and standardizing different parts in the "results" module code.
│ ├── engine_models.rs # Provides different models (enums, structs) for handling and standardizing different parts in the "engines" module code.
│ ├── mod.rs # A module file for the rust project.
│ ├── parser_models.rs # Provides different models (enums, structs) for handling and standardizing different parts in the "config" module code.
│ └── server_models.rs # Provides different models (enums, structs) for handling and standardizing different parts in the "server" module code.
├── results # A folder that provides code to handle the fetching and aggregating of results from the upstream search engines.
│ ├── aggregator.rs # Provides code aggregate and fetches results from the upstream engines.
│ ├── mod.rs # A module file for the rust project.
│ └── user_agent.rs # Provides a helper function to allow random user agents to pass in the server request code to improve user privacy and avoiding detected as a bot.
├── server # A folder that holds code to handle the routes for the search engine website.
│ ├── mod.rs # A module file for the rust project.
│ ├── router.rs # Provides functions to handle the different routes on the website.
│ └── routes # A folder that contains code to handle the bigger route for the website.
│ ├── mod.rs # A module file for the rust project.
│ └── search.rs # Provides the function to handle the search route.
└── templates # A module that provides and handles Maud HTML framework source code for the search engine website (subfolders and files are explained in the above frontend section.)
```
## Development Tools
### Performance - Lighthouse
The easiest method of checking performance is to use Chromium's built-in auditing tool, Lighthouse. To run the test, open Developer Tools (usually F12) --> Lighthouse and click on the 'Generate Report' button at the bottom.
## Notes
### Known warnings
When running the build command, a warning appears. This is not an error and does not affect the security or performance of the application. They will be addressed soon in a future update.
```shell
warning: the following packages contain code that will be rejected by a future version of Rust: html5ever v0.23.0
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2`
```
This warning just means that any dependencies or code using the `html5ever` code would be deprecated and rejected in future versions of the Rust language. So right now these dependencies can be used as these have not happened yet.
[⬅️ Go back to Home](./README.md)

15
docs/faq.md Normal file
View file

@ -0,0 +1,15 @@
# General Questions
## Why Websurfx?
The primary purpose of the Websurfx project is to create a fast, secure, and privacy-focused [meta-search engine](https://en.wikipedia.org/wiki/Metasearch_engine). While there are numerous meta-search engines available, not all of them guarantee the security of their search engine, which is critical for maintaining privacy. Memory flaws, for example, can expose private or sensitive information, which is never a good thing. Also, there is the added problem of Spam, ads, and unorganic results which most engines don't have the full-proof answer to it till now but with Websurfx I finally put a full stop to this problem, also, Rust is used to write Websurfx, which ensures memory safety and removes such issues. Many meta-search engines also lack important features like advanced picture search, which is required by many graphic designers, content providers, and others. Websurfx attempts to improve the user experience by providing these and other features, such as proper NSFW blocking and Micro-apps or Quick results (like providing a calculator, currency exchanges, etc in the search results).
## Why AGPLv3?
Websurfx is released under the AGPLv3 license to ensure that the source code remains open and transparent. This helps to prevent the inclusion of spyware, telemetry, or other malicious code in the project. AGPLv3 is a strong copyleft license that ensures the source code of the software remains open and available to everyone, including any modifications or improvements made to the code.
## Why Rust?
Rust was chosen as the programming language for Websurfx due to its memory safety features, which can help prevent vulnerabilities and make the codebase more secure. Rust is also faster than C++, which helps to make Websurfx fast and responsive. In addition, Rust's ownership and borrowing system allows for safe concurrency and thread safety in the codebase.
[⬅️ Go back to Home](./README.md)

42
docs/features.md Normal file
View file

@ -0,0 +1,42 @@
# Features
The project provides 4 caching options as conditionally compiled features. This helps reduce the size of the compiled app by only including the code that is necessary for a particular caching option.
The different caching features provided are as follows:
- No cache
- Redis cache
- In memory cache
- Hybrid cache
## Explanation
### No Cache
This feature can drastically reduce binary size but with the cost that subsequent search requests and previous & next page search results are not cached which can make navigating between pages slower. As well as Page refreshes of the same page also become slower as each refresh has to fetch the results from the upstream search engines.
### Redis Cache
This feature allows the search engine to cache the results on the redis server. This feature can be useful for having a dedicated cache server for multiple devices hosted with the `Websurfx` server which can use the one dedicated cache server for hosting their cache on it. But a disadvantage of this solution is that if the `Redis`server is located far away (for example provided by a vps as service) and if it is unavailable or down for some reason then the `Websurfx` server would not be able to function properly or will crash on startup.
### In Memory Cache
This feature is the default feature provided by the project. This feature allows the search engine to cache the results in the memory which can help increase the speed of the fetched cache results and it also has the advantage that it is extremely reliable as all the results are stored in memory within the search engine. Though the disadvantage of this solution is that caching of results is slightly slower than the `redis-cache` solution, it requires a good amount of memory on the system and as such is not ideal for very low memory devices and is highly unscalable.
### Hybrid Cache
This feature provides the advantages of both `In Memory` caching and `Redis` caching and it is an ideal solution if you need a very resilient and reliable solution for the `Websurfx` which can provide both speed and reliability. Like for example if the `Redis` server becomes unavailable then the search engine switches to `In Memory` caching until the server becomes available again. This solution can be useful for hosting a `Websurfx` instance which will be used by hundreds or thousands of users all over the world.
## Tabular Summary
| **Attributes** | **Hybrid** | **In-Memory** | **No Cache** | **Redis** |
|-----------------------------------------|------------|------------------------------------------------------|-----------------|------------------------|
| **Speed** | Fast | Caching is slow, but retrieval of cache data is fast | Slow | Fastest |
| **Reliability** | ✅ | ✅ | ✅ | ❌ |
| **Scalability** | ✅ | ❌ | - | ✅ |
| **Resiliency** | ✅ | ✅ | ✅ | ❌ |
| **Production/Large Scale/Instance use** | ✅ | Not Recommended | Not Recommended | Not Recommended |
| **Low Memory Support** | ❌ | ❌ | ✅ | ❌ |
| **Binary Size** | Big | Bigger than `No Cache` | small | Bigger than `No Cache` |
[⬅️ Go back to Home](./README.md)

409
docs/installation.md Normal file
View file

@ -0,0 +1,409 @@
# Install From Package
## Arch Linux
### Rolling/Edge/Unstable
You can install `Websurfx` through the [Aur](https://aur.archlinux.org/packages/websurfx-git), By running the following command (using [paru](https://github.com/Morganamilo/paru)):
```shell
paru -S websurfx-edge-git
```
After installing it you can run the websurfx server by running the following commands:
```shell
websurfx
```
Once you have started the server, open your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
If you want to change the port or the IP or any other configuration setting check out the [configuration docs](./configuration.md).
### Stable
For the stable version, follow the same steps as above (as mentioned for the `unstable/rolling/edge` version) with the only difference being that the package to be installed for the stable version is called `websurfx-git` instead of `websurfx-edge-git`.
## NixOS
A `flake.nix` has been provided to allow installing `websurfx` easily. It utilizes [nearsk](https://github.com/nix-community/naersk) to automatically generate a derivation based on `Cargo.toml` and `Cargo.lock`.
The Websurfx project provides 2 versions/flavours for the flake `stable` and `rolling/unstable/edge`. The steps for each are covered below in different sections.
### Rolling/Edge/Unstable
To get started, First, clone the repository, edit the config file which is located in the `websurfx` directory, and then build and run the websurfx server by running the following commands:
```shell
git clone https://github.com/neon-mmd/websurfx.git
cd websurfx
cp -rf ./websurfx/ ~/.config/
$ mkdir /opt/websurfx/
$ cp -rf ./public/ /opt/websurfx/
nix build .#websurfx
nix run .#websurfx
```
> [!Note]
> In the above command the dollar sign(**$**) refers to running the command in Privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
Once you have run the above set of commands, open your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
If you want to change the port or the IP or any other configuration setting check out the [configuration docs](./configuration.md).
> Optionally, you may include it in your own flake by adding this repo to its inputs and adding it to `environment.systemPackages` as follows:
>
> ```nix
> {
> description = "My awesome configuration";
>
> inputs = {
> websurfx.url = "github:neon-mmd/websurfx";
> };
>
> outputs = { nixpkgs, ... }@inputs: {
> nixosConfigurations = {
> hostname = nixpkgs.lib.nixosSystem {
> system = "x86_64-linux";
> modules = [{
> environment.systemPackages = [inputs.websurfx.packages.x86_64-linux.websurfx];
> }];
> };
> };
> };
> }
> ```
### Stable
For the stable version, follow the same steps as above (as mentioned for the `unstable/rolling/edge version`) with an addition of one command which has to be performed after cloning and changing the directory into the repository which makes the building step as follows:
```shell
git clone https://github.com/neon-mmd/websurfx.git
cd websurfx
git checkout stable
cp -rf ./websurfx/ ~/.config/
$ mkdir /opt/websurfx/
$ cp -rf ./public/ /opt/websurfx/
nix build .#websurfx
nix run .#websurfx
```
> [!Note]
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
## Other Distros
The package is currently not available on other Linux distros. With contribution and support it can be made available on other distros as well 🙂.
# Install From Source
Before you can start building `websurfx`, you will need to have `Cargo` installed on your system. You can find the installation instructions [here](https://doc.rust-lang.org/cargo/getting-started/installation.html).
## Stable
To get started with Websurfx, clone the repository, edit the config file which is located in the `websurfx` directory, and install redis server by following the instructions located [here](https://redis.io/docs/getting-started/) and then build and run the websurfx server by running the following commands:
```shell
git clone https://github.com/neon-mmd/websurfx.git
cd websurfx
git checkout stable
cargo build -r
redis-server --port 8082 &
./target/release/websurfx
```
Once you have started the server, open your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
If you want to change the port or the IP or any other configuration setting check out the [configuration docs](./configuration.md).
## Rolling/Edge/Unstable
If you want to use the rolling/edge branch, run the following commands instead:
```shell
git clone https://github.com/neon-mmd/websurfx.git
cd websurfx
```
Once you have changed the directory to the `websurfx` directory then follow the build options listed below:
> [!Note]
> Before you start building the search engine using one of the below listed command. We would strongly recommend setting the `PKG_ENV` enviroment variable as this applies some special optimization to code to reduce the file and improve the page load speed of the website.
> To set the `PKG_ENV` enviroment variable in the `bash` shell run the following command:
>
> ```bash
> export PKG_ENV="prod"
> ```
>
> For how to set the environment variables in other shells. You can follow the instructions on how to do so by visiting the documentation of the specific shell you are using.
### Hybrid Cache
> For more information on the features and their pros and cons. see: [**Features**](./features.md)
To build the search engine with the `Hybrid caching` feature. Run the following build command:
```shell
cargo build -r --features redis-cache
```
### Memory Cache (Default Features)
> For more information on the features and their pros and cons. see: [**Features**](./features.md)
To build the search engine with the `In-Memory caching` feature. Run the following build command:
```shell
cargo build -r
```
### No Cache
> For more information on the features and their pros and cons. see: [**Features**](./features.md)
To build the search engine with the `No caching` feature. Run the following build command:
```shell
cargo build -r --no-default-features
```
### Redis Cache
> For more information on the features and their pros and cons. see: [**Features**](./features.md)
To build the search engine with the `hybrid caching` feature. Run the following build command:
```shell
cargo build -r --no-default-features --features redis-cache
```
> Optionally, If you have built the app with the `Redis cache`or `Hybrid cache` feature (as mentioned above) then before launching the search engine run the following command:
>
> ```shell
> redis-server --port 8082 &
> ```
Once you have finished building the `search engine`. then run the following command to start the search engine:
```shell
./target/release/websurfx
```
Once you have started the server, launch your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
If you want to change the port or the IP or any other configuration setting check out the [configuration docs](./configuration.md).
# Docker Deployment
Before you start, you will need [Docker](https://docs.docker.com/get-docker/) installed on your system first.
## Prebuild
The Websurfx project provides several prebuilt images based on the different features provided by the search engine. To get started using the prebuild image, you will first need to create a `docker-compose.yml` file with the following content:
```yaml
---
version: '3.9'
services:
app:
# Comment the line below if you don't want to use the `hybrid/latest` image.
image: neonmmd/websurfx:latest
# Uncomment the line below if you want to use the `no cache` image.
# image: neonmmd/websurfx:nocache
# Uncomment the line below if you want to use the `memory` image.
# image: neonmmd/websurfx:memory
# Uncomment the line below if you want to use the `redis` image.
# image: neonmmd/websurfx:redis
ports:
- 8080:8080
# Uncomment the following lines if you are using the `hybrid/latest` or `redis` image.
# depends_on:
# - redis
# links:
# - redis
volumes:
- ./websurfx/:/etc/xdg/websurfx/
# Uncomment the following lines if you are using the `hybrid/latest` or `redis` image.
# redis:
# image: redis:latest
```
Then make sure to edit the `docker-compose.yml` file as required. After that create a directory `websurfx` in the directory you have placed the `docker-compose.yml` file, and then in the new directory create two new empty files named `allowlist.txt` and `blocklist.txt`. Finally, create a new config file `config.lua` with the default configuration, which looks something like this:
```lua
-- ### General ###
logging = true -- an option to enable or disable logs.
debug = false -- an option to enable or disable debug mode.
threads = 8 -- the amount of threads that the app will use to run (the value should be greater than 0).
-- ### Server ###
port = "8080" -- port on which server should be launched
binding_ip = "0.0.0.0" --ip address on the which server should be launched.
production_use = false -- whether to use production mode or not (in other words this option should be used if it is to be used to host it on the server to provide a service to a large number of users (more than one))
-- if production_use is set to true
-- There will be a random delay before sending the request to the search engines, this is to prevent DDoSing the upstream search engines from a large number of simultaneous requests.
request_timeout = 30 -- timeout for the search requests sent to the upstream search engines to be fetched (value in seconds).
rate_limiter = {
number_of_requests = 20, -- The number of requests that are allowed within a provided time limit.
time_limit = 3, -- The time limit in which the number of requests that should be accepted.
}
-- ### Search ###
-- Filter results based on different levels. The levels provided are:
-- {{
-- 0 - None
-- 1 - Low
-- 2 - Moderate
-- 3 - High
-- 4 - Aggressive
-- }}
safe_search = 2
-- ### Website ###
-- The different colorschemes provided are:
-- {{
-- catppuccin-mocha
-- dark-chocolate
-- dracula
-- gruvbox-dark
-- monokai
-- nord
-- oceanic-next
-- one-dark
-- solarized-dark
-- solarized-light
-- tokyo-night
-- tomorrow-night
-- }}
colorscheme = "catppuccin-mocha" -- the colorscheme name that should be used for the website theme
theme = "simple" -- the theme name that should be used for the website
-- ### Caching ###
redis_url = "redis://redis:6379" -- redis connection url address on which the client should connect on.
-- ### Search Engines ###
upstream_search_engines = {
DuckDuckGo = true,
Searx = false,
} -- select the upstream search engines from which the results should be fetched.
```
Then run the following command to deploy the search engine:
```shell
$ docker compose up -d
```
> [!Note]
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec` or any other privileged access methods.
Then launch the browser of your choice and navigate to http://<ip_address_of_the_device>:<whatever_port_you_provided_in_the_config>.
> [!Note]
> The official prebuild images only support `stable` versions of the app and will not support `rolling/edge/unstable` versions. But with support and contribution, it could be made available for these versions as well 🙂.
## Manual Deployment
This section covers how to deploy the app with docker manually by manually building the image and deploying it.
> [!Note]
> This section is provided for those who want to further customize the docker image or for those who are extra cautious about security.
> [!Warning]
> A note of caution the project currently only supports **x86-64** architecture and as such we do not recommend deploying the project on devices with other architectures. Though if you still want to do it then **do it at your own risk**.
### Unstable/Edge/Rolling
First, clone the repository by running the following command:
```bash
git clone https://github.com/neon-mmd/websurfx.git
cd websurfx
```
After that edit the config.lua file located under `websurfx` directory. In the config file, you will specifically need to change to values which are `binding_ip_addr` and `redis_connection_url` which should make the config look something like this:
```lua
-- ### General ###
logging = true -- an option to enable or disable logs.
debug = false -- an option to enable or disable debug mode.
threads = 10 -- the amount of threads that the app will use to run (the value should be greater than 0).
-- ### Server ###
port = "8080" -- port on which server should be launched
binding_ip = "127.0.0.1" --ip address on the which server should be launched.
production_use = false -- whether to use production mode or not (in other words this option should be used if it is to be used to host it on the server to provide a service to a large number of users (more than one))
-- if production_use is set to true
-- There will be a random delay before sending the request to the search engines, this is to prevent DDoSing the upstream search engines from a large number of simultaneous requests.
request_timeout = 30 -- timeout for the search requests sent to the upstream search engines to be fetched (value in seconds).
rate_limiter = {
number_of_requests = 20, -- The number of request that are allowed within a provided time limit.
time_limit = 3, -- The time limit in which the quantity of requests that should be accepted.
}
-- ### Search ###
-- Filter results based on different levels. The levels provided are:
-- {{
-- 0 - None
-- 1 - Low
-- 2 - Moderate
-- 3 - High
-- 4 - Aggressive
-- }}
safe_search = 2
-- ### Website ###
-- The different colorschemes provided are:
-- {{
-- catppuccin-mocha
-- dark-chocolate
-- dracula
-- gruvbox-dark
-- monokai
-- nord
-- oceanic-next
-- one-dark
-- solarized-dark
-- solarized-light
-- tokyo-night
-- tomorrow-night
-- }}
colorscheme = "catppuccin-mocha" -- the colorscheme name which should be used for the website theme
theme = "simple" -- the theme name which should be used for the website
-- ### Caching ###
redis_url = "redis://127.0.0.1:8082" -- redis connection url address on which the client should connect on.
cache_expiry_time = 600 -- This option takes the expiry time of the search results (value in seconds and the value should be greater than or equal to 60 seconds).
-- ### Search Engines ###
upstream_search_engines = {
DuckDuckGo = true,
Searx = false,
Brave = false,
Startpage = false,
LibreX = false,
} -- select the upstream search engines from which the results should be fetched.
```
After this make sure to edit the `docker-compose.yml` and `Dockerfile` files as required and run the following command to deploy the app:
```bash
$ docker compose up -d --build
```
> [!Note]
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
This will take around 5-10 mins for the first deployment, afterwards, the docker build stages will be cached so it will be faster to build from next time onwards. After the above step finishes launch your preferred browser and then navigate to `http://<ip_address_of_the_device>:<whatever_port_you_provided_in_the_config>`.
### Stable
For the stable version, follow the same steps as above (as mentioned for the unstable/rolling/edge version) with an addition of one command which has to be performed after cloning and changing the directory into the repository which makes the cloning step as follows:
```bash
git clone https://github.com/neon-mmd/websurfx.git
cd websurfx
git checkout stable
```
[⬅️ Go back to Home](./README.md)

15
docs/instances.md Normal file
View file

@ -0,0 +1,15 @@
# Instances
> To contribute your server instance, check out the contributing guide [here](https://github.com/neon-mmd/websurfx/blob/HEAD/CONTRIBUTING.md).
This page provides a list of `Websurfx` instances provided by us and our community.
|URL|Network|Version|Location|Status|Maintained By|TLS|IPv6|Comment|
|-|-|-|-|-|-|-|-|-|
|https://websurfx.pp.ua|www|rolling|🇺🇸 US|<a href="https://status.websurfx.pp.ua"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwebsurfx.pp.ua&label=Status"></a>|[Websurfx Project](https://github.com/neon-mmd/websurfx)|✅|✅||
|https://alamin655-spacex.hf.space|www|rolling|🇺🇸 US|<a href="https://status.websurfx.pp.ua"><img src="https://img.shields.io/website?url=https%3A%2F%2Falamin655-spacex.hf.space&label=Status"></a>|[Websurfx Project](https://github.com/neon-mmd/websurfx)|✅|❌||
|https://websurfx.instance.pp.ua|www|rolling|🇺🇸 US|<a href="https://status.websurfx.pp.ua"><img src="https://img.shields.io/website?url=https%3A%2F%2Fwebsurfx.instance.pp.ua&label=Status"></a>|[Websurfx Project](https://github.com/neon-mmd/websurfx)|✅|✅||
|https://alamin655-surfx.hf.space|www|stable|🇺🇸 US|<a href="https://status.websurfx.pp.ua"><img src="https://img.shields.io/website?url=https%3A%2F%2Falamin655-surfx.hf.space&label=Status"></a>|[Websurfx Project](https://github.com/neon-mmd/websurfx)|✅|❌||
[⬅️ Go back to Home](./README.md)

13
docs/introduction.md Normal file
View file

@ -0,0 +1,13 @@
# Introduction
A modern-looking, lightning-fast, privacy-respecting, secure [meta search engine](https://en.wikipedia.org/wiki/Metasearch_engine) (pronounced as websurface or web-surface /wɛbˈːrfəs/.) written in Rust. It provides a fast and secure search experience while respecting user privacy.
# Motivation
Most meta search engines tend to be slow, lack a high level of customization, and miss many features, and all of them lack security as they are written in unsafe languages like Python, JavaScript, etc., which tend to open a wide variety of vulnerabilities, which can also sometimes pose a threat to privacy as sometimes this can be exploited and can be used to leak out sensitive information, which is never good.
# Solution
Websurfx is a project that seeks to provide privacy, security, speed, and all the features that the user wants.
[⬅️ Go back to Home](./README.md)

885
docs/theming.md Normal file
View file

@ -0,0 +1,885 @@
# Theming
## Colorschemes
### Built-in
By default `websurfx` comes with 12 colorschemes to choose from which can be easily chosen using the config file or via the settings page on the website.
> To how to change colorschemes using the config file. See: [**Configuration**](https://github.com/neon-mmd/websurfx/wiki/configuration)
### Custom
To write a custom theme for the website, you will first need to create a new file under the `public/static/themes` folder with name of the theme containing each word seperated with a hyphen (**-**). Then after that edit the newly created file as required with new css code.
Creating coloschemes is as easy as it gets it requires the user to have a colorscheme file name with the name of the colorscheme that is to be provided in which every space should be replaced with a `-` (dash) and it should end with a `.css` file extension. After creating the file you need to add the following code with the `colors` you want to include:
```css
:root {
--background-color: <background color>;
--foreground-color: <foreground color (text color on the website) >;
--logo-color: <logo color
(the color of the logo svg image on the website homepage) >;
--color-one: <color 1>;
--color-two: <color 2>;
--color-three: <color 3>;
--color-four: <color 4>;
--color-five: <color 5>;
--color-six: <color 6>;
--color-seven: <color 7>;
}
```
> [!Note]
> Please infer the theme file located under `public/static/themes` to better understand where each color is being used.
**Example of `catppuccin-mocha` colorscheme:**
```css
:root {
--background-color: #1e1e2e;
--foreground-color: #cdd6f4;
--logo-color: #f5c2e7;
--color-one: #45475a;
--color-two: #f38ba8;
--color-three: #a6e3a1;
--color-four: #f9e2af;
--color-five: #89b4fa;
--color-six: #f5c2e7;
--color-seven: #ffffff;
}
```
## Themes
### Built-in
By default `websurfx` comes with 1 theme to choose from which can be easily chosen using the config file or via the settings page on the website.
> To how to change themes using the config file. See: [**Configuration**](https://github.com/neon-mmd/websurfx/wiki/configuration)
### Custom
> This section expects the user to have some knowledge of `css`.
To write a custom theme for the website, you will first need to create a new file under the `public/static/themes` folder with name of the theme containing each word seperated with a hyphen (**-**). Then after that edit the newly created file as required with new css code.
Here is an example of `simple theme` (which we provide by default with the app) which will give you a better idea on how you can create your own custom theme for the website:
#### General
```css
@font-face {
font-family: Rubik;
src: url('https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;600;700;800&display=swap');
fallback: sans-serif;
}
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
html {
font-size: 62.5%;
}
body {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
height: 100vh;
font-family: Rubik, sans-serif;
background-color: var(--background-color);
}
/* enforce font for buttons */
button {
font-family: Rubik, sans-serif;
}
```
#### Styles for the index page
```css
.search-container {
display: flex;
flex-direction: column;
gap: 5rem;
justify-content: center;
align-items: center;
}
.search-container svg {
color: var(--logo-color);
}
.search-container div {
display: flex;
}
```
#### Styles for the search box and search button
```css
.search_bar {
display: flex;
gap: 10px;
align-items: center;
}
.search_bar input {
border-radius: 6px;
padding: 2.6rem 2.2rem;
width: 50rem;
height: 3rem;
outline: none;
border: none;
box-shadow: rgb(0 0 0 / 1);
background-color: var(--color-one);
color: var(--foreground-color);
outline-offset: 3px;
font-size: 1.6rem;
}
.search_bar input:focus {
outline: 2px solid var(--foreground-color);
}
.search_bar input::placeholder {
color: var(--foreground-color);
opacity: 1;
}
.search_bar button {
padding: 2.6rem 3.2rem;
border-radius: 6px;
height: 3rem;
display: flex;
justify-content: center;
align-items: center;
outline-offset: 3px;
outline: 2px solid transparent;
border: none;
transition: 0.1s;
gap: 0;
background-color: var(--color-six);
color: var(--background-color);
font-weight: 600;
letter-spacing: 0.1rem;
}
.search_bar button:active {
outline: 2px solid var(--color-three);
}
.search_bar button:active,
.search_bar button:hover {
filter: brightness(1.2);
}
.search_area .search_options {
display: flex;
justify-content: space-between;
align-items: center;
}
.search_area .search_options select {
margin: 0.7rem 0;
width: 20rem;
background-color: var(--color-one);
color: var(--foreground-color);
padding: 1.2rem 2rem;
border-radius: 0.5rem;
outline-offset: 3px;
outline: 2px solid transparent;
border: none;
text-transform: capitalize;
}
.search_area .search_options select:active,
.search_area .search_options select:hover {
outline: 2px solid var(--color-three);
}
.search_area .search_options option:hover {
background-color: var(--color-one);
}
.result_not_found {
display: flex;
flex-direction: column;
font-size: 1.5rem;
color: var(--foreground-color);
}
.result_not_found p {
margin: 1rem 0;
}
.result_not_found ul {
margin: 1rem 0;
}
.result_not_found img {
width: 40rem;
}
/* styles for the error box */
.error_box .error_box_toggle_button {
background: var(--foreground-color);
}
.error_box .dropdown_error_box {
position: absolute;
display: none;
flex-direction: column;
background: var(--background-color);
border-radius: 0;
margin-left: 2rem;
min-height: 20rem;
min-width: 22rem;
}
.error_box .dropdown_error_box.show {
display: flex;
}
.error_box .dropdown_error_box .error_item,
.error_box .dropdown_error_box .no_errors {
display: flex;
align-items: center;
color: var(--foreground-color);
letter-spacing: 0.1rem;
padding: 1rem;
font-size: 1.2rem;
}
.error_box .dropdown_error_box .error_item {
justify-content: space-between;
}
.error_box .dropdown_error_box .no_errors {
min-height: 18rem;
justify-content: center;
}
.error_box .dropdown_error_box .error_item:hover {
box-shadow: inset 0 0 100px 100px rgb(255 255 255 / 0.1);
}
.error_box .error_item .severity_color {
width: 1.2rem;
height: 1.2rem;
}
.results .result_disallowed,
.results .result_filtered,
.results .result_engine_not_selected {
display: flex;
justify-content: center;
align-items: center;
gap: 10rem;
font-size: 2rem;
color: var(--foreground-color);
margin: 0 7rem;
}
.results .result_disallowed .user_query,
.results .result_filtered .user_query,
.results .result_engine_not_selected .user_query {
color: var(--background-color);
font-weight: 300;
}
.results .result_disallowed img,
.results .result_filtered img,
.results .result_engine_not_selected img {
width: 30rem;
}
.results .result_disallowed div,
.results .result_filtered div,
.results .result_engine_not_selected div {
display: flex;
flex-direction: column;
gap: 1rem;
line-break: strict;
}
```
#### Styles for the footer and header
```css
header {
width: 100%;
background: var(--background-color);
display: flex;
align-items: center;
justify-content: space-between;
padding: 2rem 3rem;
}
footer {
width: 100%;
background: var(--background-color);
display: flex;
align-items: center;
padding: 1.7rem 1.7rem 4rem;
gap: 1.8rem;
flex-direction: column;
justify-content: center;
}
header h1 a {
text-transform: capitalize;
text-decoration: none;
color: var(--foreground-color);
letter-spacing: 0.1rem;
}
header ul,
footer ul {
list-style: none;
display: flex;
justify-content: space-around;
align-items: center;
font-size: 1.5rem;
gap: 2rem;
}
header ul li a,
footer ul li a,
header ul li a:visited,
footer ul li a:visited {
text-decoration: none;
color: var(--color-two);
text-transform: capitalize;
letter-spacing: 0.1rem;
}
header ul li a {
font-weight: 600;
}
header ul li a:hover,
footer ul li a:hover {
color: var(--color-five);
}
footer div span {
font-size: 1.5rem;
color: var(--color-four);
}
footer div {
display: flex;
gap: 1rem;
}
```
#### Styles for the search page
```css
.results {
width: 90%;
display: flex;
flex-direction: column;
justify-content: space-around;
gap: 1rem;
}
.result {
gap: 1rem;
}
.results .search_bar {
margin: 1rem 0;
}
.results_aggregated {
display: flex;
flex-direction: column;
justify-content: space-between;
margin: 2rem 0;
content-visibility: auto;
}
.results_aggregated .result {
display: flex;
flex-direction: column;
margin-top: 1rem;
}
.results_aggregated .result h1 a {
font-size: 1.7rem;
font-weight: normal;
color: var(--color-two);
text-decoration: none;
}
.results_aggregated .result h1 a:hover {
color: var(--color-five);
}
.results_aggregated .result h1 a:visited {
color: var(--background-color);
}
.results_aggregated .result small {
color: var(--color-three);
font-size: 1.3rem;
word-wrap: break-word;
line-break: anywhere;
}
.results_aggregated .result p {
color: var(--foreground-color);
font-size: 1.4rem;
line-height: 2.4rem;
margin-top: 0.3rem;
word-wrap: break-word;
line-break: anywhere;
}
.results_aggregated .result .upstream_engines {
text-align: right;
font-size: 1.2rem;
padding: 1rem;
color: var(--color-five);
display: flex;
gap: 1rem;
justify-content: right;
}
```
#### Styles for the 404 page
```css
.error_container {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
gap: 5rem;
}
.error_container img {
width: 30%;
}
.error_content {
display: flex;
flex-direction: column;
justify-content: center;
gap: 1rem;
}
.error_content h1,
.error_content h2 {
letter-spacing: 0.1rem;
}
.error_content h1 {
font-size: 3rem;
}
.error_content h2 {
font-size: 2rem;
}
.error_content p {
font-size: 1.2rem;
}
.error_content p a,
.error_content p a:visited {
color: var(--color-two);
text-decoration: none;
}
.error_content p a:hover {
color: var(--color-five);
}
```
#### Styles for the previous and next button on the search page
```css
.page_navigation {
padding: 0 0 2rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.page_navigation button {
background: var(--background-color);
color: var(--foreground-color);
padding: 1rem;
border-radius: 0.5rem;
outline: none;
border: none;
}
.page_navigation button:active {
filter: brightness(1.2);
}
```
#### Styles for the about page
This part is only available right now in the **rolling/edge/unstable** version
```css
.about-container article {
font-size: 1.5rem;
color: var(--foreground-color);
padding-bottom: 10px;
}
.about-container article h1 {
color: var(--color-two);
font-size: 2.8rem;
}
.about-container article div {
padding-bottom: 15px;
}
.about-container a {
color: var(--color-three);
}
.about-container article h2 {
color: var(--color-three);
font-size: 1.8rem;
padding-bottom: 10px;
}
.about-container p {
color: var(--foreground-color);
font-size: 1.6rem;
padding-bottom: 10px;
}
.about-container h3 {
font-size: 1.5rem;
}
.about-container {
width: 80%;
}
```
#### Styles for the Settings Page
This part is only available right now in the **rolling/edge/unstable** version
```css
.settings_container {
display: flex;
justify-content: space-around;
width: 80dvw;
margin: 5rem 0;
}
.settings h1 {
color: var(--color-two);
font-size: 2.5rem;
}
.settings > h1 {
margin-bottom: 4rem;
margin-left: 2rem;
}
.settings hr {
border-color: var(--color-three);
margin: 0.3rem 0 1rem;
}
.settings > hr {
margin-left: 2rem;
}
.settings_container .sidebar {
width: 30%;
cursor: pointer;
font-size: 2rem;
display: flex;
flex-direction: column;
margin-right: 0.5rem;
margin-left: -0.7rem;
padding: 0.7rem;
border-radius: 5px;
margin-bottom: 0.5rem;
color: var(--foreground-color);
text-transform: capitalize;
gap: 1.5rem;
}
.settings_container .sidebar .btn {
padding: 2rem;
border-radius: 0.5rem;
outline-offset: 3px;
outline: 2px solid transparent;
}
.settings_container .sidebar .btn:active {
outline: 2px solid var(--color-two);
}
.settings_container .sidebar .btn:not(.active):hover {
color: var(--color-two);
}
.settings_container .sidebar .btn.active {
background-color: var(--color-two);
color: var(--background-color);
}
.settings_container .main_container {
width: 70%;
border-left: 1.5px solid var(--color-three);
padding-left: 3rem;
border: none;
}
.settings_container .tab {
display: none;
}
.settings_container .tab.active {
display: flex;
gap: 1.2rem;
flex-direction: column;
justify-content: space-around;
}
.settings_container button {
margin-top: 1rem;
padding: 1rem 2rem;
font-size: 1.5rem;
background: var(--color-three);
color: var(--background-color);
border-radius: 0.5rem;
border: 2px solid transparent;
font-weight: bold;
transition: all 0.1s ease-out;
cursor: pointer;
box-shadow: 5px 5px;
outline: none;
}
.settings_container button:active {
box-shadow: none;
translate: 5px 5px;
}
.settings_container .main_container .message {
font-size: 1.5rem;
color: var(--foreground-color);
}
.settings_container .tab h3 {
font-size: 2rem;
font-weight: bold;
color: var(--color-four);
margin-top: 1.5rem;
text-transform: capitalize;
}
.settings_container .tab .description {
font-size: 1.5rem;
margin-bottom: 0.5rem;
color: var(--foreground-color);
}
.settings_container .user_interface select,
.settings_container .general select {
margin: 0.7rem 0;
width: 20rem;
background-color: var(--color-one);
color: var(--foreground-color);
padding: 1rem 2rem;
border-radius: 0.5rem;
outline: none;
border: none;
text-transform: capitalize;
}
.settings_container .user_interface option:hover,
.settings_container .general option:hover {
background-color: var(--color-one);
}
.settings_container .engines .engine_selection {
display: flex;
flex-direction: column;
justify-content: center;
padding: 1rem 0;
margin-bottom: 2rem;
gap: 2rem;
}
.settings_container .engines .toggle_btn {
color: var(--foreground-color);
font-size: 1.5rem;
display: flex;
align-items: center;
border-radius: 100px;
gap: 1.5rem;
letter-spacing: 1px;
}
.settings_container .engines hr {
margin: 0;
}
.settings_container .cookies input {
margin: 1rem 0;
}
```
#### Styles for the Toggle Button
This part is only available right now in the **rolling/edge/unstable** version
```css
/* The switch - the box around the slider */
.switch {
position: relative;
display: inline-block;
width: 6rem;
height: 3.4rem;
}
/* Hide default HTML checkbox */
.switch input {
opacity: 0;
width: 0;
height: 0;
}
/* The slider */
.slider {
position: absolute;
cursor: pointer;
inset: 0;
background-color: var(--foreground-color);
transition: 0.2s;
outline-offset: 3px;
outline: 2px solid transparent;
}
.slider:active {
outline: 2px solid var(--foreground-color);
}
.slider::before {
position: absolute;
content: '';
height: 2.6rem;
width: 2.6rem;
left: 0.4rem;
bottom: 0.4rem;
background-color: var(--background-color);
transition: 0.2s;
}
input:checked + .slider {
background-color: var(--color-three);
}
input:focus + .slider {
box-shadow: 0 0 1px var(--color-three);
}
input:checked + .slider::before {
transform: translateX(2.6rem);
}
/* Rounded sliders */
.slider.round {
border-radius: 3.4rem;
}
.slider.round::before {
border-radius: 50%;
}
```
## Animations
### Built-in
By default `websurfx` comes with 1 animation to choose from which can be easily chosen using the config file or via the settings page on the website.
> To how to change animations using the config file. See: [**Configuration**](https://github.com/neon-mmd/websurfx/wiki/configuration)
### Custom
To write custom animation, it requires the user to have some knowledge of `themes` and the `HTML of the page for which the animation is being provided for`.
The animations can be of 2 categories:
- Theme specific animations
- Universal animations
#### Theme Specific Animations
These animations can only be used with a specific theme and should not be used with other themes otherwise it either won't look good or won't work at all or would work partially.
Here is an example of `simple-frosted-glow` animation for the `simple theme` (which we provide by default with the app) which will give you a better idea on how to create a custom animation for a specific theme:
```css
.results_aggregated .result {
margin: 1rem;
padding: 1rem;
border-radius: 1rem;
}
.results_aggregated .result:hover {
box-shadow:
inset 0 0 3rem var(--color-two),
inset 0 0 6rem var(--color-five),
inset 0 0 9rem var(--color-three),
0 0 0.25rem var(--color-two),
0 0 0.5rem var(--color-five),
0 0 0.75rem var(--color-three);
}
```
#### Universal Animations
These animations are independent of the theme being used and can be used with all the themes.
Here is an example of `text-tilt` animation which will give you an idea on how to create universal animations for the search engine website.
```css
.results_aggregated .result:hover {
transform: skewX(10deg);
}
```
> [!Note]
> 1. The above-mentioned examples of animations was covered for the search page of the search engine website. While the same way of creating custom animations can also be done for other pages also.
> 2. While the naming the file for the new theme file. Follow the following naming conventions:
> 1. If the animation is theme specfic then name of the animation file should look like this:
> `<name of the theme which these animation is for><seperated by a hyphen or dash><name of the animation with whitespaces replaced with hyphens>`
> **For example:**
> If the animation to make search results frosty glow on hover was to be created for the `simple` theme then the name of the file would look something like this:
> `simple-frosted-glow`
> Where `simple` is the name of the theme the animation targets and `frosted-glow` is the name of the animation where each word has been seperated by a hyphen.
> 2. If the animation is not theme specfic (univeral theme) then name of the animation file should look like this:
> `<name of the animation with whitespaces replaced with hyphens>`
> **For example:**
> If the animation to make search results text tilt on hover was to be created then the name of the file would look something like this:
> `text-tilt`
> Where `text-tilt` is the name of the animation where each word has been seperated by a hyphen. (While naming the files for these types of themes, You do not need to add a theme name in frontend of the file name.).
[⬅️ Go back to Home](./README.md)

94
flake.lock generated Normal file
View file

@ -0,0 +1,94 @@
{
"nodes": {
"naersk": {
"inputs": {
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1694081375,
"narHash": "sha256-vzJXOUnmkMCm3xw8yfPP5m8kypQ3BhAIRe4RRCWpzy8=",
"owner": "nix-community",
"repo": "naersk",
"rev": "3f976d822b7b37fc6fb8e6f157c2dd05e7e94e89",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "master",
"repo": "naersk",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1695318763,
"narHash": "sha256-FHVPDRP2AfvsxAdc+AsgFJevMz5VBmnZglFUMlxBkcY=",
"path": "/nix/store/p7iz0r8gs6ppkhj83zjmwyd21k8b7v3y-source",
"rev": "e12483116b3b51a185a33a272bf351e357ba9a99",
"type": "path"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1725194671,
"narHash": "sha256-tLGCFEFTB5TaOKkpfw3iYT9dnk4awTP/q4w+ROpMfuw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b833ff01a0d694b910daca6e2ff4a3f26dee478c",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"naersk": "naersk",
"nixpkgs": "nixpkgs_2",
"utils": "utils"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1694529238,
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

63
flake.nix Normal file
View file

@ -0,0 +1,63 @@
{
# Websurfx NixOS flake
inputs = {
naersk.url = "github:nix-community/naersk/master";
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
utils.url = "github:numtide/flake-utils";
};
outputs = {
naersk,
nixpkgs,
self,
utils,
}:
# We do this for all systems - namely x86_64-linux, aarch64-linux,
# x86_64-darwin and aarch64-darwin
utils.lib.eachDefaultSystem (system: let
pkgs = import nixpkgs {inherit system;};
naersk-lib = pkgs.callPackage naersk {};
in rec {
# Build via "nix build .#default"
packages.default = naersk-lib.buildPackage {
# The build dependencies
buildInputs = with pkgs; [pkg-config openssl];
src = ./.;
};
# Enter devshell with all the tools via "nix develop"
# or "nix-shell"
devShells.default = with pkgs;
mkShell {
buildInputs = [
actionlint
cargo
docker
haskellPackages.hadolint
nodejs
nodePackages_latest.cspell
eslint
nodePackages_latest.markdownlint-cli2
nodePackages_latest.stylelint
redis
rustPackages.clippy
rust-analyzer
cargo-watch
rustc
rustfmt
yamllint
openssl
pkg-config
];
RUST_SRC_PATH = rustPlatform.rustLibSrc;
shellHook = ''
export PATH="$PATH:$HOME/.cargo/bin"
export NODE_PATH="$NODE_PATH:./node_modules"
'';
};
# Build via "nix build .#websurfx", which is basically just
# calls the build function
packages.websurfx = packages.default;
});
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
images/websurfx_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
public/images/barricade.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 KiB

1
public/images/close.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>

After

Width:  |  Height:  |  Size: 299 B

BIN
public/images/filter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

1
public/images/info.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke-width="1.5" color="#000" viewBox="0 0 24 24" style="--darkreader-inline-color:#e8e6e3"><path stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 11.5v5M12 7.51l.01-.011M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z" style="--darkreader-inline-stroke:#000000"/></svg>

After

Width:  |  Height:  |  Size: 409 B

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 50 50" width="24px" height="24px"><circle fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" cx="21" cy="20" r="16"/><line fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" x1="32.229" y1="32.229" x2="45.5" y2="45.5"/></svg>

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke-width="1.5" color="#000" viewBox="0 0 24 24" style="--darkreader-inline-color:#e8e6e3"><path stroke="#000" stroke-linecap="round" stroke-width="1.5" d="M20.043 21H3.957c-1.538 0-2.5-1.664-1.734-2.997l8.043-13.988c.77-1.337 2.699-1.337 3.468 0l8.043 13.988C22.543 19.336 21.58 21 20.043 21zM12 9v4" style="--darkreader-inline-stroke:#000000"/><path stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 17.01l.01-.011" style="--darkreader-inline-stroke:#000000"/></svg>

After

Width:  |  Height:  |  Size: 583 B

View file

@ -0,0 +1,15 @@
.results_aggregated .result {
margin: 1rem;
padding: 1rem;
border-radius: 1rem;
}
.results_aggregated .result:hover {
box-shadow:
inset 0 0 3rem var(--color-two),
inset 0 0 6rem var(--color-five),
inset 0 0 9rem var(--color-three),
0 0 0.25rem var(--color-two),
0 0 0.5rem var(--color-five),
0 0 0.75rem var(--color-three);
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #1e1e2e;
--fg: #cdd6f4;
--1: #45475a;
--2: #f38ba8;
--3: #a6e3a1;
--4: #f9e2af;
--5: #89b4fa;
--6: #f5c2e7;
--7: #ffffff;
--background-color: #1e1e2e;
--foreground-color: #cdd6f4;
--logo-color: #f5c2e7;
--color-one: #45475a;
--color-two: #f38ba8;
--color-three: #a6e3a1;
--color-four: #f9e2af;
--color-five: #89b4fa;
--color-six: #f5c2e7;
--color-seven: #fff;
}

View file

@ -0,0 +1,12 @@
:root {
--background-color: #000;
--foreground-color: #fff;
--logo-color: #e0e0e0;
--color-one: #121212;
--color-two: #808080;
--color-three: #999;
--color-four: #666;
--color-five: #bfbfbf;
--color-six: #e0e0e0;
--color-seven: #555;
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #44475a;
--fg: #8be9fd;
--1: #ff5555;
--2: #50fa7b;
--3: #ffb86c;
--4: #bd93f9;
--5: #ff79c6;
--6: #94a3a5;
--7: #ffffff;
--background-color: #44475a;
--foreground-color: #8be9fd;
--logo-color: #ffb86c;
--color-one: #f55;
--color-two: #50fa7b;
--color-three: #ffb86c;
--color-four: #bd93f9;
--color-five: #ff79c6;
--color-six: #94a3a5;
--color-seven: #fff;
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #282828;
--fg: #ebdbb2;
--1: #cc241d;
--2: #98971a;
--3: #d79921;
--4: #458588;
--5: #b16286;
--6: #689d6a;
--7: #ffffff;
--background-color: #1d2021;
--foreground-color: #ebdbb2;
--logo-color: #ebdbb2;
--color-one: #282828;
--color-two: #98971a;
--color-three: #d79921;
--color-four: #458588;
--color-five: #b16286;
--color-six: #689d6a;
--color-seven: #fff;
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #403e41;
--fg: #fcfcfa;
--1: #ff6188;
--2: #a9dc76;
--3: #ffd866;
--4: #fc9867;
--5: #ab9df2;
--6: #78dce8;
--7: #ffffff;
--background-color: #49483Eff;
--foreground-color: #FFB269;
--logo-color: #ffd866;
--color-one: #272822ff;
--color-two: #61AFEF;
--color-three: #ffd866;
--color-four: #fc9867;
--color-five: #ab9df2;
--color-six: #78dce8;
--color-seven: #fff;
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #2e3440;
--fg: #d8dee9;
--1: #3b4252;
--2: #bf616a;
--3: #a3be8c;
--4: #ebcb8b;
--5: #81a1c1;
--6: #b48ead;
--7: #ffffff;
--background-color: #122736ff;
--foreground-color: #a2e2a9;
--logo-color: #e2ecd6;
--color-one: #121B2Cff;
--color-two: #f08282;
--color-three: #ABC5AAff;
--color-four: #e6d2d2;
--color-five: #81a1c1;
--color-six: #e2ecd6;
--color-seven: #fff;
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #1b2b34;
--fg: #d8dee9;
--1: #343d46;
--2: #ec5f67;
--3: #99c794;
--4: #fac863;
--5: #6699cc;
--6: #c594c5;
--7: #ffffff;
--background-color: #1b2b34;
--foreground-color: #d8dee9;
--logo-color: #d8dee9;
--color-one: #343d46;
--color-two: #5FB3B3ff;
--color-three: #69Cf;
--color-four: #99c794;
--color-five: #69c;
--color-six: #c594c5;
--color-seven: #D8DEE9ff;
}

View file

@ -0,0 +1,12 @@
:root {
--background-color: #282c34;
--foreground-color: #abb2bf;
--logo-color: #c8ccd4;
--color-one: #3b4048;
--color-two: #a3be8c;
--color-three: #b48ead;
--color-four: #c8ccd4;
--color-five: #e06c75;
--color-six: #61afef;
--color-seven: #be5046;
}

View file

@ -0,0 +1,12 @@
:root {
--background-color: #faf4ed;
--foreground-color: #575279;
--logo-color: #d7827e;
--color-one: #f2e9e1;
--color-two: #907aa9;
--color-three: #56949f;
--color-four: #ea9d34;
--color-five: #d7827e;
--color-six: #9893a5;
--color-seven: #575279;
}

View file

@ -0,0 +1,12 @@
:root {
--background-color: #232136;
--foreground-color: #e0def4;
--logo-color: #ea9a97;
--color-one: #393552;
--color-two: #c4a7e7;
--color-three: #9ccfd8;
--color-four: #f6c177;
--color-five: #ea9a97;
--color-six: #6e6a86;
--color-seven: #e0def4;
}

View file

@ -0,0 +1,12 @@
:root {
--background-color: #191724;
--foreground-color: #e0def4;
--logo-color: #ebbcba;
--color-one: #26233a;
--color-two: #c4a7e7;
--color-three: #9ccfd8;
--color-four: #f6c177;
--color-five: #eb6f92;
--color-six: #6e6a86;
--color-seven: #e0def4;
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #002b36;
--fg: #839496;
--1: #073642;
--2: #dc322f;
--3: #859900;
--4: #b58900;
--5: #268bd2;
--6: #d33682;
--7: #ffffff;
--background-color: #002b36;
--foreground-color: #c9e0e6;
--logo-color: #EEE8D5ff;
--color-one: #073642;
--color-two: #2AA198ff;
--color-three: #2AA198ff;
--color-four: #EEE8D5ff;
--color-five: #268bd2;
--color-six: #d33682;
--color-seven: #fff;
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #fdf6e3;
--fg: #657b83;
--1: #073642;
--2: #dc322f;
--3: #859900;
--4: #b58900;
--5: #268bd2;
--6: #d33682;
--7: #ffffff;
--background-color: #EEE8D5ff;
--foreground-color: #b1ab97;
--logo-color: #586E75;
--color-one: #fdf6e3;
--color-two: #DC322Fff;
--color-three: #586E75ff;
--color-four: #b58900;
--color-five: #268bd2;
--color-six: #d33682;
--color-seven: #fff;
}

View file

@ -0,0 +1,12 @@
:root {
--background-color: #1a1b26;
--foreground-color: #c0caf5;
--logo-color: #e2afff;
--color-one: #32364a;
--color-two: #a9b1d6;
--color-three: #5a5bb8;
--color-four: #6b7089;
--color-five: #e2afff;
--color-six: #a9a1e1;
--color-seven: #988bc7;
}

View file

@ -1,11 +1,12 @@
:root {
--bg: #1d1f21;
--fg: #c5c8c6;
--1: #cc6666;
--2: #b5bd68;
--3: #f0c674;
--4: #81a2be;
--5: #b294bb;
--6: #8abeb7;
--7: #ffffff;
--background-color: #35383Cff;
--foreground-color: #D7DAD8ff;
--logo-color: #D7DAD8ff;
--color-one: #1d1f21;
--color-two: #D77C79ff;
--color-three: #f0c674;
--color-four: #92B2CAff;
--color-five: #C0A7C7ff;
--color-six: #9AC9C4ff;
--color-seven: #fff;
}

94
public/static/cookies.js Normal file
View file

@ -0,0 +1,94 @@
/**
* This functions gets the saved cookies if it is present on the user's machine If it
* is available then it is parsed and converted to an object which is then used to
* retrieve the preferences that the user had selected previously and is then loaded
* and used for displaying the user provided settings by setting them as the selected
* options in the settings page.
*
* @function
* @param {string} cookie - It takes the client settings cookie as a string.
* @returns {void}
*/
function setClientSettingsOnPage(cookie) {
let cookie_value = cookie
.split(';')
.map((item) => item.split('='))
.reduce((acc, [_, v]) => (acc = JSON.parse(v)) && acc, {})
// Loop through all select tags and add their values to the cookie dictionary
document.querySelectorAll('select').forEach((select_tag) => {
switch (select_tag.name) {
case 'themes':
select_tag.value = cookie_value['theme']
break
case 'colorschemes':
select_tag.value = cookie_value['colorscheme']
break
case 'animations':
select_tag.value = cookie_value['animation']
break
case 'safe_search_levels':
select_tag.value = cookie_value['safe_search_level']
break
}
})
let engines = document.querySelectorAll('.engine')
let engines_cookie = cookie_value['engines']
if (engines_cookie.length === engines.length) {
document.querySelector('.select_all').checked = true
engines.forEach((engine_checkbox) => {
engine_checkbox.checked = true
})
} else {
engines.forEach((engines_checkbox) => {
engines_checkbox.checked = false
})
engines_cookie.forEach((engine_name) => {
engines.forEach((engine_checkbox) => {
if (
engine_checkbox.parentNode.parentNode.innerText.trim() ===
engine_name.trim()
) {
engine_checkbox.checked = true
}
})
})
}
}
/**
* This function is executed when any page on the website finishes loading and
* this function retrieves the cookies if it is present on the user's machine.
* If it is available then the saved cookies is display in the cookies tab
* otherwise an appropriate message is displayed if it is not available.
*
* @function
* @listens DOMContentLoaded
* @returns {void}
*/
document.addEventListener(
'DOMContentLoaded',
() => {
try {
// Decode the cookie value
let cookie = decodeURIComponent(document.cookie)
// Set the value of the input field to the decoded cookie value if it is not empty
// Otherwise, display a message indicating that no cookies have been saved on the user's system
if (cookie.length) {
document.querySelector('.cookies input').value = cookie
// This function displays the user provided settings on the settings page.
setClientSettingsOnPage(cookie)
} else {
document.querySelector('.cookies input').value =
'No cookies have been saved on your system'
}
} catch (error) {
// If there is an error decoding the cookie, log the error to the console
// and display an error message in the input field
console.error('Error decoding cookie:', error)
document.querySelector('.cookies input').value = 'Error decoding cookie'
}
},
false,
)

View file

@ -0,0 +1,7 @@
/**
* This function provides the ability for the button to toggle the dropdown error-box
* in the search page.
*/
function toggleErrorBox() {
document.querySelector('.dropdown_error_box').classList.toggle('show')
}

View file

@ -1,10 +1,6 @@
let search_box = document.querySelector('input')
function search_web() {
window.location = `search?q=${search_box.value}`
/**
* A function that clears the search input text when the clear button is clicked.
*/
function clearSearchText() {
document.querySelector('.search_bar > input').value = ''
}
search_box.addEventListener('keyup', (e) => {
if (e.keyCode === 13) {
search_web()
}
})

View file

@ -1,26 +0,0 @@
function navigate_forward() {
const url = new URL(window.location)
const searchParams = url.searchParams
let q = searchParams.get('q')
let page = searchParams.get('page')
if (page === null) {
page = 2
window.location = `${url.origin}${url.pathname}?q=${q}&page=${page}`
} else {
window.location = `${url.origin}${url.pathname}?q=${q}&page=${++page}`
}
}
function navigate_backward() {
const url = new URL(window.location)
const searchParams = url.searchParams
let q = searchParams.get('q')
let page = searchParams.get('page')
if (page !== null && page > 1) {
window.location = `${url.origin}${url.pathname}?q=${q}&page=${--page}`
}
}

155
public/static/settings.js Normal file
View file

@ -0,0 +1,155 @@
/**
* This function handles the toggling of selections of all upstream search engines
* options in the settings page under the tab engines.
*/
function toggleAllSelection() {
document
.querySelectorAll('.engine')
.forEach(
(engine_checkbox) =>
(engine_checkbox.checked =
document.querySelector('.select_all').checked),
)
}
/**
* This function adds the functionality to sidebar buttons to only show settings
* related to that tab.
* @param {HTMLElement} current_tab - The current tab that was clicked.
*/
function setActiveTab(current_tab) {
// Remove the active class from all tabs and buttons
document
.querySelectorAll('.tab')
.forEach((tab) => tab.classList.remove('active'))
document
.querySelectorAll('.btn')
.forEach((tab) => tab.classList.remove('active'))
// Add the active class to the current tab and its corresponding settings
current_tab.classList.add('active')
document
.querySelector(`.${current_tab.innerText.toLowerCase().replace(' ', '_')}`)
.classList.add('active')
}
/**
* This function adds the functionality to save all the user selected preferences
* to be saved in a cookie on the users machine.
*/
function setClientSettings() {
// Create an object to store the user's preferences
let cookie_dictionary = new Object()
// Loop through all select tags and add their values to the cookie dictionary
document.querySelectorAll('select').forEach((select_tag) => {
switch (select_tag.name) {
case 'themes':
cookie_dictionary['theme'] = select_tag.value
break
case 'colorschemes':
cookie_dictionary['colorscheme'] = select_tag.value
break
case 'animations':
cookie_dictionary['animation'] = select_tag.value || null
break
case 'safe_search_levels':
cookie_dictionary['safe_search_level'] = Number(select_tag.value)
break
}
})
// Loop through all engine checkboxes and add their values to the cookie dictionary
let engines = []
document.querySelectorAll('.engine').forEach((engine_checkbox) => {
if (engine_checkbox.checked) {
engines.push(engine_checkbox.parentNode.parentNode.innerText.trim())
}
})
cookie_dictionary['engines'] = engines
// Set the expiration date for the cookie to 1 year from the current date
let expiration_date = new Date()
expiration_date.setFullYear(expiration_date.getFullYear() + 1)
// Save the cookie to the user's machine
document.cookie = `appCookie=${JSON.stringify(
cookie_dictionary,
)}; expires=${expiration_date.toUTCString()}`
// Display a success message to the user
document.querySelector('.message').innerText =
'✅ The settings have been saved sucessfully!!'
// Clear the success message after 10 seconds
setTimeout(() => {
document.querySelector('.message').innerText = ''
}, 10000)
}
/**
* This functions gets the saved cookies if it is present on the user's machine If it
* is available then it is parsed and converted to an object which is then used to
* retrieve the preferences that the user had selected previously and is then loaded in the
* website otherwise the function does nothing and the default server side settings are loaded.
*/
function getClientSettings() {
// Get the appCookie from the user's machine
let cookie = decodeURIComponent(document.cookie)
// If the cookie is not empty, parse it and use it to set the user's preferences
if (cookie.length) {
let cookie_value = cookie
.split(';')
.map((item) => item.split('='))
.reduce((acc, [_, v]) => (acc = JSON.parse(v)) && acc, {})
let links = Array.from(document.querySelectorAll('link'))
// A check to determine whether the animation link exists under the head tag or not.
// If it does not exists then create and add a new animation link under the head tag
// and update the other link tags href according to the settings provided by the user
// via the UI. On the other hand if it does exist then just update all the link tags
// href according to the settings provided by the user via the UI.
if (!links.some((item) => item.href.includes('static/animations'))) {
if (cookie_value['animation']) {
let animation_link = document.createElement('link')
animation_link.href = `static/animations/${cookie_value['animation']}.css`
animation_link.rel = 'stylesheet'
animation_link.type = 'text/css'
document.querySelector('head').appendChild(animation_link)
}
// Loop through all link tags and update their href values to match the user's preferences
links.forEach((item) => {
if (item.href.includes('static/themes')) {
item.href = `static/themes/${cookie_value['theme']}.css`
} else if (item.href.includes('static/colorschemes')) {
item.href = `static/colorschemes/${cookie_value['colorscheme']}.css`
}
})
} else {
// Loop through all link tags and update their href values to match the user's preferences
links.forEach((item) => {
if (item.href.includes('static/themes')) {
item.href = `static/themes/${cookie_value['theme']}.css`
} else if (item.href.includes('static/colorschemes')) {
item.href = `static/colorschemes/${cookie_value['colorscheme']}.css`
} else if (
item.href.includes('static/animations') &&
cookie_value['animation']
) {
item.href = `static/colorschemes/${cookie_value['animation']}.css`
}
})
if (!cookie_value['animation']) {
document
.querySelector('head')
.removeChild(
links.filter((item) => item.href.includes('static/animations')),
)
}
}
}
}

View file

@ -1,4 +1,13 @@
/* @import url('./catppuccin-mocha.css'); */
@font-face {
font-family: Rubik;
font-style: normal;
font-weight: 200 600;
font-stretch: 0% 200%;
font-display: swap;
src: url('https://fonts.gstatic.com/s/rubik/v28/iJWKBXyIfDnIV7nErXyi0A.woff2')
format('woff2');
}
* {
padding: 0;
@ -15,8 +24,14 @@ body {
flex-direction: column;
justify-content: space-between;
align-items: center;
height: 100vh;
background: var(--1);
min-height: 100vh;
font-family: Rubik, sans-serif;
background-color: var(--background-color);
}
/* enforce font for buttons */
button {
font-family: Rubik, sans-serif;
}
/* styles for the index page */
@ -29,6 +44,10 @@ body {
align-items: center;
}
.search-container svg {
color: var(--logo-color);
}
.search-container div {
display: flex;
}
@ -37,32 +56,66 @@ body {
.search_bar {
display: flex;
gap: 10px;
align-items: center;
}
.search_bar input {
padding: 1rem;
border-radius: 6px;
padding: 2.6rem 2.2rem;
width: 50rem;
height: 3rem;
outline: none;
border: none;
box-shadow: rgba(0, 0, 0, 1);
background: var(--fg);
box-shadow: rgb(0 0 0 / 1);
background-color: var(--color-one);
color: var(--foreground-color);
outline-offset: 3px;
font-size: 1.6rem;
}
.search_bar input::-webkit-search-results-button,
.search_bar input::-webkit-search-cancel-button{
display: none;
}
.search_bar input:focus {
outline: 2px solid var(--foreground-color);
}
.search_bar input::placeholder {
color: var(--foreground-color);
opacity: 1;
}
.search_bar button {
padding: 1rem;
border-radius: 0;
padding: 2.6rem 3.2rem;
border-radius: 6px;
height: 3rem;
display: flex;
justify-content: center;
align-items: center;
outline: none;
outline-offset: 3px;
outline: 2px solid transparent;
border: none;
transition: 0.1s;
gap: 0;
background: var(--bg);
color: var(--3);
background-color: var(--color-six);
color: var(--background-color);
font-weight: 600;
letter-spacing: 0.1rem;
position: relative;
}
.search_bar button img {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.search_bar button:active {
outline: 2px solid var(--color-three);
}
.search_bar button:active,
@ -70,15 +123,162 @@ body {
filter: brightness(1.2);
}
.search_area .search_options {
display: flex;
justify-content: space-between;
align-items: center;
}
.search_area .search_options select {
margin: 0.7rem 0;
width: 20rem;
background-color: var(--color-one);
color: var(--foreground-color);
padding: 1.2rem 2rem;
border-radius: 0.5rem;
outline-offset: 3px;
outline: 2px solid transparent;
border: none;
text-transform: capitalize;
}
.search_area .search_options select:active,
.search_area .search_options select:hover {
outline: 2px solid var(--color-three);
}
.search_area .search_options option:hover {
background-color: var(--color-one);
}
.result_not_found {
display: flex;
flex-direction: column;
font-size: 1.5rem;
color: var(--foreground-color);
}
.result_not_found p {
margin: 1rem 0;
}
.result_not_found ul {
margin: 1rem 0;
}
.result_not_found img {
width: 40rem;
}
/* styles for the error box */
.error_box .error_box_toggle_button {
background: var(--foreground-color);
}
.error_box .dropdown_error_box {
position: absolute;
display: none;
flex-direction: column;
background: var(--background-color);
border-radius: 0;
margin-left: 2rem;
min-height: 20rem;
min-width: 22rem;
}
.error_box .dropdown_error_box.show {
display: flex;
}
.error_box .dropdown_error_box .error_item,
.error_box .dropdown_error_box .no_errors {
display: flex;
align-items: center;
color: var(--foreground-color);
letter-spacing: 0.1rem;
padding: 1rem;
font-size: 1.2rem;
}
.error_box .dropdown_error_box .error_item {
justify-content: space-between;
}
.error_box .dropdown_error_box .no_errors {
min-height: 18rem;
justify-content: center;
}
.error_box .dropdown_error_box .error_item:hover {
box-shadow: inset 0 0 100px 100px rgb(255 255 255 / 0.1);
}
.error_box .error_item .severity_color {
width: 1.2rem;
height: 1.2rem;
}
.results .result_disallowed,
.results .result_filtered,
.results .result_engine_not_selected {
display: flex;
justify-content: center;
align-items: center;
gap: 10rem;
font-size: 2rem;
color: var(--foreground-color);
margin: 0 7rem;
}
.results .result_disallowed .user_query,
.results .result_filtered .user_query,
.results .result_engine_not_selected .user_query {
color: var(--background-color);
font-weight: 300;
}
.results .result_disallowed img,
.results .result_filtered img,
.results .result_engine_not_selected img {
width: 30rem;
}
.results .result_disallowed div,
.results .result_filtered div,
.results .result_engine_not_selected div {
display: flex;
flex-direction: column;
gap: 1rem;
line-break: strict;
}
/* styles for the footer and header */
header {
background: var(--bg);
width: 100%;
background: var(--background-color);
display: flex;
justify-content: right;
align-items: center;
padding: 1rem;
justify-content: space-between;
padding: 2rem 3rem;
}
footer {
width: 100%;
background: var(--background-color);
display: flex;
align-items: center;
padding: 1.7rem 1.7rem 4rem;
gap: 1.8rem;
flex-direction: column;
justify-content: center;
}
header h1 a {
text-transform: capitalize;
text-decoration: none;
color: var(--foreground-color);
letter-spacing: 0.1rem;
}
header ul,
@ -96,7 +296,7 @@ footer ul li a,
header ul li a:visited,
footer ul li a:visited {
text-decoration: none;
color: var(--2);
color: var(--color-two);
text-transform: capitalize;
letter-spacing: 0.1rem;
}
@ -107,12 +307,12 @@ header ul li a {
header ul li a:hover,
footer ul li a:hover {
color: var(--5);
color: var(--color-five);
}
footer div span {
font-size: 1.5rem;
color: var(--4);
color: var(--color-four);
}
footer div {
@ -120,16 +320,6 @@ footer div {
gap: 1rem;
}
footer {
background: var(--bg);
width: 100%;
padding: 1rem;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
/* Styles for the search page */
.results {
@ -137,6 +327,11 @@ footer {
display: flex;
flex-direction: column;
justify-content: space-around;
gap: 1rem;
}
.result {
gap: 1rem;
}
.results .search_bar {
@ -148,6 +343,7 @@ footer {
flex-direction: column;
justify-content: space-between;
margin: 2rem 0;
content-visibility: auto;
}
.results_aggregated .result {
@ -157,30 +353,31 @@ footer {
}
.results_aggregated .result h1 a {
font-size: 1.5rem;
color: var(--2);
font-size: 1.7rem;
font-weight: normal;
color: var(--color-two);
text-decoration: none;
letter-spacing: 0.1rem;
}
.results_aggregated .result h1 a:hover {
color: var(--5);
color: var(--color-five);
}
.results_aggregated .result h1 a:visited {
color: var(--bg);
color: var(--color-five);
}
.results_aggregated .result small {
color: var(--3);
font-size: 1.1rem;
color: var(--color-three);
font-size: 1.3rem;
word-wrap: break-word;
line-break: anywhere;
}
.results_aggregated .result p {
color: var(--fg);
font-size: 1.2rem;
color: var(--foreground-color);
font-size: 1.4rem;
line-height: 2.4rem;
margin-top: 0.3rem;
word-wrap: break-word;
line-break: anywhere;
@ -190,7 +387,10 @@ footer {
text-align: right;
font-size: 1.2rem;
padding: 1rem;
color: var(--5);
color: var(--color-five);
display: flex;
gap: 1rem;
justify-content: right;
}
/* Styles for the 404 page */
@ -233,67 +433,468 @@ footer {
.error_content p a,
.error_content p a:visited {
color: var(--2);
color: var(--color-two);
text-decoration: none;
}
.error_content p a:hover {
color: var(--5);
color: var(--color-five);
}
.page_navigation {
padding: 0 0 2rem 0;
padding: 0 0 2rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.page_navigation button {
background: var(--bg);
color: var(--fg);
.page_navigation a {
background: var(--background-color);
color: var(--foreground-color);
padding: 1rem;
border-radius: 0.5rem;
outline: none;
border: none;
}
.page_navigation button:active {
.page_navigation a:active {
filter: brightness(1.2);
}
/* Styles for the about page */
.about-container article{
font-size: 1.5rem;
color:var(--fg);
padding-bottom: 10px;
}
.about-container article {
font-size: 1.5rem;
color: var(--foreground-color);
padding-bottom: 10px;
max-width: 1100px;
margin: 14rem auto;
display: flex;
flex-direction: column;
row-gap: 100px;
}
.about-container article h1{
color: var(--2);
font-size: 2.8rem;
}
.about-container article h1 {
color: var(--color-two);
font-size: 4.5rem;
}
.about-container article div{
padding-bottom: 15px;
}
.about-container article .logo-container {
display: flex;
align-items: center;
justify-content: center;
}
.about-container a{
color:var(--3);
.about-container article .logo-container svg {
width: clamp(200px, 530px, 815px);
color: var(--logo-color);
}
.about-container article .text-block {
box-shadow: 0 0 0 100vmax var(--foreground-color);
background-color: var(--foreground-color);
clip-path: inset(0 -100vmax);
padding: 90px 0;
display: flex;
gap: 40px;
align-items: center;
justify-content: center;
flex-direction: column;
text-align: center;
color: var(--background-color);
}
.about-container article .text-block .text-block-title {
font-size: 64px;
font-weight: 500;
}
.hero-text-container {
width: 860px;
}
.hero-text {
font-size: 45px;
font-weight: 200;
}
.about-container a {
color: var(--color-three);
}
.about-container {
width: 80%;
margin-bottom: 140px;
}
.feature-list {
padding: 35px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
row-gap: 60px;
}
.feature-list-title {
text-align: center;
font-size: 64px;
font-weight: 500;
}
.features {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 40px;
}
.feature-card {
background-color: var(--foreground-color);
color: var(--background-color);
text-align: center;
display: flex;
padding: 30px;
border-radius: 24px;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 15px;
}
.feature-card-header {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
row-gap: 15px;
}
.feature-card-header h4 {
font-size: 33px;
font-weight: 500;
}
.feature-card-body p {
font-size: 20px;
font-weight: 200;
}
.about-footnote {
font-size: 24px;
text-align: center;
color: var(--foreground-color);
}
/* Styles for the settings page */
.settings_container {
display: flex;
justify-content: space-around;
width: 80dvw;
margin: 5rem 0;
}
.settings h1 {
color: var(--color-two);
font-size: 2.5rem;
}
.settings > h1 {
margin-bottom: 4rem;
margin-left: 2rem;
}
.settings hr {
border-color: var(--color-three);
margin: 0.3rem 0 1rem;
}
.settings > hr {
margin-left: 2rem;
}
.settings_container .sidebar {
width: 30%;
cursor: pointer;
font-size: 2rem;
display: flex;
flex-direction: column;
margin-right: 0.5rem;
margin-left: -0.7rem;
padding: 0.7rem;
border-radius: 5px;
margin-bottom: 0.5rem;
color: var(--foreground-color);
text-transform: capitalize;
gap: 1.5rem;
}
.settings_container .sidebar .btn {
padding: 2rem;
border-radius: 0.5rem;
outline-offset: 3px;
outline: 2px solid transparent;
}
.settings_container .sidebar .btn:active {
outline: 2px solid var(--color-two);
}
.settings_container .sidebar .btn:not(.active):hover {
color: var(--color-two);
}
.settings_container .sidebar .btn.active {
background-color: var(--color-two);
color: var(--background-color);
}
.settings_container .main_container {
width: 70%;
border-left: 1.5px solid var(--color-three);
padding-left: 3rem;
border: none;
}
.settings_container .tab {
display: none;
}
.settings_container .tab.active {
display: flex;
gap: 1.2rem;
flex-direction: column;
justify-content: space-around;
}
.settings_container button {
margin-top: 1rem;
padding: 1rem 2rem;
font-size: 1.5rem;
background: var(--color-three);
color: var(--background-color);
border-radius: 0.5rem;
border: 2px solid transparent;
font-weight: bold;
transition: all 0.1s ease-out;
cursor: pointer;
box-shadow: 5px 5px;
outline: none;
}
.settings_container button:active {
box-shadow: none;
translate: 5px 5px;
}
.settings_container .main_container .message {
font-size: 1.5rem;
color: var(--foreground-color);
}
.settings_container .tab h3 {
font-size: 2rem;
font-weight: bold;
color: var(--color-four);
margin-top: 1.5rem;
text-transform: capitalize;
}
.settings_container .tab .description,
.settings_container .tab .admin_warning {
font-size: 1.5rem;
margin-bottom: 0.5rem;
}
.settings_container .tab .description {
color: var(--foreground-color);
}
.settings_container .tab .admin_warning {
color: var(--color-two);
}
.settings_container .user_interface select,
.settings_container .general select,
.settings_container .general form input {
margin: 0.7rem 0;
width: 20rem;
background-color: var(--color-one);
color: var(--foreground-color);
padding: 1rem 2rem;
border-radius: 0.5rem;
outline: none;
border: none;
text-transform: capitalize;
}
.settings_container .general form input {
padding: 0;
width: 30rem;
text-align: center;
text-transform: none;
}
.settings_container .general form input::file-selector-button {
content: 'Browse';
padding: 1rem 2rem;
font-size: 1.5rem;
background: var(--color-three);
color: var(--background-color);
border-radius: 0.5rem;
border: 2px solid transparent;
font-weight: bold;
transition: all 0.1s ease-out;
cursor: pointer;
box-shadow: 5px 5px;
outline: none;
translate: -1rem 0;
}
.settings_container .general form input::file-selector-button:active {
box-shadow: none;
translate: 5px 5px;
}
.settings_container .general .export_btn {
margin-bottom: 1rem;
}
.settings_container .user_interface option:hover,
.settings_container .general option:hover {
background-color: var(--color-one);
}
.settings_container .engines .engine_selection {
display: flex;
flex-direction: column;
justify-content: center;
padding: 1rem 0;
margin-bottom: 2rem;
gap: 2rem;
}
.settings_container .engines .toggle_btn {
color: var(--foreground-color);
font-size: 1.5rem;
display: flex;
align-items: center;
border-radius: 100px;
gap: 1.5rem;
letter-spacing: 1px;
}
.settings_container .engines hr {
margin: 0;
}
.settings_container .cookies input {
margin: 1rem 0;
}
/* Styles for the toggle button */
/* The switch - the box around the slider */
.switch {
position: relative;
display: inline-block;
width: 6rem;
height: 3.4rem;
}
/* Hide default HTML checkbox */
.switch input {
opacity: 0;
width: 0;
height: 0;
}
/* The slider */
.slider {
position: absolute;
cursor: pointer;
inset: 0;
background-color: var(--foreground-color);
transition: 0.2s;
outline-offset: 3px;
outline: 2px solid transparent;
}
.slider:active {
outline: 2px solid var(--foreground-color);
}
.slider::before {
position: absolute;
content: '';
height: 2.6rem;
width: 2.6rem;
left: 0.4rem;
bottom: 0.4rem;
background-color: var(--background-color);
transition: 0.2s;
}
input:checked + .slider {
background-color: var(--color-three);
}
input:focus + .slider {
box-shadow: 0 0 1px var(--color-three);
}
input:checked + .slider::before {
transform: translateX(2.6rem);
}
/* Rounded sliders */
.slider.round {
border-radius: 3.4rem;
}
.slider.round::before {
border-radius: 50%;
}
@media screen and (width <=1136px) {
.hero-text-container {
width: unset;
}
.about-container article h2{
color: var(--3);
font-size: 1.8rem;
padding-bottom: 10px;
.features {
grid-template-columns: repeat(2, 1fr);
}
}
@media screen and (width <=706px) {
.about-container article .logo-container svg {
width: clamp(200px, 290px, 815px);
}
.about-container p{
color:var(--fg);
font-size: 1.6rem;
padding-bottom: 10px;
.about-container article .text-block .text-block-title {
font-size: 33px;
}
.about-container h3{
font-size: 1.5rem;
.hero-text {
font-size: 22px;
}
.about-container {
width: unset;
}
.feature-list-title {
font-size: 33px;
}
.features {
grid-template-columns: 1fr;
}
.feature-list {
padding: 35px 0;
}
.feature-card {
border-radius: 0;
}
}

View file

@ -1,10 +0,0 @@
{{>header this}}
<main class="error_container">
<img src="images/robot-404.svg" alt="Image of broken robot." />
<div class="error_content">
<h1>Aw! snap</h1>
<h2>404 Page Not Found!</h2>
<p>Go to <a href="/">search page</a></p>
</div>
</main>
{{>footer}}

View file

@ -1,29 +0,0 @@
{{>header this}}
<main class="about-container">
<article >
<div>
<h1 >Websurfx</h1>
<hr size="4" width="100%" color="#a6e3a1">
</div>
<p>A modern-looking, lightning-fast, privacy-respecting, secure meta search engine written in Rust. It provides a fast and secure search experience while respecting user privacy.<br> It aggregates results from multiple search engines and presents them in an unbiased manner, filtering out trackers and ads.
</p>
<h2>Some of the Top Features:</h2>
<ul><strong>Lightning fast </strong>- Results load within milliseconds for an instant search experience.</ul>
<ul><strong>Secure search</strong> - All searches are performed over an encrypted connection to prevent snooping.</ul>
<ul><strong>Ad free results</strong> - All search results are ad free and clutter free for a clean search experience.</ul>
<ul><strong>Privacy focused</strong> - Websurface does not track, store or sell your search data. Your privacy is our priority.</ul>
<ul><strong>Free and Open source</strong> - The entire project's code is open source and available for free on <a href="https://github.com/neon-mmd/websurfx">GitHub</a> under an GNU Affero General Public License.</ul>
<ul><strong>Highly customizable</strong> - Websurface comes with 9 built-in color themes and supports creating custom themes effortlessly.</ul>
</article>
<h3>Devoloped by: <a href="https://github.com/neon-mmd/websurfx">Websurfx team</a></h3>
</main>
{{>footer}}

View file

@ -1,15 +0,0 @@
<footer>
<div>
<span>Powered By <b>Websurfx</b></span><span>-</span><span>a lightening fast, privacy respecting, secure meta
search engine</span>
</div>
<div>
<ul>
<li><a href="#">Source Code</a></li>
<li><a href="#">Issues/Bugs</a></li>
</ul>
</div>
</footer>
</body>
</html>

View file

@ -1,12 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Websurfx</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="static/colorschemes/{{colorscheme}}.css" rel="stylesheet" type="text/css" />
<link href="static/themes/{{theme}}.css" rel="stylesheet" type="text/css" />
</head>
<body>
<header>{{>navbar}}</header>

View file

@ -1,7 +0,0 @@
{{>header this}}
<main class="search-container">
<img src="images/fps_logo.png" alt="Websurfx meta-search engine logo" />
{{>search_bar}}
</main>
<script src="static/index.js"></script>
{{>footer}}

View file

@ -1,6 +0,0 @@
<nav>
<ul>
<li><a href="about">about</a></li>
<li><a href="settings">settings</a></li>
</ul>
</nav>

View file

@ -1,25 +0,0 @@
{{>header this.style}}
<main class="results">
{{>search_bar}}
<div class="results_aggregated">
{{#each results}}
<div class="result">
<h1><a href="{{this.visitingUrl}}">{{{this.title}}}</a></h1>
<small>{{this.url}}</small>
<p>{{{this.description}}}</p>
<div class="upstream_engines">
{{#each engine}}
<span>{{this}}</span>
{{/each}}
</div>
</div>
{{/each}}
</div>
<div class="page_navigation">
<button type="button" onclick="navigate_backward()">&#8592; previous</button>
<button type="button" onclick="navigate_forward()">next &#8594;</button>
</div>
</main>
<script src="static/index.js"></script>
<script src="static/pagination.js"></script>
{{>footer}}

View file

@ -1,9 +0,0 @@
<div class="search_bar">
<input
type="search"
name="search-box"
value="{{this.pageQuery}}"
placeholder="Type to search"
/>
<button type="submit" onclick="search_web()">search</button>
</div>

View file

@ -1,5 +0,0 @@
{{>header this}}
<main class="settings">
<h1>Page is under construction</h1>
</main>
{{>footer}}

View file

@ -2,11 +2,23 @@
//!
//! This module contains the main function which handles the logging of the application to the
//! stdout and handles the command line arguments provided and launches the `websurfx` server.
#[cfg(not(feature = "dhat-heap"))]
use mimalloc::MiMalloc;
use std::net::TcpListener;
use std::{net::TcpListener, sync::OnceLock};
use websurfx::{cache::cacher::create_cache, config::parser::Config, run};
use env_logger::Env;
use websurfx::{config_parser::parser::Config, run};
/// A dhat heap memory profiler
#[cfg(feature = "dhat-heap")]
#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;
#[cfg(not(feature = "dhat-heap"))]
#[global_allocator]
static GLOBAL: MiMalloc = MiMalloc;
/// A static constant for holding the parsed config.
static CONFIG: OnceLock<Config> = OnceLock::new();
/// The function that launches the main server and registers all the routes of the website.
///
@ -16,15 +28,27 @@ use websurfx::{config_parser::parser::Config, run};
/// available for being used for other applications.
#[actix_web::main]
async fn main() -> std::io::Result<()> {
// Initialize the parsed config file.
let config = Config::parse().unwrap();
// A dhat heap profiler initialization.
#[cfg(feature = "dhat-heap")]
let _profiler = dhat::Profiler::new_heap();
// Initializing logging middleware with level set to default or info.
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
// Initialize the parsed config globally.
let config = CONFIG.get_or_init(|| Config::parse(false).unwrap());
log::info!("started server on port {}", config.port);
let cache = create_cache(config).await;
let listener = TcpListener::bind((config.binding_ip_addr.clone(), config.port))?;
log::info!(
"started server on port {} and IP {}",
config.port,
config.binding_ip
);
log::info!(
"Open http://{}:{}/ in your browser",
config.binding_ip,
config.port,
);
run(listener, config)?.await
let listener = TcpListener::bind((config.binding_ip.as_str(), config.port))?;
run(listener, config, cache)?.await
}

615
src/cache/cacher.rs vendored
View file

@ -1,74 +1,597 @@
//! This module provides the functionality to cache the aggregated results fetched and aggregated
//! from the upstream search engines in a json format.
use md5::compute;
use redis::{Client, Commands, Connection};
use error_stack::Report;
use futures::future::join_all;
#[cfg(feature = "memory-cache")]
use moka::future::Cache as MokaCache;
/// A named struct which stores the redis Connection url address to which the client will
/// connect to.
///
/// # Fields
///
/// * `redis_connection_url` - It stores the redis Connection url address.
pub struct RedisCache {
connection: Connection,
}
#[cfg(feature = "memory-cache")]
use std::time::Duration;
use tokio::sync::Mutex;
impl RedisCache {
/// Constructs a new `SearchResult` with the given arguments needed for the struct.
use crate::{config::parser::Config, models::aggregation_models::SearchResults};
use super::error::CacheError;
#[cfg(feature = "redis-cache")]
use super::redis_cacher::RedisCache;
#[cfg(any(feature = "encrypt-cache-results", feature = "cec-cache-results"))]
use super::encryption::*;
/// Abstraction trait for common methods provided by a cache backend.
#[async_trait::async_trait]
pub trait Cacher: Send + Sync {
// A function that builds the cache from the given configuration.
///
/// # Arguments
///
/// * `redis_connection_url` - It stores the redis Connection url address.
pub fn new(redis_connection_url: String) -> Result<Self, Box<dyn std::error::Error>> {
let client = Client::open(redis_connection_url)?;
let connection = client.get_connection()?;
let redis_cache = RedisCache { connection };
Ok(redis_cache)
}
/// * `config` - It takes the config struct as an argument.
///
/// # Returns
///
/// It returns a newly initialized backend based on the feature enabled by the user.
async fn build(config: &Config) -> Self
where
Self: Sized;
/// A function which fetches the cached json results as json string.
///
/// # Arguments
///
/// * `url` - It takes an url as a string.
///
/// # Error
///
/// Returns the `SearchResults` from the cache if the program executes normally otherwise
/// returns a `CacheError` if the results cannot be retrieved from the cache.
async fn cached_results(&mut self, url: &str) -> Result<SearchResults, Report<CacheError>>;
/// A function which caches the results by using the `url` as the key and
/// `json results` as the value and stores it in the cache
///
/// # Arguments
///
/// * `json_results` - It takes the json results string as an argument.
/// * `url` - It takes the url as a String.
///
/// # Error
///
/// Returns a unit type if the program caches the given search results without a failure
/// otherwise it returns a `CacheError` if the search results cannot be cached due to a
/// failure.
async fn cache_results(
&mut self,
search_results: &[SearchResults],
urls: &[String],
) -> Result<(), Report<CacheError>>;
/// A helper function which computes the hash of the url and formats and returns it as string.
///
/// # Arguments
///
/// * `url` - It takes an url as string.
fn compute_url_hash(url: &str) -> String {
format!("{:?}", compute(url))
fn hash_url(&self, url: &str) -> String {
blake3::hash(url.as_bytes()).to_string()
}
/// A function which fetches the cached json results as json string from the redis server.
/// A helper function that returns either encrypted or decrypted results.
/// Feature flags (**encrypt-cache-results or cec-cache-results**) are required for this to work.
///
/// # Arguments
///
/// * `url` - It takes an url as a string.
pub fn cached_results_json(&mut self, url: &str) -> Result<String, Box<dyn std::error::Error>> {
let hashed_url_string = Self::compute_url_hash(url);
Ok(self.connection.get(hashed_url_string)?)
}
/// * `bytes` - It takes a slice of bytes as an argument.
/// * `encrypt` - A boolean to choose whether to encrypt or decrypt the bytes
/// A function which caches the results by using the hashed `url` as the key and
/// `json results` as the value and stores it in redis server with ttl(time to live)
/// set to 60 seconds.
///
/// # Arguments
///
/// * `json_results` - It takes the json results string as an argument.
/// * `url` - It takes the url as a String.
pub fn cache_results(
/// # Error
/// Returns either encrypted or decrypted bytes on success otherwise it returns a CacheError
/// on failure.
#[cfg(any(
// feature = "compress-cache-results",
feature = "encrypt-cache-results",
feature = "cec-cache-results"
))]
async fn encrypt_or_decrypt_results(
&mut self,
json_results: String,
url: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let hashed_url_string = Self::compute_url_hash(url);
mut bytes: Vec<u8>,
encrypt: bool,
) -> Result<Vec<u8>, Report<CacheError>> {
use chacha20poly1305::{
aead::{Aead, AeadCore, KeyInit, OsRng},
ChaCha20Poly1305,
};
// put results_json into cache
self.connection.set(&hashed_url_string, json_results)?;
let cipher = CIPHER.get_or_init(|| {
let key = ChaCha20Poly1305::generate_key(&mut OsRng);
ChaCha20Poly1305::new(&key)
});
// Set the TTL for the key to 60 seconds
self.connection
.expire::<String, u32>(hashed_url_string, 60)
.unwrap();
let encryption_key = ENCRYPTION_KEY.get_or_init(
|| ChaCha20Poly1305::generate_nonce(&mut OsRng), // 96-bits; unique per message
);
bytes = if encrypt {
cipher
.encrypt(encryption_key, bytes.as_ref())
.map_err(|_| CacheError::EncryptionError)?
} else {
cipher
.decrypt(encryption_key, bytes.as_ref())
.map_err(|_| CacheError::EncryptionError)?
};
Ok(bytes)
}
/// A helper function that returns compressed results.
/// Feature flags (**compress-cache-results or cec-cache-results**) are required for this to work.
///
/// # Arguments
///
/// * `bytes` - It takes a slice of bytes as an argument.
///
/// # Error
/// Returns the compressed bytes on success otherwise it returns a CacheError
/// on failure.
#[cfg(any(feature = "compress-cache-results", feature = "cec-cache-results"))]
async fn compress_results(
&mut self,
mut bytes: Vec<u8>,
) -> Result<Vec<u8>, Report<CacheError>> {
use tokio::io::AsyncWriteExt;
let mut writer = async_compression::tokio::write::BrotliEncoder::new(Vec::new());
writer
.write_all(&bytes)
.await
.map_err(|_| CacheError::CompressionError)?;
writer
.shutdown()
.await
.map_err(|_| CacheError::CompressionError)?;
bytes = writer.into_inner();
Ok(bytes)
}
/// A helper function that returns compressed-encrypted results.
/// Feature flag (**cec-cache-results**) is required for this to work.
///
/// # Arguments
///
/// * `bytes` - It takes a slice of bytes as an argument.
///
/// # Error
/// Returns the compressed and encrypted bytes on success otherwise it returns a CacheError
/// on failure.
#[cfg(feature = "cec-cache-results")]
async fn compress_encrypt_compress_results(
&mut self,
mut bytes: Vec<u8>,
) -> Result<Vec<u8>, Report<CacheError>> {
// compress first
bytes = self.compress_results(bytes).await?;
// encrypt
bytes = self.encrypt_or_decrypt_results(bytes, true).await?;
// compress again;
bytes = self.compress_results(bytes).await?;
Ok(bytes)
}
/// A helper function that returns compressed results.
/// Feature flags (**compress-cache-results or cec-cache-results**) are required for this to work.
/// If bytes where
/// # Arguments
///
/// * `bytes` - It takes a slice of bytes as an argument.
///
/// # Error
/// Returns the uncompressed bytes on success otherwise it returns a CacheError
/// on failure.
#[cfg(any(feature = "compress-cache-results", feature = "cec-cache-results"))]
async fn decompress_results(&mut self, bytes: &[u8]) -> Result<Vec<u8>, Report<CacheError>> {
cfg_if::cfg_if! {
if #[cfg(feature = "compress-cache-results")]
{
decompress_util(bytes).await
}
else if #[cfg(feature = "cec-cache-results")]
{
let decompressed = decompress_util(bytes)?;
let decrypted = self.encrypt_or_decrypt_results(decompressed, false)?;
decompress_util(&decrypted).await
}
}
}
/// A helper function that compresses or encrypts search results before they're inserted into a cache store
/// # Arguments
///
/// * `search_results` - A reference to the search_Results to process.
///
///
/// # Error
/// Returns a Vec of compressed or encrypted bytes on success otherwise it returns a CacheError
/// on failure.
async fn pre_process_search_results(
&mut self,
search_results: &SearchResults,
) -> Result<Vec<u8>, Report<CacheError>> {
#[allow(unused_mut)] // needs to be mutable when any of the features is enabled
let mut bytes: Vec<u8> = search_results.try_into()?;
#[cfg(feature = "compress-cache-results")]
{
let compressed = self.compress_results(bytes).await?;
bytes = compressed;
}
#[cfg(feature = "encrypt-cache-results")]
{
let encrypted = self.encrypt_or_decrypt_results(bytes, true).await?;
bytes = encrypted;
}
#[cfg(feature = "cec-cache-results")]
{
let compressed_encrypted_compressed =
self.compress_encrypt_compress_results(bytes).await?;
bytes = compressed_encrypted_compressed;
}
Ok(bytes)
}
/// A helper function that decompresses or decrypts search results after they're fetched from the cache-store
/// # Arguments
///
/// * `bytes` - A Vec of bytes stores in the cache.
///
///
/// # Error
/// Returns the SearchResults struct on success otherwise it returns a CacheError
/// on failure.
#[allow(unused_mut)] // needs to be mutable when any of the features is enabled
async fn post_process_search_results(
&mut self,
mut bytes: Vec<u8>,
) -> Result<SearchResults, Report<CacheError>> {
#[cfg(feature = "compress-cache-results")]
{
let decompressed = self.decompress_results(&bytes).await?;
bytes = decompressed
}
#[cfg(feature = "encrypt-cache-results")]
{
let decrypted = self.encrypt_or_decrypt_results(bytes, false).await?;
bytes = decrypted
}
#[cfg(feature = "cec-cache-results")]
{
let decompressed_decrypted = self.decompress_results(&bytes).await?;
bytes = decompressed_decrypted;
}
Ok(bytes.try_into()?)
}
}
/// A helper function that returns compressed results.
/// Feature flags (**compress-cache-results or cec-cache-results**) are required for this to work.
/// If bytes where
/// # Arguments
///
/// * `bytes` - It takes a slice of bytes as an argument.
///
/// # Error
/// Returns the uncompressed bytes on success otherwise it returns a CacheError
/// on failure.
#[cfg(any(feature = "compress-cache-results", feature = "cec-cache-results"))]
async fn decompress_util(input: &[u8]) -> Result<Vec<u8>, Report<CacheError>> {
use tokio::io::AsyncWriteExt;
let mut writer = async_compression::tokio::write::BrotliDecoder::new(Vec::new());
writer
.write_all(input)
.await
.map_err(|_| CacheError::CompressionError)?;
writer
.shutdown()
.await
.map_err(|_| CacheError::CompressionError)?;
let bytes = writer.into_inner();
Ok(bytes)
}
#[cfg(feature = "redis-cache")]
#[async_trait::async_trait]
impl Cacher for RedisCache {
async fn build(config: &Config) -> Self {
log::info!(
"Initialising redis cache. Listening to {}",
&config.redis_url
);
RedisCache::new(&config.redis_url, 5, config.cache_expiry_time)
.await
.expect("Redis cache configured")
}
async fn cached_results(&mut self, url: &str) -> Result<SearchResults, Report<CacheError>> {
use base64::Engine;
let hashed_url_string: &str = &self.hash_url(url);
let base64_string = self.cached_json(hashed_url_string).await?;
let bytes = base64::engine::general_purpose::STANDARD_NO_PAD
.decode(base64_string)
.map_err(|_| CacheError::Base64DecodingOrEncodingError)?;
self.post_process_search_results(bytes).await
}
async fn cache_results(
&mut self,
search_results: &[SearchResults],
urls: &[String],
) -> Result<(), Report<CacheError>> {
use base64::Engine;
// size of search_results is expected to be equal to size of urls -> key/value pairs for cache;
let search_results_len = search_results.len();
let mut bytes = Vec::with_capacity(search_results_len);
for result in search_results {
let processed = self.pre_process_search_results(result).await?;
bytes.push(processed);
}
let base64_strings = bytes
.iter()
.map(|bytes_vec| base64::engine::general_purpose::STANDARD_NO_PAD.encode(bytes_vec));
let mut hashed_url_strings = Vec::with_capacity(search_results_len);
for url in urls {
let hash = self.hash_url(url);
hashed_url_strings.push(hash);
}
self.cache_json(base64_strings, hashed_url_strings.into_iter())
.await
}
}
/// TryInto implementation for SearchResults from Vec<u8>
use std::{convert::TryInto, sync::Arc};
impl TryInto<SearchResults> for Vec<u8> {
type Error = CacheError;
fn try_into(self) -> Result<SearchResults, Self::Error> {
bincode::deserialize_from(self.as_slice()).map_err(|_| CacheError::SerializationError)
}
}
impl TryInto<Vec<u8>> for &SearchResults {
type Error = CacheError;
fn try_into(self) -> Result<Vec<u8>, Self::Error> {
bincode::serialize(self).map_err(|_| CacheError::SerializationError)
}
}
/// Memory based cache backend.
#[cfg(feature = "memory-cache")]
pub struct InMemoryCache {
/// The backend cache which stores data.
cache: Arc<MokaCache<String, Vec<u8>>>,
}
#[cfg(feature = "memory-cache")]
impl Clone for InMemoryCache {
fn clone(&self) -> Self {
Self {
cache: self.cache.clone(),
}
}
}
#[cfg(feature = "memory-cache")]
#[async_trait::async_trait]
impl Cacher for InMemoryCache {
async fn build(config: &Config) -> Self {
log::info!("Initialising in-memory cache");
InMemoryCache {
cache: Arc::new(
MokaCache::builder()
.time_to_live(Duration::from_secs(config.cache_expiry_time.into()))
.build(),
),
}
}
async fn cached_results(&mut self, url: &str) -> Result<SearchResults, Report<CacheError>> {
let hashed_url_string = self.hash_url(url);
match self.cache.get(&hashed_url_string).await {
Some(res) => self.post_process_search_results(res).await,
None => Err(Report::new(CacheError::MissingValue)),
}
}
async fn cache_results(
&mut self,
search_results: &[SearchResults],
urls: &[String],
) -> Result<(), Report<CacheError>> {
let mut tasks: Vec<_> = Vec::with_capacity(urls.len());
for (url, search_result) in urls.iter().zip(search_results.iter()) {
let hashed_url_string = self.hash_url(url);
let bytes = self.pre_process_search_results(search_result).await?;
let new_self = self.clone();
tasks.push(tokio::spawn(async move {
new_self.cache.insert(hashed_url_string, bytes).await
}));
}
join_all(tasks).await;
Ok(())
}
}
/// Cache backend which utilises both memory and redis based caches.
///
/// The hybrid cache system uses both the types of cache to ensure maximum availability.
/// The set method sets the key, value pair in both the caches. Therefore in a case where redis
/// cache becomes unavailable, the backend will retreive the value from in-memory cache.
#[cfg(all(feature = "memory-cache", feature = "redis-cache"))]
pub struct HybridCache {
/// The in-memory backend cache which stores data.
memory_cache: InMemoryCache,
/// The redis backend cache which stores data.
redis_cache: RedisCache,
}
#[cfg(all(feature = "memory-cache", feature = "redis-cache"))]
#[async_trait::async_trait]
impl Cacher for HybridCache {
async fn build(config: &Config) -> Self {
log::info!("Initialising hybrid cache");
HybridCache {
memory_cache: InMemoryCache::build(config).await,
redis_cache: RedisCache::build(config).await,
}
}
async fn cached_results(&mut self, url: &str) -> Result<SearchResults, Report<CacheError>> {
match self.redis_cache.cached_results(url).await {
Ok(res) => Ok(res),
Err(_) => self.memory_cache.cached_results(url).await,
}
}
async fn cache_results(
&mut self,
search_results: &[SearchResults],
urls: &[String],
) -> Result<(), Report<CacheError>> {
self.redis_cache.cache_results(search_results, urls).await?;
self.memory_cache
.cache_results(search_results, urls)
.await?;
Ok(())
}
}
/// Dummy cache backend
pub struct DisabledCache;
#[async_trait::async_trait]
impl Cacher for DisabledCache {
async fn build(_config: &Config) -> Self {
log::info!("Caching is disabled");
DisabledCache
}
async fn cached_results(&mut self, _url: &str) -> Result<SearchResults, Report<CacheError>> {
Err(Report::new(CacheError::MissingValue))
}
async fn cache_results(
&mut self,
_search_results: &[SearchResults],
_urls: &[String],
) -> Result<(), Report<CacheError>> {
Ok(())
}
}
/// A structure to efficiently share the cache between threads - as it is protected by a Mutex.
pub struct SharedCache {
/// The internal cache protected from concurrent access by a mutex
cache: Mutex<Box<dyn Cacher>>,
}
impl SharedCache {
/// A function that creates a new `SharedCache` from a Cache implementation.
///
/// # Arguments
///
/// * `cache` - It takes the `Cache` enum variant as an argument with the prefered cache type.
///
/// Returns a newly constructed `SharedCache` struct.
pub fn new(cache: impl Cacher + 'static) -> Self {
Self {
cache: Mutex::new(Box::new(cache)),
}
}
/// A getter function which retrieves the cached SearchResulsts from the internal cache.
///
/// # Arguments
///
/// * `url` - It takes the search url as an argument which will be used as the key to fetch the
/// cached results from the cache.
///
/// # Error
///
/// Returns a `SearchResults` struct containing the search results from the cache if nothing
/// goes wrong otherwise returns a `CacheError`.
pub async fn cached_results(&self, url: &str) -> Result<SearchResults, Report<CacheError>> {
let mut mut_cache = self.cache.lock().await;
mut_cache.cached_results(url).await
}
/// A setter function which caches the results by using the `url` as the key and
/// `SearchResults` as the value.
///
/// # Arguments
///
/// * `search_results` - It takes the `SearchResults` as an argument which are results that
/// needs to be cached.
/// * `url` - It takes the search url as an argument which will be used as the key for storing
/// results in the cache.
///
/// # Error
///
/// Returns an unit type if the results are cached succesfully otherwise returns a `CacheError`
/// on a failure.
pub async fn cache_results(
&self,
search_results: &[SearchResults],
urls: &[String],
) -> Result<(), Report<CacheError>> {
let mut mut_cache = self.cache.lock().await;
mut_cache.cache_results(search_results, urls).await
}
}
/// A function to initialise the cache backend.
pub async fn create_cache(config: &Config) -> impl Cacher {
#[cfg(all(feature = "redis-cache", feature = "memory-cache"))]
return HybridCache::build(config).await;
#[cfg(all(feature = "memory-cache", not(feature = "redis-cache")))]
return InMemoryCache::build(config).await;
#[cfg(all(feature = "redis-cache", not(feature = "memory-cache")))]
return RedisCache::build(config).await;
#[cfg(not(any(feature = "memory-cache", feature = "redis-cache")))]
return DisabledCache::build(config).await;
}
//#[cfg(feature = "Compress-cache-results")]

25
src/cache/encryption.rs vendored Normal file
View file

@ -0,0 +1,25 @@
use chacha20poly1305::{
consts::{B0, B1},
ChaChaPoly1305,
};
use std::sync::OnceLock;
use chacha20::{
cipher::{
generic_array::GenericArray,
typenum::{UInt, UTerm},
StreamCipherCoreWrapper,
},
ChaChaCore,
};
/// The ChaCha20 core wrapped in a stream cipher for use in ChaCha20-Poly1305 authenticated encryption.
type StreamCipherCoreWrapperType =
StreamCipherCoreWrapper<ChaChaCore<UInt<UInt<UInt<UInt<UTerm, B1>, B0>, B1>, B0>>>;
/// Our ChaCha20-Poly1305 cipher instance, lazily initialized.
pub static CIPHER: OnceLock<ChaChaPoly1305<StreamCipherCoreWrapperType>> = OnceLock::new();
/// The type alias for our encryption key, a 32-byte array.
type GenericArrayType = GenericArray<u8, UInt<UInt<UInt<UInt<UTerm, B1>, B1>, B0>, B0>>;
/// Our encryption key, lazily initialized.
pub static ENCRYPTION_KEY: OnceLock<GenericArrayType> = OnceLock::new();

68
src/cache/error.rs vendored Normal file
View file

@ -0,0 +1,68 @@
//! This module provides the error enum to handle different errors associated while requesting data from
//! the redis server using an async connection pool.
use std::fmt;
#[cfg(feature = "redis-cache")]
use redis::RedisError;
/// A custom error type used for handling redis async pool associated errors.
#[derive(Debug)]
pub enum CacheError {
/// This variant handles all errors related to `RedisError`,
#[cfg(feature = "redis-cache")]
RedisError(RedisError),
/// This variant handles the errors which occurs when all the connections
/// in the connection pool return a connection dropped redis error.
PoolExhaustionWithConnectionDropError,
/// Whenever serialization or deserialization fails during communication with the cache.
SerializationError,
/// Returned when the value is missing.
MissingValue,
/// whenever encryption or decryption of cache results fails
EncryptionError,
/// Whenever compression of the cache results fails
CompressionError,
/// Whenever base64 decoding failed
Base64DecodingOrEncodingError,
}
impl fmt::Display for CacheError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
#[cfg(feature = "redis-cache")]
CacheError::RedisError(redis_error) => {
if let Some(detail) = redis_error.detail() {
write!(f, "{}", detail)
} else {
write!(f, "")
}
}
CacheError::PoolExhaustionWithConnectionDropError => {
write!(
f,
"Error all connections from the pool dropped with connection error"
)
}
CacheError::MissingValue => {
write!(f, "The value is missing from the cache")
}
CacheError::SerializationError => {
write!(f, "Unable to serialize, deserialize from the cache")
}
CacheError::EncryptionError => {
write!(f, "Failed to encrypt or decrypt cache-results")
}
CacheError::CompressionError => {
write!(f, "failed to compress or uncompress cache results")
}
CacheError::Base64DecodingOrEncodingError => {
write!(f, "base64 encoding or decoding failed")
}
}
}
}
impl error_stack::Context for CacheError {}

12
src/cache/mod.rs vendored
View file

@ -1 +1,11 @@
pub mod cacher;
//! This module provides the modules which provide the functionality to cache the aggregated
//! results fetched and aggregated from the upstream search engines in a json format.
pub mod cacher;
#[cfg(any(feature = "encrypt-cache-results", feature = "cec-cache-results"))]
/// encryption module contains encryption utils such the cipher and key
pub mod encryption;
pub mod error;
#[cfg(feature = "redis-cache")]
pub mod redis_cacher;

191
src/cache/redis_cacher.rs vendored Normal file
View file

@ -0,0 +1,191 @@
//! This module provides the functionality to cache the aggregated results fetched and aggregated
//! from the upstream search engines in a json format.
use super::error::CacheError;
use error_stack::Report;
use futures::stream::FuturesUnordered;
use redis::{
aio::ConnectionManager, AsyncCommands, Client, ExistenceCheck, RedisError, SetExpiry,
SetOptions,
};
/// A constant holding the redis pipeline size.
const REDIS_PIPELINE_SIZE: usize = 3;
/// A named struct which stores the redis Connection url address to which the client will
/// connect to.
pub struct RedisCache {
/// It stores a pool of connections ready to be used.
connection_pool: Box<[ConnectionManager]>,
/// It stores the size of the connection pool (in other words the number of
/// connections that should be stored in the pool).
pool_size: u8,
/// It stores the index of which connection is being used at the moment.
current_connection: u8,
/// It stores the max TTL for keys.
cache_ttl: u16,
/// It stores the redis pipeline struct of size 3.
pipeline: redis::Pipeline,
}
impl RedisCache {
/// A function which fetches the cached json results as json string.
///
/// # Arguments
///
/// * `redis_connection_url` - It takes the redis Connection url address.
/// * `pool_size` - It takes the size of the connection pool (in other words the number of
/// connections that should be stored in the pool).
/// * `cache_ttl` - It takes the the time to live for cached results to live in the redis
/// server.
///
/// # Error
///
/// Returns a newly constructed `RedisCache` struct on success otherwise returns a standard
/// error type.
pub async fn new(
redis_connection_url: &str,
pool_size: u8,
cache_ttl: u16,
) -> Result<Self, Box<dyn std::error::Error>> {
let client = Client::open(redis_connection_url)?;
let tasks: FuturesUnordered<_> = FuturesUnordered::new();
for _ in 0..pool_size {
let client_partially_cloned = client.clone();
tasks.push(tokio::spawn(async move {
client_partially_cloned.get_connection_manager().await
}));
}
let mut outputs = Vec::with_capacity(tasks.len());
for task in tasks {
outputs.push(task.await??);
}
let redis_cache = RedisCache {
connection_pool: outputs.into_boxed_slice(),
pool_size,
current_connection: Default::default(),
cache_ttl,
pipeline: redis::Pipeline::with_capacity(REDIS_PIPELINE_SIZE),
};
Ok(redis_cache)
}
/// A function which fetches the cached json as json string from the redis server.
///
/// # Arguments
///
/// * `key` - It takes a string as key.
///
/// # Error
///
/// Returns the json as a String from the cache on success otherwise returns a `CacheError`
/// on a failure.
pub async fn cached_json(&mut self, key: &str) -> Result<String, Report<CacheError>> {
self.current_connection = Default::default();
let mut result: Result<String, RedisError> = self.connection_pool
[self.current_connection as usize]
.get(key)
.await;
// Code to check whether the current connection being used is dropped with connection error
// or not. if it drops with the connection error then the current connection is replaced
// with a new connection from the pool which is then used to run the redis command then
// that connection is also checked whether it is dropped or not if it is not then the
// result is passed as a `Result` or else the same process repeats again and if all of the
// connections in the pool result in connection drop error then a custom pool error is
// returned.
loop {
match result {
Err(error) => match error.is_connection_dropped() {
true => {
self.current_connection += 1;
if self.current_connection == self.pool_size {
return Err(Report::new(
CacheError::PoolExhaustionWithConnectionDropError,
));
}
result = self.connection_pool[self.current_connection as usize]
.get(key)
.await;
continue;
}
false => return Err(Report::new(CacheError::RedisError(error))),
},
Ok(res) => return Ok(res),
}
}
}
/// A function which caches the json by using the key and
/// `json results` as the value and stores it in redis server with ttl(time to live)
/// set to 60 seconds.
///
/// # Arguments
///
/// * `json_results` - It takes the json results string as an argument.
/// * `key` - It takes the key as a String.
///
/// # Error
///
/// Returns an unit type if the results are cached succesfully otherwise returns a `CacheError`
/// on a failure.
pub async fn cache_json(
&mut self,
json_results: impl Iterator<Item = String>,
keys: impl Iterator<Item = String>,
) -> Result<(), Report<CacheError>> {
self.current_connection = Default::default();
for (key, json_result) in keys.zip(json_results) {
self.pipeline.set_options(
key,
json_result,
SetOptions::default()
.conditional_set(ExistenceCheck::NX)
.get(true)
.with_expiration(SetExpiry::EX(self.cache_ttl.into())),
);
}
let mut result: Result<(), RedisError> = self
.pipeline
.query_async(&mut self.connection_pool[self.current_connection as usize])
.await;
// Code to check whether the current connection being used is dropped with connection error
// or not. if it drops with the connection error then the current connection is replaced
// with a new connection from the pool which is then used to run the redis command then
// that connection is also checked whether it is dropped or not if it is not then the
// result is passed as a `Result` or else the same process repeats again and if all of the
// connections in the pool result in connection drop error then a custom pool error is
// returned.
loop {
match result {
Err(error) => match error.is_connection_dropped() {
true => {
self.current_connection += 1;
if self.current_connection == self.pool_size {
return Err(Report::new(
CacheError::PoolExhaustionWithConnectionDropError,
));
}
result = self
.pipeline
.query_async(
&mut self.connection_pool[self.current_connection as usize],
)
.await;
continue;
}
false => return Err(Report::new(CacheError::RedisError(error))),
},
Ok(_) => return Ok(()),
}
}
}
}

4
src/config/mod.rs Normal file
View file

@ -0,0 +1,4 @@
//! This module provides the modules which handles the functionality to parse the lua config
//! and convert the config options into rust readable form.
pub mod parser;

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