alamin655 commited on
Commit
ca30fd5
2 Parent(s): 05eda69 99ec846

Merge pull request #288 from neon-mmd/rolling

Browse files

🚀 Release the first stable version of the app

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .cspell.json +20 -0
  2. .github/ISSUE_TEMPLATE/bug.yml +40 -0
  3. .github/ISSUE_TEMPLATE/bug_report.md +0 -36
  4. .github/ISSUE_TEMPLATE/config.yml +5 -1
  5. .github/ISSUE_TEMPLATE/docs.yml +40 -0
  6. .github/ISSUE_TEMPLATE/engine-request.md +0 -27
  7. .github/ISSUE_TEMPLATE/engine.yml +72 -0
  8. .github/ISSUE_TEMPLATE/feature.yml +40 -0
  9. .github/ISSUE_TEMPLATE/feature_request.md +0 -20
  10. .github/ISSUE_TEMPLATE/other.yml +36 -0
  11. .github/label-actions.yml +11 -0
  12. .github/labeler.yml +27 -0
  13. .github/workflows/contributors.yml +48 -0
  14. .github/workflows/hello.yml +1 -0
  15. .github/workflows/issue-lock-unlock.yml +16 -0
  16. .github/workflows/labels.yml +2 -1
  17. .github/workflows/mega-linter.yml +89 -0
  18. .github/workflows/pr_labeler.yml +15 -0
  19. .github/workflows/releases.yml +0 -78
  20. .github/workflows/rust.yml +27 -22
  21. .github/workflows/rust_format.yml +15 -1
  22. .github/workflows/stale.yml +1 -0
  23. .gitignore +7 -0
  24. .gitpod.Dockerfile +3 -0
  25. .gitpod.yml +50 -0
  26. .mega-linter.yml +22 -0
  27. .rusty-hook.toml +5 -0
  28. .stylelintrc.json +13 -0
  29. CONTRIBUTING.md +3 -19
  30. Cargo.lock +0 -0
  31. Cargo.toml +66 -16
  32. Dockerfile +19 -5
  33. PULL_REQUEST_TEMPLATE.md +1 -1
  34. README.md +73 -42
  35. docker-compose.yml +13 -8
  36. docs/README.md +2 -0
  37. docs/configuration.md +46 -13
  38. docs/features.md +42 -0
  39. docs/installation.md +294 -23
  40. docs/instances.md +12 -0
  41. docs/theming.md +438 -69
  42. flake.lock +94 -0
  43. flake.nix +52 -0
  44. images/create_fork_button.png +0 -0
  45. images/fork_button.png +0 -0
  46. images/fork_options_page.png +0 -0
  47. public/images/barricade.png +0 -0
  48. public/images/filter.png +0 -0
  49. public/images/info.svg +1 -0
  50. public/images/no_results.gif +0 -0
