├── LICENSE ├── README.md ├── assets ├── .gitignore ├── avoidthehack2.png ├── css │ └── datatables.css ├── icons │ ├── donate.svg │ ├── github.svg │ └── help.svg ├── index.md.browsertemplate ├── js │ ├── buttons.html5.js │ ├── dataTables.buttons.js │ ├── dataTables.colReorder.js │ ├── datatables.js │ ├── jquery371.js │ ├── jszip.js │ └── moment.min.js ├── json │ └── browsers.json └── logos │ ├── arc.png │ ├── avastlogo.png │ ├── avoidthehack.webp │ ├── badwolflogo.png │ ├── bravelogo.png │ ├── bromitelogo.png │ ├── chromiumlogo.png │ ├── comododragon.png │ ├── comodoicedragon.png │ ├── cromite.png │ ├── duckduckgologo.png │ ├── epicbrowserlogo.png │ ├── falkonlogo.png │ ├── fdroid.png │ ├── firedragonlogo.png │ ├── firefoxfocuslogo.png │ ├── firefoxlogo.png │ ├── floorp.png │ ├── ghostery.png │ ├── icecatlogo.png │ ├── iceravenlogo1.png │ ├── insightlogo.jpg │ ├── iridiumlogo.png │ ├── kiwi.png │ ├── librewolflogo.png │ ├── minbrowserlogo.png │ ├── mullbrowser.webp │ ├── mullvad.png │ ├── nyxt.png │ ├── onionb.jpg │ ├── operalogo.png │ ├── otterlogo.png │ ├── palemoonlogo.png │ ├── pumalogo.png │ ├── snowhazelogo.png │ ├── soulbrowser.png │ ├── srwarelogo.png │ ├── stoutnerlogo.png │ ├── vivaldilogo.png │ └── waterfoxlogo.png ├── changelog.md └── content ├── .gitignore ├── arc └── index.md ├── avast └── index.md ├── badwolf └── index.md ├── brave └── index.md ├── bromite └── index.md ├── cromite └── index.md ├── dragon └── index.md ├── duckduckgo └── index.md ├── epic └── index.md ├── falkon └── index.md ├── firedragon └── index.md ├── firefox └── index.md ├── floorp └── index.md ├── focus └── index.md ├── ghostery └── index.md ├── icecat └── index.md ├── icedragon └── index.md ├── iceraven └── index.md ├── index.md ├── index.md.back ├── insight └── index.md ├── iridium └── index.md ├── iron └── index.md ├── kiwi └── index.md ├── librewolf └── index.md ├── min └── index.md ├── mull └── index.md ├── mullvad └── index.md ├── nyxt └── index.md ├── opera └── index.md ├── otter └── index.md ├── palemoon └── index.md ├── puma └── index.md ├── snowhaze └── index.md ├── soul └── index.md ├── stoutner └── index.md ├── ungoogled └── index.md ├── vivaldi └── index.md └── waterfox └── index.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 avoidthehack 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | Avoid The Hack! (avoidthehack.com) presents: 4 | 5 | # Private Browser Comparison Tool 6 | 7 | [![avoidthehack logo](https://user-images.githubusercontent.com/100534728/155898886-22d6de82-6b64-487e-aa65-3234bb1e66d3.png)](https://links.avoidthehack.com)
8 | 9 |
10 | 11 |
12 | 13 |
14 | 15 | 16 | 17 |
18 | 19 | ## Overview 20 | 21 | Not all privacy browsers are built the same; as such they don't deliver the exact same results. This tool aims to fix that by painting an as-complete-as-possible picture of the different privacy browsers out there _before_ users commit to a download/install. 22 | 23 | This privacy browser comparison tool aims to be easily readable and usable for **all** users, regardless of personal technical expertise. 24 | 25 | The interactive and fancily rendered version of this table/tool is hosted at [https://browsers.avoidthehack.com](https://browsers.avoidthehack.com) 26 | 27 | ## Legend 28 | 29 | dash (-) = N/A 30 | 31 | **"must be enabled"** = feature is present, but not enabled by default 32 | 33 | ? = unknown/information missing (feel free to open an issue with the appropriate information) 34 | 35 | ## Contributing 36 | 37 | - Suggestions: If something is outdated, incorrect, or should be added here, users are encouraged to open an issue. **Read the [FAQ](https://browsers.avoidthehack.com/#faq) before opening an issue.** 38 | - Enhancements: Everyone is welcomed to fork and hack/modify the code and submit a pull request. 39 | - Sharing: Sharing this comparison - wherever, however - is greatly appreciated. **Don't forget to star this repo!** 40 | - If you are feeling extra generous, you can contribute on [Ko-Fi!](https://ko-fi.com/avoidthehack) 41 | 42 | ## Acknowledgements 43 | This project wouldn't be possible without the existence of these other projects and their developers/maintainers: 44 | 45 | * [DataTables](https://datatables.net/) 46 | * [PicoCMS](https://picocms.org/) 47 | -------------------------------------------------------------------------------- /assets/.gitignore: -------------------------------------------------------------------------------- 1 | # This file is meant to be empty 2 | -------------------------------------------------------------------------------- /assets/avoidthehack2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/avoidthehack2.png -------------------------------------------------------------------------------- /assets/css/datatables.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This combined file was created by the DataTables downloader builder: 3 | * https://datatables.net/download 4 | * 5 | * To rebuild or modify this file with the latest versions of the included 6 | * software please visit: 7 | * https://datatables.net/download/#dt/dt-2.0.0 8 | * 9 | * Included libraries: 10 | * DataTables 2.0.0 11 | */ 12 | 13 | @charset "UTF-8"; 14 | :root { 15 | --dt-row-selected: 13, 110, 253; 16 | --dt-row-selected-text: 255, 255, 255; 17 | --dt-row-selected-link: 9, 10, 11; 18 | --dt-row-stripe: 0, 0, 0; 19 | --dt-row-hover: 0, 0, 0; 20 | --dt-column-ordering: 0, 0, 0; 21 | --dt-html-background: white; 22 | } 23 | :root.dark { 24 | --dt-html-background: rgb(33, 37, 41); 25 | } 26 | 27 | table.dataTable td.dt-control { 28 | text-align: center; 29 | cursor: pointer; 30 | } 31 | table.dataTable td.dt-control:before { 32 | display: inline-block; 33 | box-sizing: border-box; 34 | content: ""; 35 | border-top: 5px solid transparent; 36 | border-left: 10px solid rgba(0, 0, 0, 0.5); 37 | border-bottom: 5px solid transparent; 38 | border-right: 0px solid transparent; 39 | } 40 | table.dataTable tr.dt-hasChild td.dt-control:before { 41 | border-top: 10px solid rgba(0, 0, 0, 0.5); 42 | border-left: 5px solid transparent; 43 | border-bottom: 0px solid transparent; 44 | border-right: 5px solid transparent; 45 | } 46 | 47 | html.dark table.dataTable td.dt-control:before, 48 | :root[data-bs-theme=dark] table.dataTable td.dt-control:before { 49 | border-left-color: rgba(255, 255, 255, 0.5); 50 | } 51 | html.dark table.dataTable tr.dt-hasChild td.dt-control:before, 52 | :root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before { 53 | border-top-color: rgba(255, 255, 255, 0.5); 54 | border-left-color: transparent; 55 | } 56 | 57 | div.dt-scroll-body thead tr, 58 | div.dt-scroll-body tfoot tr { 59 | height: 0; 60 | } 61 | div.dt-scroll-body thead tr th, div.dt-scroll-body thead tr td, 62 | div.dt-scroll-body tfoot tr th, 63 | div.dt-scroll-body tfoot tr td { 64 | height: 0 !important; 65 | padding-top: 0px !important; 66 | padding-bottom: 0px !important; 67 | border-top-width: 0px !important; 68 | border-bottom-width: 0px !important; 69 | } 70 | div.dt-scroll-body thead tr th div.dt-scroll-sizing, div.dt-scroll-body thead tr td div.dt-scroll-sizing, 71 | div.dt-scroll-body tfoot tr th div.dt-scroll-sizing, 72 | div.dt-scroll-body tfoot tr td div.dt-scroll-sizing { 73 | height: 0 !important; 74 | overflow: hidden !important; 75 | } 76 | 77 | table.dataTable thead > tr > th:active, 78 | table.dataTable thead > tr > td:active { 79 | outline: none; 80 | } 81 | table.dataTable thead > tr > th.dt-orderable-asc span.dt-column-order:before, table.dataTable thead > tr > th.dt-ordering-asc span.dt-column-order:before, 82 | table.dataTable thead > tr > td.dt-orderable-asc span.dt-column-order:before, 83 | table.dataTable thead > tr > td.dt-ordering-asc span.dt-column-order:before { 84 | position: absolute; 85 | display: block; 86 | bottom: 50%; 87 | content: "▲"; 88 | content: "▲"/""; 89 | } 90 | table.dataTable thead > tr > th.dt-orderable-desc span.dt-column-order:after, table.dataTable thead > tr > th.dt-ordering-desc span.dt-column-order:after, 91 | table.dataTable thead > tr > td.dt-orderable-desc span.dt-column-order:after, 92 | table.dataTable thead > tr > td.dt-ordering-desc span.dt-column-order:after { 93 | position: absolute; 94 | display: block; 95 | top: 50%; 96 | content: "▼"; 97 | content: "▼"/""; 98 | } 99 | table.dataTable thead > tr > th.dt-orderable-asc, table.dataTable thead > tr > th.dt-orderable-desc, table.dataTable thead > tr > th.dt-ordering-asc, table.dataTable thead > tr > th.dt-ordering-desc, 100 | table.dataTable thead > tr > td.dt-orderable-asc, 101 | table.dataTable thead > tr > td.dt-orderable-desc, 102 | table.dataTable thead > tr > td.dt-ordering-asc, 103 | table.dataTable thead > tr > td.dt-ordering-desc { 104 | position: relative; 105 | padding-right: 30px; 106 | } 107 | table.dataTable thead > tr > th.dt-orderable-asc span.dt-column-order, table.dataTable thead > tr > th.dt-orderable-desc span.dt-column-order, table.dataTable thead > tr > th.dt-ordering-asc span.dt-column-order, table.dataTable thead > tr > th.dt-ordering-desc span.dt-column-order, 108 | table.dataTable thead > tr > td.dt-orderable-asc span.dt-column-order, 109 | table.dataTable thead > tr > td.dt-orderable-desc span.dt-column-order, 110 | table.dataTable thead > tr > td.dt-ordering-asc span.dt-column-order, 111 | table.dataTable thead > tr > td.dt-ordering-desc span.dt-column-order { 112 | position: absolute; 113 | right: 12px; 114 | top: 0; 115 | bottom: 0; 116 | width: 12px; 117 | } 118 | table.dataTable thead > tr > th.dt-orderable-asc span.dt-column-order:before, table.dataTable thead > tr > th.dt-orderable-asc span.dt-column-order:after, table.dataTable thead > tr > th.dt-orderable-desc span.dt-column-order:before, table.dataTable thead > tr > th.dt-orderable-desc span.dt-column-order:after, table.dataTable thead > tr > th.dt-ordering-asc span.dt-column-order:before, table.dataTable thead > tr > th.dt-ordering-asc span.dt-column-order:after, table.dataTable thead > tr > th.dt-ordering-desc span.dt-column-order:before, table.dataTable thead > tr > th.dt-ordering-desc span.dt-column-order:after, 119 | table.dataTable thead > tr > td.dt-orderable-asc span.dt-column-order:before, 120 | table.dataTable thead > tr > td.dt-orderable-asc span.dt-column-order:after, 121 | table.dataTable thead > tr > td.dt-orderable-desc span.dt-column-order:before, 122 | table.dataTable thead > tr > td.dt-orderable-desc span.dt-column-order:after, 123 | table.dataTable thead > tr > td.dt-ordering-asc span.dt-column-order:before, 124 | table.dataTable thead > tr > td.dt-ordering-asc span.dt-column-order:after, 125 | table.dataTable thead > tr > td.dt-ordering-desc span.dt-column-order:before, 126 | table.dataTable thead > tr > td.dt-ordering-desc span.dt-column-order:after { 127 | left: 0; 128 | opacity: 0.125; 129 | line-height: 9px; 130 | font-size: 0.8em; 131 | } 132 | table.dataTable thead > tr > th.dt-orderable-asc, table.dataTable thead > tr > th.dt-orderable-desc, 133 | table.dataTable thead > tr > td.dt-orderable-asc, 134 | table.dataTable thead > tr > td.dt-orderable-desc { 135 | cursor: pointer; 136 | } 137 | table.dataTable thead > tr > th.dt-orderable-asc:hover, table.dataTable thead > tr > th.dt-orderable-desc:hover, 138 | table.dataTable thead > tr > td.dt-orderable-asc:hover, 139 | table.dataTable thead > tr > td.dt-orderable-desc:hover { 140 | outline: 2px solid rgba(0, 0, 0, 0.05); 141 | outline-offset: -2px; 142 | } 143 | table.dataTable thead > tr > th.dt-ordering-asc span.dt-column-order:before, table.dataTable thead > tr > th.dt-ordering-desc span.dt-column-order:after, 144 | table.dataTable thead > tr > td.dt-ordering-asc span.dt-column-order:before, 145 | table.dataTable thead > tr > td.dt-ordering-desc span.dt-column-order:after { 146 | opacity: 0.6; 147 | } 148 | table.dataTable thead > tr > th.sorting_desc_disabled span.dt-column-order:after, table.dataTable thead > tr > th.sorting_asc_disabled span.dt-column-order:before, 149 | table.dataTable thead > tr > td.sorting_desc_disabled span.dt-column-order:after, 150 | table.dataTable thead > tr > td.sorting_asc_disabled span.dt-column-order:before { 151 | display: none; 152 | } 153 | table.dataTable thead > tr > th:active, 154 | table.dataTable thead > tr > td:active { 155 | outline: none; 156 | } 157 | 158 | div.dt-scroll-body > table.dataTable > thead > tr > th, 159 | div.dt-scroll-body > table.dataTable > thead > tr > td { 160 | overflow: hidden; 161 | } 162 | 163 | :root.dark table.dataTable thead > tr > th.dt-orderable-asc:hover, :root.dark table.dataTable thead > tr > th.dt-orderable-desc:hover, 164 | :root.dark table.dataTable thead > tr > td.dt-orderable-asc:hover, 165 | :root.dark table.dataTable thead > tr > td.dt-orderable-desc:hover, 166 | :root[data-bs-theme=dark] table.dataTable thead > tr > th.dt-orderable-asc:hover, 167 | :root[data-bs-theme=dark] table.dataTable thead > tr > th.dt-orderable-desc:hover, 168 | :root[data-bs-theme=dark] table.dataTable thead > tr > td.dt-orderable-asc:hover, 169 | :root[data-bs-theme=dark] table.dataTable thead > tr > td.dt-orderable-desc:hover { 170 | outline: 2px solid rgba(255, 255, 255, 0.05); 171 | } 172 | 173 | div.dt-processing { 174 | position: absolute; 175 | top: 50%; 176 | left: 50%; 177 | width: 200px; 178 | margin-left: -100px; 179 | margin-top: -22px; 180 | text-align: center; 181 | padding: 2px; 182 | z-index: 10; 183 | } 184 | div.dt-processing > div:last-child { 185 | position: relative; 186 | width: 80px; 187 | height: 15px; 188 | margin: 1em auto; 189 | } 190 | div.dt-processing > div:last-child > div { 191 | position: absolute; 192 | top: 0; 193 | width: 13px; 194 | height: 13px; 195 | border-radius: 50%; 196 | background: rgb(13, 110, 253); 197 | background: rgb(var(--dt-row-selected)); 198 | animation-timing-function: cubic-bezier(0, 1, 1, 0); 199 | } 200 | div.dt-processing > div:last-child > div:nth-child(1) { 201 | left: 8px; 202 | animation: datatables-loader-1 0.6s infinite; 203 | } 204 | div.dt-processing > div:last-child > div:nth-child(2) { 205 | left: 8px; 206 | animation: datatables-loader-2 0.6s infinite; 207 | } 208 | div.dt-processing > div:last-child > div:nth-child(3) { 209 | left: 32px; 210 | animation: datatables-loader-2 0.6s infinite; 211 | } 212 | div.dt-processing > div:last-child > div:nth-child(4) { 213 | left: 56px; 214 | animation: datatables-loader-3 0.6s infinite; 215 | } 216 | 217 | @keyframes datatables-loader-1 { 218 | 0% { 219 | transform: scale(0); 220 | } 221 | 100% { 222 | transform: scale(1); 223 | } 224 | } 225 | @keyframes datatables-loader-3 { 226 | 0% { 227 | transform: scale(1); 228 | } 229 | 100% { 230 | transform: scale(0); 231 | } 232 | } 233 | @keyframes datatables-loader-2 { 234 | 0% { 235 | transform: translate(0, 0); 236 | } 237 | 100% { 238 | transform: translate(24px, 0); 239 | } 240 | } 241 | table.dataTable.nowrap th, table.dataTable.nowrap td { 242 | white-space: nowrap; 243 | } 244 | table.dataTable th, 245 | table.dataTable td { 246 | box-sizing: border-box; 247 | } 248 | table.dataTable th.dt-left, 249 | table.dataTable td.dt-left { 250 | text-align: left; 251 | } 252 | table.dataTable th.dt-center, 253 | table.dataTable td.dt-center { 254 | text-align: center; 255 | } 256 | table.dataTable th.dt-right, 257 | table.dataTable td.dt-right { 258 | text-align: right; 259 | } 260 | table.dataTable th.dt-justify, 261 | table.dataTable td.dt-justify { 262 | text-align: justify; 263 | } 264 | table.dataTable th.dt-nowrap, 265 | table.dataTable td.dt-nowrap { 266 | white-space: nowrap; 267 | } 268 | table.dataTable th.dt-empty, 269 | table.dataTable td.dt-empty { 270 | text-align: center; 271 | vertical-align: top; 272 | } 273 | table.dataTable th.dt-type-numeric, table.dataTable th.dt-type-date, 274 | table.dataTable td.dt-type-numeric, 275 | table.dataTable td.dt-type-date { 276 | text-align: right; 277 | } 278 | table.dataTable thead th, 279 | table.dataTable thead td, 280 | table.dataTable tfoot th, 281 | table.dataTable tfoot td { 282 | text-align: left; 283 | } 284 | table.dataTable thead th.dt-head-left, 285 | table.dataTable thead td.dt-head-left, 286 | table.dataTable tfoot th.dt-head-left, 287 | table.dataTable tfoot td.dt-head-left { 288 | text-align: left; 289 | } 290 | table.dataTable thead th.dt-head-center, 291 | table.dataTable thead td.dt-head-center, 292 | table.dataTable tfoot th.dt-head-center, 293 | table.dataTable tfoot td.dt-head-center { 294 | text-align: center; 295 | } 296 | table.dataTable thead th.dt-head-right, 297 | table.dataTable thead td.dt-head-right, 298 | table.dataTable tfoot th.dt-head-right, 299 | table.dataTable tfoot td.dt-head-right { 300 | text-align: right; 301 | } 302 | table.dataTable thead th.dt-head-justify, 303 | table.dataTable thead td.dt-head-justify, 304 | table.dataTable tfoot th.dt-head-justify, 305 | table.dataTable tfoot td.dt-head-justify { 306 | text-align: justify; 307 | } 308 | table.dataTable thead th.dt-head-nowrap, 309 | table.dataTable thead td.dt-head-nowrap, 310 | table.dataTable tfoot th.dt-head-nowrap, 311 | table.dataTable tfoot td.dt-head-nowrap { 312 | white-space: nowrap; 313 | } 314 | table.dataTable tbody th.dt-body-left, 315 | table.dataTable tbody td.dt-body-left { 316 | text-align: left; 317 | } 318 | table.dataTable tbody th.dt-body-center, 319 | table.dataTable tbody td.dt-body-center { 320 | text-align: center; 321 | } 322 | table.dataTable tbody th.dt-body-right, 323 | table.dataTable tbody td.dt-body-right { 324 | text-align: right; 325 | } 326 | table.dataTable tbody th.dt-body-justify, 327 | table.dataTable tbody td.dt-body-justify { 328 | text-align: justify; 329 | } 330 | table.dataTable tbody th.dt-body-nowrap, 331 | table.dataTable tbody td.dt-body-nowrap { 332 | white-space: nowrap; 333 | } 334 | 335 | /* 336 | * Table styles 337 | */ 338 | table.dataTable { 339 | width: 100%; 340 | margin: 0 auto; 341 | border-spacing: 0; 342 | /* 343 | * Header and footer styles 344 | */ 345 | /* 346 | * Body styles 347 | */ 348 | } 349 | table.dataTable thead th, 350 | table.dataTable tfoot th { 351 | font-weight: bold; 352 | } 353 | table.dataTable > thead > tr > th, 354 | table.dataTable > thead > tr > td { 355 | padding: 10px; 356 | border-bottom: 1px solid rgba(0, 0, 0, 0.3); 357 | } 358 | table.dataTable > thead > tr > th:active, 359 | table.dataTable > thead > tr > td:active { 360 | outline: none; 361 | } 362 | table.dataTable > tfoot > tr > th, 363 | table.dataTable > tfoot > tr > td { 364 | border-top: 1px solid rgba(0, 0, 0, 0.3); 365 | padding: 10px 10px 6px 10px; 366 | } 367 | table.dataTable > tbody > tr { 368 | background-color: transparent; 369 | } 370 | table.dataTable > tbody > tr:first-child > * { 371 | border-top: none; 372 | } 373 | table.dataTable > tbody > tr:last-child > * { 374 | border-bottom: none; 375 | } 376 | table.dataTable > tbody > tr.selected > * { 377 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.9); 378 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9); 379 | color: rgb(255, 255, 255); 380 | color: rgb(var(--dt-row-selected-text)); 381 | } 382 | table.dataTable > tbody > tr.selected a { 383 | color: rgb(9, 10, 11); 384 | color: rgb(var(--dt-row-selected-link)); 385 | } 386 | table.dataTable > tbody > tr > th, 387 | table.dataTable > tbody > tr > td { 388 | padding: 8px 10px; 389 | } 390 | table.dataTable.row-border > tbody > tr > *, table.dataTable.display > tbody > tr > * { 391 | border-top: 1px solid rgba(0, 0, 0, 0.15); 392 | } 393 | table.dataTable.row-border > tbody > tr:first-child > *, table.dataTable.display > tbody > tr:first-child > * { 394 | border-top: none; 395 | } 396 | table.dataTable.row-border > tbody > tr.selected + tr.selected > td, table.dataTable.display > tbody > tr.selected + tr.selected > td { 397 | border-top-color: rgba(13, 110, 253, 0.65); 398 | border-top-color: rgba(var(--dt-row-selected), 0.65); 399 | } 400 | table.dataTable.cell-border > tbody > tr > * { 401 | border-top: 1px solid rgba(0, 0, 0, 0.15); 402 | border-right: 1px solid rgba(0, 0, 0, 0.15); 403 | } 404 | table.dataTable.cell-border > tbody > tr > *:first-child { 405 | border-left: 1px solid rgba(0, 0, 0, 0.15); 406 | } 407 | table.dataTable.cell-border > tbody > tr:first-child > * { 408 | border-top: 1px solid rgba(0, 0, 0, 0.3); 409 | } 410 | table.dataTable.stripe > tbody > tr:nth-child(odd) > *, table.dataTable.display > tbody > tr:nth-child(odd) > * { 411 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.023); 412 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.023); 413 | } 414 | table.dataTable.stripe > tbody > tr:nth-child(odd).selected > *, table.dataTable.display > tbody > tr:nth-child(odd).selected > * { 415 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.923); 416 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.923); 417 | } 418 | table.dataTable.hover > tbody > tr:hover > *, table.dataTable.display > tbody > tr:hover > * { 419 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.035); 420 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.035); 421 | } 422 | table.dataTable.hover > tbody > tr.selected:hover > *, table.dataTable.display > tbody > tr.selected:hover > * { 423 | box-shadow: inset 0 0 0 9999px #0d6efd !important; 424 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 1) !important; 425 | } 426 | table.dataTable.order-column > tbody tr > .sorting_1, 427 | table.dataTable.order-column > tbody tr > .sorting_2, 428 | table.dataTable.order-column > tbody tr > .sorting_3, table.dataTable.display > tbody tr > .sorting_1, 429 | table.dataTable.display > tbody tr > .sorting_2, 430 | table.dataTable.display > tbody tr > .sorting_3 { 431 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.019); 432 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.019); 433 | } 434 | table.dataTable.order-column > tbody tr.selected > .sorting_1, 435 | table.dataTable.order-column > tbody tr.selected > .sorting_2, 436 | table.dataTable.order-column > tbody tr.selected > .sorting_3, table.dataTable.display > tbody tr.selected > .sorting_1, 437 | table.dataTable.display > tbody tr.selected > .sorting_2, 438 | table.dataTable.display > tbody tr.selected > .sorting_3 { 439 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.919); 440 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919); 441 | } 442 | table.dataTable.display > tbody > tr:nth-child(odd) > .sorting_1, table.dataTable.order-column.stripe > tbody > tr:nth-child(odd) > .sorting_1 { 443 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.054); 444 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.054); 445 | } 446 | table.dataTable.display > tbody > tr:nth-child(odd) > .sorting_2, table.dataTable.order-column.stripe > tbody > tr:nth-child(odd) > .sorting_2 { 447 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.047); 448 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.047); 449 | } 450 | table.dataTable.display > tbody > tr:nth-child(odd) > .sorting_3, table.dataTable.order-column.stripe > tbody > tr:nth-child(odd) > .sorting_3 { 451 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.039); 452 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.039); 453 | } 454 | table.dataTable.display > tbody > tr:nth-child(odd).selected > .sorting_1, table.dataTable.order-column.stripe > tbody > tr:nth-child(odd).selected > .sorting_1 { 455 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.954); 456 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.954); 457 | } 458 | table.dataTable.display > tbody > tr:nth-child(odd).selected > .sorting_2, table.dataTable.order-column.stripe > tbody > tr:nth-child(odd).selected > .sorting_2 { 459 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.947); 460 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.947); 461 | } 462 | table.dataTable.display > tbody > tr:nth-child(odd).selected > .sorting_3, table.dataTable.order-column.stripe > tbody > tr:nth-child(odd).selected > .sorting_3 { 463 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.939); 464 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.939); 465 | } 466 | table.dataTable.display > tbody > tr.even > .sorting_1, table.dataTable.order-column.stripe > tbody > tr.even > .sorting_1 { 467 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.019); 468 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.019); 469 | } 470 | table.dataTable.display > tbody > tr.even > .sorting_2, table.dataTable.order-column.stripe > tbody > tr.even > .sorting_2 { 471 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.011); 472 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.011); 473 | } 474 | table.dataTable.display > tbody > tr.even > .sorting_3, table.dataTable.order-column.stripe > tbody > tr.even > .sorting_3 { 475 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.003); 476 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.003); 477 | } 478 | table.dataTable.display > tbody > tr.even.selected > .sorting_1, table.dataTable.order-column.stripe > tbody > tr.even.selected > .sorting_1 { 479 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.919); 480 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919); 481 | } 482 | table.dataTable.display > tbody > tr.even.selected > .sorting_2, table.dataTable.order-column.stripe > tbody > tr.even.selected > .sorting_2 { 483 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.911); 484 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.911); 485 | } 486 | table.dataTable.display > tbody > tr.even.selected > .sorting_3, table.dataTable.order-column.stripe > tbody > tr.even.selected > .sorting_3 { 487 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.903); 488 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.903); 489 | } 490 | table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { 491 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.082); 492 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.082); 493 | } 494 | table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { 495 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.074); 496 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.074); 497 | } 498 | table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { 499 | box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.062); 500 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.062); 501 | } 502 | table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { 503 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.982); 504 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.982); 505 | } 506 | table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { 507 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.974); 508 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.974); 509 | } 510 | table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { 511 | box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.962); 512 | box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.962); 513 | } 514 | table.dataTable.compact thead th, 515 | table.dataTable.compact thead td, 516 | table.dataTable.compact tfoot th, 517 | table.dataTable.compact tfoot td, 518 | table.dataTable.compact tbody th, 519 | table.dataTable.compact tbody td { 520 | padding: 4px; 521 | } 522 | 523 | /* 524 | * Control feature layout 525 | */ 526 | div.dt-container { 527 | position: relative; 528 | clear: both; 529 | } 530 | div.dt-container div.dt-layout-row { 531 | display: table; 532 | clear: both; 533 | width: 100%; 534 | } 535 | div.dt-container div.dt-layout-row.dt-layout-table { 536 | display: block; 537 | } 538 | div.dt-container div.dt-layout-row.dt-layout-table div.dt-layout-cell { 539 | display: block; 540 | } 541 | div.dt-container div.dt-layout-cell { 542 | display: table-cell; 543 | vertical-align: middle; 544 | padding: 5px 0; 545 | } 546 | div.dt-container div.dt-layout-cell.dt-full { 547 | text-align: center; 548 | } 549 | div.dt-container div.dt-layout-cell.dt-start { 550 | text-align: left; 551 | } 552 | div.dt-container div.dt-layout-cell.dt-end { 553 | text-align: right; 554 | } 555 | div.dt-container div.dt-layout-cell:empty { 556 | display: none; 557 | } 558 | div.dt-container .dt-search input { 559 | border: 1px solid #aaa; 560 | border-radius: 3px; 561 | padding: 5px; 562 | background-color: transparent; 563 | color: inherit; 564 | margin-left: 3px; 565 | } 566 | div.dt-container .dt-input { 567 | border: 1px solid #aaa; 568 | border-radius: 3px; 569 | padding: 5px; 570 | background-color: transparent; 571 | color: inherit; 572 | } 573 | div.dt-container select.dt-input { 574 | padding: 4px; 575 | } 576 | div.dt-container .dt-paging .dt-paging-button { 577 | box-sizing: border-box; 578 | display: inline-block; 579 | min-width: 1.5em; 580 | padding: 0.5em 1em; 581 | margin-left: 2px; 582 | text-align: center; 583 | text-decoration: none !important; 584 | cursor: pointer; 585 | color: inherit !important; 586 | border: 1px solid transparent; 587 | border-radius: 2px; 588 | background: transparent; 589 | } 590 | div.dt-container .dt-paging .dt-paging-button.current, div.dt-container .dt-paging .dt-paging-button.current:hover { 591 | color: inherit !important; 592 | border: 1px solid rgba(0, 0, 0, 0.3); 593 | background-color: rgba(0, 0, 0, 0.05); 594 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.05)), color-stop(100%, rgba(0, 0, 0, 0.05))); /* Chrome,Safari4+ */ 595 | background: -webkit-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%); /* Chrome10+,Safari5.1+ */ 596 | background: -moz-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%); /* FF3.6+ */ 597 | background: -ms-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%); /* IE10+ */ 598 | background: -o-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%); /* Opera 11.10+ */ 599 | background: linear-gradient(to bottom, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%); /* W3C */ 600 | } 601 | div.dt-container .dt-paging .dt-paging-button.disabled, div.dt-container .dt-paging .dt-paging-button.disabled:hover, div.dt-container .dt-paging .dt-paging-button.disabled:active { 602 | cursor: default; 603 | color: rgba(0, 0, 0, 0.5) !important; 604 | border: 1px solid transparent; 605 | background: transparent; 606 | box-shadow: none; 607 | } 608 | div.dt-container .dt-paging .dt-paging-button:hover { 609 | color: white !important; 610 | border: 1px solid #111; 611 | background-color: #111; 612 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); /* Chrome,Safari4+ */ 613 | background: -webkit-linear-gradient(top, #585858 0%, #111 100%); /* Chrome10+,Safari5.1+ */ 614 | background: -moz-linear-gradient(top, #585858 0%, #111 100%); /* FF3.6+ */ 615 | background: -ms-linear-gradient(top, #585858 0%, #111 100%); /* IE10+ */ 616 | background: -o-linear-gradient(top, #585858 0%, #111 100%); /* Opera 11.10+ */ 617 | background: linear-gradient(to bottom, #585858 0%, #111 100%); /* W3C */ 618 | } 619 | div.dt-container .dt-paging .dt-paging-button:active { 620 | outline: none; 621 | background-color: #0c0c0c; 622 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); /* Chrome,Safari4+ */ 623 | background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); /* Chrome10+,Safari5.1+ */ 624 | background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); /* FF3.6+ */ 625 | background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); /* IE10+ */ 626 | background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); /* Opera 11.10+ */ 627 | background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); /* W3C */ 628 | box-shadow: inset 0 0 3px #111; 629 | } 630 | div.dt-container .dt-paging .ellipsis { 631 | padding: 0 1em; 632 | } 633 | div.dt-container .dt-length, 634 | div.dt-container .dt-search, 635 | div.dt-container .dt-info, 636 | div.dt-container .dt-processing, 637 | div.dt-container .dt-paging { 638 | color: inherit; 639 | } 640 | div.dt-container .dataTables_scroll { 641 | clear: both; 642 | } 643 | div.dt-container .dataTables_scroll div.dt-scroll-body { 644 | -webkit-overflow-scrolling: touch; 645 | } 646 | div.dt-container .dataTables_scroll div.dt-scroll-body > table > thead > tr > th, div.dt-container .dataTables_scroll div.dt-scroll-body > table > thead > tr > td, div.dt-container .dataTables_scroll div.dt-scroll-body > table > tbody > tr > th, div.dt-container .dataTables_scroll div.dt-scroll-body > table > tbody > tr > td { 647 | vertical-align: middle; 648 | } 649 | div.dt-container .dataTables_scroll div.dt-scroll-body > table > thead > tr > th > div.dataTables_sizing, 650 | div.dt-container .dataTables_scroll div.dt-scroll-body > table > thead > tr > td > div.dataTables_sizing, div.dt-container .dataTables_scroll div.dt-scroll-body > table > tbody > tr > th > div.dataTables_sizing, 651 | div.dt-container .dataTables_scroll div.dt-scroll-body > table > tbody > tr > td > div.dataTables_sizing { 652 | height: 0; 653 | overflow: hidden; 654 | margin: 0 !important; 655 | padding: 0 !important; 656 | } 657 | div.dt-container.dt-empty-footer tbody > tr:last-child > * { 658 | border-bottom: 1px solid rgba(0, 0, 0, 0.3); 659 | } 660 | div.dt-container.dt-empty-footer .dt-scroll-body { 661 | border-bottom: 1px solid rgba(0, 0, 0, 0.3); 662 | } 663 | div.dt-container.dt-empty-footer .dt-scroll-body tbody > tr:last-child > * { 664 | border-bottom: none; 665 | } 666 | 667 | @media screen and (max-width: 767px) { 668 | div.dt-container div.dt-layout-row { 669 | display: block; 670 | } 671 | div.dt-container div.dt-layout-cell { 672 | display: block; 673 | } 674 | div.dt-container div.dt-layout-cell.dt-full, div.dt-container div.dt-layout-cell.dt-start, div.dt-container div.dt-layout-cell.dt-end { 675 | text-align: center; 676 | } 677 | } 678 | @media screen and (max-width: 640px) { 679 | .dt-container .dt-length, 680 | .dt-container .dt-search { 681 | float: none; 682 | text-align: center; 683 | } 684 | .dt-container .dt-search { 685 | margin-top: 0.5em; 686 | } 687 | } 688 | html.dark { 689 | --dt-row-hover: 255, 255, 255; 690 | --dt-row-stripe: 255, 255, 255; 691 | --dt-column-ordering: 255, 255, 255; 692 | } 693 | html.dark table.dataTable > thead > tr > th, 694 | html.dark table.dataTable > thead > tr > td { 695 | border-bottom: 1px solid rgb(89, 91, 94); 696 | } 697 | html.dark table.dataTable > thead > tr > th:active, 698 | html.dark table.dataTable > thead > tr > td:active { 699 | outline: none; 700 | } 701 | html.dark table.dataTable > tfoot > tr > th, 702 | html.dark table.dataTable > tfoot > tr > td { 703 | border-top: 1px solid rgb(89, 91, 94); 704 | } 705 | html.dark table.dataTable.row-border > tbody > tr > *, html.dark table.dataTable.display > tbody > tr > * { 706 | border-top: 1px solid rgb(64, 67, 70); 707 | } 708 | html.dark table.dataTable.row-border > tbody > tr:first-child > *, html.dark table.dataTable.display > tbody > tr:first-child > * { 709 | border-top: none; 710 | } 711 | html.dark table.dataTable.row-border > tbody > tr.selected + tr.selected > td, html.dark table.dataTable.display > tbody > tr.selected + tr.selected > td { 712 | border-top-color: rgba(13, 110, 253, 0.65); 713 | border-top-color: rgba(var(--dt-row-selected), 0.65); 714 | } 715 | html.dark table.dataTable.cell-border > tbody > tr > th, 716 | html.dark table.dataTable.cell-border > tbody > tr > td { 717 | border-top: 1px solid rgb(64, 67, 70); 718 | border-right: 1px solid rgb(64, 67, 70); 719 | } 720 | html.dark table.dataTable.cell-border > tbody > tr > th:first-child, 721 | html.dark table.dataTable.cell-border > tbody > tr > td:first-child { 722 | border-left: 1px solid rgb(64, 67, 70); 723 | } 724 | html.dark .dt-container.dt-empty-footer table.dataTable { 725 | border-bottom: 1px solid rgb(89, 91, 94); 726 | } 727 | html.dark .dt-container .dt-search input, 728 | html.dark .dt-container .dt-length select { 729 | border: 1px solid rgba(255, 255, 255, 0.2); 730 | background-color: var(--dt-html-background); 731 | } 732 | html.dark .dt-container .dt-paging .dt-paging-button.current, html.dark .dt-container .dt-paging .dt-paging-button.current:hover { 733 | border: 1px solid rgb(89, 91, 94); 734 | background: rgba(255, 255, 255, 0.15); 735 | } 736 | html.dark .dt-container .dt-paging .dt-paging-button.disabled, html.dark .dt-container .dt-paging .dt-paging-button.disabled:hover, html.dark .dt-container .dt-paging .dt-paging-button.disabled:active { 737 | color: #666 !important; 738 | } 739 | html.dark .dt-container .dt-paging .dt-paging-button:hover { 740 | border: 1px solid rgb(53, 53, 53); 741 | background: rgb(53, 53, 53); 742 | } 743 | html.dark .dt-container .dt-paging .dt-paging-button:active { 744 | background: #3a3a3a; 745 | } 746 | 747 | /* 748 | * Overrides for RTL support 749 | */ 750 | *[dir=rtl] table.dataTable thead th, 751 | *[dir=rtl] table.dataTable thead td, 752 | *[dir=rtl] table.dataTable tfoot th, 753 | *[dir=rtl] table.dataTable tfoot td { 754 | text-align: right; 755 | } 756 | *[dir=rtl] table.dataTable th.dt-type-numeric, *[dir=rtl] table.dataTable th.dt-type-date, 757 | *[dir=rtl] table.dataTable td.dt-type-numeric, 758 | *[dir=rtl] table.dataTable td.dt-type-date { 759 | text-align: left; 760 | } 761 | *[dir=rtl] div.dt-container div.dt-layout-cell.dt-start { 762 | text-align: right; 763 | } 764 | *[dir=rtl] div.dt-container div.dt-layout-cell.dt-end { 765 | text-align: left; 766 | } 767 | *[dir=rtl] div.dt-container div.dt-search input { 768 | margin: 0 3px 0 0; 769 | } 770 | 771 | 772 | -------------------------------------------------------------------------------- /assets/icons/donate.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/icons/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/icons/help.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /assets/index.md.browsertemplate: -------------------------------------------------------------------------------- 1 | --- 2 | Title: 3 | Description: 4 | Template: more 5 | --- 6 | 7 |
XXX
8 | 9 |
10 |
11 | # More information: BROWSER 12 | 13 | Enter text here. Enter text here. Enter text here. Enter text here. Enter text here. Enter text here. Enter text here. Enter text here. Enter text here. 14 | 15 | Enter text here. Enter text here. Enter text here. Enter text here. Enter text here. Enter text here. Enter text here. 16 | 17 | * [Download](#) 18 | * This bullet only if listed on [privacytests.org](https://privacytests.org) 19 | * This bullet if listed on [privacyguides.org](#) 20 |
21 | 22 |
23 |
24 | 25 | ## avoidthehack weigh-ins 26 | 27 | avoidthehack Recommendation status: N/A 28 | 29 | insert info if there are avoidthehack.com posts about it also link with Link 30 | 31 |
32 |
33 | 34 | -------------------------------------------------------------------------------- /assets/js/dataTables.colReorder.js: -------------------------------------------------------------------------------- 1 | /*! ColReorder 2.0.0 2 | * © SpryMedia Ltd - datatables.net/license 3 | */ 4 | 5 | (function( factory ){ 6 | if ( typeof define === 'function' && define.amd ) { 7 | // AMD 8 | define( ['jquery', 'datatables.net'], function ( $ ) { 9 | return factory( $, window, document ); 10 | } ); 11 | } 12 | else if ( typeof exports === 'object' ) { 13 | // CommonJS 14 | var jq = require('jquery'); 15 | var cjsRequires = function (root, $) { 16 | if ( ! $.fn.dataTable ) { 17 | require('datatables.net')(root, $); 18 | } 19 | }; 20 | 21 | if (typeof window === 'undefined') { 22 | module.exports = function (root, $) { 23 | if ( ! root ) { 24 | // CommonJS environments without a window global must pass a 25 | // root. This will give an error otherwise 26 | root = window; 27 | } 28 | 29 | if ( ! $ ) { 30 | $ = jq( root ); 31 | } 32 | 33 | cjsRequires( root, $ ); 34 | return factory( $, root, root.document ); 35 | }; 36 | } 37 | else { 38 | cjsRequires( window, jq ); 39 | module.exports = factory( jq, window, window.document ); 40 | } 41 | } 42 | else { 43 | // Browser 44 | factory( jQuery, window, document ); 45 | } 46 | }(function( $, window, document ) { 47 | 'use strict'; 48 | var DataTable = $.fn.dataTable; 49 | 50 | 51 | /** 52 | * Mutate an array, moving a set of elements into a new index position 53 | * 54 | * @param arr Array to modify 55 | * @param from Start move index 56 | * @param count Number of elements to move 57 | * @param to Index where the start element will move to 58 | */ 59 | function arrayMove(arr, from, count, to) { 60 | var movers = arr.splice(from, count); 61 | // Add delete and start to the array, so we can use it for the `apply` 62 | movers.unshift(0); // splice delete param 63 | movers.unshift(to < from ? to : to - count + 1); // splice start param 64 | arr.splice.apply(arr, movers); 65 | } 66 | /** 67 | * Run finishing activities after one or more columns have been reordered. 68 | * 69 | * @param dt DataTable being operated on - must be a single table instance 70 | */ 71 | function finalise(dt) { 72 | // Cache invalidation. Always read from the data object rather 73 | // than reading back from the DOM since it could have been 74 | // changed by a renderer 75 | dt.rows().invalidate('data'); 76 | // Redraw the header / footer. Its a little bit of a hack this, as DT 77 | // doesn't expose the header draw as an API method. It calls state 78 | // saving, so we don't need to here. 79 | dt.column(0).visible(dt.column(0).visible()); 80 | dt.columns.adjust(); 81 | // Fire an event so other plug-ins can update 82 | var order = dt.colReorder.order(); 83 | dt.trigger('columns-reordered', [ 84 | { 85 | order: order, 86 | mapping: invertKeyValues(order) 87 | } 88 | ]); 89 | } 90 | /** 91 | * Get the original indexes in their current order 92 | * 93 | * @param dt DataTable being operated on - must be a single table instance 94 | * @returns Original indexes in current order 95 | */ 96 | function getOrder(dt) { 97 | return dt.settings()[0].aoColumns.map(function (col) { 98 | return col._crOriginalIdx; 99 | }); 100 | } 101 | /** 102 | * Manipulate a header / footer array in DataTables settings to reorder 103 | * the columns. 104 | */ 105 | function headerUpdate(structure, map, from, to) { 106 | var done = []; 107 | for (var i = 0; i < structure.length; i++) { 108 | var headerRow = structure[i]; 109 | arrayMove(headerRow, from[0], from.length, to); 110 | for (var j = 0; j < headerRow.length; j++) { 111 | var cell = headerRow[j].cell; 112 | // Only work on a DOM element once, otherwise we risk remapping a 113 | // remapped value (etc). 114 | if (done.includes(cell)) { 115 | continue; 116 | } 117 | var indexes = cell.getAttribute('data-dt-column').split(','); 118 | var mapped = indexes 119 | .map(function (idx) { 120 | return map[idx]; 121 | }) 122 | .join(','); 123 | // Update data attributes for the new column position 124 | cell.setAttribute('data-dt-column', mapped); 125 | done.push(cell); 126 | } 127 | } 128 | } 129 | /** 130 | * Setup for ColReorder API operations 131 | * 132 | * @param dt DataTable(s) being operated on - might have multiple tables! 133 | */ 134 | function init(api) { 135 | // Assign the original column index to a parameter that we can lookup. 136 | // On the first pass (i.e. when the parameter hasn't yet been set), the 137 | // index order will be the original order, so this is quite a simple 138 | // assignment. 139 | api.columns().iterator('column', function (s, idx) { 140 | var columns = s.aoColumns; 141 | if (columns[idx]._crOriginalIdx === undefined) { 142 | columns[idx]._crOriginalIdx = idx; 143 | } 144 | }); 145 | } 146 | /** 147 | * Switch the key value pairing of an index array to be value key (i.e. the old value is now the 148 | * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ]. 149 | * 150 | * @param array arr Array to switch around 151 | */ 152 | function invertKeyValues(arr) { 153 | var result = []; 154 | for (var i = 0; i < arr.length; i++) { 155 | result[arr[i]] = i; 156 | } 157 | return result; 158 | } 159 | /** 160 | * Move one or more columns from one index to another. 161 | * 162 | * This method has a lot of knowledge about how DataTables works internally. 163 | * If DataTables changes how it handles cells, columns, etc, then this 164 | * method would need to be updated accordingly. 165 | * 166 | * @param dt DataTable being operated on - must be a single table instance 167 | * @param from Column indexes to move 168 | * @param to Destination index (starting if multiple) 169 | */ 170 | function move(dt, from, to) { 171 | var i, j; 172 | var settings = dt.settings()[0]; 173 | var columns = settings.aoColumns; 174 | var newOrder = columns.map(function (col, idx) { 175 | return idx; 176 | }); 177 | // The to column in already inside the from column(s) (might be the same) 178 | // no change required 179 | if (from.includes(to)) { 180 | return; 181 | } 182 | // A reverse index array so we can look up new indexes from old 183 | arrayMove(newOrder, from[0], from.length, to); 184 | var reverseIndexes = invertKeyValues(newOrder); 185 | // Main column 186 | arrayMove(columns, from[0], from.length, to); 187 | // Per row manipulations 188 | for (i = 0; i < settings.aoData.length; i++) { 189 | var data = settings.aoData[i]; 190 | var cells = data.anCells; 191 | if (cells) { 192 | // Array of cells 193 | arrayMove(cells, from[0], from.length, to); 194 | for (j = 0; j < cells.length; j++) { 195 | // Reinsert into the document in the new order 196 | if (data.nTr && cells[j] && columns[j].bVisible) { 197 | data.nTr.appendChild(cells[j]); 198 | } 199 | // Update lookup index 200 | if (cells[j] && cells[j]._DT_CellIndex) { 201 | cells[j]._DT_CellIndex.column = j; 202 | } 203 | } 204 | } 205 | } 206 | // Per column manipulation 207 | for (i = 0; i < columns.length; i++) { 208 | var column = columns[i]; 209 | // Data column sorting 210 | for (j = 0; j < column.aDataSort.length; j++) { 211 | column.aDataSort[j] = reverseIndexes[column.aDataSort[j]]; 212 | } 213 | // Update the column indexes 214 | column.idx = reverseIndexes[column.idx]; 215 | // Reorder the colgroup > col elements for the new order 216 | if (column.bVisible) { 217 | settings.colgroup.append(column.colEl); 218 | } 219 | } 220 | // Header and footer 221 | headerUpdate(settings.aoHeader, reverseIndexes, from, to); 222 | headerUpdate(settings.aoFooter, reverseIndexes, from, to); 223 | // Search - columns 224 | arrayMove(settings.aoPreSearchCols, from[0], from.length, to); 225 | // Ordering indexes update - note that the sort listener on the 226 | // header works out the index to apply on each draw, so it doesn't 227 | // need to be updated here. 228 | orderingIndexes(reverseIndexes, settings.aaSorting); 229 | if (Array.isArray(settings.aaSortingFixed)) { 230 | orderingIndexes(reverseIndexes, settings.aaSortingFixed); 231 | } 232 | else if (settings.aaSortingFixed.pre) { 233 | orderingIndexes(reverseIndexes, settings.aaSortingFixed.pre); 234 | } 235 | else if (settings.aaSortingFixed.post) { 236 | orderingIndexes(reverseIndexes, settings.aaSortingFixed.pre); 237 | } 238 | settings.aLastSort.forEach(function (el) { 239 | el.src = reverseIndexes[el.src]; 240 | }); 241 | // Fire an event so other plug-ins can update 242 | dt.trigger('column-reorder', [ 243 | dt.settings()[0], 244 | { 245 | from: from, 246 | to: to, 247 | mapping: reverseIndexes 248 | } 249 | ]); 250 | } 251 | /** 252 | * Update the indexing for ordering arrays 253 | * 254 | * @param map Reverse index map 255 | * @param order Array to update 256 | */ 257 | function orderingIndexes(map, order) { 258 | for (var i = 0; i < order.length; i++) { 259 | var el = order[i]; 260 | if (typeof el === 'number') { 261 | // Just a number 262 | order[i] = map[el]; 263 | } 264 | else if ($.isPlainObject(el) && el.idx !== undefined) { 265 | // New index in an object style 266 | el.idx = map[el.idx]; 267 | } 268 | else if (Array.isArray(el) && typeof el[0] === 'number') { 269 | // The good old fixes length array 270 | el[0] = map[el[0]]; 271 | } 272 | // No need to update if in object + .name style 273 | } 274 | } 275 | /** 276 | * Take an index array for the current positioned, reordered to what you want 277 | * them to be. 278 | * 279 | * @param dt DataTable being operated on - must be a single table instance 280 | * @param order Indexes from current order, positioned as you want them to be 281 | */ 282 | function setOrder(dt, order, original) { 283 | var changed = false; 284 | var i; 285 | if (order.length !== dt.columns().count()) { 286 | dt.error('ColReorder - column count mismatch'); 287 | return; 288 | } 289 | // The order given is based on the original indexes, rather than the 290 | // existing ones, so we need to translate from the original to current 291 | // before then doing the order 292 | if (original) { 293 | order = transpose(dt, order, 'toCurrent'); 294 | } 295 | // The API is array index as the desired position, but our algorithm below is 296 | // for array index as the current position. So we need to invert for it to work. 297 | var setOrder = invertKeyValues(order); 298 | // Move columns, one by one with validation disabled! 299 | for (i = 0; i < setOrder.length; i++) { 300 | var currentIndex = setOrder.indexOf(i); 301 | if (i !== currentIndex) { 302 | // Reorder our switching error 303 | arrayMove(setOrder, currentIndex, 1, i); 304 | // Do the reorder 305 | move(dt, [currentIndex], i); 306 | changed = true; 307 | } 308 | } 309 | // Reorder complete 310 | if (changed) { 311 | finalise(dt); 312 | } 313 | } 314 | /** 315 | * Convert the DataTables header structure array into a 2D array where each 316 | * element has a reference to its TH/TD cell (regardless of spanning). 317 | * 318 | * @param structure Header / footer structure object 319 | * @returns 2D array of header cells 320 | */ 321 | function structureFill(structure) { 322 | var filledIn = []; 323 | for (var row = 0; row < structure.length; row++) { 324 | filledIn.push([]); 325 | for (var col = 0; col < structure[row].length; col++) { 326 | var cell = structure[row][col]; 327 | if (cell) { 328 | for (var rowInner = 0; rowInner < cell.rowspan; rowInner++) { 329 | for (var colInner = 0; colInner < cell.colspan; colInner++) { 330 | filledIn[row + rowInner][col + colInner] = cell.cell; 331 | } 332 | } 333 | } 334 | } 335 | } 336 | return filledIn; 337 | } 338 | /** 339 | * Convert the index type 340 | * 341 | * @param dt DataTable to work on 342 | * @param idx Index to transform 343 | * @param dir Transform direction 344 | * @returns Converted number(s) 345 | */ 346 | function transpose(dt, idx, dir) { 347 | var order = dt.colReorder.order(); 348 | var columns = dt.settings()[0].aoColumns; 349 | if (dir === 'toCurrent' || dir === 'fromOriginal') { 350 | // Given an original index, want the current 351 | return !Array.isArray(idx) 352 | ? order.indexOf(idx) 353 | : idx.map(function (index) { 354 | return order.indexOf(index); 355 | }); 356 | } 357 | // Given a current index, want the original 358 | return !Array.isArray(idx) 359 | ? columns[idx]._crOriginalIdx 360 | : idx.map(function (index) { 361 | return columns[index]._crOriginalIdx; 362 | }); 363 | } 364 | /** 365 | * Validate that a requested move is okay. This includes bound checking 366 | * and that it won't split colspan'ed cells. 367 | * 368 | * @param table API instance 369 | * @param from Column indexes to move 370 | * @param to Destination index (starting if multiple) 371 | * @returns Validation result 372 | */ 373 | function validateMove(table, from, to) { 374 | var columns = table.columns().count(); 375 | // Sanity and bound checking 376 | if (from[0] < to && to < from[from.length]) { 377 | return false; 378 | } 379 | if (from[0] < 0 && from[from.length - 1] > columns) { 380 | return false; 381 | } 382 | if (to < 0 && to > columns) { 383 | return false; 384 | } 385 | // No change - it's valid 386 | if (from.includes(to)) { 387 | return true; 388 | } 389 | if (!validateStructureMove(table.table().header.structure(), from, to)) { 390 | return false; 391 | } 392 | if (!validateStructureMove(table.table().footer.structure(), from, to)) { 393 | return false; 394 | } 395 | return true; 396 | } 397 | /** 398 | * For a given structure check that the move is valid. 399 | * @param structure 400 | * @param from 401 | * @param to 402 | * @returns 403 | */ 404 | function validateStructureMove(structure, from, to) { 405 | var header = structureFill(structure); 406 | var i; 407 | // Shuffle the header cells around 408 | for (i = 0; i < header.length; i++) { 409 | arrayMove(header[i], from[0], from.length, to); 410 | } 411 | // Sanity check that the headers are next to each other 412 | for (i = 0; i < header.length; i++) { 413 | var seen = []; 414 | for (var j = 0; j < header[i].length; j++) { 415 | var cell = header[i][j]; 416 | if (!seen.includes(cell)) { 417 | // Hasn't been seen before 418 | seen.push(cell); 419 | } 420 | else if (seen[seen.length - 1] !== cell) { 421 | // Has been seen before and is not the previous cell - validation failed 422 | return false; 423 | } 424 | } 425 | } 426 | return true; 427 | } 428 | 429 | /** 430 | * This is one possible UI for column reordering in DataTables. In this case 431 | * columns are reordered by clicking and dragging a column header. It calculates 432 | * where columns can be dropped based on the column header used to start the drag 433 | * and then `colReorder.move()` method to alter the DataTable. 434 | */ 435 | var ColReorder = /** @class */ (function () { 436 | function ColReorder(dt, opts) { 437 | this.dom = { 438 | drag: null 439 | }; 440 | this.c = { 441 | columns: null, 442 | enable: null, 443 | order: null 444 | }; 445 | this.s = { 446 | dropZones: [], 447 | mouse: { 448 | absLeft: -1, 449 | offset: { 450 | x: -1, 451 | y: -1 452 | }, 453 | start: { 454 | x: -1, 455 | y: -1 456 | }, 457 | target: null, 458 | targets: [] 459 | }, 460 | scrollInterval: null 461 | }; 462 | var that = this; 463 | var ctx = dt.settings()[0]; 464 | // Check if ColReorder already has been initialised on this DataTable - only 465 | // one can exist. 466 | if (ctx._colReorder) { 467 | return; 468 | } 469 | dt.settings()[0]._colReorder = this; 470 | this.dt = dt; 471 | $.extend(this.c, ColReorder.defaults, opts); 472 | init(dt); 473 | dt.on('stateSaveParams', function (e, s, d) { 474 | d.colReorder = getOrder(dt); 475 | }); 476 | dt.on('destroy', function () { 477 | dt.off('.colReorder'); 478 | dt.colReorder.reset(); 479 | }); 480 | // Initial ordering / state restoring 481 | var loaded = dt.state.loaded(); 482 | var order = this.c.order; 483 | if (loaded && loaded.colReorder) { 484 | order = loaded.colReorder; 485 | } 486 | if (order) { 487 | dt.ready(function () { 488 | setOrder(dt, order, true); 489 | }); 490 | } 491 | dt.table() 492 | .header.structure() 493 | .forEach(function (row) { 494 | for (var i = 0; i < row.length; i++) { 495 | if (row[i] && row[i].cell) { 496 | that._addListener(row[i].cell); 497 | } 498 | } 499 | }); 500 | } 501 | ColReorder.prototype.disable = function () { 502 | this.c.enable = false; 503 | return this; 504 | }; 505 | ColReorder.prototype.enable = function (flag) { 506 | if (flag === void 0) { flag = true; } 507 | if (flag === false) { 508 | return this.disable(); 509 | } 510 | this.c.enable = true; 511 | return this; 512 | }; 513 | /** 514 | * Attach the mouse down listener to an element to start a column reorder action 515 | * 516 | * @param el 517 | */ 518 | ColReorder.prototype._addListener = function (el) { 519 | var that = this; 520 | $(el) 521 | .on('selectstart.colReorder', function () { 522 | return false; 523 | }) 524 | .on('mousedown.colReorder touchstart.colReorder', function (e) { 525 | // Ignore middle and right click 526 | if (e.type === 'mousedown' && e.which !== 1) { 527 | return; 528 | } 529 | // Ignore if disabled 530 | if (!that.c.enable) { 531 | return; 532 | } 533 | that._mouseDown(e, this); 534 | }); 535 | }; 536 | /** 537 | * Create the element that is dragged around the page 538 | */ 539 | ColReorder.prototype._createDragNode = function () { 540 | var origCell = this.s.mouse.target; 541 | var origTr = origCell.parent(); 542 | var origThead = origTr.parent(); 543 | var origTable = origThead.parent(); 544 | var cloneCell = origCell.clone(); 545 | // This is a slightly odd combination of jQuery and DOM, but it is the 546 | // fastest and least resource intensive way I could think of cloning 547 | // the table with just a single header cell in it. 548 | this.dom.drag = $(origTable[0].cloneNode(false)) 549 | .addClass('dtcr-cloned') 550 | .append($(origThead[0].cloneNode(false)).append($(origTr[0].cloneNode(false)).append(cloneCell[0])) // Not sure why it doesn't want to append a jQuery node 551 | ) 552 | .css({ 553 | position: 'absolute', 554 | top: 0, 555 | left: 0, 556 | width: $(origCell).outerWidth(), 557 | height: $(origCell).outerHeight() 558 | }) 559 | .appendTo('body'); 560 | }; 561 | /** 562 | * Get cursor position regardless of mouse or touch input 563 | * 564 | * @param e Event 565 | * @param prop Property name to get 566 | * @returns Value - assuming a number here 567 | */ 568 | ColReorder.prototype._cursorPosition = function (e, prop) { 569 | return e.type.indexOf('touch') !== -1 ? e.originalEvent.touches[0][prop] : e[prop]; 570 | }; 571 | /** 572 | * Cache values at start 573 | * 574 | * @param e Triggering event 575 | * @param cell Cell that the action started on 576 | * @returns 577 | */ 578 | ColReorder.prototype._mouseDown = function (e, cell) { 579 | var _this = this; 580 | var target = $(e.target).closest('th, td'); 581 | var offset = target.offset(); 582 | var moveableColumns = this.dt.columns(this.c.columns).indexes().toArray(); 583 | var moveColumnIndexes = $(cell) 584 | .attr('data-dt-column') 585 | .split(',') 586 | .map(function (val) { 587 | return parseInt(val, 10); 588 | }); 589 | // Don't do anything for columns which are not selected as moveable 590 | for (var j = 0; j < moveColumnIndexes.length; j++) { 591 | if (!moveableColumns.includes(moveColumnIndexes[j])) { 592 | return false; 593 | } 594 | } 595 | this.s.mouse.start.x = this._cursorPosition(e, 'pageX'); 596 | this.s.mouse.start.y = this._cursorPosition(e, 'pageY'); 597 | this.s.mouse.offset.x = this._cursorPosition(e, 'pageX') - offset.left; 598 | this.s.mouse.offset.y = this._cursorPosition(e, 'pageY') - offset.top; 599 | this.s.mouse.target = target; 600 | this.s.mouse.targets = moveColumnIndexes; 601 | // Classes to highlight the columns being moved 602 | for (var i = 0; i < moveColumnIndexes.length; i++) { 603 | var cells = this.dt 604 | .cells(null, moveColumnIndexes[i], { page: 'current' }) 605 | .nodes() 606 | .to$(); 607 | var klass = 'dtcr-moving'; 608 | if (i === 0) { 609 | klass += ' dtcr-moving-first'; 610 | } 611 | if (i === moveColumnIndexes.length - 1) { 612 | klass += ' dtcr-moving-last'; 613 | } 614 | cells.addClass(klass); 615 | } 616 | this._regions(moveColumnIndexes); 617 | this._scrollRegions(); 618 | /* Add event handlers to the document */ 619 | $(document) 620 | .on('mousemove.colReorder touchmove.colReorder', function (e) { 621 | _this._mouseMove(e); 622 | }) 623 | .on('mouseup.colReorder touchend.colReorder', function (e) { 624 | _this._mouseUp(e); 625 | }); 626 | }; 627 | ColReorder.prototype._mouseMove = function (e) { 628 | if (this.dom.drag === null) { 629 | // Only create the drag element if the mouse has moved a specific distance from the start 630 | // point - this allows the user to make small mouse movements when sorting and not have a 631 | // possibly confusing drag element showing up 632 | if (Math.pow(Math.pow(this._cursorPosition(e, 'pageX') - this.s.mouse.start.x, 2) + 633 | Math.pow(this._cursorPosition(e, 'pageY') - this.s.mouse.start.y, 2), 0.5) < 5) { 634 | return; 635 | } 636 | $(document.body).addClass('dtcr-dragging'); 637 | this._createDragNode(); 638 | } 639 | // Position the element - we respect where in the element the click occurred 640 | this.dom.drag.css({ 641 | left: this._cursorPosition(e, 'pageX') - this.s.mouse.offset.x, 642 | top: this._cursorPosition(e, 'pageY') - this.s.mouse.offset.y 643 | }); 644 | // Find cursor's left position relative to the table 645 | var tableOffset = $(this.dt.table().node()).offset().left; 646 | var cursorMouseLeft = this._cursorPosition(e, 'pageX') - tableOffset; 647 | var dropZone = this.s.dropZones.find(function (zone) { 648 | if (zone.left <= cursorMouseLeft && cursorMouseLeft <= zone.left + zone.width) { 649 | return true; 650 | } 651 | return false; 652 | }); 653 | this.s.mouse.absLeft = this._cursorPosition(e, 'pageX'); 654 | if (!dropZone) { 655 | return; 656 | } 657 | if (!dropZone.self) { 658 | this._move(dropZone, cursorMouseLeft); 659 | } 660 | }; 661 | ColReorder.prototype._mouseUp = function (e) { 662 | $(document).off('.colReorder'); 663 | $(document.body).removeClass('dtcr-dragging'); 664 | if (this.dom.drag) { 665 | this.dom.drag.remove(); 666 | this.dom.drag = null; 667 | } 668 | if (this.s.scrollInterval) { 669 | clearInterval(this.s.scrollInterval); 670 | } 671 | this.dt.cells('.dtcr-moving').nodes().to$().removeClass('dtcr-moving dtcr-moving-first dtcr-moving-last'); 672 | }; 673 | /** 674 | * Shift columns around 675 | * 676 | * @param dropZone Where to move to 677 | * @param cursorMouseLeft Cursor position, relative to the left of the table 678 | */ 679 | ColReorder.prototype._move = function (dropZone, cursorMouseLeft) { 680 | var that = this; 681 | this.dt.colReorder.move(this.s.mouse.targets, dropZone.colIdx); 682 | // Update the targets 683 | this.s.mouse.targets = $(this.s.mouse.target) 684 | .attr('data-dt-column') 685 | .split(',') 686 | .map(function (val) { 687 | return parseInt(val, 10); 688 | }); 689 | this._regions(this.s.mouse.targets); 690 | // If the column being moved is smaller than the column it is replacing, 691 | // the drop zones might need a correction to allow for this since, otherwise 692 | // we might immediately be changing the column order as soon as it was placed. 693 | // Find the drop zone for the first in the list of targets - is its 694 | // left greater than the mouse position. If so, it needs correcting 695 | var dz = this.s.dropZones.find(function (zone) { 696 | return zone.colIdx === that.s.mouse.targets[0]; 697 | }); 698 | var dzIdx = this.s.dropZones.indexOf(dz); 699 | if (dz.left > cursorMouseLeft) { 700 | var previousDiff = dz.left - cursorMouseLeft; 701 | var previousDz = this.s.dropZones[dzIdx - 1]; 702 | dz.left -= previousDiff; 703 | dz.width += previousDiff; 704 | if (previousDz) { 705 | previousDz.width -= previousDiff; 706 | } 707 | } 708 | // And for the last in the list 709 | dz = this.s.dropZones.find(function (zone) { 710 | return zone.colIdx === that.s.mouse.targets[that.s.mouse.targets.length - 1]; 711 | }); 712 | if (dz.left + dz.width < cursorMouseLeft) { 713 | var nextDiff = cursorMouseLeft - (dz.left + dz.width); 714 | var nextDz = this.s.dropZones[dzIdx + 1]; 715 | dz.width += nextDiff; 716 | if (nextDz) { 717 | nextDz.left += nextDiff; 718 | nextDz.width -= nextDiff; 719 | } 720 | } 721 | }; 722 | /** 723 | * Determine the boundaries for where drops can happen and where they would 724 | * insert into. 725 | */ 726 | ColReorder.prototype._regions = function (moveColumns) { 727 | var that = this; 728 | var dropZones = []; 729 | var totalWidth = 0; 730 | var negativeCorrect = 0; 731 | var allowedColumns = this.dt.columns(this.c.columns).indexes().toArray(); 732 | var widths = this.dt.columns().widths(); 733 | // Each column is a drop zone 734 | this.dt.columns().every(function (colIdx, tabIdx, i) { 735 | if (!this.visible()) { 736 | return; 737 | } 738 | var columnWidth = widths[colIdx]; 739 | // Check that we are allowed to move into this column - if not, need 740 | // to offset the widths 741 | if (!allowedColumns.includes(colIdx)) { 742 | totalWidth += columnWidth; 743 | return; 744 | } 745 | var valid = validateMove(that.dt, moveColumns, colIdx); 746 | if (valid) { 747 | // New drop zone. Note that it might have it's offset moved 748 | // by the final condition in this logic set 749 | dropZones.push({ 750 | colIdx: colIdx, 751 | left: totalWidth - negativeCorrect, 752 | self: moveColumns[0] <= colIdx && colIdx <= moveColumns[moveColumns.length - 1], 753 | width: columnWidth + negativeCorrect 754 | }); 755 | } 756 | else if (colIdx < moveColumns[0]) { 757 | // Not valid and before the column(s) to be moved - the drop 758 | // zone for the previous valid drop point is extended 759 | if (dropZones.length) { 760 | dropZones[dropZones.length - 1].width += columnWidth; 761 | } 762 | } 763 | else if (colIdx > moveColumns[moveColumns.length - 1]) { 764 | // Not valid and after the column(s) to be moved - the next 765 | // drop zone to be created will be extended 766 | negativeCorrect += columnWidth; 767 | } 768 | totalWidth += columnWidth; 769 | }); 770 | this.s.dropZones = dropZones; 771 | // this._drawDropZones(); 772 | }; 773 | /** 774 | * Check if the table is scrolling or not. It is it the `table` isn't the same for 775 | * the header and body parents. 776 | * 777 | * @returns 778 | */ 779 | ColReorder.prototype._isScrolling = function () { 780 | return this.dt.table().body().parentNode !== this.dt.table().header().parentNode; 781 | }; 782 | /** 783 | * Set an interval clock that will check to see if the scrolling of the table body should be moved 784 | * as the mouse moves on the scroll (allowing a drag and drop to columns which aren't yet visible) 785 | */ 786 | ColReorder.prototype._scrollRegions = function () { 787 | if (!this._isScrolling()) { 788 | // Not scrolling - nothing to do 789 | return; 790 | } 791 | var that = this; 792 | var tableLeft = $(this.dt.table().container()).position().left; 793 | var tableWidth = $(this.dt.table().container()).outerWidth(); 794 | var mouseBuffer = 75; 795 | var scrollContainer = this.dt.table().body().parentElement.parentElement; 796 | this.s.scrollInterval = setInterval(function () { 797 | var mouseLeft = that.s.mouse.absLeft; 798 | if (mouseLeft < tableLeft + mouseBuffer && scrollContainer.scrollLeft) { 799 | scrollContainer.scrollLeft -= 5; 800 | } 801 | else if (mouseLeft > tableLeft + tableWidth - mouseBuffer && 802 | scrollContainer.scrollLeft < scrollContainer.scrollWidth) { 803 | scrollContainer.scrollLeft += 5; 804 | } 805 | }, 25); 806 | }; 807 | // This is handy for debugging where the drop zones actually are! 808 | // private _drawDropZones () { 809 | // let dropZones = this.s.dropZones; 810 | // $('div.allan').remove(); 811 | // for (let i=0 ; i') 815 | // .addClass('allan') 816 | // .css({ 817 | // position: 'absolute', 818 | // top: 0, 819 | // width: zone.width - 4, 820 | // height: 20, 821 | // left: zone.left + 2, 822 | // border: '1px solid red', 823 | // }) 824 | // ); 825 | // } 826 | // } 827 | ColReorder.defaults = { 828 | columns: '', 829 | enable: true, 830 | order: null 831 | }; 832 | ColReorder.version = '2.0.0'; 833 | return ColReorder; 834 | }()); 835 | 836 | /*! ColReorder 2.0.0 837 | * © SpryMedia Ltd - datatables.net/license 838 | */ 839 | /** 840 | * @summary ColReorder 841 | * @description Provide the ability to reorder columns in a DataTable 842 | * @version 2.0.0 843 | * @author SpryMedia Ltd 844 | * @contact datatables.net 845 | * @copyright SpryMedia Ltd. 846 | * 847 | * This source file is free software, available under the following license: 848 | * MIT license - http://datatables.net/license/mit 849 | * 850 | * This source file is distributed in the hope that it will be useful, but 851 | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 852 | * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. 853 | * 854 | * For details please refer to: http://www.datatables.net 855 | */ 856 | // declare var DataTable: any; 857 | /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 858 | * UI interaction class 859 | */ 860 | /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 861 | * DataTables API integration 862 | */ 863 | /** Enable mouse column reordering */ 864 | DataTable.Api.register('colReorder.enable()', function (flag) { 865 | return this.iterator('table', function (ctx) { 866 | if (ctx._colReorder) { 867 | ctx._colReorder.enable(flag); 868 | } 869 | }); 870 | }); 871 | /** Disable mouse column reordering */ 872 | DataTable.Api.register('colReorder.disable()', function () { 873 | return this.iterator('table', function (ctx) { 874 | if (ctx._colReorder) { 875 | ctx._colReorder.disable(); 876 | } 877 | }); 878 | }); 879 | /** 880 | * Change the ordering of the columns in the DataTable. 881 | */ 882 | DataTable.Api.register('colReorder.move()', function (from, to) { 883 | init(this); 884 | if (!Array.isArray(from)) { 885 | from = [from]; 886 | } 887 | if (!validateMove(this, from, to)) { 888 | this.error('ColReorder - invalid move'); 889 | return this; 890 | } 891 | return this.tables().every(function () { 892 | move(this, from, to); 893 | finalise(this); 894 | }); 895 | }); 896 | DataTable.Api.register('colReorder.order()', function (set, original) { 897 | init(this); 898 | if (!set) { 899 | return this.context.length ? getOrder(this) : null; 900 | } 901 | return this.tables().every(function () { 902 | setOrder(this, set, original); 903 | }); 904 | }); 905 | DataTable.Api.register('colReorder.reset()', function () { 906 | init(this); 907 | return this.tables().every(function () { 908 | var order = this.columns() 909 | .every(function (i) { 910 | return i; 911 | }) 912 | .flatten() 913 | .toArray(); 914 | setOrder(this, order, true); 915 | }); 916 | }); 917 | DataTable.Api.register('colReorder.transpose()', function (idx, dir) { 918 | init(this); 919 | if (!dir) { 920 | dir = 'toCurrent'; 921 | } 922 | return transpose(this, idx, dir); 923 | }); 924 | DataTable.ColReorder = ColReorder; 925 | // Called when DataTables is going to load a state. That might be 926 | // before the table is ready (state saving) or after (state restoring). 927 | // Also note that it happens _before_ preInit (below). 928 | $(document).on('stateLoadInit.dt', function (e, settings, state) { 929 | if (e.namespace !== 'dt') { 930 | return; 931 | } 932 | var dt = new DataTable.Api(settings); 933 | if (state.colReorder) { 934 | if (dt.ready()) { 935 | // Table is fully loaded - do the column reordering here 936 | // so that the stored indexes are in the correct place 937 | // e.g. column visibility 938 | setOrder(dt, state.colReorder, true); 939 | } 940 | else { 941 | // If the table is not ready, column reordering is done 942 | // after it becomes fully ready. That means that saved 943 | // column indexes need to be updated for where those columns 944 | // currently are. 945 | var map = invertKeyValues(state.colReorder); 946 | // State's ordering indexes 947 | orderingIndexes(map, state.order); 948 | // State's columns array - sort by restore index 949 | for (var i = 0; i < state.columns.length; i++) { 950 | state.columns[i]._cr_sort = state.colReorder[i]; 951 | } 952 | state.columns.sort(function (a, b) { 953 | return a._cr_sort - b._cr_sort; 954 | }); 955 | } 956 | } 957 | }); 958 | $(document).on('preInit.dt', function (e, settings) { 959 | if (e.namespace !== 'dt') { 960 | return; 961 | } 962 | var init = settings.oInit.colReorder; 963 | var defaults = DataTable.defaults.colReorder; 964 | if (init || defaults) { 965 | var opts = $.extend({}, defaults, init); 966 | if (init !== false) { 967 | var dt = new DataTable.Api(settings); 968 | new ColReorder(dt, opts); 969 | } 970 | } 971 | }); 972 | 973 | 974 | return DataTable; 975 | })); 976 | -------------------------------------------------------------------------------- /assets/json/browsers.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | { 4 | "id": "1", 5 | "more": "Details", 6 | "logo": "/assets/logos/firefoxlogo.png", 7 | "browser": "Firefox", 8 | "developer": "Mozilla", 9 | "engine": "Gecko", 10 | "source": "Open source", 11 | "telemetry": "Yes; opt out", 12 | "track": "Yes; limited", 13 | "script": "Javascript only", 14 | "fingerprint": "must be enabled", 15 | "webrtc": "Yes; must be enabled", 16 | "availability": "Windows, macOS, Linux, Android, iOS", 17 | "sync": "Yes", 18 | "google": "Location services", 19 | "https": "must be enabled", 20 | "doh": "Yes/must be enabled (depends on locale)", 21 | "extensions": "Firefox Add-ons", 22 | "search": "Google" 23 | }, 24 | { 25 | "id": "2", 26 | "more": "Details", 27 | "logo": "/assets/logos/bravelogo.png", 28 | "browser": "Brave", 29 | "developer": "Brave Software", 30 | "engine": "Chromium", 31 | "source": "Open source", 32 | "telemetry": "Yes; opt-out", 33 | "track": "Yes; limited", 34 | "script": "Javascript only", 35 | "fingerprint": "Yes", 36 | "webrtc": "Only anonymize", 37 | "availability": "Windows, macOS, Linux, Android, iOS", 38 | "sync": "Yes", 39 | "google": "Proxied with Brave services", 40 | "https": "Yes", 41 | "doh": "must be enabled", 42 | "extensions": "Chrome Web Store extensions", 43 | "search": "Brave Search" 44 | }, 45 | { 46 | "id": "3", 47 | "more": "Details", 48 | "logo": "/assets/logos/librewolflogo.png", 49 | "browser": "Librewolf", 50 | "developer": "Community driven", 51 | "engine": "Gecko", 52 | "source": "Open source", 53 | "telemetry": "No", 54 | "track": "Yes; uBlock Origin", 55 | "script": "Javascript only", 56 | "fingerprint": "Yes", 57 | "webrtc": "Yes", 58 | "availability": "Windows, macOS, Linux", 59 | "sync": "Yes", 60 | "google": "No", 61 | "https": "Yes", 62 | "doh": "must be enabled", 63 | "extensions": "Firefox add-ons", 64 | "search": "DuckDuckGo" 65 | }, 66 | { 67 | "id": "4", 68 | "more": "Details", 69 | "logo": "/assets/logos/chromiumlogo.png", 70 | "browser": "Ungoogled Chromium", 71 | "developer": "Community driven", 72 | "engine": "Chromium", 73 | "source": "Open source", 74 | "telemetry": "No", 75 | "track": "No", 76 | "script": "Javascript only", 77 | "fingerprint": "must be enabled", 78 | "webrtc": "Only anonymize", 79 | "availability": "Windows, macOS, Linux", 80 | "sync": "No", 81 | "google": "No", 82 | "https": "Yes", 83 | "doh": "must be enabled", 84 | "extensions": "Chrome Web Store extensions", 85 | "search": "NoSearch" 86 | }, 87 | { 88 | "id": "5", 89 | "more": "Details", 90 | "logo": "/assets/logos/waterfoxlogo.png", 91 | "browser": "Waterfox", 92 | "developer": "Alex Kontos (Community driven)", 93 | "engine": "Gecko", 94 | "source": "Open source", 95 | "telemetry": "No", 96 | "track": "Yes; uBlock Origin", 97 | "script": "Javascript only", 98 | "fingerprint": "must be enabled", 99 | "webrtc": "Yes", 100 | "availability": "Windows, macOS, Linux, Android", 101 | "sync": "Yes", 102 | "google": "No", 103 | "https": "Yes", 104 | "doh": "must be enabled", 105 | "extensions": "Firefox add-ons", 106 | "search": "Bing" 107 | }, 108 | { 109 | "id": "6", 110 | "more": "Details", 111 | "logo": "/assets/logos/vivaldilogo.png", 112 | "browser": "Vivaldi", 113 | "developer": "Vivaldi Technologies", 114 | "engine": "Chromium", 115 | "source": "Part closed, part open source", 116 | "telemetry": "Yes; limited", 117 | "track": "Yes", 118 | "script": "Javascript only", 119 | "fingerprint": "must be enabled", 120 | "webrtc": "Only anonymize", 121 | "availability": "Windows, macOS, Linux, Android", 122 | "sync": "Yes", 123 | "google": "Yes, some", 124 | "https": "Yes", 125 | "doh": "must be enabled", 126 | "extensions": "Chrome Web Store extensions", 127 | "search": "Bing" 128 | }, 129 | { 130 | "id": "7", 131 | "more": "Details", 132 | "logo": "/assets/logos/palemoonlogo.png", 133 | "browser": "Pale Moon", 134 | "developer": "Moonchild Productions", 135 | "engine": "Goanna", 136 | "source": "Open source", 137 | "telemetry": "No", 138 | "track": "Yes; limited", 139 | "script": "Javascript only", 140 | "fingerprint": "Yes", 141 | "webrtc": "Yes; not supported", 142 | "availability": "Windows, Linux", 143 | "sync": "Yes", 144 | "google": "No", 145 | "https": "Yes", 146 | "doh": "-", 147 | "extensions": "Goanna add-ons", 148 | "search": "DuckDuckGo" 149 | }, 150 | { 151 | "id": "8", 152 | "more": "Details", 153 | "logo": "/assets/logos/iridiumlogo.png", 154 | "browser": "Iridium", 155 | "developer": "NETitwork GmbH", 156 | "engine": "Chromium", 157 | "source": "Open source", 158 | "telemetry": "No", 159 | "track": "No", 160 | "script": "Javascript only", 161 | "fingerprint": "must be enabled", 162 | "webrtc": "Only anonymize", 163 | "availability": "Windows, macOS, Linux", 164 | "sync": "No", 165 | "google": "Safe browsing only", 166 | "https": "Yes", 167 | "doh": "must be enabled", 168 | "extensions": "Chrome Web Store extensions - limited (see details)", 169 | "search": "Bing" 170 | }, 171 | { 172 | "id": "9", 173 | "more": "Details", 174 | "logo": "/assets/logos/duckduckgologo.png", 175 | "browser": "DuckDuckGo Mobile Browser", 176 | "developer": "DuckDuckGo", 177 | "engine": "WebKit/Blink", 178 | "source": "Open source", 179 | "telemetry": "?", 180 | "track": "Yes", 181 | "script": "No", 182 | "fingerprint": "Yes", 183 | "webrtc": "-", 184 | "availability": "iOS, Android, Windows, macOS", 185 | "sync": "No", 186 | "google": "?", 187 | "https": "Yes", 188 | "doh": "must be enabled", 189 | "extensions": "No", 190 | "search": "DuckDuckGo" 191 | }, 192 | { 193 | "id": "10", 194 | "more": "Details", 195 | "logo": "/assets/logos/firefoxfocuslogo.png", 196 | "browser": "Firefox Focus", 197 | "developer": "Mozilla", 198 | "engine": "Gecko", 199 | "source": "Open source", 200 | "telemetry": "?", 201 | "track": "Yes", 202 | "script": "Yes", 203 | "fingerprint": "No", 204 | "webrtc": "-", 205 | "availability": "iOS, Android", 206 | "sync": "No", 207 | "google": "Search only", 208 | "https": "Yes", 209 | "doh": "No", 210 | "extensions": "No", 211 | "search": "DuckDuckGo" 212 | }, 213 | { 214 | "id": "11", 215 | "more": "Details", 216 | "logo": "/assets/logos/icecatlogo.png", 217 | "browser": "GNU Icecat", 218 | "developer": "GNUzilla", 219 | "engine": "Gecko", 220 | "source": "Open source", 221 | "telemetry": "No", 222 | "track": "Yes", 223 | "script": "Yes", 224 | "fingerprint": "Yes", 225 | "webrtc": "Yes", 226 | "availability": "Linux", 227 | "sync": "No", 228 | "google": "No", 229 | "https": "Yes", 230 | "doh": "?", 231 | "extensions": "Firefox add-ons, GNUzilla add-ons", 232 | "search": "?" 233 | }, 234 | { 235 | "id": "12", 236 | "more": "Details", 237 | "logo": "/assets/logos/snowhazelogo.png", 238 | "browser": "SnowHaze", 239 | "developer": "Illotros GmbH", 240 | "engine": "WebKit", 241 | "source": "Open source", 242 | "telemetry": "No", 243 | "track": "Yes", 244 | "script": "Javascript, 3rd party scripts", 245 | "fingerprint": "must be enabled", 246 | "webrtc": "-", 247 | "availability": "iOS", 248 | "sync": "No", 249 | "google": "No", 250 | "https": "must be enabled", 251 | "doh": "must be enabled", 252 | "extensions": "No", 253 | "search": "Google" 254 | }, 255 | { 256 | "id": "13", 257 | "more": "Details", 258 | "logo": "/assets/logos/falkonlogo.png", 259 | "browser": "Falkon", 260 | "developer": "KDE", 261 | "engine": "QT WebEngine/Chromium", 262 | "source": "Open source", 263 | "telemetry": "No", 264 | "track": "Yes", 265 | "script": "Javascript only", 266 | "fingerprint": "?", 267 | "webrtc": "?", 268 | "availability": "Linux, Windows", 269 | "sync": "No", 270 | "google": "?", 271 | "https": "Yes", 272 | "doh": "must be enabled", 273 | "extensions": "Falkon Store (see details)", 274 | "search": "DuckDuckGo" 275 | }, 276 | { 277 | "id": "14", 278 | "more": "Details", 279 | "logo": "/assets/logos/bromitelogo.png", 280 | "browser": "Bromite", 281 | "developer": "Community driven", 282 | "engine": "Blink/Chromium", 283 | "source": "Open source", 284 | "telemetry": "No", 285 | "track": "Yes", 286 | "script": "Javascript", 287 | "fingerprint": "Yes; must be enabled", 288 | "webrtc": "Yes", 289 | "availability": "Android", 290 | "sync": "No", 291 | "google": "No", 292 | "https": "Yes", 293 | "doh": "must be enabled", 294 | "extensions": "Chrome Web Store extensions", 295 | "search": "DuckDuckGo" 296 | }, 297 | { 298 | "id": "15", 299 | "more": "Details", 300 | "logo": "/assets/logos/minbrowserlogo.png", 301 | "browser": "Min Browser", 302 | "developer": "Community driven", 303 | "engine": "Electron/System (see details)", 304 | "source": "Open source", 305 | "telemetry": "?", 306 | "track": "Yes", 307 | "script": "Javascript, 3rd party", 308 | "fingerprint": "No", 309 | "webrtc": "Only anonymize", 310 | "availability": "Windows, macOS, Linux", 311 | "sync": "No", 312 | "google": "No", 313 | "https": "Yes", 314 | "doh": "?", 315 | "extensions": "No", 316 | "search": "DuckDuckGo" 317 | }, 318 | { 319 | "id": "16", 320 | "more": "Details", 321 | "logo": "/assets/logos/stoutnerlogo.png", 322 | "browser": "Privacy Browser (Stoutner)", 323 | "developer": "Soren Stoutner", 324 | "engine": "Blink", 325 | "source": "Open source", 326 | "telemetry": "?", 327 | "track": "Yes", 328 | "script": "Javascript only", 329 | "fingerprint": "must be enabled", 330 | "webrtc": "?", 331 | "availability": "Android", 332 | "sync": "No", 333 | "google": "?", 334 | "https": "Yes", 335 | "doh": "?", 336 | "extensions": "-", 337 | "search": "Mojeek" 338 | }, 339 | { 340 | "id": "17", 341 | "more": "Details", 342 | "logo": "/assets/logos/epicbrowserlogo.png", 343 | "browser": "Epic Browser", 344 | "developer": "Hidden Reflex", 345 | "engine": "Chromium", 346 | "source": "Part closed, part open source", 347 | "telemetry": "Yes", 348 | "track": "Yes", 349 | "script": "Javascript only", 350 | "fingerprint": "?", 351 | "webrtc": "Only anonymize", 352 | "availability": "Windows, macOS, Linux, iOS, Android", 353 | "sync": "?", 354 | "google": "?", 355 | "https": "Yes", 356 | "doh": "?", 357 | "extensions": "Chrome Web Store extensions", 358 | "search": "?" 359 | }, 360 | { 361 | "id": "18", 362 | "more": "Details", 363 | "logo": "/assets/logos/pumalogo.png", 364 | "browser": "Puma Browser", 365 | "developer": "Puma Technologies", 366 | "engine": "WebKit/Blink", 367 | "source": "Closed source", 368 | "telemetry": "Yes (anonymized)", 369 | "track": "Yes (limited)", 370 | "script": "?", 371 | "fingerprint": "?", 372 | "webrtc": "-", 373 | "availability": "iOS, Android", 374 | "sync": "No", 375 | "google": "Search", 376 | "https": "Yes", 377 | "doh": "?", 378 | "extensions": "No", 379 | "search": "Google" 380 | }, 381 | { 382 | "id": "19", 383 | "more": "Details", 384 | "logo": "/assets/logos/insightlogo.jpg", 385 | "browser": "Insight Browser", 386 | "developer": "Laso Technologies Inc", 387 | "engine": "WebKit", 388 | "source": "Closed source", 389 | "telemetry": "Yes (anonymized)", 390 | "track": "Yes", 391 | "script": "Javascript only", 392 | "fingerprint": "?", 393 | "webrtc": "?", 394 | "availability": "iOS", 395 | "sync": "No", 396 | "google": "?", 397 | "https": "Yes", 398 | "doh": "?", 399 | "extensions": "-", 400 | "search": "Google" 401 | }, 402 | { 403 | "id": "20", 404 | "more": "Details", 405 | "logo": "/assets/logos/badwolflogo.png", 406 | "browser": "Badwolf", 407 | "developer": "Hacktivis (Ianodan)", 408 | "engine": "WebKit", 409 | "source": "Open source", 410 | "telemetry": "No", 411 | "track": "Yes", 412 | "script": "Javascript only", 413 | "fingerprint": "No", 414 | "webrtc": "-", 415 | "availability": "Linux", 416 | "sync": "No", 417 | "google": "No", 418 | "https": "Yes", 419 | "doh": "?", 420 | "extensions": "?", 421 | "search": "-" 422 | }, 423 | { 424 | "id": "21", 425 | "more": "Details", 426 | "logo": "/assets/logos/otterlogo.png", 427 | "browser": "Otter Browser", 428 | "developer": "Community driven", 429 | "engine": "QT WebEngine", 430 | "source": "Open source", 431 | "telemetry": "No", 432 | "track": "Yes; limited", 433 | "script": "Javascript only", 434 | "fingerprint": "?", 435 | "webrtc": "-", 436 | "availability": "Windows, macOS, Linux", 437 | "sync": "No", 438 | "google": "No", 439 | "https": "Yes", 440 | "doh": "must be enabled", 441 | "extensions": "?", 442 | "search": "?" 443 | }, 444 | { 445 | "id": "22", 446 | "more": "Details", 447 | "logo": "/assets/logos/avastlogo.png", 448 | "browser": "Avast Secure Browser", 449 | "developer": "Avast Software", 450 | "engine": "Chromium", 451 | "source": "Part closed, part open source", 452 | "telemetry": "Yes", 453 | "track": "Yes (limited)", 454 | "script": "Javascript only", 455 | "fingerprint": "Yes", 456 | "webrtc": "Only anonymize", 457 | "availability": "Windows, macOS, iOS, Android", 458 | "sync": "No", 459 | "google": "Yes", 460 | "https": "Yes", 461 | "doh": "must be enabled", 462 | "extensions": "Chrome Web Store extensions", 463 | "search": "Google" 464 | }, 465 | { 466 | "id": "23", 467 | "more": "Details", 468 | "logo": "/assets/logos/operalogo.png", 469 | "browser": "Opera", 470 | "developer": "Opera Software", 471 | "engine": "Chromium", 472 | "source": "Part closed, part open source", 473 | "telemetry": "Yes", 474 | "track": "Yes (limited)", 475 | "script": "Javascript only", 476 | "fingerprint": "?", 477 | "webrtc": "Only anonymize", 478 | "availability": "Windows, macOS, Linux, iOS, Android", 479 | "sync": "Yes", 480 | "google": "Search", 481 | "https": "Yes", 482 | "doh": "must be enabled", 483 | "extensions": "Chrome Web Store extensions", 484 | "search": "Google" 485 | }, 486 | { 487 | "id": "24", 488 | "more": "Details", 489 | "logo": "/assets/logos/firedragonlogo.png", 490 | "browser": "Firedragon", 491 | "developer": "Community driven", 492 | "engine": "Gecko", 493 | "source": "Open source", 494 | "telemetry": "No", 495 | "track": "Yes; ClearURLS and uBlock Origin", 496 | "script": "Javascript only", 497 | "fingerprint": "Yes; Canvasblocker", 498 | "webrtc": "Yes", 499 | "availability": "Linux", 500 | "sync": "No", 501 | "google": "No", 502 | "https": "Yes", 503 | "doh": "must be enabled", 504 | "extensions": "Firefox add-ons", 505 | "search": "?" 506 | }, 507 | { 508 | "id": "25", 509 | "more": "Details", 510 | "logo": "/assets/logos/srwarelogo.png", 511 | "browser": "SRWare Iron", 512 | "developer": "SRWare", 513 | "engine": "Chromium", 514 | "source": "Part open source", 515 | "telemetry": "?", 516 | "track": "Yes", 517 | "script": "Javascript only", 518 | "fingerprint": "?", 519 | "webrtc": "must be disabled", 520 | "availability": "Windows, macOS, Linux, Android", 521 | "sync": "?", 522 | "google": "?", 523 | "https": "Yes", 524 | "doh": "must be enabled", 525 | "extensions": "Chrome Web Store extensions", 526 | "search": "Bing" 527 | }, 528 | { 529 | "id": "26", 530 | "more": "Details", 531 | "logo": "/assets/logos/iceravenlogo1.png", 532 | "browser": "IceRaven", 533 | "developer": "Community driven", 534 | "engine": "Gecko", 535 | "source": "Open source", 536 | "telemetry": "?", 537 | "track": "?", 538 | "script": "Javascript only", 539 | "fingerprint": "Yes", 540 | "webrtc": "must be disabled", 541 | "availability": "Android", 542 | "sync": "No", 543 | "google": "?", 544 | "https": "Yes", 545 | "doh": "must be enabled", 546 | "extensions": "?", 547 | "search": "DuckDuckGo" 548 | }, 549 | { 550 | "id": "27", 551 | "more": "Details", 552 | "logo": "/assets/logos/mullbrowser.webp", 553 | "browser": "Mull Browser", 554 | "developer": "DivestOS", 555 | "engine": "Gecko", 556 | "source": "Open source", 557 | "telemetry": "No", 558 | "track": "?", 559 | "script": "Javascript only", 560 | "fingerprint": "Yes", 561 | "webrtc": "must be disabled", 562 | "availability": "Android", 563 | "sync": "No", 564 | "google": "No", 565 | "https": "Yes", 566 | "doh": "must be enabled", 567 | "extensions": "?", 568 | "search": "DuckDuckGo" 569 | }, 570 | { 571 | "id": "28", 572 | "more": "Details", 573 | "logo": "/assets/logos/ghostery.png", 574 | "browser": "Ghostery Dawn", 575 | "developer": "Ghostery GmbH", 576 | "engine": "Gecko", 577 | "source": "Open source", 578 | "telemetry": "?", 579 | "track": "Yes; Ghostery Ad Blocker", 580 | "script": "?", 581 | "fingerprint": "Yes", 582 | "webrtc": "must be disabled", 583 | "availability": "Windows, MacOS, Linux", 584 | "sync": "No", 585 | "google": "?", 586 | "https": "Yes", 587 | "doh": "must be enabled", 588 | "extensions": "Firefox add-ons", 589 | "search": "Ghostery Glow" 590 | }, 591 | { 592 | 593 | "id": "29", 594 | "more": "Details", 595 | "logo": "/assets/logos/kiwi.png", 596 | "browser": "Kiwi browser", 597 | "developer": "Geometry OU", 598 | "engine": "Chromium", 599 | "source": "Open source", 600 | "telemetry": "?", 601 | "track": "Yes; built-in solution", 602 | "script": "?", 603 | "fingerprint": "?", 604 | "webrtc": "must be disabled", 605 | "availability": "Android", 606 | "sync": "No", 607 | "google": "?", 608 | "https": "Yes", 609 | "doh": "must be enabled", 610 | "extensions": "Chrome Web Store extensions", 611 | "search": "Google search" 612 | }, 613 | { 614 | "id": "30", 615 | "more": "Details", 616 | "logo": "/assets/logos/comododragon.png", 617 | "browser": "Dragon", 618 | "developer": "Comodo", 619 | "engine": "Chromium", 620 | "source": "Part closed, part open source", 621 | "telemetry": "Yes", 622 | "track": "?", 623 | "script": "Javascript only", 624 | "fingerprint": "?", 625 | "webrtc": "Only anonymize", 626 | "availability": "Windows", 627 | "sync": "No", 628 | "google": "Replaced or proxied services", 629 | "https": "?", 630 | "doh": "must be enabled", 631 | "extensions": "Chrome Web Store extensions", 632 | "search": "?" 633 | }, 634 | { 635 | "id": "31", 636 | "more": "Details", 637 | "logo": "/assets/logos/comodoicedragon.png", 638 | "browser": "IceDragon", 639 | "developer": "Comodo", 640 | "engine": "Gecko", 641 | "source": "Part closed, part open source", 642 | "telemetry": "Yes", 643 | "track": "?", 644 | "script": "Javascript only", 645 | "fingerprint": "?", 646 | "webrtc": "Can be disabled", 647 | "availability": "Windows", 648 | "sync": "No", 649 | "google": "Replaced or proxied services", 650 | "https": "?", 651 | "doh": "must be enabled", 652 | "extensions": "Firefox Add-ons", 653 | "search": "?" 654 | }, 655 | 656 | { 657 | "id": "32", 658 | "more": "Details", 659 | "logo": "/assets/logos/soulbrowser.png", 660 | "browser": "Soul Browser", 661 | "developer": "SoulSoft", 662 | "engine": "Chromium", 663 | "source": "Part closed, part open source", 664 | "telemetry": "?", 665 | "track": "Yes", 666 | "script": "?", 667 | "fingerprint": "?", 668 | "webrtc": "Only anonymize", 669 | "availability": "Android", 670 | "sync": "No", 671 | "google": "?", 672 | "https": "?", 673 | "doh": "?", 674 | "extensions": "?", 675 | "search": "?" 676 | }, 677 | { 678 | "id": "33", 679 | "more": "Details", 680 | "logo": "/assets/logos/mullvad.png", 681 | "browser": "Mullvad Browser", 682 | "developer": "Mullvad", 683 | "engine": "Gecko (from Tor specifically)", 684 | "source": "Open-source", 685 | "telemetry": "No", 686 | "track": "Yes; uBlock Origin", 687 | "script": "Javascript only", 688 | "fingerprint": "Yes", 689 | "webrtc": "Can be disabled", 690 | "availability": "Windows, macOS, Linux", 691 | "sync": "No", 692 | "google": "No", 693 | "https": "Yes", 694 | "doh": "Yes", 695 | "extensions": "Firefox Add-ons", 696 | "search": "DuckDuckGo" 697 | }, 698 | { 699 | "id": "34", 700 | "more": "Details", 701 | "logo": "/assets/logos/floorp.png", 702 | "browser": "Floorp", 703 | "developer": "Ablaze", 704 | "engine": "Gecko", 705 | "source": "Open-source", 706 | "telemetry": "No", 707 | "track": "Yes", 708 | "script": "?", 709 | "fingerprint": "Yes", 710 | "webrtc": "Can be disabled", 711 | "availability": "Windows, macOS, Linux", 712 | "sync": "?", 713 | "google": "No", 714 | "https": "Yes", 715 | "doh": "Yes", 716 | "extensions": "Firefox Add-ons", 717 | "search": "?" 718 | }, 719 | { 720 | "id": "35", 721 | "more": "Details", 722 | "logo": "/assets/logos/nyxt.png", 723 | "browser": "Nyxt", 724 | "developer": "Atlas", 725 | "engine": "WebKit/WebEngine (see details)", 726 | "source": "Open-source", 727 | "telemetry": "No", 728 | "track": "Yes", 729 | "script": "Yes", 730 | "fingerprint": "?", 731 | "webrtc": "-", 732 | "availability": "Linux", 733 | "sync": "No", 734 | "google": "No", 735 | "https": "Yes", 736 | "doh": "?", 737 | "extensions": "Lisp-developed only (see details)", 738 | "search": "?" 739 | }, 740 | 741 | { 742 | "id": "36", 743 | "more": "Details", 744 | "logo": "/assets/logos/cromite.png", 745 | "browser": "Cromite", 746 | "developer": "uazo (Community driven)", 747 | "engine": "Chromium", 748 | "source": "Open-source", 749 | "telemetry": "No", 750 | "track": "Yes", 751 | "script": "?", 752 | "fingerprint": "Yes", 753 | "webrtc": "-", 754 | "availability": "Linux, Windows, Android", 755 | "sync": "No", 756 | "google": "No", 757 | "https": "Yes", 758 | "doh": "?", 759 | "extensions": "?", 760 | "search": "Google" 761 | }, 762 | { 763 | "id": "37", 764 | "more": "Details", 765 | "logo": "/assets/logos/arc.png", 766 | "browser": "Arc Browser", 767 | "developer": "The Browser Company", 768 | "engine": "Chromium", 769 | "source": "Part closed, part open-source", 770 | "telemetry": "Yes", 771 | "track": "Yes; uBlock Origin", 772 | "script": "?", 773 | "fingerprint": "?", 774 | "webrtc": "Only anonymize", 775 | "availability": "Windows, iOS, macOS", 776 | "sync": "Yes (iCloud)", 777 | "google": "No", 778 | "https": "Yes", 779 | "doh": "?", 780 | "extensions": "Chrome Web Store Extensions", 781 | "search": "Google" 782 | } 783 | ] 784 | } 785 | -------------------------------------------------------------------------------- /assets/logos/arc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/arc.png -------------------------------------------------------------------------------- /assets/logos/avastlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/avastlogo.png -------------------------------------------------------------------------------- /assets/logos/avoidthehack.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/avoidthehack.webp -------------------------------------------------------------------------------- /assets/logos/badwolflogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/badwolflogo.png -------------------------------------------------------------------------------- /assets/logos/bravelogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/bravelogo.png -------------------------------------------------------------------------------- /assets/logos/bromitelogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/bromitelogo.png -------------------------------------------------------------------------------- /assets/logos/chromiumlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/chromiumlogo.png -------------------------------------------------------------------------------- /assets/logos/comododragon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/comododragon.png -------------------------------------------------------------------------------- /assets/logos/comodoicedragon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/comodoicedragon.png -------------------------------------------------------------------------------- /assets/logos/cromite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/cromite.png -------------------------------------------------------------------------------- /assets/logos/duckduckgologo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/duckduckgologo.png -------------------------------------------------------------------------------- /assets/logos/epicbrowserlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/epicbrowserlogo.png -------------------------------------------------------------------------------- /assets/logos/falkonlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/falkonlogo.png -------------------------------------------------------------------------------- /assets/logos/fdroid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/fdroid.png -------------------------------------------------------------------------------- /assets/logos/firedragonlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/firedragonlogo.png -------------------------------------------------------------------------------- /assets/logos/firefoxfocuslogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/firefoxfocuslogo.png -------------------------------------------------------------------------------- /assets/logos/firefoxlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/firefoxlogo.png -------------------------------------------------------------------------------- /assets/logos/floorp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/floorp.png -------------------------------------------------------------------------------- /assets/logos/ghostery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/ghostery.png -------------------------------------------------------------------------------- /assets/logos/icecatlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/icecatlogo.png -------------------------------------------------------------------------------- /assets/logos/iceravenlogo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/iceravenlogo1.png -------------------------------------------------------------------------------- /assets/logos/insightlogo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/insightlogo.jpg -------------------------------------------------------------------------------- /assets/logos/iridiumlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/iridiumlogo.png -------------------------------------------------------------------------------- /assets/logos/kiwi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/kiwi.png -------------------------------------------------------------------------------- /assets/logos/librewolflogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/librewolflogo.png -------------------------------------------------------------------------------- /assets/logos/minbrowserlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/minbrowserlogo.png -------------------------------------------------------------------------------- /assets/logos/mullbrowser.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/mullbrowser.webp -------------------------------------------------------------------------------- /assets/logos/mullvad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/mullvad.png -------------------------------------------------------------------------------- /assets/logos/nyxt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/nyxt.png -------------------------------------------------------------------------------- /assets/logos/onionb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/onionb.jpg -------------------------------------------------------------------------------- /assets/logos/operalogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/operalogo.png -------------------------------------------------------------------------------- /assets/logos/otterlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/otterlogo.png -------------------------------------------------------------------------------- /assets/logos/palemoonlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/palemoonlogo.png -------------------------------------------------------------------------------- /assets/logos/pumalogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/pumalogo.png -------------------------------------------------------------------------------- /assets/logos/snowhazelogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/snowhazelogo.png -------------------------------------------------------------------------------- /assets/logos/soulbrowser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/soulbrowser.png -------------------------------------------------------------------------------- /assets/logos/srwarelogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/srwarelogo.png -------------------------------------------------------------------------------- /assets/logos/stoutnerlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/stoutnerlogo.png -------------------------------------------------------------------------------- /assets/logos/vivaldilogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/vivaldilogo.png -------------------------------------------------------------------------------- /assets/logos/waterfoxlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avoidthehack/Private-Browsers-Table/3cd6fc021b29653259f5fc0d003270ec86ace0ba/assets/logos/waterfoxlogo.png -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # avoidthehack Privacy Browser Comparison Tool 2 | 3 | ## 2.0.1 4 | - Added Cromite 5 | - Fixed typos 6 | - Fixed broken links 7 | 8 | ## 2.0 9 | * Changed mull browser icon 10 | * Changed mullvad browser icon 11 | * Added "details" pages for 35 browsers (entire table) 12 | * Added Floorp browser ( 13 | * Add Floorp #26) 14 | * Added Nyxt browser ( 15 | * Add Nyxt browser #28) 16 | * Corrected existing information for listed browsers 17 | * Updated dependencies 18 | * Fixed typos 19 | * Expanded FAQ 20 | * Added download links 21 | * If browser is listed on Privacy Guides, add link to privacy guides 22 | * Indicate whether browser is recommended on avoidthehack.com (only on "details" pages) 23 | * If browser is compared on privacytests.org, link to its results on privacytests.org 24 | 25 | ## 1.70 26 | * Fixed paths for open/close icons (so they're actually visible) 27 | * Added Soul browser 28 | * Added Comodo Dragon 29 | 30 | ## 1.67 31 | * Fixed paths for browser icon images 32 | * Changed Firefox default search provider from DuckDuckGo to Google 33 | 34 | ## 1.66 35 | * Added Kiwi browser 36 | 37 | ## 1.65 38 | * Added browsers.json - the data directly called by the table 39 | * Added Ghostery Dawn browser 40 | ## 1.6 41 | * Added Default Search Provider column 42 | 43 | ## 1.5.8 44 | * Added Mull browser and IceRaven browsers 45 | 46 | ## 1.5.5 47 | * Filled in information for different browsers 48 | * Added SrWare Iron and Firedragon browsers 49 | 50 | ## 1.5 51 | * Redid the backend so that it's easier to implement updates in the future 52 | * Corrected some existing information on the table 53 | * Added additional relevant information on each browser by clicking the + 54 | 55 | ## 1.4 56 | * Added Opera browser, Otter browser 57 | * Reinstated the equivalent of the "Show all Rows" function 58 | * Updated existing browser information 59 | 60 | ## 1.3 61 | * Updated legend 62 | * added export to excel/copy to clipboard 63 | * updated standing browser information (no new browsers) 64 | * fixed the sorting icon issues 65 | 66 | ## 1.2 67 | * Added browsers badwolf, Falkon, Avast Secure Browser 68 | -------------------------------------------------------------------------------- /content/.gitignore: -------------------------------------------------------------------------------- 1 | # This file is meant to be empty 2 | -------------------------------------------------------------------------------- /content/arc/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Arc Browser | Browser Comparison 3 | Description: More information on the Arc Browser listed in the private comparison tool 4 | Template: more 5 | --- 6 | 7 |
arc browser logo
8 | 9 |
10 |
11 | # More information: Arc Browser 12 | 13 | The Arc Browser integrates web browsing and applications/features to be an "operating system for the web." **The browser requires an account to use.** 14 | 15 | Arc ships with its own in-built apps and has official integrations for third parties, such as Notion and WhatsApp. It uses vertical tabs by default and allows users to customize their experience (via CSS, HTML, and JavaScript) using its "Boosts" feature. 16 | 17 | Arc is built using Swift but maintains a Chromium code base. 18 | 19 | * [Download](https://arc.net/) 20 | 21 |
22 | 23 |
24 |
25 | 26 | ## avoidthehack weigh-ins 27 | 28 | avoidthehack Recommendation status: N/A 29 | 30 |
31 |
32 | 33 | -------------------------------------------------------------------------------- /content/avast/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Avast Secure Browser | Browser Comparison 3 | Description: More information on Avast Secure Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
avast secure browser logo
8 | 9 |
10 |
11 | # More information: Avast Secure Browser 12 | 13 | The Avast Secure Browser is a Chromium fork maintained by developers at Avast, a large antivirus company. Its Chromium codebase is open source, but the extensions that ship out as defaults with the browser are proprietary _and_ closed source. 14 | 15 | * [Download](https://www.avast.com/secure-browser) 16 |
17 | 18 |
19 |
20 | 21 | ## avoidthehack weigh-ins 22 | 23 | avoidthehack Recommendation status: N/A 24 | 25 | A look into what the Avast Secure Browser offers: Review 26 | 27 | **Note:** Avast and its subsidiaries have been implicated in using its products to collect user demographics and browsing history. This data has/was sold to various third parties. 28 | 29 |
30 |
31 | 32 | -------------------------------------------------------------------------------- /content/badwolf/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Badwolf | Browser Comparison 3 | Description: More information on Badwolf in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
badwolf browser logo
8 | 9 |
10 |
11 | # More information: Badwolf 12 | 13 | Badwolf is an open source browser based on WebKit developed and primarily maintained by Ianodan. It has support for WebKitGTK native extensions and its interface is customizable/extensible via CSS. 14 | 15 | Badwolf is a minimalist browser with JavaScript disabled by default. It is only available for Linux - though it has support for BSD-based systems. 16 | 17 | * [Download](https://hacktivis.me/projects/badwolf) 18 |
19 | 20 |
21 |
22 | 23 | ## avoidthehack weigh-ins 24 | 25 | avoidthehack Recommendation status: N/A 26 | 27 |
28 |
29 | 30 | -------------------------------------------------------------------------------- /content/brave/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Brave | Browser Comparison 3 | Description: More information on the Brave browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
brave browser logo
8 | 9 |
10 |
11 | # More information: Brave 12 | 13 | The Brave browser is an extensive fork of Chromium that either proxies or removes certain Google services and server callbacks from the source code. It was first launched in 2016 by a former employee of Mozilla. 14 | 15 | Brave browser has a "Tor" tabs feature, while it does use the Tor network as a proxy, it does not provide the same level of privacy and anonymity inherent to using the Tor browser. Brave also has "forgetful browsing," and an opt-in, built-in cryptocurrency wallet using the Basic Attention Token (BAT) ecosystem. 16 | 17 | As of February 2024, Brave has started rolling out its AI assistant, "Leo," to the Brave browser on certain platforms. 18 | 19 | * [Download](https://brave.com/download/) 20 | * [privacytests.org](https://privacytests.org) 21 | * [privacyguides.org](https://www.privacyguides.org/en/desktop-browsers/#brave) 22 |
23 | 24 |
25 |
26 | 27 | ## avoidthehack weigh-ins 28 | 29 | avoidthehack Recommendation status: **Recommended** ([Windows](https://avoidthehack.com/best-privacy-browsers-windows-10) | [Linux/macOS](https://avoidthehack.com/best-linux-macos-privacy-browsers) | [iOS](https://avoidthehack.com/best-privacy-browsers-ios) | [Android](https://avoidthehack.com/best-privacy-browsers-android)) 30 | 31 | A brief dive into Brave, its background connections, and other: Review 32 | 33 | **Note:** The company behind the Brave browser has been implicated in a couple of privacy-related scandals, such as the affiliate link injection scandal. 34 | 35 |
36 |
37 | 38 | -------------------------------------------------------------------------------- /content/bromite/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Bromite | Browser Comparison 3 | Description: More information on Bromite in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
bromite browser logo
8 | 9 |
10 |
11 | # More information: Bromite 12 | 13 | Bromite is a Chromium fork with native adblocking capabilities. It also has many privacy enhancements enabled by default. 14 | 15 | Bromite is only available for Android. 16 | 17 | * [Download](https://github.com/bromite/bromite) 18 | 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: N/A 27 | 28 | **Note:** This browser appears to no longer be maintained. It is missing years of bug fixes/security updates. 29 | 30 |
31 |
32 | 33 | -------------------------------------------------------------------------------- /content/cromite/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Cromite | Browser Comparison 3 | Description: More information on Cromite in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
cromite browser logo
8 | 9 |
10 |
11 | # More information: Cromite 12 | 13 | Cromite is a fork - and successor - of the defunct Bromite. It has built-in support for adblocking and an "eye for privacy." Its goals include limiting "features" built into the browser used for tracking users' habits and limiting the integration between the browser and the vendor/developer. 14 | 15 | * [Download](https://github.com/uazo/cromite) 16 | 17 |
18 | 19 |
20 |
21 | 22 | ## avoidthehack weigh-ins 23 | 24 | avoidthehack Recommendation status: N/A 25 | 26 |
27 |
28 | 29 | -------------------------------------------------------------------------------- /content/dragon/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Comodo Dragon | Browser Comparison 3 | Description: More information on Comodo Dragon in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
comodo dragon browser logo
8 | 9 |
10 |
11 | # More information: Comodo Dragon 12 | 13 | Comodo Dragon is a Chromium fork maintained by Comodo, a cybersecurity/antivirus company. Dragon is a sister-browser to IceDragon. 14 | 15 | * [Download](https://www.comodo.com/home/browsers-toolbars/browser.php) 16 |
17 | 18 |
19 |
20 | 21 | ## avoidthehack weigh-ins 22 | 23 | avoidthehack Recommendation status: N/A 24 | 25 |
26 |
27 | 28 | -------------------------------------------------------------------------------- /content/duckduckgo/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: DuckDuckGo Mobile Browser | Browser Comparison 3 | Description: More information on DuckDuckGo Mobile Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
duckduckgo logo
8 | 9 |
10 |
11 | # More information: DuckDuckGo Mobile Browser 12 | 13 | The same company (DuckDuckGo) behind the private search engine of the same name develops and maintains the DuckDuckGo Mobile Browser. It is based on WebKit (iOS) and Blink (Android), using the WebView of the mobile operating system. 14 | 15 | The DuckDuckGo _Mobile_ browser is only available for iOS and Android. DuckDuckGo Mobile browser includes information about visited websites from other privacy-focused projects, such as TOSDR. 16 | 17 | * [Download](https://duckduckgo.com/app) 18 | * [privacytests.org](https://privacytests.org) 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: N/A 27 | 28 | A brief look into the blocking abilities of the DuckDuckGo Mobile Browser: Review 29 | 30 |
31 |
32 | 33 | -------------------------------------------------------------------------------- /content/epic/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Epic Browser | Browser Comparison 3 | Description: More information on Epic Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
epic browser logo
8 | 9 |
10 |
11 | # More information: Epic Browser 12 | 13 | Epic Browser is a partially open source Chromium fork maintained by Hidden Reflex; users wishing to see Epic's entire codebase must request the source code from the developers (it is not published publicly, with the exception of Chromium itself). 14 | 15 | * [Download](https://epicbrowser.com/) 16 | 17 |
18 | 19 |
20 |
21 | 22 | ## avoidthehack weigh-ins 23 | 24 | avoidthehack Recommendation status: N/A 25 | 26 |
27 |
28 | 29 | -------------------------------------------------------------------------------- /content/falkon/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Falkon | Browser Comparison 3 | Description: More information on Falkon in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
falkon browser logo
8 | 9 |
10 |
11 | # More information: Falkon 12 | 13 | Falkon is an open-source browser built on the QtWebEngine (previously known as QupZilla). Falkon is a KDE project. The native adblocker in Falkon is a fork of uBlock Origin, a wide spectrum tracker blocker. 14 | 15 | Falkon has its own extensions "store" for the browser. 16 | 17 | * [Download](https://www.falkon.org/download/) 18 | 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: **Recommended** ([Linux](https://avoidthehack.com/best-linux-macos-privacy-browsers)) 27 | 28 | 29 |
30 |
31 | 32 | -------------------------------------------------------------------------------- /content/firedragon/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Firedragon | Browser Comparison 3 | Description: More information on Firedragon in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
firedragon logo
8 | 9 |
10 |
11 | # More information: Firedragon 12 | 13 | Firedragon is borrows some tweaks from the Librewolf browser, uses SearX for the default search engine provider, and incorporates patches from Gentoo, Ubuntu, and Debian. 14 | 15 | Firedragon is primarily intended for use with Garuda Linux, but can be built from source or found in the Chaotic-AUR repository. 16 | 17 | * [Download](https://dr460nf1r3.org/projects/firedragon/) 18 | 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: N/A 27 | 28 |
29 |
30 | 31 | -------------------------------------------------------------------------------- /content/firefox/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Firefox | Browser Comparison 3 | Description: More information on the Firefox browser listed in the private comparison tool 4 | Template: more 5 | --- 6 |
firefox logo
7 |
8 |
9 | # More information: Firefox 10 | Firefox originally forked from the defunct "Mozilla browser" in **2004**. Firefox also includes in-browser translations and a feature to auto-close cookie banners as of version. Firefox has a vast library of browser plugins, called "Add-ons," and the developer, Mozilla, maintains a website for add-on download. 11 | 12 | Firefox serves as the upstream for most Gecko-based browsers, including privacy-hardened forks such as Librewolf and speed-oriented forks like Waterfox. Older Gecko codebase has also spawned hard-forks that no longer explicitly rely on Firefox as an upstream provider such as Pale Moon. 13 | 14 | * [Download](https://www.mozilla.org/firefox/browsers/) 15 | * [privacytests.org](https://privacytests.org/) 16 | * [privacyguides.org](https://www.privacyguides.org/desktop-browsers/#firefox) 17 |
18 | 19 |
20 |
21 | ## avoidthehack weigh-ins 22 | 23 | avoidthehack Recommendation status: **Recommended** ([Linux/macOS](https://avoidthehack.com/best-linux-macos-privacy-browsers) | [Windows](https://avoidthehack.com/best-privacy-browsers-windows-10)) 24 | 25 | Default Firefox still leaves a lot on the table when it comes to privacy. To reach its "true" privacy potential, Firefox must be "hardened" or tweaked: Harden Firefox 26 | 27 | **Note:** Mozilla tracks downloads of Firefox with a unique ID.
28 |
29 | 30 | 31 | -------------------------------------------------------------------------------- /content/floorp/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Floorp | Browser Comparison 3 | Description: More information on Floorp in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
floorp browser logo
8 | 9 |
10 |
11 | # More information: Floorp 12 | 13 | Floorp is a Firefox fork. In addition to the browser being open source, so is the build environment. 14 | 15 | * [Download](https://floorp.app/en/download/) 16 |
17 | 18 |
19 |
20 | 21 | ## avoidthehack weigh-ins 22 | 23 | avoidthehack Recommendation status: N/A 24 | 25 |
26 |
27 | 28 | -------------------------------------------------------------------------------- /content/focus/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Firefox Focus | Browser Comparison 3 | Description: More information on Firefox Focus in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
firefox focus logo
8 | 9 |
10 |
11 | # More information: Firefox Focus 12 | 13 | **Not the same as Firefox Mobile or Fennec.** 14 | 15 | Firefox Focus is a variant of Firefox (Mobile) maintained by Mozilla. It started off as a tracker blocker for iOS devices in 2015 before evolving into a standalone browser circa 2016. 16 | 17 | Firefox Focus is a minimalist browser, lacking common browser features such as tabs and tab management. It also functions exclusively in a "private browsing" mode where history and cookies are deleted when the browser is closed. It has a lightweight footprint. 18 | 19 | Firefox Focus is only available for mobile devices on iOS or Android. On iOS, Firefox Focus can integrate its blocking capabilities with Safari. 20 | 21 | * [Download](https://www.mozilla.org/firefox/browsers/mobile/focus/) 22 | * [privacytests.org](https://privacytests.org) 23 |
24 | 25 |
26 |
27 | 28 | ## avoidthehack weigh-ins 29 | 30 | avoidthehack Recommendation status: **Recommended** ([iOS](https://avoidthehack.com/best-privacy-browsers-ios)) 31 | 32 | A dive into Firefox Focus, its minimalism, and its privacy features: Review 33 | 34 | **Note:** For _most_ users, Firefox Focus may be too minimalist. It is generally recommended as a secondary browser. 35 | 36 |
37 |
38 | 39 | -------------------------------------------------------------------------------- /content/ghostery/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Ghostery Dawn | Browser Comparison 3 | Description: More information on Ghostery Dawn in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
ghostery logo
8 | 9 |
10 |
11 | # More information: Ghostery Dawn 12 | 13 | Ghostery Dawn is a Firefox fork built and maintained by Ghostery GmBH. It is part of a suite offered by Ghostery. Ghostery Dawn comes with an ad/tracker blocker enabled by default and the default search provider is set to Ghostery Private Search. 14 | 15 | Ghostery Dawn is separate from the Ghostery ad/tracker blocker available as a browser plugin for Firefox, and Chromium-based browsers. 16 | 17 | * [Download](https://www.ghostery.com/ghostery-private-browser) 18 | 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: N/A 27 |
28 |
29 | 30 | -------------------------------------------------------------------------------- /content/icecat/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Icecat | Browser Comparison 3 | Description: More information on Icecat in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
GNU icecat logo
8 | 9 |
10 |
11 | # More information: Icecat 12 | 13 | Icecat (GNU Icecat) is the GNU version of the Firefox browser, made up of only free software and a less restrictive license. Icecat includes privacy protections such as LibreJS, JShelter, and fingerprinting countermeasures. 14 | 15 | Icecat is _officially_ only available for GNU/Linux systems. The project does not distribute binaries. 16 | 17 | **Note:** An unofficial website hosting Windows and macOS version exists but is not officially endorsed by GNU. 18 | 19 | * [Download](https://www.gnu.org/software/gnuzilla/) 20 | 21 |
22 | 23 |
24 |
25 | 26 | ## avoidthehack weigh-ins 27 | 28 | avoidthehack Recommendation status: N/A 29 | 30 |
31 |
32 | 33 | -------------------------------------------------------------------------------- /content/icedragon/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Comodo IceDragon | Browser Comparison 3 | Description: More information on Comodo IceDragon in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
comodo icedragon browser logo
8 | 9 |
10 |
11 | # More information: Comodo IceDragon 12 | 13 | Comodo IceDragon is a Gecko (Firefox) fork maintained by Comodo, a cybersecurity/antivirus company. IceDragon is a sister-browser to Dragon. 14 | 15 | * [Download](https://www.comodo.com/home/browsers-toolbars/browser.php) 16 |
17 | 18 |
19 |
20 | 21 | ## avoidthehack weigh-ins 22 | 23 | avoidthehack Recommendation status: N/A 24 | 25 |
26 |
27 | 28 | -------------------------------------------------------------------------------- /content/iceraven/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Ice Raven | Browser Comparison 3 | Description: More information on Ice Raven in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
iceraven logo
8 | 9 |
10 |
11 | # More information: Ice Raven 12 | 13 | Ice Raven is a Firefox fork available for Android. It is primarily maintained by core developers under the "Ice Raven Project." Ice Raven has support for about:config options and support for extensions. 14 | 15 | Ice Raven strips telemetry and proprietary code from its source code. Its primary goal is to provide the user with a high number of customization options. 16 | 17 | **Note:** Ice Raven is only available for Android. 18 | 19 | * [Download](https://github.com/fork-maintainers/iceraven-browser/releases) 20 | 21 |
22 | 23 |
24 |
25 | 26 | ## avoidthehack weigh-ins 27 | 28 | avoidthehack Recommendation status: **Recommended** ([Android](https://avoidthehack.com/best-privacy-browsers-android)) 29 |
30 |
31 | 32 | -------------------------------------------------------------------------------- /content/index.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
github logo icon hand with a heart icon life raft help icon
10 | 11 |
avoidthehack logo
12 | 13 | # Welcome to the Private Browser Comparison Tool 14 | 15 | Use the Privacy Browser Comparison Tool to compare key points/features of different privacy browsers. This table is **interactive** and can be searched and locally exported to **Excel** or any spreadsheet software capable of working with `.xlsx` files. 16 | 17 | **Note:** This tool requires JavaScript to run. 18 | 19 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 87 | 88 | 91 | 92 | 93 | 94 | 97 | 98 | 99 | 102 | 103 | 104 |
+LogoBrowserDeveloperEngineSource codeTelemetryTracker Blocking 85 | more info 86 | Script blockingFingerprinting protectionDisable WebRTC 89 | more info 90 | AvailabilitySyncGoogle services?Force HTTPS 95 | more info 96 | DoH supportExtension CompatibilityDefault Search 100 | more info 101 |
105 | 106 | ## Legend 107 | dash (-) = N/A 108 | 109 | **"must be enabled"** = feature is present, but not enabled by default 110 | 111 | ? = unknown/information missing (feel free to open an issue with the appropriate information) 112 | 113 | _A [detailed how-to guide](https://avoidthehack.com/how-to-bct) for maximizing use of this table is available._ 114 | 115 | 116 | ## Overview 117 | Not all privacy browsers are built the same; as such they don't deliver the exact same results. However, many users may find that a private browser doesn't fulfill their goals for any reason. Most browser download pages focus on their own unique features when compared to the competition. 118 | 119 | This tool aims to paint an as-complete-as-possible picture of the different privacy browsers out there before users commit to a download/install. 120 | 121 | This privacy browser comparison tool aims to be easily readable and usable for all users, regardless of personal technical expertise. 122 | 123 | **Note:** Browsers listed in this table are not specifically recommended by avoidthehack.com _unless_ indicated under the more information column ("avoidthehack" weigh-ins). The data in this table is provided as-is for warranty purposes. 124 | 125 | 126 |

FAQ

127 | 128 | ### Where can I view more information about the browsers listed here? 129 | Under the "+" or "plus sign" column (the left most column), click the plus sign for the corresponding browser. Each "more information" page for each browser features a link to the browser's last known official website and/or download/repository pages. 130 | 131 | If this information has changed, but isn't reflected here, then please open an issue on the [Private Browser Comparison Tool GitHub page](https://github.com/avoidthehack/Private-Browsers-Table/issues). 132 | 133 | ### Where can I download the browsers listed here? 134 | 1. Under the "+" column (left-most column in the table), click the plus sign for the corresponding browser. 135 | 2. Click the "Download" button on the browser's "Details" page. 136 | 137 | ### Where is Chrome, Edge, Safari? 138 | Traditionally, these browsers aren't classified as "private" browsers. While they can be hardened to _some_ degree, it's generally recommended to migrate from these browsers when possible to do so. 139 | 140 | This is because the hardening process with these browsers can be tedious, requiring many different tweaks in different locations. Some settings may not be "Accessible" unless one is willing to edit code or go to more extreme measures. There is also the issue of silent automatic updates rolling back your changes to the new version's default. 141 | 142 | If you're not familiar with the perils of using browsers like Microsoft and Google Chrome, then please get familiar with how these browsers are terrible for privacy @ the [avoidthehack Privacy Browsers page](https://avoidthehack.com/tools/privacy-browsers) 143 | 144 | **Note:** Migrating from Safari on iOS is "limited" due to all third-party browsers on iOS forced to use WebKit (the same rendering engine as Safari). In some cases, it may be best to use Safari on iOS due to fingerprinting issues, while taking care to [tweak some settings](https://avoidthehack.com/configure-safari-privacy-ios). 145 | 146 | ### Where is TOR? 147 | Since TOR is configured to run on the onion (Tor) network, this makes it a completely different animal from just about every browser found here. This isn't necessarily an overly "good" or "bad" thing - just that TOR is _different enough_ to not be included here. 148 | 149 | TOR has many unique characteristics about and surrounding it, especially the technology behind the `.onion` network and its relay hops. TOR can be used to browse the clearnet, deepweb, and the "darknet." 150 | 151 | TOR is generally recommended as the de facto standard for users looking to be **anonymous** while browsing. The browsers listed here may provide some privacy or security benefits, but generally do not provide anonymity. 152 | 153 | More information on TOR: 154 | * [Official TOR Project](https://www.torproject.org/) 155 | 156 | ### Where can I find recommended browsers? 157 | When clicking the "+" or plus sign in the "+" (more information) column, some browsers may have a listed "recommended" status by avoidthehack. This means these browsers are recommended by avoidthehack. 158 | 159 | For a curated list of recommended browsers, visit the [Privacy Browsers page](https://avoidthehack.com/tools/privacy-browsers) on avoidthehack.com 160 | 161 | ### Wait... what exactly is a privacy/privacy-oriented browser? 162 | 163 | Privacy (or privacy-oriented browsers) respect the user's privacy and also take steps to help preserve the user's privacy when surfing the internet. Different privacy browsers implement different ways to accomplish both of these. 164 | 165 | For more information, give "[What is a Privacy-Oriented Browser?](https://avoidthehack.com/what-is-a-privacy-focused-browser)" on avoidthehack.com a read. 166 | 167 | ### X browser is in alpha/beta, why isn't it listed? 168 | Alpha or beta software is very volatile and often changes quickly. Additionally, many alpha and beta projects big and small are regularly abandoned. Browsers listed here are "mature enough" (typically version 1.0) and tend to not be as volatile. 169 | 170 | ### Where can I get a .csv file for this table? 171 | As of July 2023, the previously hosted .csv file was deleted. Users are free to use the "copy" or "Export to Excel" buttons to create their own .csv file. 172 | 173 | ### How do I make a suggestion to this table/related pages? 174 | The entirety of this subsite/tool is available on [GitHub](https://github.com/avoidthehack/Private-Browsers-Table). Feel free to open an issue there, but be sure to read the readme! 175 | -------------------------------------------------------------------------------- /content/index.md.back: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
avoidthehack logo
6 | 7 | # Private Browser Comparison Tool 8 | 9 | Use the Privacy Browser Comparison Tool to compare key points/features of different privacy browsers. This table is **interactive** and can be searched and locally exported to **CSV** or **Excel**. 10 | 11 | **Note:** This tool requires JavaScript to run. 12 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 65 | 66 | 69 | 70 | 71 | 72 | 75 | 76 | 77 | 80 | 81 | 82 |
+LogoBrowserDeveloperEngineSource codeTelemetryTracker Blocking 63 | more info 64 | Script blockingFingerprinting protectionDisable WebRTC 67 | more info 68 | AvailabilitySyncGoogle services?Force HTTPS 73 | more info 74 | DoH supportExtension CompatibilityDefault Search 78 | more info 79 |
83 |
84 | ## Legend 85 | dash (-) = N/A 86 | 87 | **"must be enabled"** = feature is present, but not enabled by default 88 | 89 | ? = unknown/information missing (feel free to open an issue with the appropriate information) 90 | 91 | A detailed how-to guide for maximizing use of this table is available. 92 |
93 | 94 |
95 | ## Overview 96 | Not all privacy browsers are built the same; as such they don't deliver the exact same results. However, many users may find that a private browser doesn't fulfill their goals for any reason. Most browser download pages focus on their own unique features when compared to the competition. 97 | 98 | This tool aims to paint an as-complete-as-possible picture of the different privacy browsers out there before users commit to a download/install. 99 | 100 | This privacy browser comparison tool aims to be easily readable and usable for all users, regardless of personal technical expertise. 101 | 102 | **Note:** Browsers listed in this table are not specifically recommended by avoidthehack.com _unless_ indicated under the more information column ("avoidthehack" weigh-ins). The data in this table is provided as-is for warranty purposes. 103 |
104 | 105 | ## FAQ 106 | 107 | ### Where can I view more information about the browsers listed here? 108 | Under the "+" or "plus sign" column (the left most column), click the plus sign for the corresponding browser. Each "more information" page for each browser features a link to the browser's last known official website and/or download/repository pages. 109 | 110 | If this information has changed, but isn't reflected here, then please open an issue on the [Private Browser Comparison Tool GitHub page](https://github.com/avoidthehack/Private-Browsers-Table/issues). 111 | 112 | ### Where can I download the browsers listed here? 113 | 1. Under the "+" column (left-most column in the table), click the plus sign for the corresponding browser. 114 | 2. Click the "Download" button on the browser's "More information" page. 115 | 116 | ### Where is Chrome, Edge, Safari? 117 | Traditionally, these browsers aren't classified as "private" browsers. While they can be hardened to _some_ degree, it's generally recommended to migrate from these browsers when possible to do so. 118 | 119 | This is because the hardening process with these browsers can be tedious, requiring many different tweaks in different locations. Some settings may not be "Accessible" unless one is willing to edit code or go to more extreme measures. There is also the issue of silent automatic updates rolling back your changes to the new version's default. 120 | 121 | If you're not familiar with the perils of using browsers like Microsoft and Google Chrome, then please get familiar with how these browsers are terrible for privacy @ the [avoidthehack Privacy Browsers page](https://avoidthehack.com/tools/privacy-browsers) 122 | 123 | ### Where is TOR? 124 | Since TOR is configured to run on the onion (Tor) network, this makes it a completely different animal from just about every browser found here. This isn't necessarily an overly "good" or "bad" thing - just that TOR is _different enough_ to not be included here. 125 | 126 | TOR has many unique characteristics about and surrounding it, especially the technology behind the `.onion` network and its relay hops. TOR can be used to browse the clearnet, deepweb, and the "darknet." 127 | 128 | TOR is generally recommended as the de facto standard for users looking to be **anonymous** while browsing. The browsers listed here may provide some privacy or security benefits, but generally do not provide anonymity. 129 | 130 | More information on TOR: 131 | * [Official TOR Project](https://www.torproject.org/) 132 | 133 | ### Where can I find recommended browsers? 134 | When clicking the "+" or plus sign in the "+" (more information) column, some browsers may have a listed "recommended" status by avoidthehack. This means these browsers are recommended by avoidthehack. 135 | 136 | For a curated list of recommended browsers, visit the [Privacy Browsers page](https://avoidthehack.com/tools/privacy-browsers) on avoidthehack.com 137 | 138 | ### X browser is in alpha/beta, why isn't it listed? 139 | Alpha or beta software is very volatile and often changes quickly. Additionally, many alpha and beta projects big and small are regularly abandoned. Browsers listed here are "mature enough" (typically version 1.0) and tend to not be as volatile. 140 | 141 | ### Where can I get a .csv file for this table? 142 | As of July 2023, the previously hosted .csv file was deleted. Users are free to use the "copy" or "Export to Excel" buttons to create their own .csv file. 143 | 144 | ### How do I make a suggestion to this table/related pages? 145 | The entirety of this subsite/tool is available on [GitHub](https://github.com/avoidthehack/Private-Browsers-Table). Feel free to open an issue there, but be sure to read the readme! 146 | -------------------------------------------------------------------------------- /content/insight/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Insight Browser | Browser Comparison 3 | Description: More information on Insight Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
insight browser logo
8 | 9 |
10 |
11 | # More information: Insight Browser 12 | 13 | Insight Browser is a closed source browser maintained by Laso Technologies. It claims to be the first iOS with support for extensions. It has a native ad blocking solution, though it appears to collect search history and usage data, (according to its own App Privacy disclosure in the Apple App Store.) 14 | 15 | Insight Browser is only available on iOS. 16 | 17 | * [Download](https://apps.apple.com/us/app/insight-browser/id1531407280) 18 |
19 | 20 |
21 |
22 | 23 | ## avoidthehack weigh-ins 24 | 25 | avoidthehack Recommendation status: N/A 26 | 27 | **Note:** This browser appears to be unmaintained. 28 | 29 |
30 |
31 | 32 | -------------------------------------------------------------------------------- /content/iridium/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Iridium | Browser Comparison 3 | Description: More information on Iridium in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
iridium browser logo
8 | 9 |
10 |
11 | # More information: Iridium 12 | 13 | The Iridium browser is a fork of Chromium where "all modifications enhance the privacy of the user." Iridium introduced de-googling contributions to its source code that are borrowed by other projects, such as Ungoogled Chromium. 14 | 15 | User reports indicates some of Iridium's implementations cause compatibility issues with various Chromium extensions. 16 | 17 | * [Download](https://iridiumbrowser.de/downloads/) 18 | 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: N/A 27 | 28 | A brief dive into the Iridium browser and what it has to offer: Review 29 | 30 | **Note:** The Iridium browser struggles to stay on top of latest security and bug fixes from upstream Chromium. This can prove problematic for security as regular security updates - especially for browser software - are [highly important for user security _and_ privacy](https://avoidthehack.com/getting-started-cybersecurity#updatesoftwarefirmware). 31 | 32 |
33 |
34 | 35 | -------------------------------------------------------------------------------- /content/iron/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: SRWare Iron | Browser Comparison 3 | Description: More information on SRWare Iron in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
srware iron browser logo
8 | 9 |
10 |
11 | # More information: SRWare Iron 12 | 13 | SRWare Iron is a Chromium fork developed and maintained by German company SRWare. Its goal is to eliminate user tracking, "bloatware," and other telemetry typically associated with vanilla Chromium and Google Chrome. 14 | 15 | * [Download](https://www.srware.net/iron/) 16 |
17 | 18 |
19 |
20 | 21 | ## avoidthehack weigh-ins 22 | 23 | avoidthehack Recommendation status: N/A 24 | 25 |
26 |
27 | 28 | -------------------------------------------------------------------------------- /content/kiwi/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Kiwi Browser | Browser Comparison 3 | Description: More information on Kiwi Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
kiwi browser logo
8 | 9 |
10 |
11 | # More information: Kiwi Browser 12 | 13 | Kiwi browser is an open-source browser maintained by Geometry OU. It has a native adblocker and is "optimized for speed." Kiwi browser supports extensions downloaded from the Chrome Web Store. Users can download the `.apk` from the official website or Google Play Store. 14 | 15 | Kiwi Browser is only available on Android. 16 | 17 | * [Download](https://kiwibrowser.com/) 18 | 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: N/A 27 | 28 |
29 |
30 | 31 | -------------------------------------------------------------------------------- /content/librewolf/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Librewolf | Browser Comparison 3 | Description: More information on Librewolf in the browser comparison tool 4 | Template: more 5 | --- 6 | 7 |
official logo of librewolf project
8 | 9 |
10 |
11 | # More information: Librewolf 12 | 13 | Librewolf is a fork of Firefox focusing on goals of "privacy, security, and user freedom." It comes with an extensive list of (refer to the Arkenfox project) privacy tweaks by default. Private search providers, such as DuckDuckGo, are included by default. 14 | 15 | Librewolf also disables telemetry enabled by vanilla Firefox by default. It also disables digital rights management (DRM) features, which may make playing back video/streaming content from specific providers difficult. 16 | 17 | * [Download](https://librewolf.net/installation/) 18 | * [privacytests.org](https://privacytests.org) 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: Recommended ([Windows](https://avoidthehack.com/best-privacy-browsers-windows-10) | [Linux/macOS](https://avoidthehack.com/best-linux-macos-privacy-browsers)) 27 | 28 | Librewolf can be installed in many ways, depending on user choice and user operating system: Install Guide 29 | 30 | **Note:** This guide is deprecated, but could still serve as a reference for those interested in getting started with Librewolf. 31 | 32 |
33 |
34 | 35 | -------------------------------------------------------------------------------- /content/min/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Min | Browser Comparison 3 | Description: More information on Min in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
min browser logo
8 | 9 |
10 |
11 | # More information: Min 12 | 13 | Min is an open-source web browser built entirely on Electron, written entirely in CSS and JavaScript. 14 | 15 | While Min uses the Chromium rendering engine, it is not considered a Chromium fork. This is because it does not use the same browser interface (that is also integrated with Google services) used by Chromium and other true Chromium forks such as Ungoogled Chromium and Brave. 16 | 17 | Min markets itself as a faster, minimal web browser that allows users to "browse without distractions." Min includes a native adblocker by default. 18 | 19 | * [Download](https://minbrowser.org/) 20 |
21 | 22 |
23 |
24 | 25 | ## avoidthehack weigh-ins 26 | 27 | avoidthehack Recommendation status: N/A 28 | 29 |
30 |
31 | 32 | -------------------------------------------------------------------------------- /content/mull/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Mull Browser | Browser Comparison 3 | Description: More information on Mull Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
mull browser logo
8 | 9 |
10 |
11 | # More information: Mull Browser 12 | 13 | The Mull Browser is a Gecko (Firefox/Fenix) fork for Android. Mull removes proprietary blobs found in the source code of Firefox. It also enables features from the Tor Uplift project by using tweaks made by the Arkenfox-user.js project. 14 | 15 | **Note:** Mull is only available for Android. 16 | 17 | * [Download](https://github.com/Divested-Mobile/Mull-Fenix) 18 | * [privacytests.org](https://privacytests.org) 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: **Recommended** ([Android](https://avoidthehack.com/best-privacy-browsers-android)) 27 | 28 |
29 |
30 | 31 | -------------------------------------------------------------------------------- /content/mullvad/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Mullvad Browser | Browser Comparison 3 | Description: More information on Mullvad Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
mullvad browser m logo
8 | 9 |
10 |
11 | # More information: Mullvad Browser 12 | 13 | The Mullvad Browser is a fork of the Tor browser (which of itself is a fork of Firefox). However, instead of being configured to run on the Tor network, the Mullvad Browser is configured to use a trusted VPN provider. It is maintained by the Tor developers. 14 | 15 | The Mullvad Browser brings Tor's strong fingerprint protection for users that do not use/regularly use the Tor browser. 16 | 17 | **Note:** The Mullvad Browser can be used without a VPN. 18 | 19 | * [Download](https://mullvad.net/download/browser/windows) 20 | * [privacytests.org](https://privacytests.org) 21 | * [privacyguides.org](https://www.privacyguides.org/en/desktop-browsers/#mullvad-browser) 22 |
23 | 24 |
25 |
26 | 27 | ## avoidthehack weigh-ins 28 | 29 | avoidthehack Recommendation status: **Recommended** ([Windows](https://avoidthehack.com/best-privacy-browsers-windows-10) | [Linux/macOS](https://avoidthehack.com/best-linux-macos-privacy-browsers)) 30 | 31 |
32 |
33 | 34 | -------------------------------------------------------------------------------- /content/nyxt/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Nyxt | Browser Comparison 3 | Description: More information on XXX in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
nyxt logo
8 | 9 |
10 |
11 | # More information: Nyxt 12 | 13 | Nyxt is an open source browser developed and primarily maintained by developers at Atlas. Nyxt uses an API to interact/use any web engine (the project describes itself as "web engine agnostic"); it supports WebKit and WebEngine and, experimentally, Blink. 14 | 15 | It has a native adblocker and has many keyboard shortcuts. Nyxt does not support WebRTC. Nyxt is extensible and only supports extensions developed in Lisp. 16 | 17 | Nyxt is only available for Linux systems. 18 | 19 | **Note:** The developers have indicated Windows and macOS versions are in development. 20 | 21 | * [Download](https://nyxt.atlas.engineer/purchase) 22 | 23 |
24 | 25 |
26 |
27 | 28 | ## avoidthehack weigh-ins 29 | 30 | avoidthehack Recommendation status: N/A 31 | 32 |
33 |
34 | 35 | -------------------------------------------------------------------------------- /content/opera/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Opera | Browser Comparison 3 | Description: More information on Opera in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
opera browser logo
8 | 9 |
10 |
11 | # More information: Opera 12 | 13 | Opera is a partly closed source browser, built on Blink (Chromium). Opera's user interface is "closed source" (excluding the use of open source libraries to build it.) In July 2013, Opera switched to using Blink (created for Chromium) over its own Presto browser engine. 14 | 15 | 16 | * [Download](https://www.opera.com/download) 17 | * [privacytests.org](https://privacytests.org) 18 |
19 | 20 |
21 |
22 | 23 | ## avoidthehack weigh-ins 24 | 25 | avoidthehack Recommendation status: N/A 26 | 27 |
28 |
29 | 30 | -------------------------------------------------------------------------------- /content/otter/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Otter Browser | Browser Comparison 3 | Description: More information on Otter Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
otter browser logo
8 | 9 |
10 |
11 | # More information: Otter Browser 12 | 13 | Otter Browser is an open source browser based on the QT WebEngine. Its primary aim is to recreate the "best aspects of the classic Opera UI." 14 | 15 | Otter Browser must be installed by building it from the source code. Though there are official and unofficial packages available, they appear lag behind updates to the source code itself. Binaries are labeled as experimental by the developers (and also are out of date.) 16 | 17 | * [Download](https://github.com/OtterBrowser/otter-browser/blob/master/INSTALL.md) 18 | 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: N/A 27 | 28 |
29 |
30 | 31 | -------------------------------------------------------------------------------- /content/palemoon/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Pale Moon | Browser Comparison 3 | Description: More information on Pale Moon in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
pale moon browser logo
8 | 9 |
10 |
11 | # More information: Pale Moon 12 | 13 | Pale Moon is a hard fork of pre-Australis (which also means pre Quantum) Firefox source code. Pale Moon runs on its own rendering engine, "Goanna," and its own platform, "UXP." It has an independent add-on store, which is independent of Mozilla's Add-ons and the Chrome Web Store for Chromium-based browsers. 14 | 15 | Pale Moon by default does not collect data or use telemetry. The browser has a detailed permissions manager and an 16 | 17 | Pale Moon maintains Netscape Plugin Application Programming Interface (NPAPI) plugins, such as Adobe Flash and Microsoft Silverlight. Most modern browsers do not support NPAPI plugins and many NPAPI plugins are years past their end-of-life. 18 | 19 | * [Download](https://www.palemoon.org/download.shtml) 20 | 21 |
22 | 23 |
24 |
25 | 26 | ## avoidthehack weigh-ins 27 | 28 | avoidthehack Recommendation status: **Recommended** ([Windows](https://avoidthehack.com/best-privacy-browsers-windows-10)) 29 | 30 | A brief dive into what Pale Moon is and isn't: Review 31 | 32 | **Note:** Pale Moon only uses a single core, even on modern machines (most of which have multiple CPU cores, either physical or hyperthreaded), so depending on load it may use 100% of a single core. This can harm performance even on more-than-capable hardware. 33 | 34 |
35 |
36 | 37 | -------------------------------------------------------------------------------- /content/puma/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Puma Browser | Browser Comparison 3 | Description: More information on Puma Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
puma browser logo
8 | 9 |
10 |
11 | # More information: Puma Browser 12 | 13 | Puma Browser is a closed-source browser, built and maintained by a core team of developers at Puma Browser. Puma Browser has Web 3 integrations, such as support for IPFS, HNS, and ENS. It also has integration support with ChatGPT, an "AI" LLM. 14 | 15 | * [Download](https://www.pumabrowser.com/) 16 |
17 | 18 |
19 |
20 | 21 | ## avoidthehack weigh-ins 22 | 23 | avoidthehack Recommendation status: N/A 24 | 25 |
26 |
27 | 28 | -------------------------------------------------------------------------------- /content/snowhaze/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: SnowHaze | Browser Comparison 3 | Description: More information on SnowHaze in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
snowhaze browser logo
8 | 9 |
10 |
11 | # More information: SnowHaze 12 | 13 | SnowHaze is an open-source browser using WebKit developed and maintained by Swiss-based Illotros GmbH. It has a native adblocker and fingerprint protections. It has customizable and expanded tab settings, a dedicated tracking script blocker, and can "depersonalize" URLs. 14 | 15 | SnowHaze is only available for iOS. 16 | 17 | * [Download](https://snowhaze.com/en/download.html) 18 |
19 | 20 |
21 |
22 | 23 | ## avoidthehack weigh-ins 24 | 25 | avoidthehack Recommendation status: Recommended ([iOS](https://avoidthehack.com/best-privacy-browsers-ios)) 26 | 27 | A (dated) dive into what SnowHaze has to offer for iOS users: Review 28 | 29 |
30 |
31 | 32 | -------------------------------------------------------------------------------- /content/soul/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Soul Browser | Browser Comparison 3 | Description: More information on Soul Browser in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
soul browser logo
8 | 9 |
10 |
11 | # More information: Soul Browser 12 | 13 | Soul Browser is an open-source browser forked from Chromium (mobile). It has a native ad blocker and a video downloader. Soul Browser uses Android VpnService to change DNS servers. 14 | 15 | Soul Browser is only available for Android. 16 | 17 | * [Download](https://github.com/SoulBrowser/SoulBrowser/issues) 18 | 19 |
20 | 21 |
22 |
23 | 24 | ## avoidthehack weigh-ins 25 | 26 | avoidthehack Recommendation status: N/A 27 | 28 |
29 |
30 | 31 | -------------------------------------------------------------------------------- /content/stoutner/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Privacy Browser (Stoutner) | Browser Comparison 3 | Description: More information on Privacy Browser (Stoutner) in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
privacy browser stoutner logo
8 | 9 |
10 |
11 | # More information: Privacy Browser (Stoutner) 12 | 13 | Privacy Browser is an open source browser primarily maintained by Soren Stoutner. It has a native ad/tracker blocker, uses Mojeek as the default search engine, and does not use telemetry. JavaScript, cookies, and DOM permissions can be controlled on a per-site basis. 14 | 15 | **Note:** This browser requires a purchase from the Google Play Store. 16 | 17 | **Note 2:** A desktop version (Linux) of this browser, using the QT WebEngine, is available as an alpha release. 18 | 19 | * [Download](https://www.stoutner.com/) 20 | 21 |
22 | 23 |
24 |
25 | 26 | ## avoidthehack weigh-ins 27 | 28 | avoidthehack Recommendation status: N/A 29 | 30 |
31 |
32 | 33 | -------------------------------------------------------------------------------- /content/ungoogled/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Ungoogled Chromium 3 | Description: More information on the Ungoogled Chromium browser 4 | Template: more 5 | --- 6 | 7 |
chromium browser logo
8 | 9 |
10 |
11 | # More information: Ungoogled Chromium 12 | 13 | Ungoogled Chromium is a community-driven and maintained fork of vanilla Google Chromium with a goal of _removing_ Google-related services, telemetry, and other Google-connected dependencies in the source code. While this improves privacy, users should expect a level of breakage with this browser. 14 | 15 | Ungoogled Chromium introduces features, such as setting the default search provider to "No search." It also borrows features from other Chromium browser projects, such as Bromite and the Iridium Browser. 16 | 17 | If users choose to install Ungoogled Chromium using binaries in the repository (as opposed to a package manager or building from source), the project emphasizes binaries are third-party and comes with inherent risk. 18 | 19 | 20 | * [Download](https://github.com/ungoogled-software/ungoogled-chromium) 21 | * [privacytests.org](https://privacytests.org) 22 |
23 | 24 |
25 |
26 | 27 | ## avoidthehack weigh-ins 28 | 29 | avoidthehack Recommendation status: **Recommended** ([Linux/macOS](https://avoidthehack.com/best-linux-macos-privacy-browsers) | [Windows](https://avoidthehack.com/best-privacy-browsers-windows-10)) 30 | 31 | Ungoogled Chromium has many different install methods that can be overwhelming for non-technical users: Install Guide 32 | 33 | Generally, it may prove useful for users of this browser to also look into installing extensions without logging into the Chrome Web Store with a Google account: Manually Install Extensions 34 | 35 | **Note:** Users should give careful consideration if choosing to use third-party binaries for installation. 36 | 37 |
38 |
39 | 40 | -------------------------------------------------------------------------------- /content/vivaldi/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Vivaldi | Browser Comparison 3 | Description: More information on Vivaldi in the Browser Comparison Tool 4 | Template: more 5 | --- 6 | 7 |
vivaldi browser logo
8 | 9 |
10 |
11 | # More information: Vivaldi 12 | 13 | Vivaldi is a fork of Chromium and markets itself as the most feature-packed and customizable browser available with user privacy coming first. Vivaldi was initially released in 2015. It's often considered a continuation of the "original" Opera browser as the company developing the browser was a co-founder of Opera Software. 14 | 15 | Vivaldi has numerous native features, including a contacts manager, private calendar, mail client, and quick note taker (in addition to an ad blocker). 16 | 17 | 18 | * [Download](https://vivaldi.com/download/) 19 | * [privacytests.org](https://privacytests.org) 20 |
21 | 22 |
23 |
24 | 25 | ## avoidthehack weigh-ins 26 | 27 | avoidthehack Recommendation status: N/A 28 | 29 | A dive into Vivaldi and its many features: Review 30 | 31 | **Note:** Users should note that Vivaldi keeps a unique identifier for the browser's installation on your device and receives a connection at least every 24-hours from your Vivaldi installation. 32 | 33 |
34 |
35 | 36 | -------------------------------------------------------------------------------- /content/waterfox/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | Title: Waterfox | Browser Comparison 3 | Description: More information on Waterfox browser in the browser comparison tool 4 | Template: more 5 | --- 6 | 7 |
waterfox logo
8 | 9 |
10 |
11 | # More information: Waterfox 12 | 13 | Waterfox is a fork of Firefox primarily maintained by Alex Kontos with contributions from the open source community. Waterfox initially gained traction because it was one of the only browsers available for x64-bit systems. 14 | 15 | While stripping Mozilla's telemetry and implementing more privacy-friendly defaults, Waterfox definitively marketed itself as a privacy-first browser; it was primarily built for optimization and speed. 16 | 17 | Waterfox entered a partnership with analytics and advertising company, System1 in December 2019. As of July 2023, Waterfox has regained its independent status, dropping the partnership with System1. 18 | 19 | * [Download](https://www.waterfox.net/download/) 20 | 21 |
22 | 23 |
24 |
25 | 26 | ## avoidthehack weigh-ins 27 | 28 | avoidthehack Recommendation status: N/A 29 | 30 | A dive into Waterfox, both during its time under System1 and after its return to independent status: Review 31 | 32 |
33 |
34 | 35 | --------------------------------------------------------------------------------