.cspell.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "ignorePaths": [
3
+ "**/node_modules/**",
4
+ "**/vscode-extension/**",
5
+ "**/.git/**",
6
+ "**/.pnpm-lock.json",
7
+ ".vscode",
8
+ "megalinter",
9
+ "package-lock.json",
10
+ "report"
11
+ ],
12
+ "language": "en",
13
+ "noConfigSearch": true,
14
+ "words": [
15
+ "megalinter",
16
+ "oxsecurity",
17
+ "websurfx"
18
+ ],
19
+ "version": "0.2"
20
+ }
.github/ISSUE_TEMPLATE/bug.yml ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: 🐛 Bug
2
+ description: Report an issue to help improve the project.
3
+ title: "🐛 <description>"
4
+ labels: ["🛠️ goal: fix","🚦 status: awaiting triage"]
5
+ body:
6
+ - type: textarea
7
+ id: description
8
+ attributes:
9
+ label: Description
10
+ description: A brief description of the question or issue, also include what you tried and what didn't work
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: screenshots
15
+ attributes:
16
+ label: Screenshots
17
+ description: Please add screenshots if applicable
18
+ validations:
19
+ required: false
20
+ - type: dropdown
21
+ id: assignee
22
+ attributes:
23
+ label: Do you want to work on this issue?
24
+ multiple: false
25
+ options:
26
+ - "Yes"
27
+ - "No"
28
+ validations:
29
+ required: false
30
+ - type: textarea
31
+ id: extrainfo
32
+ attributes:
33
+ label: Additional information
34
+ description: Is there anything else we should know about this bug?
35
+ validations:
36
+ required: false
37
+ - type: markdown
38
+ attributes:
39
+ value: |
40
+ You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)
.github/ISSUE_TEMPLATE/bug_report.md DELETED
@@ -1,36 +0,0 @@
1
- ---
2
- name: Bug report
3
- about: Create a report to help us improve
4
- title: "[BUG] <your bug report title>"
5
- labels: bug
6
- assignees: ''
7
-
8
- ---
9
-
10
- <!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF Websurfx -->
11
-
12
- **Version of Websurfx, commit number if you are using on master branch**
13
- <!-- If you are running on master branch using git execute this command
14
- in order to fetch the latest commit ID:
15
- ```
16
- git log -1
17
- ```
18
- -->
19
-
20
- **How did you install Websurfx?**
21
- <!-- Did you install Websurfx following the README ? -->
22
-
23
- **What happened?**
24
- <!-- A clear and concise description of what the bug is. -->
25
-
26
- **Steps To Reproduce**
27
- <!-- How can we reproduce this issue? (as minimally and as precisely as possible) -->
28
-
29
- **Expected behavior**
30
- <!-- A clear and concise description of what you expected to happen. -->
31
-
32
- **Screenshots**
33
- <!-- If applicable, provide screenshots to help explain your problem better. -->
34
-
35
- **Additional context**
36
- <!-- Add any other context about the problem here. -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/ISSUE_TEMPLATE/config.yml CHANGED
@@ -1 +1,5 @@
1
- blank_issues_enabled: true
 
 
 
 
 
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Question?
4
+ url: https://discord.gg/SWnda7Mw5u
5
+ about: Feel free to ask your question by joining our Discord server.
.github/ISSUE_TEMPLATE/docs.yml ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: 📝 Documentation issue
2
+ description: Found an issue in the documentation? You can use this one!
3
+ title: "📝 <description>"
4
+ labels: ["📄 aspect: text","🚦 status: awaiting triage"]
5
+ body:
6
+ - type: textarea
7
+ id: description
8
+ attributes:
9
+ label: Description
10
+ description: A brief description of the question or issue, also include what you tried and what didn't work
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: screenshots
15
+ attributes:
16
+ label: Screenshots
17
+ description: Please add screenshots if applicable
18
+ validations:
19
+ required: false
20
+ - type: dropdown
21
+ id: assignee
22
+ attributes:
23
+ label: Do you want to work on this issue?
24
+ multiple: false
25
+ options:
26
+ - "Yes"
27
+ - "No"
28
+ validations:
29
+ required: false
30
+ - type: textarea
31
+ id: extrainfo
32
+ attributes:
33
+ label: Additional information
34
+ description: Is there anything else we should know about this issue?
35
+ validations:
36
+ required: false
37
+ - type: markdown
38
+ attributes:
39
+ value: |
40
+ You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)
.github/ISSUE_TEMPLATE/engine-request.md DELETED
@@ -1,27 +0,0 @@
1
- ---
2
- name: Engine request
3
- about: 'Suggest a new engine to be add '
4
- title: "[ENGINE] <your engine request title>"
5
- labels: engine
6
- assignees: ''
7
-
8
- ---
9
-
10
- <!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF Websurfx -->
11
-
12
- **Working URL of the engine**
13
- <!-- Please check if the engine is responding correctly before submitting it. -->
14
-
15
- **Why do you want to add this engine?**
16
- <!-- What's special about this engine? Is it open source or libre? -->
17
-
18
- **Features of this engine**
19
- <!-- Features of this engine: Doesn't track its users, fast, easy to integrate, ... -->
20
-
21
- **Applicable category of this engine**
22
- <!-- Where should this new engine fit in Websurfx? Current categories in Websurfx:
23
- general, files, images, it, map, music, news, science, social media and videos.
24
- You can add multiple categories at the same time. -->
25
-
26
- **Additional context**
27
- <!-- Add any other context about this engine here. -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/ISSUE_TEMPLATE/engine.yml ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: ✨ Engine
2
+ description: Have a new engine to suggest for Websurfx? Please suggest!
3
+ title: '✨ <your engine request title>'
4
+ labels: ['⭐ goal: addition', '🚦 status: awaiting triage']
5
+ body:
6
+ - type: textarea
7
+ id: workingUrl
8
+ attributes:
9
+ label: Working URL of the engine
10
+ description: Please check if the engine is responding correctly before submitting it.
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: reason
15
+ attributes:
16
+ label: Why do you want to add this engine?
17
+ description: What's special about this engine? Is it open source or libre?
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: features
22
+ attributes:
23
+ label: Features of this engine
24
+ description: Features of this engine: Doesn't track its users, fast, easy to integrate, or anything else that we can know about.
25
+ validations:
26
+ required: true
27
+ - type: textarea
28
+ id: screenshots
29
+ attributes:
30
+ label: Screenshots
31
+ description: Please add screenshots if applicable
32
+ validations:
33
+ required: false
34
+ - type: dropdown
35
+ id: assignee
36
+ attributes:
37
+ label: Do you want to work on this issue?
38
+ multiple: true
39
+ options:
40
+ - 'General'
41
+ - 'Files'
42
+ - 'Images'
43
+ - 'IT'
44
+ - 'Map'
45
+ - 'Music'
46
+ - 'News'
47
+ - 'Science'
48
+ - 'Social Media'
49
+ - 'Videos'
50
+ validations:
51
+ required: true
52
+ - type: dropdown
53
+ id: assignee
54
+ attributes:
55
+ label: Do you want to work on this issue?
56
+ multiple: false
57
+ options:
58
+ - 'Yes'
59
+ - 'No'
60
+ validations:
61
+ required: false
62
+ - type: textarea
63
+ id: extrainfo
64
+ attributes:
65
+ label: Additional information
66
+ description: Is there anything else we should know about this idea?
67
+ validations:
68
+ required: false
69
+ - type: markdown
70
+ attributes:
71
+ value: |
72
+ You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)
.github/ISSUE_TEMPLATE/feature.yml ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: 💡 General Feature Request
2
+ description: Have a new idea/feature for Websurfx? Please suggest!
3
+ title: "✨ <description>"
4
+ labels: ["⭐ goal: addition", "🚦 status: awaiting triage"]
5
+ body:
6
+ - type: textarea
7
+ id: description
8
+ attributes:
9
+ label: Description
10
+ description: A brief description of the enhancement you propose, also include what you tried and what worked.
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: screenshots
15
+ attributes:
16
+ label: Screenshots
17
+ description: Please add screenshots if applicable
18
+ validations:
19
+ required: false
20
+ - type: dropdown
21
+ id: assignee
22
+ attributes:
23
+ label: Do you want to work on this issue?
24
+ multiple: false
25
+ options:
26
+ - "Yes"
27
+ - "No"
28
+ validations:
29
+ required: false
30
+ - type: textarea
31
+ id: extrainfo
32
+ attributes:
33
+ label: Additional information
34
+ description: Is there anything else we should know about this idea?
35
+ validations:
36
+ required: false
37
+ - type: markdown
38
+ attributes:
39
+ value: |
40
+ You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)
.github/ISSUE_TEMPLATE/feature_request.md DELETED
@@ -1,20 +0,0 @@
1
- ---
2
- name: Feature request
3
- about: Suggest an idea for this project
4
- title: "[FEATURE] <your feature request title>"
5
- labels: enhancement
6
- assignees: ''
7
-
8
- ---
9
-
10
- **Is your feature request related to a problem? Please describe.**
11
- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
-
13
- **Describe the solution you'd like**
14
- A clear and concise description of what you want to happen.
15
-
16
- **Describe alternatives you've considered**
17
- A clear and concise description of any alternative solutions or features you've considered.
18
-
19
- **Additional context**
20
- Add any other context or screenshots about the feature request here.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/ISSUE_TEMPLATE/other.yml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: 🧱 Other
2
+ description: Use this for any other issues. Please do NOT create blank issues
3
+ title: "🧱 <Add your title here>"
4
+ labels: ["🚦 status: awaiting triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: "# Other issue"
9
+ - type: textarea
10
+ id: issuedescription
11
+ attributes:
12
+ label: What would you like to share?
13
+ description: Provide a clear and concise explanation of your issue.
14
+ validations:
15
+ required: true
16
+ - type: dropdown
17
+ id: assignee
18
+ attributes:
19
+ label: Do you want to work on this issue?
20
+ multiple: false
21
+ options:
22
+ - "Yes"
23
+ - "No"
24
+ validations:
25
+ required: false
26
+ - type: textarea
27
+ id: extrainfo
28
+ attributes:
29
+ label: Additional information
30
+ description: Is there anything else we should know about this issue?
31
+ validations:
32
+ required: false
33
+ - type: markdown
34
+ attributes:
35
+ value: |
36
+ You can also join our Discord community [here](https://discord.gg/SWnda7Mw5u)
.github/label-actions.yml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "🚦 status: awaiting triage":
2
+ issues:
3
+ comment: >
4
+ 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
5
+ lock: true
6
+
7
+ "🏁 status: ready for dev":
8
+ issues:
9
+ comment: >
10
+ 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
11
+ unlock: true
.github/labeler.yml ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '💻 aspect: code':
2
+ - src/*
3
+ - Cargo.toml
4
+ - Cargo.lock
5
+ - Dockerfile
6
+ - docker-compose.yml
7
+ - websurfx/*
8
+
9
+ '🤖 aspect: dx':
10
+ - '**/*.json'
11
+ - .dockerignore
12
+ - .gitignore
13
+ - .gitpod.Dockerfile
14
+ - .gitpod.yml
15
+ - .rusty-hook.toml
16
+ - PULL_REQUEST_TEMPLATE.md
17
+ - SECURITY.md
18
+ - .github/*
19
+ - .mega-linter.yml
20
+ - tests/*
21
+
22
+ '📄 aspect: text':
23
+ - any: ['**/*.md', '!PULL_REQUEST_TEMPLATE.md', '!SECURITY.md']
24
+ - LICENSE
25
+
26
+ '🕹️ aspect: interface':
27
+ - public/*
.github/workflows/contributors.yml ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Contributors List
3
+
4
+ on:
5
+ workflow_dispatch:
6
+
7
+ schedule:
8
+ - cron: "0 1 * * *"
9
+
10
+ jobs:
11
+ contributors:
12
+ permissions:
13
+ contents: write
14
+ pull-requests: write
15
+
16
+ runs-on: ubuntu-latest
17
+
18
+ steps:
19
+ - name: Checkout code
20
+ uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0
21
+ with:
22
+ fetch-depth: 0
23
+ ref: ${{ github.event.repository.default_branch }}
24
+
25
+ - name: Update contributors list
26
+ uses: wow-actions/contributors-list@b9e91f91a51a55460fdcae64daad0cb8122cdd53 # v1.1.0
27
+ with:
28
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
29
+ svgPath: images/contributors_list.svg
30
+ round: true
31
+ includeBots: false
32
+ noCommit: true
33
+
34
+ - name: Commit & PR
35
+ uses: peter-evans/create-pull-request@38e0b6e68b4c852a5500a94740f0e535e0d7ba54 # v4.2.4
36
+ with:
37
+ token: ${{ secrets.GITHUB_TOKEN }}
38
+ add-paths: .github/assets/CONTRIBUTORS.svg
39
+ commit-message: 'chore: update contributors-list'
40
+ committer: GitHub <noreply@github.com>
41
+ author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
42
+ signoff: false
43
+ branch: workflow/update-contributors-list
44
+ base: main
45
+ delete-branch: true
46
+ title: 'chore: update contributors-list'
47
+ body: |
48
+ Automated update to `images/contributors_list.svg`
.github/workflows/hello.yml CHANGED
@@ -1,3 +1,4 @@
 
1
  name: Welcome first time contributors
2
 
3
  on:
 
1
+ ---
2
  name: Welcome first time contributors
3
 
4
  on:
.github/workflows/issue-lock-unlock.yml ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: "lock/unlock issue"
2
+
3
+ on:
4
+ issues:
5
+ types: labeled
6
+
7
+ permissions:
8
+ issues: write
9
+
10
+ jobs:
11
+ action:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: dessant/label-actions@v3
15
+ with:
16
+ process-only: issues
.github/workflows/labels.yml CHANGED
@@ -1,9 +1,10 @@
 
1
  name: Import open source standard labels
2
 
3
  on:
4
  push:
5
  branches:
6
- - master
7
 
8
  jobs:
9
  labels:
 
1
+ ---
2
  name: Import open source standard labels
3
 
4
  on:
5
  push:
6
  branches:
7
+ - rolling
8
 
9
  jobs:
10
  labels:
.github/workflows/mega-linter.yml ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ # MegaLinter GitHub Action configuration file
3
+ # More info at https://megalinter.io
4
+ name: MegaLinter
5
+
6
+ on:
7
+ # Trigger mega-linter at every push. Action will also be visible from Pull Requests to rolling
8
+ push: # Comment this line to trigger action only on pull-requests (not recommended if you don't pay for GH Actions)
9
+ pull_request:
10
+ branches: [rolling]
11
+
12
+ env: # Comment env block if you do not want to apply fixes
13
+ # Apply linter fixes configuration
14
+ APPLY_FIXES: all # When active, APPLY_FIXES must also be defined as environment variable (in github/workflows/mega-linter.yml or other CI tool)
15
+ APPLY_FIXES_EVENT: pull_request # Decide which event triggers application of fixes in a commit or a PR (pull_request, push, all)
16
+ APPLY_FIXES_MODE: commit # If APPLY_FIXES is used, defines if the fixes are directly committed (commit) or posted in a PR (pull_request)
17
+
18
+ concurrency:
19
+ group: ${{ github.ref }}-${{ github.workflow }}
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ build:
24
+ name: MegaLinter
25
+ runs-on: ubuntu-latest
26
+ permissions:
27
+ # Give the default GITHUB_TOKEN write permission to commit and push, comment issues & post new PR
28
+ # Remove the ones you do not need
29
+ contents: write
30
+ issues: write
31
+ pull-requests: write
32
+ steps:
33
+ # Git Checkout
34
+ - name: Checkout Code
35
+ uses: actions/checkout@v3
36
+ with:
37
+ token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
38
+
39
+ # MegaLinter
40
+ - name: MegaLinter
41
+ id: ml
42
+ # You can override MegaLinter flavor used to have faster performances
43
+ # More info at https://megalinter.io/flavors/
44
+ uses: oxsecurity/megalinter/flavors/cupcake@v7.1.0
45
+ env:
46
+ # All available variables are described in documentation
47
+ # https://megalinter.io/configuration/
48
+ VALIDATE_ALL_CODEBASE: true # Set ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} to validate only diff with main branch
49
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
50
+ # ADD YOUR CUSTOM ENV VARIABLES HERE TO OVERRIDE VALUES OF .mega-linter.yml AT THE ROOT OF YOUR REPOSITORY
51
+
52
+ # Upload MegaLinter artifacts
53
+ - name: Archive production artifacts
54
+ if: ${{ success() }} || ${{ failure() }}
55
+ uses: actions/upload-artifact@v3
56
+ with:
57
+ name: MegaLinter reports
58
+ path: |
59
+ megalinter-reports
60
+ mega-linter.log
61
+
62
+ # Create pull request if applicable (for now works only on PR from same repository, not from forks)
63
+ - name: Create Pull Request with applied fixes
64
+ id: cpr
65
+ if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'pull_request' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix')
66
+ uses: peter-evans/create-pull-request@v5
67
+ with:
68
+ token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
69
+ commit-message: "[MegaLinter] Apply linters automatic fixes"
70
+ title: "[MegaLinter] Apply linters automatic fixes"
71
+ labels: bot
72
+ - name: Create PR output
73
+ if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'pull_request' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix')
74
+ run: |
75
+ echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
76
+ echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
77
+
78
+ # Push new commit if applicable (for now works only on PR from same repository, not from forks)
79
+ - name: Prepare commit
80
+ if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix')
81
+ run: sudo chown -Rc $UID .git/
82
+ - name: Commit and push applied linter fixes
83
+ if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix')
84
+ uses: stefanzweifel/git-auto-commit-action@v4
85
+ with:
86
+ branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }}
87
+ commit_message: "[MegaLinter] Apply linters fixes"
88
+ commit_user_name: megalinter-bot
89
+ commit_user_email: nicolas.vuillamy@ox.security
.github/workflows/pr_labeler.yml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: "Pull Request Auto Labeler"
2
+ on:
3
+ - pull_request_target
4
+
5
+ jobs:
6
+ triage:
7
+ permissions:
8
+ contents: read
9
+ pull-requests: write
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/labeler@v4
13
+ with:
14
+ sync-labels: true
15
+ dot: true
.github/workflows/releases.yml DELETED
@@ -1,78 +0,0 @@
1
- name: Releases
2
- on:
3
- push:
4
- branches:
5
- - "rolling"
6
-
7
- concurrency:
8
- group: "rolling-branch"
9
-
10
- jobs:
11
- changelog:
12
- if: github.repository == 'neon-mmd/websurfx'
13
- runs-on: ubuntu-latest
14
-
15
- steps:
16
- # Create a temporary, uniquely named branch to push release info to
17
- - name: create temporary branch
18
- uses: peterjgrainger/action-create-branch@v2.3.0
19
- id: create-branch
20
- with:
21
- branch: "release-from-${{ github.sha }}"
22
- sha: "${{ github.sha }}"
23
- env:
24
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
25
-
26
- # check out the repository afterwards
27
- - uses: actions/checkout@v3
28
-
29
- # fetch branches and switch to the temporary branch
30
- - name: switch to new branch
31
- run: git fetch --all && git checkout --track origin/release-from-${{ github.sha }}
32
-
33
- # update app config with version
34
- - name: Get current rust app version from its Cargo.toml.
35
- id: foo
36
- uses: dante-signal31/rust-app-version@v1.2.0
37
- with:
38
- cargo_toml_folder: rust_app_folder/
39
-
40
- - name: Use the version to update the Cargo.toml version.
41
- shell: bash
42
- run: sed -i "3s/version = \"[0-9]*.[0-9]*.[0-9]*\"/version = \"${{ steps.foo.outputs.app_version }}\"/g" Cargo.toml
43
-
44
- # create release info and push it upstream
45
- - name: conventional Changelog Action
46
- id: changelog
47
- uses: TriPSs/conventional-changelog-action@v3
48
- with:
49
- github-token: ${{ secrets.GITHUB_TOKEN }}
50
- version-file: "./Cargo.toml"
51
- git-branch: "release-from-${{ github.sha }}"
52
- skip-on-empty: false
53
- skip-git-pull: true
54
-
55
- # create PR using GitHub CLI
56
- - name: create PR with release info
57
- id: create-pr
58
- run: gh pr create --base main --head release-from-${{ github.sha }} --title 'Merge new release into rolling' --body 'Created by Github action'
59
- env:
60
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
61
-
62
- # merge PR using GitHub CLI
63
- - name: merge PR with release info
64
- id: merge-pr
65
- run: gh pr merge --admin --merge --subject 'Merge release info' --delete-branch
66
- env:
67
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
68
-
69
- # release info is now in main so we can continue as before
70
- - name: create release with last commit
71
- uses: actions/create-release@v1
72
- if: steps.changelog.outputs.skipped == 'false'
73
- env:
74
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
75
- with:
76
- tag_name: ${{ steps.changelog.outputs.tag }}
77
- release_name: ${{ steps.changelog.outputs.tag }}
78
- body: ${{ steps.changelog.outputs.clean_changelog }}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/rust.yml CHANGED
@@ -1,12 +1,13 @@
 
1
  name: Rust
2
 
3
  on:
4
  push:
5
  branches:
6
- - "**"
7
  pull_request:
8
  branches:
9
- - "rolling"
10
 
11
  env:
12
  CARGO_TERM_COLOR: always
@@ -20,23 +21,27 @@ jobs:
20
  - stable
21
 
22
  steps:
23
- - uses: actions/checkout@v3
24
- - run: rustup toolchain install stable --profile minimal
25
- - uses: Swatinem/rust-cache@v2
26
- with:
27
- prefix-key: ""
28
- shared-key: ""
29
- key: ""
30
- env-vars: ""
31
- workspaces: ""
32
- cache-directories: ""
33
- cache-targets: ""
34
- cache-on-failure: ""
35
- cache-all-crates: ""
36
- save-if: ""
37
- - uses: actions/checkout@v3
38
- - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
39
- - name: Build
40
- run: cargo build --verbose
41
- - name: Run tests
42
- run: cargo test --verbose
 
 
 
 
 
1
+ ---
2
  name: Rust
3
 
4
  on:
5
  push:
6
  branches:
7
+ - '**'
8
  pull_request:
9
  branches:
10
+ - 'rolling'
11
 
12
  env:
13
  CARGO_TERM_COLOR: always
 
21
  - stable
22
 
23
  steps:
24
+ - name: Install LuaJIT and Lua
25
+ run: |
26
+ sudo apt-get update
27
+ 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
28
+ - uses: actions/checkout@v3
29
+ - run: rustup toolchain install stable --profile minimal
30
+ - uses: Swatinem/rust-cache@v2
31
+ with:
32
+ prefix-key: ''
33
+ shared-key: ''
34
+ key: ''
35
+ env-vars: ''
36
+ workspaces: ''
37
+ cache-directories: ''
38
+ cache-targets: ''
39
+ cache-on-failure: ''
40
+ cache-all-crates: ''
41
+ save-if: ''
42
+ - uses: actions/checkout@v3
43
+ - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
44
+ - name: Build
45
+ run: cargo build --verbose
46
+ - name: Run tests
47
+ run: cargo test --verbose
.github/workflows/rust_format.yml CHANGED
@@ -1,3 +1,4 @@
 
1
  name: Rust format and clippy checks
2
  on:
3
  push:
@@ -12,6 +13,10 @@ jobs:
12
  name: Rust project
13
  runs-on: ubuntu-latest
14
  steps:
 
 
 
 
15
  - uses: actions/checkout@v2
16
  - name: Install minimal stable with clippy and rustfmt
17
  uses: actions-rs/toolchain@v1
@@ -19,7 +24,16 @@ jobs:
19
  profile: minimal
20
  toolchain: stable
21
  components: rustfmt, clippy
22
-
 
 
 
 
 
 
 
 
 
23
  - name: Run cargo check
24
  uses: actions-rs/cargo@v1
25
  with:
 
1
+ ---
2
  name: Rust format and clippy checks
3
  on:
4
  push:
 
13
  name: Rust project
14
  runs-on: ubuntu-latest
15
  steps:
16
+ - name: Install LuaJIT and Lua
17
+ run: |
18
+ sudo apt-get update
19
+ 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
20
  - uses: actions/checkout@v2
21
  - name: Install minimal stable with clippy and rustfmt
22
  uses: actions-rs/toolchain@v1
 
24
  profile: minimal
25
  toolchain: stable
26
  components: rustfmt, clippy
27
+ - name: Format
28
+ uses: actions-rs/cargo@v1
29
+ with:
30
+ command: fmt
31
+ args: -- --check
32
+ - name: Clippy
33
+ uses: actions-rs/cargo@v1
34
+ with:
35
+ command: clippy
36
+ args: --all-targets --all
37
  - name: Run cargo check
38
  uses: actions-rs/cargo@v1
39
  with:
.github/workflows/stale.yml CHANGED
@@ -1,3 +1,4 @@
 
1
  # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
2
  #
3
  # You can adjust the behavior by modifying this file.
 
1
+ ---
2
  # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
3
  #
4
  # You can adjust the behavior by modifying this file.
.gitignore CHANGED
@@ -1 +1,8 @@
 
1
  /target
 
 
 
 
 
 
 
1
+ .vscode
2
  /target
3
+ dhat-heap.json
4
+ dump.rdb
5
+ megalinter-reports/
6
+ package-lock.json
7
+ package.json
8
+ result
.gitpod.Dockerfile ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ FROM gitpod/workspace-rust
2
+
3
+ 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
.gitpod.yml ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ image:
3
+ file: .gitpod.Dockerfile
4
+
5
+ # Commands that will run on workspace start
6
+ tasks:
7
+ - name: Start Redis Server
8
+ command: redis-server --port 8082
9
+ - name: Run The App
10
+ init: cargo build
11
+ command: PKG_ENV=dev ./target/debug/websurfx
12
+ - name: Tests
13
+ command: cargo test
14
+ - name: Clippy Checks
15
+ command: cargo clippy
16
+
17
+ # vscode IDE setup
18
+ vscode:
19
+ extensions:
20
+ - vadimcn.vscode-lldb
21
+ - cschleiden.vscode-github-actions
22
+ - rust-lang.rust-analyzer
23
+ - bungcip.better-toml
24
+ - serayuzgur.crates
25
+ - usernamehw.errorlens
26
+ - DavidAnson.vscode-markdownlint
27
+ - esbenp.prettier-vscode
28
+ - stylelint.vscode-stylelint
29
+ - dbaeumer.vscode-eslint
30
+ - evgeniypeshkov.syntax-highlighter
31
+ - ms-azuretools.vscode-docker
32
+ - Catppuccin.catppuccin-vsc
33
+ - PKief.material-icon-theme
34
+ - oderwat.indent-rainbow
35
+ - formulahendry.auto-rename-tag
36
+ - swellaby.vscode-rust-test-adapter
37
+ - belfz.search-crates-io
38
+ - hbenl.test-adapter-converter
39
+ - hbenl.vscode-test-explorer
40
+ - eamodio.gitlens
41
+
42
+ github:
43
+ prebuilds:
44
+ master: true
45
+ branches: true
46
+ pullRequests: true
47
+ pullRequestsFromForks: true
48
+ addCheck: true
49
+ addComment: false
50
+ addBadge: true
.mega-linter.yml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ # Configuration file for MegaLinter
3
+ # See all available variables at https://megalinter.io/configuration/ and in linters documentation
4
+
5
+ APPLY_FIXES: all # all, none, or list of linter keys
6
+ # ENABLE: # If you use ENABLE variable, all other languages/formats/tooling-formats will be disabled by default
7
+ ENABLE_LINTERS: # If you use ENABLE_LINTERS variable, all other linters will be disabled by default
8
+ - RUST_CLIPPY
9
+ - JAVASCRIPT_ES
10
+ - CSS_STYLELINT
11
+ - MARKDOWN_MARKDOWNLINT
12
+ - YAML_YAMLLINT
13
+ - HTML_DJLINT
14
+ - ACTION_ACTIONLINT
15
+ - DOCKERFILE_HADOLINT
16
+ - SPELL_CSPELL
17
+ # DISABLE:
18
+ # - COPYPASTE # Uncomment to disable checks of excessive copy-pastes
19
+ # - SPELL # Uncomment to disable checks of spelling mistakes
20
+ SHOW_ELAPSED_TIME: true
21
+ FILEIO_REPORTER: false
22
+ # DISABLE_ERRORS: true # Uncomment if you want MegaLinter to detect errors but not block CI to pass
.rusty-hook.toml ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ [hooks]
2
+ pre-commit = "cargo test && cargo fmt -- --check && cargo clippy && stylelint ./public/static/themes/*.css ./public/static/colorschemes/*.css ./public/static/*.js"
3
+
4
+ [logging]
5
+ verbose = true
.stylelintrc.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "extends": "stylelint-config-standard",
3
+ "rules": {
4
+ "alpha-value-notation": "number",
5
+ "selector-class-pattern": null
6
+ },
7
+ "overrides": [
8
+ {
9
+ "files": ["*.js"],
10
+ "customSyntax": "postcss-lit"
11
+ }
12
+ ]
13
+ }
CONTRIBUTING.md CHANGED
@@ -2,7 +2,7 @@
2
 
3
  ## Documentation/Wiki
4
 
5
- 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 [wiki](https://github.com/neon-mmd/websurfx/wiki) to add to or improve the documentation. This will help future users get Websurfx up and running more easily.
6
 
7
  ## Readme
8
 
@@ -14,7 +14,7 @@ Know how to fix or improve a github action?. Consider Submitting a Pull request
14
 
15
  ## Source Code
16
 
17
- You should know atleast one of the things below to start contributing:
18
 
19
  - Rust basics
20
  - Actix-web crate basics
@@ -48,23 +48,7 @@ We have a [Discord](https://discord.gg/SWnda7Mw5u) channel, feel free to join an
48
 
49
  # Where To Contribute?
50
 
51
- ## For Source Code Contributions
52
-
53
- The _rolling branch_ is where we intend all source code contributions should go.
54
-
55
- ## For Readme Contributions
56
-
57
- The _master branch_ is where we intend all source code contributions should go.
58
-
59
- # How To Fork
60
-
61
- ![image](./images/fork_button.png)
62
-
63
- ![image](./images/fork_options_page.png)
64
-
65
- Please make sure to leave the `Copy the master branch only` option ticked off.
66
-
67
- ![image](./images/create_fork_button.png)
68
 
69
 
70
  We appreciate any contributions whether be 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 than 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.
 
2
 
3
  ## Documentation/Wiki
4
 
5
+ 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.
6
 
7
  ## Readme
8
 
 
14
 
15
  ## Source Code
16
 
17
+ You should know at least one of the things below to start contributing:
18
 
19
  - Rust basics
20
  - Actix-web crate basics
 
48
 
49
  # Where To Contribute?
50
 
51
+ The _rolling branch_ is where we intend all contributions should go.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
 
53
 
54
  We appreciate any contributions whether be 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 than 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.
Cargo.lock CHANGED
The diff for this file is too large to render. See raw diff
 
Cargo.toml CHANGED
@@ -1,23 +1,73 @@
1
  [package]
2
  name = "websurfx"
3
- version = "0.6.0"
4
  edition = "2021"
5
-
6
- # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
7
 
8
  [dependencies]
9
- reqwest = {version="*",features=["json"]}
10
- tokio = {version="*",features=["full"]}
11
- serde = {version="*",features=["derive"]}
12
- handlebars = { version = "4.3.6", features = ["dir_source"] }
13
- scraper = {version="*"}
14
- actix-web = {version="4.3.1"}
15
  actix-files = {version="0.6.2"}
16
- serde_json = {version="*"}
17
- fake-useragent = {version="*"}
 
18
  env_logger = {version="0.10.0"}
19
- log = {version="0.4.17"}
20
- rlua = {version="*"}
21
- redis = {version="*"}
22
- md5 = {version="*"}
23
- rand={version="*"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  [package]
2
  name = "websurfx"
3
+ version = "1.0.0"
4
  edition = "2021"
5
+ 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."
6
+ repository = "https://github.com/neon-mmd/websurfx"
7
+ license = "AGPL-3.0"
8
 
9
  [dependencies]
10
+ reqwest = {version="0.11.20",features=["json"]}
11
+ tokio = {version="1.32.0",features=["rt-multi-thread","macros"]}
12
+ serde = {version="1.0.188",features=["derive"]}
13
+ handlebars = { version = "4.4.0", features = ["dir_source"] }
14
+ scraper = {version="0.17.1"}
15
+ actix-web = {version="4.4.0", features = ["cookies"]}
16
  actix-files = {version="0.6.2"}
17
+ actix-cors = {version="0.6.4"}
18
+ serde_json = {version="1.0.105"}
19
+ fake-useragent = {version="0.1.3"}
20
  env_logger = {version="0.10.0"}
21
+ log = {version="0.4.20"}
22
+ mlua = {version="0.8.10", features=["luajit", "vendored"]}
23
+ redis = {version="0.23.3", features=["tokio-comp","connection-manager"], optional = true}
24
+ md5 = {version="0.7.0"}
25
+ rand={version="0.8.5"}
26
+ once_cell = {version="1.18.0"}
27
+ error-stack = {version="0.4.0"}
28
+ async-trait = {version="0.1.73"}
29
+ regex = {version="1.9.4", features=["perf"]}
30
+ smallvec = {version="1.11.0", features=["union", "serde"]}
31
+ futures = {version="0.3.28"}
32
+ dhat = {version="0.3.2", optional = true}
33
+ mimalloc = { version = "0.1.38", default-features = false }
34
+ async-once-cell = {version="0.5.3"}
35
+ actix-governor = {version="0.4.1"}
36
+ mini-moka = { version="0.10", optional = true}
37
+
38
+ [dev-dependencies]
39
+ rusty-hook = "^0.11.2"
40
+ criterion = "0.5.1"
41
+ tempfile = "3.8.0"
42
+
43
+ [profile.dev]
44
+ opt-level = 0
45
+ debug = true
46
+ split-debuginfo = '...'
47
+ debug-assertions = true
48
+ overflow-checks = true
49
+ lto = false
50
+ panic = 'unwind'
51
+ incremental = true
52
+ codegen-units = 256
53
+ rpath = false
54
+
55
+ [profile.release]
56
+ opt-level = 3
57
+ debug = false # This should only be commented when testing with dhat profiler
58
+ # debug = 1 # This should only be uncommented when testing with dhat profiler
59
+ split-debuginfo = '...'
60
+ debug-assertions = false
61
+ overflow-checks = false
62
+ lto = true
63
+ panic = 'abort'
64
+ incremental = false
65
+ codegen-units = 1
66
+ rpath = false
67
+ strip = "debuginfo"
68
+
69
+ [features]
70
+ default = ["memory-cache"]
71
+ dhat-heap = ["dep:dhat"]
72
+ memory-cache = ["dep:mini-moka"]
73
+ redis-cache = ["dep:redis"]
Dockerfile CHANGED
@@ -1,9 +1,9 @@
1
  FROM rust:latest AS chef
2
  # We only pay the installation cost once,
3
  # it will be cached from the second build onwards
4
- RUN cargo install cargo-chef
5
 
6
- WORKDIR app
7
 
8
  FROM chef AS planner
9
  COPY . .
@@ -12,15 +12,29 @@ RUN cargo chef prepare --recipe-path recipe.json
12
  FROM chef AS builder
13
  COPY --from=planner /app/recipe.json recipe.json
14
  # Build dependencies - this is the caching Docker layer!
 
 
 
15
  RUN cargo chef cook --release --recipe-path recipe.json
 
 
 
 
16
 
17
  # Build application
18
  COPY . .
 
 
 
19
  RUN cargo install --path .
 
 
 
 
20
 
21
  # We do not need the Rust toolchain to run the binary!
22
- FROM gcr.io/distroless/cc-debian11
23
- COPY --from=builder ./public/ ./public/
24
- COPY --from=builder ./websurfx/ ./websurfx/
25
  COPY --from=builder /usr/local/cargo/bin/* /usr/local/bin/
26
  CMD ["websurfx"]
 
1
  FROM rust:latest AS chef
2
  # We only pay the installation cost once,
3
  # it will be cached from the second build onwards
4
+ RUN cargo install cargo-chef --locked
5
 
6
+ WORKDIR /app
7
 
8
  FROM chef AS planner
9
  COPY . .
 
12
  FROM chef AS builder
13
  COPY --from=planner /app/recipe.json recipe.json
14
  # Build dependencies - this is the caching Docker layer!
15
+ # Uncomment the line below if you want to use the `hybrid` caching feature.
16
+ # RUN cargo chef cook --release --features redis-cache --recipe-path recipe.json
17
+ # Comment the line below if you don't want to use the `In-Memory` caching feature.
18
  RUN cargo chef cook --release --recipe-path recipe.json
19
+ # Uncomment the line below if you want to use the `no cache` feature.
20
+ # RUN cargo chef cook --release --no-default-features --recipe-path recipe.json
21
+ # Uncomment the line below if you want to use the `redis` caching feature.
22
+ # RUN cargo chef cook --release --no-default-features --features redis-cache --recipe-path recipe.json
23
 
24
  # Build application
25
  COPY . .
26
+ # Uncomment the line below if you want to use the `hybrid` caching feature.
27
+ # RUN cargo install --path . --features redis-cache
28
+ # Comment the line below if you don't want to use the `In-Memory` caching feature.
29
  RUN cargo install --path .
30
+ # Uncomment the line below if you want to use the `no cache` feature.
31
+ # RUN cargo install --path . --no-default-features
32
+ # Uncomment the line below if you want to use the `redis` caching feature.
33
+ # RUN cargo install --path . --no-default-features --features redis-cache
34
 
35
  # We do not need the Rust toolchain to run the binary!
36
+ FROM gcr.io/distroless/cc-debian12
37
+ COPY --from=builder /app/public/ /opt/websurfx/public/
38
+ VOLUME ["/etc/xdg/websurfx/"]
39
  COPY --from=builder /usr/local/cargo/bin/* /usr/local/bin/
40
  CMD ["websurfx"]
PULL_REQUEST_TEMPLATE.md CHANGED
@@ -16,7 +16,7 @@
16
 
17
  ## Author's checklist
18
 
19
- <!-- additional notes for reviewiers -->
20
 
21
  ## Related issues
22
 
 
16
 
17
  ## Author's checklist
18
 
19
+ <!-- additional notes for reviewers -->
20
 
21
  ## Related issues
22
 
README.md CHANGED
@@ -1,12 +1,22 @@
1
- <h1 align="center">
2
  <img src="./images/websurfx_logo.png" alt="websurfx logo" align="center" />
3
  </h1>
4
  <p align="center">
5
  <b align="center"><a href="README.md">Readme</a></b> |
6
  <b><a href="https://discord.gg/SWnda7Mw5u">Discord</a></b> |
 
 
7
  <b><a href="https://github.com/neon-mmd/websurfx">GitHub</a></b> |
8
- <b><a href="./docs/README.md">Documentation</a></b>
9
  <br /><br />
 
 
 
 
 
 
 
 
10
  <a href="#">
11
  <img
12
  alt="GitHub code size in bytes"
@@ -39,7 +49,7 @@
39
  >meta search engine</a
40
  >
41
  (pronounced as websurface or web-surface /wɛbˈsɜːrfəs/.) written in Rust. It
42
- provides a quick and secure search experience while maintaining user
43
  privacy.</i
44
  >
45
  </p>
@@ -49,30 +59,31 @@
49
  <p>
50
 
51
  - **Getting Started**
52
- - [🔭 Preview](#preview-)
53
- - [🚀 Features](#features-)
54
- - [🛠️ Installation and Testing](#installation-and-testing-)
55
- - [🔧 Configuration](#configuration-)
 
56
  - **Feature Overview**
57
- - [🎨 Theming](#theming-)
58
- - [🌍 Multi-Language Support](#multi-language-support-)
59
  - **Community**
60
- - [📊 System Requirements](#system-requirements-)
61
- - [🗨️ FAQ (Frequently Asked Questions)](#faq-frequently-asked-questions-)
62
- - [📣 More Contributers Wanted](#more-contributers-wanted-)
63
- - [💖 Supporting Websurfx](#supporting-websurfx-)
64
- - [📘 Documentation](#documentation-)
65
- - [🛣️ Roadmap](#roadmap-)
66
- - [🙋 Contributing](#contributing-)
67
- - [📜 License](#license-)
68
- - [🤝 Credits](#credits-)
69
 
70
  </p>
71
  </details>
72
 
73
- # Preview 🔭
74
 
75
- ## Main Page
76
 
77
  <img align="center" src="./images/main_page.png" />
78
 
@@ -86,9 +97,15 @@
86
 
87
  **[⬆️ Back to Top](#--)**
88
 
89
- # Features 🚀
 
 
 
 
90
 
91
- - 🎨 High level of customizability with nine color schemes provided by default with a simple theme, also supporting the creation of your custom themes and colorschemes very quickly and easily
 
 
92
  - 🔐 Fast, private, and secure
93
  - 🆓 100% free and open source
94
  - 💨 Ad-free and clean results
@@ -96,7 +113,7 @@
96
 
97
  **[⬆️ Back to Top](#--)**
98
 
99
- # Installation and Testing 🛠️
100
 
101
  > For full setup instructions, see: [**Installation**](./docs/installation.md)
102
 
@@ -104,9 +121,10 @@ Before you can start building `websurfx`, you will need to have `Cargo` installe
104
 
105
  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:
106
 
107
- ``` shell
108
  git clone https://github.com/neon-mmd/websurfx.git
109
  cd websurfx
 
110
  cargo build -r
111
  redis-server --port 8082 &
112
  ./target/release/websurfx
@@ -114,12 +132,14 @@ redis-server --port 8082 &
114
 
115
  Once you have started the server, open your preferred web browser and navigate to <http://127.0.0.1:8080> to start using Websurfx.
116
 
117
- > **Warning**
118
- > Please be aware that the project is still in the testing phase and is not ready for production use.
 
 
119
 
120
  **[⬆️ Back to Top](#--)**
121
 
122
- # Configuration 🔧
123
 
124
  > For full configuration instructions, see: [**Configuration**](./docs/configuration.md)
125
 
@@ -127,18 +147,18 @@ Websurfx is configured through the config.lua file, located at `websurfx/config.
127
 
128
  **[⬆️ Back to Top](#--)**
129
 
130
- # Theming 🎨
131
 
132
  > For full theming and customization instructions, see: [**Theming**](./docs/theming.md)
133
 
134
- Websurfx comes with several themes and color schemes by default, which you can apply and edit through the config file. Supports custom themes and color schemes using CSS, allowing you to develop your own unique-looking website.
135
 
136
  **[⬆️ Back to Top](#--)**
137
 
138
  # Multi-Language Support 🌍
139
 
140
  > **Note**
141
- > Currently, we do not support other languages, but in the future, we will start accepting contributions regarding language support because we believe that language should not be a barrier to entry.
142
 
143
  **[⬆️ Back to Top](#--)**
144
 
@@ -152,19 +172,19 @@ At present, we only support x86_64 architecture systems, but we would love to ha
152
 
153
  ## Why Websurfx?
154
 
155
- The primary purpose of the Websurfx project is to create a fast, secure, and privacy-focused meta-search 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).
156
 
157
  ## Why AGPLv3?
158
 
159
- Websurfx is distributed under the **AGPLv3** license to keep the source code open and transparent. This helps to keep malware, telemetry, and other dangerous programs 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.
160
 
161
  ## Why Rust?
162
 
163
- Rust was chosen as the programming language for Websurfx because of its memory safety features, which can help prevent vulnerabilities and make the codebase more secure. Rust is also faster than C++, which contributes to Websurfx's speed and responsiveness. Furthermore, the Rust ownership and borrowing system enables secure concurrency and thread safety in the program.
164
 
165
  **[⬆️ Back to Top](#--)**
166
 
167
- # More Contributers Wanted 📣
168
 
169
  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.
170
 
@@ -174,14 +194,15 @@ We are looking for more willing contributors to help grow this project. For more
174
 
175
  > For full details and other ways you can help out, see: [**Contributing**]()
176
 
177
- If you use Websurfx and would like to contribute to its development, that would be fantastic! Contributions of any size or type are always welcome, and we will properly acknowledge your efforts.
178
 
179
  Several areas that we need a bit of help with at the moment are:
 
180
  - **Better and more color schemes**: Help fix color schemes and add other famous color schemes.
181
  - **Improve evasion code for bot detection** - Help improve code related to evading IP blocking and emulating human behaviors located in everyone's engine file.
182
  - **Logo** - Help create a logo for the project and website.
183
  - **Docker Support** - Help write a Docker Compose file for the project.
184
- - Submit a PR to add a new feature, fix a bug, update the docs, add a theme, widget, or something else.
185
  - Star Websurfx on GitHub.
186
 
187
  **[⬆️ Back to Top](#--)**
@@ -189,19 +210,19 @@ Several areas that we need a bit of help with at the moment are:
189
  # Documentation 📘
190
 
191
  > **Note**
192
- > We welcome any contributions to the [documentation](./docs/) as this will benefit everyone who uses this project.
193
 
194
  **[⬆️ Back to Top](#--)**
195
 
196
  # Roadmap 🛣️
197
 
198
- > Coming soon!! 🙂.
199
 
200
  **[⬆️ Back to Top](#--)**
201
 
202
- # Contributing 🙋
203
 
204
- Contributions are welcome from anyone. It doesn\'t matter who you are; you can still contribute to the project in your own way.
205
 
206
  ## Not a developer but still want to contribute?
207
 
@@ -213,16 +234,18 @@ If you are a developer, have a look at the [CONTRIBUTING.org](CONTRIBUTING.md) d
213
 
214
  **[⬆️ Back to Top](#--)**
215
 
216
- # License 📜
217
 
218
  Websurfx is licensed under the [AGPLv3](LICENSE) license.
219
 
220
  **[⬆️ Back to Top](#--)**
221
 
222
- # Credits 🤝
223
 
224
  We would like to thank the following people for their contributions and support:
225
 
 
 
226
  <p>
227
  <br />
228
  <a href="https://github.com/neon-mmd/websurfx/graphs/contributors">
@@ -231,6 +254,14 @@ We would like to thank the following people for their contributions and support:
231
  <br />
232
  </p>
233
 
 
 
 
 
 
 
 
 
234
  **[⬆️ Back to Top](#--)**
235
 
236
  ---
 
1
+ <h1 align="center">
2
  <img src="./images/websurfx_logo.png" alt="websurfx logo" align="center" />
3
  </h1>
4
  <p align="center">
5
  <b align="center"><a href="README.md">Readme</a></b> |
6
  <b><a href="https://discord.gg/SWnda7Mw5u">Discord</a></b> |
7
+ <b><a href="../../tree/HEAD/docs/instances.md">Instances</a></b> |
8
+ <b><a href="https://discord.gg/VKCAememnr">User Showcase</a></b> |
9
  <b><a href="https://github.com/neon-mmd/websurfx">GitHub</a></b> |
10
+ <b><a href="../../tree/HEAD/docs/">Documentation</a></b>
11
  <br /><br />
12
+ <a
13
+ href="https://github.com/awesome-selfhosted/awesome-selfhosted#search-engines"
14
+ >
15
+ <img
16
+ src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg"
17
+ alt="Awesome Self-Hosted"
18
+ />
19
+ </a>
20
  <a href="#">
21
  <img
22
  alt="GitHub code size in bytes"
 
49
  >meta search engine</a
50
  >
51
  (pronounced as websurface or web-surface /wɛbˈsɜːrfəs/.) written in Rust. It
52
+ provides a quick and secure search experience while completely respecting user
53
  privacy.</i
54
  >
55
  </p>
 
59
  <p>
60
 
61
  - **Getting Started**
62
+ - [🔭 Preview](#preview-)
63
+ - [🚀 Features](#features-)
64
+ - [🔗 Instances](instances-)
65
+ - [🛠️ Installation and Testing](#installation-and-testing-%EF%B8%8F)
66
+ - [🔧 Configuration](#configuration-)
67
  - **Feature Overview**
68
+ - [🎨 Theming](#theming-)
69
+ - [🌍 Multi-Language Support](#multi-language-support-)
70
  - **Community**
71
+ - [📊 System Requirements](#system-requirements-)
72
+ - [🗨️ FAQ (Frequently Asked Questions)](#faq-frequently-asked-questions-)
73
+ - [📣 More Contributors Wanted](#more-contributors-wanted-)
74
+ - [💖 Supporting Websurfx](#supporting-websurfx-)
75
+ - [📘 Documentation](#documentation-)
76
+ - [🛣️ Roadmap](#roadmap-)
77
+ - [🙋 Contributing](#contributing-)
78
+ - [📜 License](#license-)
79
+ - [🤝 Credits](#credits-)
80
 
81
  </p>
82
  </details>
83
 
84
+ # Preview 🔭
85
 
86
+ ## Home Page
87
 
88
  <img align="center" src="./images/main_page.png" />
89
 
 
97
 
98
  **[⬆️ Back to Top](#--)**
99
 
100
+ # Instances 🔗
101
+
102
+ > For a full list of publicly available community driven `websurfx` instances to test or for daily use. see [**Instances**](./docs/instances.md)
103
+
104
+ **[⬆️ Back to Top](#--)**
105
 
106
+ # Features 🚀
107
+
108
+ - 🎨 Make Websurfx uniquely yours with twelve color schemes provided by default. It also supports creation of custom themes and color schemes in a quick and easy way, so unleash your creativity!
109
  - 🔐 Fast, private, and secure
110
  - 🆓 100% free and open source
111
  - 💨 Ad-free and clean results
 
113
 
114
  **[⬆️ Back to Top](#--)**
115
 
116
+ # Installation and Testing 🛠️
117
 
118
  > For full setup instructions, see: [**Installation**](./docs/installation.md)
119
 
 
121
 
122
  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:
123
 
124
+ ```shell
125
  git clone https://github.com/neon-mmd/websurfx.git
126
  cd websurfx
127
+ git checkout stable
128
  cargo build -r
129
  redis-server --port 8082 &
130
  ./target/release/websurfx
 
132
 
133
  Once you have started the server, open your preferred web browser and navigate to <http://127.0.0.1:8080> to start using Websurfx.
134
 
135
+ > **Note**
136
+ >
137
+ > 1. The project is no longer in the testing phase and is now ready for production use.
138
+ > 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.
139
 
140
  **[⬆️ Back to Top](#--)**
141
 
142
+ # Configuration 🔧
143
 
144
  > For full configuration instructions, see: [**Configuration**](./docs/configuration.md)
145
 
 
147
 
148
  **[⬆️ Back to Top](#--)**
149
 
150
+ # Theming 🎨
151
 
152
  > For full theming and customization instructions, see: [**Theming**](./docs/theming.md)
153
 
154
+ 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.
155
 
156
  **[⬆️ Back to Top](#--)**
157
 
158
  # Multi-Language Support 🌍
159
 
160
  > **Note**
161
+ > 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.
162
 
163
  **[⬆️ Back to Top](#--)**
164
 
 
172
 
173
  ## Why Websurfx?
174
 
175
+ 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 engine, 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 fool-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).
176
 
177
  ## Why AGPLv3?
178
 
179
+ 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.
180
 
181
  ## Why Rust?
182
 
183
+ Websurfx is based on Rust due to its memory safety features, which prevents vulnerabilities and makes 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.
184
 
185
  **[⬆️ Back to Top](#--)**
186
 
187
+ # More Contributors Wanted 📣
188
 
189
  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.
190
 
 
194
 
195
  > For full details and other ways you can help out, see: [**Contributing**]()
196
 
197
+ 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.
198
 
199
  Several areas that we need a bit of help with at the moment are:
200
+
201
  - **Better and more color schemes**: Help fix color schemes and add other famous color schemes.
202
  - **Improve evasion code for bot detection** - Help improve code related to evading IP blocking and emulating human behaviors located in everyone's engine file.
203
  - **Logo** - Help create a logo for the project and website.
204
  - **Docker Support** - Help write a Docker Compose file for the project.
205
+ - Submit a PR to add a new feature, fix a bug, update the docs, add a theme, widget, or anything else.
206
  - Star Websurfx on GitHub.
207
 
208
  **[⬆️ Back to Top](#--)**
 
210
  # Documentation 📘
211
 
212
  > **Note**
213
+ > We welcome any contributions to the [documentation](../../tree/HEAD/docs/) as this will benefit everyone who uses this project.
214
 
215
  **[⬆️ Back to Top](#--)**
216
 
217
  # Roadmap 🛣️
218
 
219
+ > Coming soon! 🙂.
220
 
221
  **[⬆️ Back to Top](#--)**
222
 
223
+ # Contributing 🙋
224
 
225
+ Contributions are welcome from anyone. It doesn't matter who you are; you can still contribute to the project in your own way.
226
 
227
  ## Not a developer but still want to contribute?
228
 
 
234
 
235
  **[⬆️ Back to Top](#--)**
236
 
237
+ # License 📜
238
 
239
  Websurfx is licensed under the [AGPLv3](LICENSE) license.
240
 
241
  **[⬆️ Back to Top](#--)**
242
 
243
+ # Credits 🤝
244
 
245
  We would like to thank the following people for their contributions and support:
246
 
247
+ **Contributors**
248
+
249
  <p>
250
  <br />
251
  <a href="https://github.com/neon-mmd/websurfx/graphs/contributors">
 
254
  <br />
255
  </p>
256
 
257
+ **Stargazers**
258
+
259
+ <p>
260
+ <a href="https://github.com/neon-mmd/websurfx/stargazers">
261
+ <img src="https://reporoster.com/stars/dark/neon-mmd/websurfx" />
262
+ </a>
263
+ </p>
264
+
265
  **[⬆️ Back to Top](#--)**
266
 
267
  ---
docker-compose.yml CHANGED
@@ -1,3 +1,4 @@
 
1
  version: "3.9"
2
  services:
3
  app:
@@ -5,11 +6,15 @@ services:
5
  build: .
6
  ports:
7
  - 8080:8080
8
- depends_on:
9
- - redis
10
- links:
11
- - redis
12
- redis:
13
- image: redis:latest
14
- ports:
15
- - 6379:6379
 
 
 
 
 
1
+ ---
2
  version: "3.9"
3
  services:
4
  app:
 
6
  build: .
7
  ports:
8
  - 8080:8080
9
+ # Uncomment the following lines if you are using the `hybrid` or `redis` caching feature.
10
+ # depends_on:
11
+ # - redis
12
+ # links:
13
+ # - redis
14
+ volumes:
15
+ - ./websurfx/:/etc/xdg/websurfx/
16
+ # Uncomment the following lines if you are using the `hybrid` or `redis` caching feature.
17
+ # redis:
18
+ # image: redis:latest
19
+ # ports:
20
+ # - 6379:6379
docs/README.md CHANGED
@@ -7,7 +7,9 @@
7
 
8
  # Users
9
 
 
10
  - [Installation](./installation.md)
 
11
  - [Configuration](./configuration.md)
12
  - [Theming](./theming.md)
13
 
 
7
 
8
  # Users
9
 
10
+ - [Instances](./instances.md)
11
  - [Installation](./installation.md)
12
+ - [Features](./features.md)
13
  - [Configuration](./configuration.md)
14
  - [Theming](./theming.md)
15
 
docs/configuration.md CHANGED
@@ -11,33 +11,59 @@ If you have built `websurfx` from source then the configuration file will be loc
11
 
12
  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/` and make the changes there and rerun the websurfx server.
13
 
14
- Some of the configuration options provided in the file are stated below. These are subdivided into three categories:
15
 
 
16
  - Server
 
17
  - Website
18
  - Cache
 
 
 
 
 
 
 
19
 
20
  ## Server
21
 
22
  - **port:** Port number on which server should be launched.
23
  - **binding_ip_addr:** IP address on the which server should be launched.
24
- - **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. This is newly added option and hence is only available in the **edge version**.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
  ## Website
27
 
28
  - **colorscheme:** The colorscheme name which should be used for the website theme (the name should be in accordance to the colorscheme file name present in `public/static/colorschemes` folder).
29
 
30
- > By Default we provide 9 colorschemes to choose from these are:
31
  >
32
  > 1. catppuccin-mocha
33
- > 2. dracula
34
- > 3. monokai
35
- > 4. nord
36
- > 5. oceanic-next
37
- > 6. solarized-dark
38
- > 7. solarized-light
39
- > 8. tomorrow-night
40
- > 9. gruvbox-dark
 
 
 
41
 
42
  - **theme:** The theme name which should be used for the website (again, the name should be in accordance to the theme file name present in `public/static/themes` folder).
43
 
@@ -47,6 +73,13 @@ Some of the configuration options provided in the file are stated below. These a
47
 
48
  ## Cache
49
 
50
- - **redis_connection_url:** Redis connection url address on which the client should connect on.
 
 
 
 
 
 
 
51
 
52
- [⬅️ Go back to Home](./README.md)
 
11
 
12
  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/` and make the changes there and rerun the websurfx server.
13
 
14
+ Some of the configuration options provided in the file are stated below. These are subdivided into the following categories:
15
 
16
+ - General
17
  - Server
18
+ - Search
19
  - Website
20
  - Cache
21
+ - Search Engines
22
+
23
+ # General
24
+
25
+ - **logging:** An option to enable or disable logs.
26
+ - **debug:** An option to enable or disable debug mode.
27
+ - **threads:** The amount of threads that the app will use to run (the value should be greater than 0).
28
 
29
  ## Server
30
 
31
  - **port:** Port number on which server should be launched.
32
  - **binding_ip_addr:** IP address on the which server should be launched.
33
+ - **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.
34
+ - **request_timeout:** Timeout for the search requests sent to the upstream search engines to be fetched (value in seconds).
35
+ - **rate_limiter:** The configuration option to configure rate limiting on the search engine website.
36
+
37
+ ## Search
38
+
39
+ - **safe_search:** This option is used to configure the search filtering based on different safe search levels. (value a number between 0 to 4)
40
+
41
+ > This option provides 4 levels of search filtering:
42
+ >
43
+ > - Level 0 - With this level no search filtering occurs.
44
+ > - Level 1 - With this level some search filtering occurs.
45
+ > - Level 2 - With this level the upstream search engines are restricted to send sensitive contents like NSFW search results, etc.
46
+ > - Level 3 - With this level the regex based filter lists is used alongside level 2 to filter more search results that have slipped in or custom results that needs to be filtered using the filter lists.
47
+ > - 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 parent or someone who wants to completely disallow their kids or yourself from watching sensitive content.
48
 
49
  ## Website
50
 
51
  - **colorscheme:** The colorscheme name which should be used for the website theme (the name should be in accordance to the colorscheme file name present in `public/static/colorschemes` folder).
52
 
53
+ > By Default we provide 12 colorschemes to choose from these are:
54
  >
55
  > 1. catppuccin-mocha
56
+ > 2. dark-chocolate
57
+ > 3. dracula
58
+ > 4. gruvbox-dark
59
+ > 5. monokai
60
+ > 6. nord
61
+ > 7. oceanic-next
62
+ > 8. one-dark
63
+ > 9. solarized-dark
64
+ > 10. solarized-light
65
+ > 11. tokyo-night
66
+ > 12. tomorrow-night
67
 
68
  - **theme:** The theme name which should be used for the website (again, the name should be in accordance to the theme file name present in `public/static/themes` folder).
69
 
 
73
 
74
  ## Cache
75
 
76
+ - **redis_url:** Redis connection url address on which the client should connect on.
77
+
78
+ > **Note**
79
+ > This option can be commented out if you have compiled the app without the `redis-cache` feature. For more information, See [**building**](./building.md).
80
+
81
+ ## Search Engines
82
+
83
+ - **upstream_search_engines:** Select from the different upstream search engines from which the results should be fetched.
84
 
85
+ [⬅️ Go back to Home](./README.md)
docs/features.md ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Features
2
+
3
+ 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.
4
+
5
+ The different caching features provided are as follows:
6
+ - No cache
7
+ - Redis cache
8
+ - In memory cache
9
+ - Hybrid cache
10
+
11
+ ## Explaination
12
+
13
+ ### No Cache
14
+
15
+ 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 becomes slower as each refresh has to fetch the results from the upstream search engines.
16
+
17
+ ### Redis Cache
18
+
19
+ 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.
20
+
21
+ ### In Memory Cache
22
+
23
+ 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 an advantage that it is extremely reliable as all the results are stored in memory within the search engine. Though the disadvantage of this solution are 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.
24
+
25
+ ### Hybrid Cache
26
+
27
+ This feature provides the advantages of both `In Memory` caching and `Redis` caching and it is an ideal solution if you need a very resiliant 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 `Websurfx` instance which will be used by hundreds or thousands of users over the world.
28
+
29
+ ## Tabular Summary
30
+
31
+
32
+ | **Attributes** | **Hybrid** | **In-Memory** | **No Cache** | **Redis** |
33
+ |-----------------------------------------|------------|------------------------------------------------------|-----------------|------------------------|
34
+ | **Speed** | Fast | Caching is slow, but retrieval of cache data is fast | Slow | Fastest |
35
+ | **Reliability** | ✅ | ✅ | ✅ | ❌ |
36
+ | **Scalability** | ✅ | ❌ | - | ✅ |
37
+ | **Resiliancy** | ✅ | ✅ | ✅ | ❌ |
38
+ | **Production/Large Scale/Instance use** | ✅ | Not Recommended | Not Recommended | Not Recommended |
39
+ | **Low Memory Support** | ❌ | ❌ | ✅ | ❌ |
40
+ | **Binary Size** | Big | Bigger than `No Cache` | small | Bigger than `No Cache` |
41
+
42
+ [⬅️ Go back to Home](./README.md)
docs/installation.md CHANGED
@@ -2,16 +2,17 @@
2
 
3
  ## Arch Linux
4
 
5
- You can install `Websurfx` through the [Aur](https://aur.archlinux.org/packages/websurfx-git), Currently we only support `Rolling/Edge` version. You can install the rolling/edge version by running the following command (using [paru](https://github.com/Morganamilo/paru)):
6
 
7
- ```bash
 
 
8
  paru -S websurfx-edge-git
9
  ```
10
 
11
  After installing it you can run the websurfx server by running the following commands:
12
 
13
- ``` bash
14
- redis-server --port 8082 &
15
  websurfx
16
  ```
17
 
@@ -19,7 +20,79 @@ Once you have started the server, open your preferred web browser and navigate t
19
 
20
  If you want to change the port or the ip or any other configuration setting checkout the [configuration docs](./configuration.md).
21
 
22
- ## Other Distros
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  The package is currently not available on other Linux distros. With contribution and support it can be made available on other distros as well 🙂.
25
 
@@ -34,6 +107,7 @@ To get started with Websurfx, clone the repository, edit the config file which i
34
  ```shell
35
  git clone https://github.com/neon-mmd/websurfx.git
36
  cd websurfx
 
37
  cargo build -r
38
  redis-server --port 8082 &
39
  ./target/release/websurfx
@@ -50,13 +124,63 @@ If you want to use the rolling/edge branch, run the following commands instead:
50
  ```shell
51
  git clone https://github.com/neon-mmd/websurfx.git
52
  cd websurfx
53
- git checkout rolling
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  cargo build -r
55
- redis-server --port 8082 &
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  ./target/release/websurfx
57
  ```
58
 
59
- Once you have started the server, open your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
60
 
61
  If you want to change the port or the ip or any other configuration setting checkout the [configuration docs](./configuration.md).
62
 
@@ -64,7 +188,121 @@ If you want to change the port or the ip or any other configuration setting chec
64
 
65
  Before you start, you will need [Docker](https://docs.docker.com/get-docker/) installed on your system first.
66
 
67
- ## Stable
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
 
69
  First clone the the repository by running the following command:
70
 
@@ -76,49 +314,82 @@ cd websurfx
76
  After that edit the config.lua file located under `websurfx` directory. In the config file you will specifically need to change to values which is `binding_ip_addr` and `redis_connection_url` which should make the config look something like this:
77
 
78
  ```lua
79
- -- Server
 
 
 
 
 
80
  port = "8080" -- port on which server should be launched
81
- binding_ip_addr = "0.0.0.0" --ip address on the which server should be launched.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
- -- Website
84
  -- The different colorschemes provided are:
85
  -- {{
86
  -- catppuccin-mocha
 
87
  -- dracula
 
88
  -- monokai
89
  -- nord
90
  -- oceanic-next
 
91
  -- solarized-dark
92
  -- solarized-light
 
93
  -- tomorrow-night
94
  -- }}
95
  colorscheme = "catppuccin-mocha" -- the colorscheme name which should be used for the website theme
96
  theme = "simple" -- the theme name which should be used for the website
97
 
98
- -- Caching
99
- redis_connection_url = "redis://127.0.0.1:8082" -- redis connection url address on which the client should connect on.
100
 
101
- 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)
102
- -- if production_use is set to true
103
- -- 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.
 
 
104
  ```
105
 
106
- After this run the following command to deploy the app:
107
 
108
  ```bash
109
- docker compose up -d --build
110
  ```
111
 
 
 
 
112
  This will take around 5-10 mins for first deployment, afterwards the docker build stages will be cached so it will be faster to be 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>`.
113
 
114
- ## Unstable/Edge/Rolling
115
 
116
- For the unstable/rolling/edge version, follow the same steps as above (as mentioned for the stable version) with an addition of one command which has to be performed after cloning and changing directory into the repository which makes the cloning step as follows:
117
 
118
  ```bash
119
  git clone https://github.com/neon-mmd/websurfx.git
120
  cd websurfx
121
- git checkout rolling
122
  ```
123
 
124
- [⬅️ Go back to Home](./README.md)
 
2
 
3
  ## Arch Linux
4
 
5
+ ### Rolling/Edge/Unstable
6
 
7
+ 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)):
8
+
9
+ ```shell
10
  paru -S websurfx-edge-git
11
  ```
12
 
13
  After installing it you can run the websurfx server by running the following commands:
14
 
15
+ ```shell
 
16
  websurfx
17
  ```
18
 
 
20
 
21
  If you want to change the port or the ip or any other configuration setting checkout the [configuration docs](./configuration.md).
22
 
23
+ ### Stable
24
+
25
+ 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 stable version is called `websurfx-git` instead of `websurfx-edge-git`.
26
+
27
+ ## NixOS
28
+
29
+ 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`.
30
+
31
+ 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.
32
+
33
+ ### Rolling/Edge/Unstable
34
+
35
+ 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:
36
+
37
+ ```shell
38
+ git clone https://github.com/neon-mmd/websurfx.git
39
+ cd websurfx
40
+ cp -rf ./websurfx/ ~/.config/
41
+ $ mkdir /opt/websurfx/
42
+ $ cp -rf ./public/ /opt/websurfx/
43
+ nix build .#websurfx
44
+ nix run .#websurfx
45
+ ```
46
+
47
+ > **Note**
48
+ > In the above command the dollar sign(**$**) refers to running the command in privilaged mode by using utilities `sudo`, `doas`, `pkgexec` or any other privilage access methods.
49
+
50
+ Once you have run the above set of commands, then open your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
51
+
52
+ If you want to change the port or the ip or any other configuration setting checkout the [configuration docs](./configuration.md).
53
+
54
+ > Optionally, you may include it in your own flake by adding this repo to its inputs and adding it to `environment.systemPackages` as follows:
55
+ >
56
+ > ```nix
57
+ > {
58
+ > description = "My awesome configuration";
59
+ >
60
+ > inputs = {
61
+ > websurfx.url = "github:neon-mmd/websurfx";
62
+ > };
63
+ >
64
+ > outputs = { nixpkgs, ... }@inputs: {
65
+ > nixosConfigurations = {
66
+ > hostname = nixpkgs.lib.nixosSystem {
67
+ > system = "x86_64-linux";
68
+ > modules = [{
69
+ > environment.systemPackages = [inputs.websurfx.packages.x86_64-linux.websurfx];
70
+ > }];
71
+ > };
72
+ > };
73
+ > };
74
+ > }
75
+ > ```
76
+
77
+ ### Stable
78
+
79
+ 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 directory into the repository which makes the building step as follows:
80
+
81
+ ```shell
82
+ git clone https://github.com/neon-mmd/websurfx.git
83
+ cd websurfx
84
+ git checkout stable
85
+ cp -rf ./websurfx/ ~/.config/
86
+ $ mkdir /opt/websurfx/
87
+ $ cp -rf ./public/ /opt/websurfx/
88
+ nix build .#websurfx
89
+ nix run .#websurfx
90
+ ```
91
+
92
+ > **Note**
93
+ > In the above command the dollar sign(**$**) refers to running the command in privilaged mode by using utilities `sudo`, `doas`, `pkgexec` or any other privilage access methods.
94
+
95
+ ## Other Distros
96
 
97
  The package is currently not available on other Linux distros. With contribution and support it can be made available on other distros as well 🙂.
98
 
 
107
  ```shell
108
  git clone https://github.com/neon-mmd/websurfx.git
109
  cd websurfx
110
+ git checkout stable
111
  cargo build -r
112
  redis-server --port 8082 &
113
  ./target/release/websurfx
 
124
  ```shell
125
  git clone https://github.com/neon-mmd/websurfx.git
126
  cd websurfx
127
+ ```
128
+
129
+ Once you have changed the directory to the `websurfx` directory then follow the build options listed below:
130
+
131
+ ### Hybrid Cache
132
+
133
+ > For more information on the features and their pros and cons. see: [**Features**](./features.md)
134
+
135
+ To build the search engine with the `Hybrid caching` feature. Run the following build command:
136
+
137
+ ```shell
138
+ cargo build -r --features redis-cache
139
+ ```
140
+
141
+ ### Memory Cache (Default Feature)
142
+
143
+ > For more information on the features and their pros and cons. see: [**Features**](./features.md)
144
+
145
+ To build the search engine with the `In-Memory caching` feature. Run the following build command:
146
+
147
+ ```shell
148
  cargo build -r
149
+ ```
150
+
151
+ ### No Cache
152
+
153
+ > For more information on the features and their pros and cons. see: [**Features**](./features.md)
154
+
155
+ To build the search engine with the `No caching` feature. Run the following build command:
156
+
157
+ ```shell
158
+ cargo build -r --no-default-features
159
+ ```
160
+
161
+ ### Redis Cache
162
+
163
+ > For more information on the features and their pros and cons. see: [**Features**](./features.md)
164
+
165
+ To build the search engine with the `hybrid caching` feature. Run the following build command:
166
+
167
+ ```shell
168
+ cargo build -r --no-default-features --features redis-cache
169
+ ```
170
+
171
+ > Optionally, If you have build the app with the `Redis cache`or `Hybrid cache` feature (as mentioned above) then before launching the search engine run the following command:
172
+ >
173
+ > ```shell
174
+ > redis-server --port 8082 &
175
+ > ```
176
+
177
+ Once you have finished building the `search engine`. then run the following command to start the search engine:
178
+
179
+ ```shell
180
  ./target/release/websurfx
181
  ```
182
 
183
+ Once you have started the server, then launch your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
184
 
185
  If you want to change the port or the ip or any other configuration setting checkout the [configuration docs](./configuration.md).
186
 
 
188
 
189
  Before you start, you will need [Docker](https://docs.docker.com/get-docker/) installed on your system first.
190
 
191
+ ## Prebuild
192
+
193
+ The Websurfx project provides several prebuild 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:
194
+
195
+ ```yaml
196
+ ---
197
+ version: '3.9'
198
+ services:
199
+ app:
200
+ # Comment the line below if you don't want to use the `hybrid/latest` image.
201
+ image: neonmmd/websurfx:latest
202
+ # Uncomment the line below if you want to use the `no cache` image.
203
+ # image: neonmmd/websurfx:nocache
204
+ # Uncomment the line below if you want to use the `memory` image.
205
+ # image: neonmmd/websurfx:memory
206
+ # Uncomment the line below if you want to use the `redis` image.
207
+ # image: neonmmd/websurfx:redis
208
+ ports:
209
+ - 8080:8080
210
+ # Uncomment the following lines if you are using the `hybrid/latest` or `redis` image.
211
+ # depends_on:
212
+ # - redis
213
+ # links:
214
+ # - redis
215
+ volumes:
216
+ - ./websurfx/:/etc/xdg/websurfx/
217
+ # Uncomment the following lines if you are using the `hybrid/latest` or `redis` image.
218
+ # redis:
219
+ # image: redis:latest
220
+ # ports:
221
+ # - 6379:6379
222
+ ```
223
+
224
+ 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:
225
+
226
+ ```lua
227
+ -- ### General ###
228
+ logging = true -- an option to enable or disable logs.
229
+ debug = false -- an option to enable or disable debug mode.
230
+ threads = 8 -- the amount of threads that the app will use to run (the value should be greater than 0).
231
+
232
+ -- ### Server ###
233
+ port = "8080" -- port on which server should be launched
234
+ binding_ip = "0.0.0.0" --ip address on the which server should be launched.
235
+ 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))
236
+ -- if production_use is set to true
237
+ -- 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.
238
+ request_timeout = 30 -- timeout for the search requests sent to the upstream search engines to be fetched (value in seconds).
239
+ rate_limiter = {
240
+ number_of_requests = 20, -- The number of request that are allowed within a provided time limit.
241
+ time_limit = 3, -- The time limit in which the quantity of requests that should be accepted.
242
+ }
243
+
244
+ -- ### Search ###
245
+ -- Filter results based on different levels. The levels provided are:
246
+ -- {{
247
+ -- 0 - None
248
+ -- 1 - Low
249
+ -- 2 - Moderate
250
+ -- 3 - High
251
+ -- 4 - Aggressive
252
+ -- }}
253
+ safe_search = 2
254
+
255
+ -- ### Website ###
256
+ -- The different colorschemes provided are:
257
+ -- {{
258
+ -- catppuccin-mocha
259
+ -- dark-chocolate
260
+ -- dracula
261
+ -- gruvbox-dark
262
+ -- monokai
263
+ -- nord
264
+ -- oceanic-next
265
+ -- one-dark
266
+ -- solarized-dark
267
+ -- solarized-light
268
+ -- tokyo-night
269
+ -- tomorrow-night
270
+ -- }}
271
+ colorscheme = "catppuccin-mocha" -- the colorscheme name which should be used for the website theme
272
+ theme = "simple" -- the theme name which should be used for the website
273
+
274
+ -- ### Caching ###
275
+ redis_url = "redis://redis:6379" -- redis connection url address on which the client should connect on.
276
+
277
+ -- ### Search Engines ###
278
+ upstream_search_engines = {
279
+ DuckDuckGo = true,
280
+ Searx = false,
281
+ } -- select the upstream search engines from which the results should be fetched.
282
+ ```
283
+
284
+ Then run the following command to deploy the search engine:
285
+
286
+ ```shell
287
+ $ docker compose up -d
288
+ ```
289
+
290
+ > **Note**
291
+ > In the above command the dollar sign(**$**) refers to running the command in privilaged mode by using utilities `sudo`, `doas`, `pkgexec` or any other privilage access methods.
292
+
293
+ Then launch the browser of your choice and navigate to http://<ip_address_of_the_device>:<whatever_port_you_provided_in_the_config>.
294
+
295
+ > **Note**
296
+ > 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 🙂.
297
+
298
+ ## Manual Deployment
299
+
300
+ This section covers how to deploy the app with docker manually by manually building the image and deploying it.
301
+
302
+ > **Note**
303
+ > This section is provided for those who want to futher customize the docker image or for those who are extra cautious about security.
304
+
305
+ ### Unstable/Edge/Rolling
306
 
307
  First clone the the repository by running the following command:
308
 
 
314
  After that edit the config.lua file located under `websurfx` directory. In the config file you will specifically need to change to values which is `binding_ip_addr` and `redis_connection_url` which should make the config look something like this:
315
 
316
  ```lua
317
+ -- ### General ###
318
+ logging = true -- an option to enable or disable logs.
319
+ debug = false -- an option to enable or disable debug mode.
320
+ threads = 8 -- the amount of threads that the app will use to run (the value should be greater than 0).
321
+
322
+ -- ### Server ###
323
  port = "8080" -- port on which server should be launched
324
+ binding_ip = "0.0.0.0" --ip address on the which server should be launched.
325
+ 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))
326
+ -- if production_use is set to true
327
+ -- 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.
328
+ request_timeout = 30 -- timeout for the search requests sent to the upstream search engines to be fetched (value in seconds).
329
+ rate_limiter = {
330
+ number_of_requests = 20, -- The number of request that are allowed within a provided time limit.
331
+ time_limit = 3, -- The time limit in which the quantity of requests that should be accepted.
332
+ }
333
+
334
+ -- ### Search ###
335
+ -- Filter results based on different levels. The levels provided are:
336
+ -- {{
337
+ -- 0 - None
338
+ -- 1 - Low
339
+ -- 2 - Moderate
340
+ -- 3 - High
341
+ -- 4 - Aggressive
342
+ -- }}
343
+ safe_search = 2
344
 
345
+ -- ### Website ###
346
  -- The different colorschemes provided are:
347
  -- {{
348
  -- catppuccin-mocha
349
+ -- dark-chocolate
350
  -- dracula
351
+ -- gruvbox-dark
352
  -- monokai
353
  -- nord
354
  -- oceanic-next
355
+ -- one-dark
356
  -- solarized-dark
357
  -- solarized-light
358
+ -- tokyo-night
359
  -- tomorrow-night
360
  -- }}
361
  colorscheme = "catppuccin-mocha" -- the colorscheme name which should be used for the website theme
362
  theme = "simple" -- the theme name which should be used for the website
363
 
364
+ -- ### Caching ###
365
+ redis_url = "redis://redis:6379" -- redis connection url address on which the client should connect on.
366
 
367
+ -- ### Search Engines ###
368
+ upstream_search_engines = {
369
+ DuckDuckGo = true,
370
+ Searx = false,
371
+ } -- select the upstream search engines from which the results should be fetched.
372
  ```
373
 
374
+ After this make sure to edit the `docker-compose.yml` and `Dockerfile` files as required and run the following command to deploy the app:
375
 
376
  ```bash
377
+ $ docker compose up -d --build
378
  ```
379
 
380
+ > **Note**
381
+ > In the above command the dollar sign(**$**) refers to running the command in privilaged mode by using utilities `sudo`, `doas`, `pkgexec` or any other privilage access methods.
382
+
383
  This will take around 5-10 mins for first deployment, afterwards the docker build stages will be cached so it will be faster to be 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>`.
384
 
385
+ ### Stable
386
 
387
+ 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 directory into the repository which makes the cloning step as follows:
388
 
389
  ```bash
390
  git clone https://github.com/neon-mmd/websurfx.git
391
  cd websurfx
392
+ git checkout stable
393
  ```
394
 
395
+ [⬅️ Go back to Home](./README.md)
docs/instances.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Instances
2
+
3
+ > To contribute your server instance, check out the contributing guide [here](https://github.com/neon-mmd/websurfx/blob/HEAD/CONTRIBUTING.md).
4
+
5
+ This page provides a list of `Websurfx` instances provided by us and our community.
6
+
7
+ |URL|Network|Version|Location|Behind Cloudflare?|Maintained By|TLS|IPv6|Comment|
8
+ |-|-|-|-|-|-|-|-|-|
9
+ |https://alamin655-websurfx.hf.space/|www|v0.21.4|🇺🇸 US||[websurfx project](https://github.com/neon-mmd/websurfx)|✅|||
10
+
11
+
12
+ [⬅️ Go back to Home](./README.md)
docs/theming.md CHANGED
@@ -8,17 +8,17 @@ By default `websurfx` comes with 9 colorschemes to choose from which can be easi
8
 
9
  Creating coloschemes is as easy as it gets it requires the user to have a theme file name with the colorscheme 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:
10
 
11
- ``` css
12
- :root{
13
- --bg: <background color>;
14
- --fg: <foreground color (text color)>;
15
- --1: <color 1>;
16
- --2: <color 2>;
17
- --3: <color 3>;
18
- --4: <color 4>;
19
- --5: <color 5>;
20
- --6: <color 6>;
21
- --7: <color 7>;
22
  }
23
  ```
24
 
@@ -27,17 +27,17 @@ Creating coloschemes is as easy as it gets it requires the user to have a theme
27
 
28
  **Example of `catppuccin-mocha` colorscheme:**
29
 
30
- ``` css
31
  :root {
32
- --bg: #1e1e2e;
33
- --fg: #cdd6f4;
34
- --1: #45475a;
35
- --2: #f38ba8;
36
- --3: #a6e3a1;
37
- --4: #f9e2af;
38
- --5: #89b4fa;
39
- --6: #f5c2e7;
40
- --7: #ffffff;
41
  }
42
  ```
43
 
@@ -47,14 +47,15 @@ Creating coloschemes is as easy as it gets it requires the user to have a theme
47
 
48
  By default `websurfx` comes with 1 theme to choose from which can be easily chosen using the config file. To how to change themes please view the [Configuration](https://github.com/neon-mmd/websurfx/wiki/configuration) section of the wiki.
49
 
50
- ## Custom
51
 
52
- To write custom color scheme, it requires the user to have some knowledge of `css stylesheets`.
53
 
54
  **Here is an example of `simple theme` (which we provide by default with the app) which will give the user a better idea on how to create a custom theme using it as a template:**
55
 
56
  ### General
57
- ``` css
 
58
  * {
59
  padding: 0;
60
  margin: 0;
@@ -71,11 +72,13 @@ body {
71
  justify-content: space-between;
72
  align-items: center;
73
  height: 100vh;
74
- background: var(--1);
75
  }
76
  ```
 
77
  ### Styles for the index page
78
- ``` css
 
79
  .search-container {
80
  display: flex;
81
  flex-direction: column;
@@ -88,8 +91,10 @@ body {
88
  display: flex;
89
  }
90
  ```
 
91
  ### Styles for the search box and search button
92
- ``` css
 
93
  .search_bar {
94
  display: flex;
95
  }
@@ -101,7 +106,7 @@ body {
101
  outline: none;
102
  border: none;
103
  box-shadow: rgba(0, 0, 0, 1);
104
- background: var(--fg);
105
  }
106
 
107
  .search_bar button {
@@ -114,8 +119,8 @@ body {
114
  outline: none;
115
  border: none;
116
  gap: 0;
117
- background: var(--bg);
118
- color: var(--3);
119
  font-weight: 600;
120
  letter-spacing: 0.1rem;
121
  }
@@ -124,11 +129,133 @@ body {
124
  .search_bar button:hover {
125
  filter: brightness(1.2);
126
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  ### Styles for the footer and header
129
- ``` css
 
130
  header {
131
- background: var(--bg);
132
  width: 100%;
133
  display: flex;
134
  justify-content: right;
@@ -151,7 +278,7 @@ footer ul li a,
151
  header ul li a:visited,
152
  footer ul li a:visited {
153
  text-decoration: none;
154
- color: var(--2);
155
  text-transform: capitalize;
156
  letter-spacing: 0.1rem;
157
  }
@@ -162,7 +289,27 @@ header ul li a {
162
 
163
  header ul li a:hover,
164
  footer ul li a:hover {
165
- color: var(--5);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  }
167
 
168
  footer div span {
@@ -185,8 +332,10 @@ footer {
185
  align-items: center;
186
  }
187
  ```
 
188
  ### Styles for the search page
189
- ``` css
 
190
  .results {
191
  width: 90%;
192
  display: flex;
@@ -213,28 +362,28 @@ footer {
213
 
214
  .results_aggregated .result h1 a {
215
  font-size: 1.5rem;
216
- color: var(--2);
217
  text-decoration: none;
218
  letter-spacing: 0.1rem;
219
  }
220
 
221
  .results_aggregated .result h1 a:hover {
222
- color: var(--5);
223
  }
224
 
225
  .results_aggregated .result h1 a:visited {
226
- color: var(--bg);
227
  }
228
 
229
  .results_aggregated .result small {
230
- color: var(--3);
231
  font-size: 1.1rem;
232
  word-wrap: break-word;
233
  line-break: anywhere;
234
  }
235
 
236
  .results_aggregated .result p {
237
- color: var(--fg);
238
  font-size: 1.2rem;
239
  margin-top: 0.3rem;
240
  word-wrap: break-word;
@@ -245,13 +394,13 @@ footer {
245
  text-align: right;
246
  font-size: 1.2rem;
247
  padding: 1rem;
248
- color: var(--5);
249
  }
250
  ```
251
 
252
- ### Styles for the 404 page
253
 
254
- ``` css
255
  .error_container {
256
  display: flex;
257
  justify-content: center;
@@ -290,16 +439,18 @@ footer {
290
 
291
  .error_content p a,
292
  .error_content p a:visited {
293
- color: var(--2);
294
  text-decoration: none;
295
  }
296
 
297
  .error_content p a:hover {
298
- color: var(--5);
299
  }
300
  ```
 
301
  ### Styles for the previous and next button on the search page
302
- ``` css
 
303
  .page_navigation {
304
  padding: 0 0 2rem 0;
305
  display: flex;
@@ -308,8 +459,8 @@ footer {
308
  }
309
 
310
  .page_navigation button {
311
- background: var(--bg);
312
- color: var(--fg);
313
  padding: 1rem;
314
  border-radius: 0.5rem;
315
  outline: none;
@@ -326,40 +477,258 @@ footer {
326
  This part is only available right now in the **rolling/edge/unstable** version
327
 
328
  ```css
329
- .about-container article{
330
- font-size: 1.5rem;
331
- color:var(--fg);
332
- padding-bottom: 10px;
333
- }
334
 
335
- .about-container article h1{
336
- color: var(--2);
337
- font-size: 2.8rem;
338
- }
339
 
340
- .about-container article div{
341
- padding-bottom: 15px;
342
- }
343
 
344
- .about-container a{
345
- color:var(--3);
346
  }
347
 
348
- .about-container article h2{
349
- color: var(--3);
350
  font-size: 1.8rem;
351
  padding-bottom: 10px;
352
  }
353
 
354
- .about-container p{
355
- color:var(--fg);
356
- font-size: 1.6rem;
357
  padding-bottom: 10px;
358
  }
359
 
360
- .about-container h3{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
361
  font-size: 1.5rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
362
  }
363
  ```
364
 
365
- [⬅️ Go back to Home](./README.md)
 
8
 
9
  Creating coloschemes is as easy as it gets it requires the user to have a theme file name with the colorscheme 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:
10
 
11
+ ```css
12
+ :root {
13
+ --background-color: <background color>;
14
+ --foreground-color: <foreground color (text color on the website) >;
15
+ --color-one: <color 1>;
16
+ --color-two: <color 2>;
17
+ --color-three: <color 3>;
18
+ --color-four: <color 4>;
19
+ --color-five: <color 5>;
20
+ --color-six: <color 6>;
21
+ --color-seven: <color 7>;
22
  }
23
  ```
24
 
 
27
 
28
  **Example of `catppuccin-mocha` colorscheme:**
29
 
30
+ ```css
31
  :root {
32
+ --background-color: #1e1e2e;
33
+ --foreground-color: #cdd6f4;
34
+ --color-one: #45475a;
35
+ --color-two: #f38ba8;
36
+ --color-three: #a6e3a1;
37
+ --color-four: #f9e2af;
38
+ --color-five: #89b4fa;
39
+ --color-six: #f5c2e7;
40
+ --color-seven: #ffffff;
41
  }
42
  ```
43
 
 
47
 
48
  By default `websurfx` comes with 1 theme to choose from which can be easily chosen using the config file. To how to change themes please view the [Configuration](https://github.com/neon-mmd/websurfx/wiki/configuration) section of the wiki.
49
 
50
+ ## Custom
51
 
52
+ To write custom color scheme, it requires the user to have some knowledge of `css stylesheets`.
53
 
54
  **Here is an example of `simple theme` (which we provide by default with the app) which will give the user a better idea on how to create a custom theme using it as a template:**
55
 
56
  ### General
57
+
58
+ ```css
59
  * {
60
  padding: 0;
61
  margin: 0;
 
72
  justify-content: space-between;
73
  align-items: center;
74
  height: 100vh;
75
+ background: var(--color-one);
76
  }
77
  ```
78
+
79
  ### Styles for the index page
80
+
81
+ ```css
82
  .search-container {
83
  display: flex;
84
  flex-direction: column;
 
91
  display: flex;
92
  }
93
  ```
94
+
95
  ### Styles for the search box and search button
96
+
97
+ ```css
98
  .search_bar {
99
  display: flex;
100
  }
 
106
  outline: none;
107
  border: none;
108
  box-shadow: rgba(0, 0, 0, 1);
109
+ background: var(--foreground-color);
110
  }
111
 
112
  .search_bar button {
 
119
  outline: none;
120
  border: none;
121
  gap: 0;
122
+ background: var(--background-color);
123
+ color: var(--color-three);
124
  font-weight: 600;
125
  letter-spacing: 0.1rem;
126
  }
 
129
  .search_bar button:hover {
130
  filter: brightness(1.2);
131
  }
132
+
133
+ .search_area .search_options {
134
+ display: flex;
135
+ justify-content: space-between;
136
+ align-items: center;
137
+ }
138
+
139
+ .search_area .search_options select {
140
+ margin: 0.7rem 0;
141
+ width: 20rem;
142
+ background-color: var(--color-one);
143
+ color: var(--foreground-color);
144
+ padding: 1rem 2rem;
145
+ border-radius: 0.5rem;
146
+ outline: none;
147
+ border: none;
148
+ text-transform: capitalize;
149
+ }
150
+
151
+ .search_area .search_options option:hover {
152
+ background-color: var(--color-one);
153
+ }
154
+
155
+ .result_not_found {
156
+ display: flex;
157
+ flex-direction: column;
158
+ font-size: 1.5rem;
159
+ color: var(--foreground-color);
160
+ }
161
+
162
+ .result_not_found p {
163
+ margin: 1rem 0;
164
+ }
165
+
166
+ .result_not_found ul {
167
+ margin: 1rem 0;
168
+ }
169
+
170
+ .result_not_found img {
171
+ width: 40rem;
172
+ }
173
  ```
174
+
175
+ ```css
176
+ /* styles for the error box */
177
+ .error_box .error_box_toggle_button {
178
+ background: var(--foreground-color);
179
+ }
180
+
181
+ .error_box .dropdown_error_box {
182
+ position: absolute;
183
+ display: none;
184
+ flex-direction: column;
185
+ background: var(--background-color);
186
+ border-radius: 0;
187
+ margin-left: 2rem;
188
+ min-height: 20rem;
189
+ min-width: 22rem;
190
+ }
191
+ .error_box .dropdown_error_box.show {
192
+ display: flex;
193
+ }
194
+ .error_box .dropdown_error_box .error_item,
195
+ .error_box .dropdown_error_box .no_errors {
196
+ display: flex;
197
+ align-items: center;
198
+ color: var(--foreground-color);
199
+ letter-spacing: 0.1rem;
200
+ padding: 1rem;
201
+ font-size: 1.2rem;
202
+ }
203
+ .error_box .dropdown_error_box .error_item {
204
+ justify-content: space-between;
205
+ }
206
+ .error_box .dropdown_error_box .no_errors {
207
+ min-height: 18rem;
208
+ justify-content: center;
209
+ }
210
+
211
+ .error_box .dropdown_error_box .error_item:hover {
212
+ box-shadow: inset 0 0 100px 100px rgba(255, 255, 255, 0.1);
213
+ }
214
+
215
+ .error_box .error_item .severity_color {
216
+ width: 1.2rem;
217
+ height: 1.2rem;
218
+ }
219
+ .results .result_disallowed,
220
+ .results .result_filtered,
221
+ .results .result_engine_not_selected {
222
+ display: flex;
223
+ justify-content: center;
224
+ align-items: center;
225
+ gap: 10rem;
226
+ font-size: 2rem;
227
+ color: var(--foreground-color);
228
+ margin: 0rem 7rem;
229
+ }
230
+
231
+ .results .result_disallowed .user_query,
232
+ .results .result_filtered .user_query,
233
+ .results .result_engine_not_selected .user_query {
234
+ color: var(--background-color);
235
+ font-weight: 300;
236
+ }
237
+
238
+ .results .result_disallowed img,
239
+ .results .result_filtered img,
240
+ .results .result_engine_not_selected img {
241
+ width: 30rem;
242
+ }
243
+
244
+ .results .result_disallowed div,
245
+ .results .result_filtered div,
246
+ .results .result_engine_not_selected div {
247
+ display: flex;
248
+ flex-direction: column;
249
+ gap: 1rem;
250
+ line-break: strict;
251
+ }
252
+ ```
253
+
254
  ### Styles for the footer and header
255
+
256
+ ```css
257
  header {
258
+ background: var(--background-color);
259
  width: 100%;
260
  display: flex;
261
  justify-content: right;
 
278
  header ul li a:visited,
279
  footer ul li a:visited {
280
  text-decoration: none;
281
+ color: var(--color-two);
282
  text-transform: capitalize;
283
  letter-spacing: 0.1rem;
284
  }
 
289
 
290
  header ul li a:hover,
291
  footer ul li a:hover {
292
+ color: var(--color-five);
293
+ }
294
+
295
+ footer div span {
296
+ font-size: 1.5rem;
297
+ color: var(--color-four);
298
+ }
299
+
300
+ footer div {
301
+ display: flex;
302
+ gap: 1rem;
303
+ }
304
+
305
+ footer {
306
+ background: var(--background-color);
307
+ width: 100%;
308
+ padding: 1rem;
309
+ display: flex;
310
+ flex-direction: column;
311
+ justify-content: center;
312
+ align-items: center;
313
  }
314
 
315
  footer div span {
 
332
  align-items: center;
333
  }
334
  ```
335
+
336
  ### Styles for the search page
337
+
338
+ ```css
339
  .results {
340
  width: 90%;
341
  display: flex;
 
362
 
363
  .results_aggregated .result h1 a {
364
  font-size: 1.5rem;
365
+ color: var(--color-two);
366
  text-decoration: none;
367
  letter-spacing: 0.1rem;
368
  }
369
 
370
  .results_aggregated .result h1 a:hover {
371
+ color: var(--color-five);
372
  }
373
 
374
  .results_aggregated .result h1 a:visited {
375
+ color: var(--background-color);
376
  }
377
 
378
  .results_aggregated .result small {
379
+ color: var(--color-three);
380
  font-size: 1.1rem;
381
  word-wrap: break-word;
382
  line-break: anywhere;
383
  }
384
 
385
  .results_aggregated .result p {
386
+ color: var(--foreground-color);
387
  font-size: 1.2rem;
388
  margin-top: 0.3rem;
389
  word-wrap: break-word;
 
394
  text-align: right;
395
  font-size: 1.2rem;
396
  padding: 1rem;
397
+ color: var(--color-five);
398
  }
399
  ```
400
 
401
+ ### Styles for the 404 page
402
 
403
+ ```css
404
  .error_container {
405
  display: flex;
406
  justify-content: center;
 
439
 
440
  .error_content p a,
441
  .error_content p a:visited {
442
+ color: var(--color-two);
443
  text-decoration: none;
444
  }
445
 
446
  .error_content p a:hover {
447
+ color: var(--color-five);
448
  }
449
  ```
450
+
451
  ### Styles for the previous and next button on the search page
452
+
453
+ ```css
454
  .page_navigation {
455
  padding: 0 0 2rem 0;
456
  display: flex;
 
459
  }
460
 
461
  .page_navigation button {
462
+ background: var(--background-color);
463
+ color: var(--foreground-color);
464
  padding: 1rem;
465
  border-radius: 0.5rem;
466
  outline: none;
 
477
  This part is only available right now in the **rolling/edge/unstable** version
478
 
479
  ```css
480
+ .about-container article {
481
+ font-size: 1.5rem;
482
+ color: var(--foreground-color);
483
+ padding-bottom: 10px;
484
+ }
485
 
486
+ .about-container article h1 {
487
+ color: var(--color-two);
488
+ font-size: 2.8rem;
489
+ }
490
 
491
+ .about-container article div {
492
+ padding-bottom: 15px;
493
+ }
494
 
495
+ .about-container a {
496
+ color: var(--color-three);
497
  }
498
 
499
+ .about-container article h2 {
500
+ color: var(--color-three);
501
  font-size: 1.8rem;
502
  padding-bottom: 10px;
503
  }
504
 
505
+ .about-container p {
506
+ color: var(--foreground-color);
507
+ font-size: 1.6rem;
508
  padding-bottom: 10px;
509
  }
510
 
511
+ .about-container h3 {
512
+ font-size: 1.5rem;
513
+ }
514
+
515
+ .about-container {
516
+ width: 80%;
517
+ }
518
+ ```
519
+
520
+ ### Styles for the Settings Page
521
+
522
+ This part is only available right now in the **rolling/edge/unstable** version
523
+
524
+ ```css
525
+ .settings_container {
526
+ display: flex;
527
+ justify-content: space-around;
528
+ width: 80dvw;
529
+ }
530
+
531
+ .settings h1 {
532
+ color: var(--color-two);
533
+ font-size: 2.5rem;
534
+ }
535
+
536
+ .settings hr {
537
+ border-color: var(--color-three);
538
+ margin: 0.3rem 0 1rem 0;
539
+ }
540
+
541
+ .settings_container .sidebar {
542
+ width: 30%;
543
+ cursor: pointer;
544
+ font-size: 2rem;
545
+ display: flex;
546
+ flex-direction: column;
547
+ margin-right: 0.5rem;
548
+ margin-left: -0.7rem;
549
+ padding: 0.7rem;
550
+ border-radius: 5px;
551
+ font-weight: bold;
552
+ margin-bottom: 0.5rem;
553
+ color: var(--foreground-color);
554
+ text-transform: capitalize;
555
+ gap: 1.5rem;
556
+ }
557
+
558
+ .settings_container .sidebar .btn {
559
+ padding: 0.5rem;
560
+ border-radius: 0.5rem;
561
+ }
562
+
563
+ .settings_container .sidebar .btn.active {
564
+ background-color: var(--color-two);
565
+ }
566
+
567
+ .settings_container .main_container {
568
+ width: 70%;
569
+ border-left: 1.5px solid var(--color-three);
570
+ padding-left: 3rem;
571
+ }
572
+
573
+ .settings_container .tab {
574
+ display: none;
575
+ }
576
+
577
+ .settings_container .tab.active {
578
+ display: flex;
579
+ flex-direction: column;
580
+ justify-content: space-around;
581
+ }
582
+
583
+ .settings_container button {
584
+ margin-top: 1rem;
585
+ padding: 1rem 2rem;
586
+ font-size: 1.5rem;
587
+ background: var(--color-three);
588
+ color: var(--background-color);
589
+ border-radius: 0.5rem;
590
+ border: 2px solid transparent;
591
+ font-weight: bold;
592
+ transition: all 0.1s ease-out;
593
+ cursor: pointer;
594
+ box-shadow: 5px 5px;
595
+ outline: none;
596
+ }
597
+
598
+ .settings_container button:active {
599
+ box-shadow: none;
600
+ translate: 5px 5px;
601
+ }
602
+
603
+ .settings_container .main_container .message {
604
+ font-size: 1.5rem;
605
+ color: var(--foreground-color);
606
+ }
607
+
608
+ .settings_container .tab h3 {
609
+ font-size: 2rem;
610
+ font-weight: bold;
611
+ color: var(--color-four);
612
+ margin-top: 1.5rem;
613
+ text-transform: capitalize;
614
+ }
615
+
616
+ .settings_container .tab .description {
617
  font-size: 1.5rem;
618
+ margin-bottom: 0.5rem;
619
+ color: var(--foreground-color);
620
+ }
621
+
622
+ .settings_container .user_interface select,
623
+ .settings_container .general select {
624
+ margin: 0.7rem 0;
625
+ width: 20rem;
626
+ background-color: var(--background-color);
627
+ color: var(--foreground-color);
628
+ padding: 1rem 2rem;
629
+ border-radius: 0.5rem;
630
+ outline: none;
631
+ border: none;
632
+ text-transform: capitalize;
633
+ }
634
+
635
+ .settings_container .user_interface option:hover,
636
+ .settings_container .general option:hover {
637
+ background-color: var(--color-one);
638
+ }
639
+
640
+ .settings_container .engines .engine_selection {
641
+ display: flex;
642
+ flex-direction: column;
643
+ justify-content: center;
644
+ gap: 1rem;
645
+ padding: 1rem 0;
646
+ }
647
+
648
+ .settings_container .engines .toggle_btn {
649
+ color: var(--foreground-color);
650
+ font-size: 1.5rem;
651
+ display: flex;
652
+ gap: 0.5rem;
653
+ align-items: center;
654
+ }
655
+
656
+ .settings_container .engines hr {
657
+ margin: 0;
658
+ }
659
+
660
+ .settings_container .cookies input {
661
+ margin: 1rem 0rem;
662
+ }
663
+ ```
664
+
665
+ ### Styles for the Toggle Button
666
+
667
+ This part is only available right now in the **rolling/edge/unstable** version
668
+
669
+ ```css
670
+ /* The switch - the box around the slider */
671
+ .switch {
672
+ position: relative;
673
+ display: inline-block;
674
+ width: 6rem;
675
+ height: 3.4rem;
676
+ }
677
+
678
+ /* Hide default HTML checkbox */
679
+ .switch input {
680
+ opacity: 0;
681
+ width: 0;
682
+ height: 0;
683
+ }
684
+
685
+ /* The slider */
686
+ .slider {
687
+ position: absolute;
688
+ cursor: pointer;
689
+ top: 0;
690
+ left: 0;
691
+ right: 0;
692
+ bottom: 0;
693
+ background-color: var(--background-color);
694
+ -webkit-transition: 0.4s;
695
+ transition: 0.4s;
696
+ }
697
+
698
+ .slider:before {
699
+ position: absolute;
700
+ content: '';
701
+ height: 2.6rem;
702
+ width: 2.6rem;
703
+ left: 0.4rem;
704
+ bottom: 0.4rem;
705
+ background-color: var(--foreground-color);
706
+ -webkit-transition: 0.4s;
707
+ transition: 0.4s;
708
+ }
709
+
710
+ input:checked + .slider {
711
+ background-color: var(--color-three);
712
+ }
713
+
714
+ input:focus + .slider {
715
+ box-shadow: 0 0 1px var(--color-three);
716
+ }
717
+
718
+ input:checked + .slider:before {
719
+ -webkit-transform: translateX(2.6rem);
720
+ -ms-transform: translateX(2.6rem);
721
+ transform: translateX(2.6rem);
722
+ }
723
+
724
+ /* Rounded sliders */
725
+ .slider.round {
726
+ border-radius: 3.4rem;
727
+ }
728
+
729
+ .slider.round:before {
730
+ border-radius: 50%;
731
  }
732
  ```
733
 
734
+ [⬅️ Go back to Home](./README.md)
flake.lock ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "nodes": {
3
+ "naersk": {
4
+ "inputs": {
5
+ "nixpkgs": "nixpkgs"
6
+ },
7
+ "locked": {
8
+ "lastModified": 1694081375,
9
+ "narHash": "sha256-vzJXOUnmkMCm3xw8yfPP5m8kypQ3BhAIRe4RRCWpzy8=",
10
+ "owner": "nix-community",
11
+ "repo": "naersk",
12
+ "rev": "3f976d822b7b37fc6fb8e6f157c2dd05e7e94e89",
13
+ "type": "github"
14
+ },
15
+ "original": {
16
+ "owner": "nix-community",
17
+ "ref": "master",
18
+ "repo": "naersk",
19
+ "type": "github"
20
+ }
21
+ },
22
+ "nixpkgs": {
23
+ "locked": {
24
+ "lastModified": 1695318763,
25
+ "narHash": "sha256-FHVPDRP2AfvsxAdc+AsgFJevMz5VBmnZglFUMlxBkcY=",
26
+ "path": "/nix/store/p7iz0r8gs6ppkhj83zjmwyd21k8b7v3y-source",
27
+ "rev": "e12483116b3b51a185a33a272bf351e357ba9a99",
28
+ "type": "path"
29
+ },
30
+ "original": {
31
+ "id": "nixpkgs",
32
+ "type": "indirect"
33
+ }
34
+ },
35
+ "nixpkgs_2": {
36
+ "locked": {
37
+ "lastModified": 1695318763,
38
+ "narHash": "sha256-FHVPDRP2AfvsxAdc+AsgFJevMz5VBmnZglFUMlxBkcY=",
39
+ "owner": "NixOS",
40
+ "repo": "nixpkgs",
41
+ "rev": "e12483116b3b51a185a33a272bf351e357ba9a99",
42
+ "type": "github"
43
+ },
44
+ "original": {
45
+ "owner": "NixOS",
46
+ "ref": "nixpkgs-unstable",
47
+ "repo": "nixpkgs",
48
+ "type": "github"
49
+ }
50
+ },
51
+ "root": {
52
+ "inputs": {
53
+ "naersk": "naersk",
54
+ "nixpkgs": "nixpkgs_2",
55
+ "utils": "utils"
56
+ }
57
+ },
58
+ "systems": {
59
+ "locked": {
60
+ "lastModified": 1681028828,
61
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
62
+ "owner": "nix-systems",
63
+ "repo": "default",
64
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
65
+ "type": "github"
66
+ },
67
+ "original": {
68
+ "owner": "nix-systems",
69
+ "repo": "default",
70
+ "type": "github"
71
+ }
72
+ },
73
+ "utils": {
74
+ "inputs": {
75
+ "systems": "systems"
76
+ },
77
+ "locked": {
78
+ "lastModified": 1694529238,
79
+ "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
80
+ "owner": "numtide",
81
+ "repo": "flake-utils",
82
+ "rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
83
+ "type": "github"
84
+ },
85
+ "original": {
86
+ "owner": "numtide",
87
+ "repo": "flake-utils",
88
+ "type": "github"
89
+ }
90
+ }
91
+ },
92
+ "root": "root",
93
+ "version": 7
94
+ }
flake.nix ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ # Websurfx NixOS flake
3
+ inputs = {
4
+ naersk.url = "github:nix-community/naersk/master";
5
+ nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
6
+ utils.url = "github:numtide/flake-utils";
7
+ };
8
+
9
+ outputs = {
10
+ naersk,
11
+ nixpkgs,
12
+ self,
13
+ utils,
14
+ }:
15
+ # We do this for all systems - namely x86_64-linux, aarch64-linux,
16
+ # x86_64-darwin and aarch64-darwin
17
+ utils.lib.eachDefaultSystem (system: let
18
+ pkgs = import nixpkgs {inherit system;};
19
+ naersk-lib = pkgs.callPackage naersk {};
20
+ in rec {
21
+ # Build via "nix build .#default"
22
+ packages.default = naersk-lib.buildPackage {
23
+ # The build dependencies
24
+ buildInputs = with pkgs; [pkg-config openssl];
25
+ src = ./.;
26
+ };
27
+
28
+ # Enter devshell with all the tools via "nix develop"
29
+ # or "nix-shell"
30
+ devShells.default = with pkgs;
31
+ mkShell {
32
+ buildInputs = [
33
+ actionlint
34
+ cargo
35
+ haskellPackages.hadolint
36
+ nodePackages_latest.cspell
37
+ nodePackages_latest.eslint
38
+ nodePackages_latest.markdownlint-cli2
39
+ nodePackages_latest.stylelint
40
+ redis
41
+ rustPackages.clippy
42
+ rustc
43
+ yamllint
44
+ ];
45
+ RUST_SRC_PATH = rustPlatform.rustLibSrc;
46
+ };
47
+
48
+ # Build via "nix build .#websurfx", which is basically just
49
+ # calls the build function
50
+ packages.websurfx = packages.default;
51
+ });
52
+ }
images/create_fork_button.png DELETED
Binary file (65 kB)
 
images/fork_button.png DELETED
Binary file (44.6 kB)
 
images/fork_options_page.png DELETED
Binary file (64.8 kB)
 
public/images/barricade.png ADDED
public/images/filter.png ADDED
public/images/info.svg ADDED
public/images/no_results.gif ADDED