├── .eslintrc.json
├── .github
└── FUNDING.yml
├── .gitignore
├── README.md
├── app
├── components
│ ├── About
│ │ ├── About.js
│ │ ├── ScoreExplanation.js
│ │ ├── SystemInfo.js
│ │ └── TestProcedure.js
│ ├── BrowserBarChart.js
│ ├── BrowserCard.js
│ ├── BrowserDetailsModal.js
│ ├── BrowserRankingList.js
│ ├── DarkModeToggle.js
│ ├── Explanation.js
│ ├── Footer.js
│ ├── Header.js
│ ├── Newsletter.js
│ └── StickyAnnouncement.js
├── favicon.ico
├── globals.css
├── layout.js
├── lib
│ └── getBrowsers.js
├── page.js
└── privacy
│ └── page.js
├── jsconfig.json
├── next.config.mjs
├── package-lock.json
├── package.json
├── postcss.config.mjs
├── public
├── data
│ ├── android.json
│ ├── browsers.json
│ ├── ipad.json
│ ├── macos-arm.json
│ ├── macos-intel.json
│ ├── raw-data.xlsx
│ └── windows.json
└── images
│ ├── BlueskyLogo.png
│ ├── RedditLogo.svg
│ ├── TelegramLogo.svg
│ ├── TwitterLogo.svg
│ ├── browser-logos
│ ├── arc.png
│ ├── brave.png
│ ├── bravebeta.webp
│ ├── bravenightly.webp
│ ├── chrome-canary.png
│ ├── chrome.png
│ ├── chromebeta.png
│ ├── chromedev.webp
│ ├── cromite.png
│ ├── ddg.jpg
│ ├── deta-surf.png
│ ├── dia.png
│ ├── edge-beta.png
│ ├── edge-canary.png
│ ├── edge.png
│ ├── firefox-beta.png
│ ├── firefox-dev.png
│ ├── firefox-nightly.png
│ ├── firefox.png
│ ├── floorp.png
│ ├── ghostery.png
│ ├── iceraven.png
│ ├── kito.png
│ ├── kiwi.png
│ ├── librewolf.svg
│ ├── mull.png
│ ├── mullvad.png
│ ├── opera-beta.webp
│ ├── opera-gx.png
│ ├── opera-mini.png
│ ├── opera.png
│ ├── orion.png
│ ├── quetta.png
│ ├── safari.png
│ ├── samsung-internet-beta.png
│ ├── samsung-internet.png
│ ├── sigmaos.png
│ ├── soul.png
│ ├── strawberry.jpeg
│ ├── thorium.webp
│ ├── tor.png
│ ├── via.png
│ ├── vivaldi-snapshot.png
│ ├── vivaldi.png
│ ├── waterfox.png
│ ├── yandex-alpha.png
│ ├── yandex-beta.webp
│ ├── yandex.png
│ ├── zen-twilight.png
│ └── zen.svg
│ └── logo.png
└── tailwind.config.js
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: kawaiier
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
12 | polar: # Replace with a single Polar username
13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
14 | thanks_dev: # Replace with a single thanks.dev username
15 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 | .aider*
38 | .env
39 | .cursor/
40 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Browserating
2 |
3 | Browserating is a Next.js web application that provides performance rankings and comparisons for macOS browsers. It uses data from Speedometer 3.1 benchmarks to give users a comprehensive view of browser performance.
4 |
5 | ## Features
6 |
7 | - Responsive design for optimal viewing on various devices
8 | - Display a ranking list of macOS browsers based on performance metrics
9 | - Filter browsers based on their engine
10 | - Detailed information for each browser, including multiple versions
11 | - Privacy-focused with dedicated privacy page
12 |
13 | ## Technologies Used
14 |
15 | - Next.js 14.2.6 (App Router)
16 | - React 18
17 | - Tailwind CSS 3.4.1
18 | - Chart.js 4.4.6 with react-chartjs-2
19 | - Lucide React for icons
20 | - Vercel Analytics
21 | - JSON for data storage
22 |
23 | ## Setup and Installation
24 |
25 | 1. Clone the repository:
26 |
27 | ```
28 | git clone https://github.com/kawaiier/browserating.git
29 | cd browserating
30 | ```
31 |
32 | 2. Install dependencies:
33 |
34 | ```
35 | npm install
36 | ```
37 |
38 | 3. Run the development server:
39 |
40 | ```
41 | npm run dev
42 | ```
43 |
44 | 4. Open [http://localhost:3000](http://localhost:3000) in your browser to see the application.
45 |
46 | ## Data Management
47 |
48 | Browser data is stored in `public/data/`. To update browser information:
49 |
50 | 1. Open `platform.json` in a text editor
51 | 2. Modify the JSON data following the existing structure
52 | 3. Save the file
53 |
54 | The application will automatically reflect the changes on the next load.
55 |
56 | ## Contributing
57 |
58 | Contributions are welcome! Please feel free to submit a Pull Request.
59 |
60 | ## Acknowledgments
61 |
62 | - Speedometer 3.1 for providing benchmark data - https://browserbench.org/Speedometer3.1/
63 | - Creator of AdBlock Tester - https://adblock-tester.com/
64 | - All browser developers for their continuous work on improving web technologies
65 |
66 | ## Say Thanks
67 |
68 | If you find this project useful, please consider supporting me with a coffee.
69 |
70 | [](https://ko-fi.com/J3J8TMWMG)
71 |
72 | ### Donation Addresses
73 |
74 | - **BTC**: `bc1qfyad27catyr8rtdhhydn8ummf996kxtesuw4hr`
75 | - **XMR**: `41zM5Hk39icMLDnbAckLpJHMwMPQKAQEADYA1AvjoZw9Y9NC7atnubrWPZKXWRbpZeGg66DkstQmA1oPZurRBcvRFbQ3PLs`
76 | - **LTC**: `ltc1qnqldulnxsxpz4g89uklsepjeqx7cajynzyr7tc`
77 | - **MATIC**: `0x6c056E9ccB183c08e9248eAF26160B5793221513`
78 |
79 | ## Star History
80 |
81 | [](https://star-history.com/#kawaiier/browserating&Date)
82 |
--------------------------------------------------------------------------------
/app/components/About/About.js:
--------------------------------------------------------------------------------
1 | import ScoreExplanation from "./ScoreExplanation";
2 | import SystemInfo from "./SystemInfo";
3 | import TestProcedure from "./TestProcedure";
4 |
5 | export default function About() {
6 | return (
7 |
11 |
15 | About Our Testing Methodology
16 |
17 |
18 |
19 |
23 | All browsers have been tested on a{" "}
24 |
25 | clean install of macOS Sequoia 15.4.{" "}
26 |
27 | The testing was conducted on a{" "}
28 |
29 | 14-inch MacBook Pro from 2023
30 |
31 | , equipped with an{" "}
32 |
33 | M3 Pro processor
34 | {" "}
35 | and{" "}
36 |
37 | 36 GB of RAM
38 |
39 | >
40 | }
41 | />
42 |
46 | All browsers have been tested on a{" "}
47 |
48 | clean install of macOS Ventura 13.6.9.
49 |
50 | The testing was conducted on a{" "}
51 |
52 | 15-inch MacBook Pro from 2019
53 |
54 | , equipped with a{" "}
55 |
56 | 2.3 GHz 8-core Intel Core i9 processor
57 | {" "}
58 | and{" "}
59 |
60 | 16 GB of RAM
61 |
62 | >
63 | }
64 | />
65 |
69 | All browsers have been tested on an{" "}
70 |
71 | old install of Windows 10 Pro.
72 |
73 | The testing was conducted on a{" "}
74 |
75 | Lenovo Ideapad Gaming 3 Laptop
76 |
77 | , equipped with an{" "}
78 |
79 | AMD Ryzen 5 5600H with Radeon Graphics 3.3 GHz processor
80 | {" "}
81 | and{" "}
82 |
83 | 16 GB of RAM
84 |
85 | >
86 | }
87 | />
88 |
92 | All browsers have been tested on{" "}
93 |
94 | Nothing OS 2.6 Android 14.
95 |
96 | The test was conducted on a{" "}
97 |
98 | Nothing Phone (2a)
99 |
100 | , equipped with an{" "}
101 |
102 | Dimensity 7200 Pro CPU with Mali-G610 MC4 GPU
103 | {" "}
104 | and{" "}
105 |
106 | 8 GB of RAM
107 |
108 | >
109 | }
110 | />
111 |
115 | All browsers have been tested on{" "}
116 |
117 | iPadOS 18.5.
118 |
119 | The test was conducted on a{" "}
120 |
121 | iPad Mini 7th Generation
122 |
123 | , equipped with a{" "}
124 |
125 | A17 Pro CPU
126 | {" "}
127 | and{" "}
128 |
129 | 8 GB of RAM
130 |
131 | >
132 | }
133 | />
134 |
135 |
136 | Testing Procedure
137 |
138 |
139 |
140 |
141 |
142 |
143 | Understanding the Scores
144 |
145 |
146 |
147 |
148 |
149 | );
150 | }
151 |
--------------------------------------------------------------------------------
/app/components/About/ScoreExplanation.js:
--------------------------------------------------------------------------------
1 | export default function ScoreExplanation() {
2 | return (
3 |
4 |
5 |
6 | The higher the score, the faster the browser.
7 | {" "}
8 | Speedometer 3.1 measures browser performance by simulating user
9 | interactions on various web applications.
10 |
11 |
12 |
13 |
14 | Score Interpretation:
15 |
16 |
17 |
18 | Speedometer 3.1: Higher scores
19 | indicate faster JavaScript and DOM performance
20 |
21 |
22 | RAM Usage: Lower values
23 | indicate more efficient memory usage
24 |
25 |
26 | Adblock: Higher scores indicate
27 | better ad-blocking capabilities
28 |
29 |
30 |
31 |
32 |
33 | Note: Performance may vary based on your specific hardware, operating
34 | system version, and browser configuration.
35 |
36 |
37 | );
38 | }
39 |
--------------------------------------------------------------------------------
/app/components/About/SystemInfo.js:
--------------------------------------------------------------------------------
1 | export default function SystemInfo({ title, details }) {
2 | return (
3 |
4 |
8 | {title}
9 |
16 |
22 |
23 |
24 |
25 | {details}
26 |
27 |
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/app/components/About/TestProcedure.js:
--------------------------------------------------------------------------------
1 | export default function TestProcedure() {
2 | return (
3 |
4 |
5 |
18 |
19 | For Speedometer benchmark, for each browser{" "}
20 |
21 | five tests were conducted
22 |
23 | . The{" "}
24 |
25 | best and worst results were eliminated
26 |
27 | , and the{" "}
28 |
29 | average of the remaining three tests was calculated
30 | {" "}
31 | to determine the final result.
32 |
33 |
34 |
35 |
36 |
49 |
50 | For RAM usage test,{" "}
51 |
52 | the cumulative memory consumption was measured
53 | {" "}
54 | after sequentially loading seven diverse websites: IGN, ESPN, Figma,
55 | Britannica, Wired, Bloomberg, and Reddit's popular page.
56 | Measurements were taken using Activity Monitor, filtered by each
57 | browser's name.
58 |
59 |
60 |
61 |
89 |
90 | );
91 | }
92 |
--------------------------------------------------------------------------------
/app/components/BrowserBarChart.js:
--------------------------------------------------------------------------------
1 | import { useMemo } from "react";
2 |
3 | export default function BrowserBarChart({
4 | browsers,
5 | platform,
6 | getEngineColor,
7 | }) {
8 | const chartData = useMemo(() => {
9 | if (!browsers || !platform) return [];
10 |
11 | return browsers
12 | .filter((browser) => {
13 | const platformData = browser[platform];
14 | const scores = platformData?.versions?.[0]?.scores;
15 | return scores && typeof scores.speedometer3 === "number";
16 | })
17 | .map((browser) => {
18 | const platformData = browser[platform];
19 | return {
20 | name: browser.name,
21 | score: platformData.versions[0].scores.speedometer3,
22 | engine: platformData.engine || "unknown",
23 | };
24 | })
25 | .sort((a, b) => a.score - b.score);
26 | }, [browsers, platform]);
27 |
28 | const maxScore = useMemo(() => {
29 | return Math.max(...chartData.map((item) => item.score), 1);
30 | }, [chartData]);
31 |
32 | if (!browsers || !platform || !getEngineColor) {
33 | console.warn("BrowserBarChart: Missing required props");
34 | return null;
35 | }
36 |
37 | if (chartData.length === 0) {
38 | return (
39 |
44 | No performance data available for the selected platform
45 |
46 | );
47 | }
48 |
49 | // Get platform display name
50 | const platformNames = {
51 | "macos-arm": "macOS ARM",
52 | "macos-intel": "macOS Intel",
53 | windows: "Windows",
54 | android: "Android",
55 | ipad: "iPad OS",
56 | };
57 |
58 | const platformName = platformNames[platform] || platform;
59 |
60 | return (
61 |
62 |
63 |
64 | Performance Comparison - {platformName}
65 |
66 |
67 | Scroll to view all browsers
68 | Swipe to view
69 |
70 |
71 |
72 |
78 |
79 | {chartData.map((item, index) => {
80 | const percentHeight = (item.score / maxScore) * 100;
81 | const scoreFormatted = item.score.toLocaleString(undefined, {
82 | maximumFractionDigits: 1,
83 | });
84 |
85 | return (
86 |
91 |
95 | {Math.round(item.score).toLocaleString()}
96 |
97 |
98 |
108 |
109 |
117 | {/* Hover Score */}
118 |
119 | {scoreFormatted}
120 |
121 |
122 |
123 |
124 |
125 |
126 |
130 | {item.name}
131 |
132 |
133 |
134 | );
135 | })}
136 |
137 |
138 |
139 | {/* Screen reader only summary */}
140 |
141 |
Summary of browser performance on {platformName}
142 |
From highest to lowest score:
143 |
144 | {[...chartData].reverse().map((item, index) => (
145 |
146 | {item.name} with a score of {item.score.toFixed(1)} using{" "}
147 | {item.engine} engine
148 |
149 | ))}
150 |
151 |
152 |
153 |
185 |
186 | );
187 | }
188 |
--------------------------------------------------------------------------------
/app/components/BrowserCard.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 |
3 | import BrowserDetailsModal from "./BrowserDetailsModal";
4 | import Image from "next/image";
5 |
6 | const BrowserCard = React.memo(
7 | ({ browser, getEngineColor, rank, selectedPlatform }) => {
8 | const [showModal, setShowModal] = useState(false);
9 |
10 | const platformData = browser[selectedPlatform];
11 | if (
12 | !platformData ||
13 | !platformData.versions ||
14 | platformData.versions.length === 0
15 | )
16 | return null;
17 |
18 | const latestVersion = platformData.versions[0];
19 | const prevSpeedometer3Score =
20 | platformData.versions.length > 1
21 | ? platformData.versions[1].scores.speedometer3
22 | : null;
23 |
24 | // Use the platform-specific engine
25 | const platformEngine = platformData.engine;
26 |
27 | const getRankStyle = (rank) => {
28 | switch (rank) {
29 | case 1:
30 | return "ring-4 ring-yellow-400"; // Gold
31 | case 2:
32 | return "ring-4 ring-gray-300"; // Silver
33 | case 3:
34 | return "ring-4 ring-amber-600"; // Bronze
35 | default:
36 | return "";
37 | }
38 | };
39 |
40 | // Calculate score difference for accessibility text
41 | const scoreDifference = prevSpeedometer3Score
42 | ? latestVersion.scores.speedometer3 - prevSpeedometer3Score
43 | : null;
44 |
45 | const scoreChangeText = scoreDifference
46 | ? `${scoreDifference > 0 ? "Increased" : "Decreased"} by ${Math.abs(
47 | scoreDifference
48 | ).toFixed(2)} points from previous version`
49 | : "";
50 |
51 | return (
52 | <>
53 | setShowModal(true)}
68 | onKeyDown={(e) => {
69 | if (e.key === "Enter" || e.key === " ") {
70 | e.preventDefault();
71 | setShowModal(true);
72 | }
73 | }}
74 | tabIndex={
75 | selectedPlatform === "android" && platformData.versions.length === 1
76 | ? -1
77 | : 0
78 | }
79 | >
80 | {selectedPlatform === "android" &&
81 | platformData.versions.length === 1 && (
82 |
83 | Outdated
84 |
85 | )}
86 |
87 |
113 |
114 |
118 | {latestVersion.version}
119 |
120 |
125 | {platformEngine}
126 |
127 |
128 |
129 | {/* Speedometer Score */}
130 |
131 |
132 | Speedometer 3.1
133 |
134 |
135 |
136 | {latestVersion.scores.speedometer3.toFixed(2)}
137 |
138 | {prevSpeedometer3Score && (
139 |
140 |
144 | 0
145 | ? "text-green-600 dark:text-green-400"
146 | : latestVersion.scores.speedometer3 -
147 | prevSpeedometer3Score <
148 | 0
149 | ? "text-red-600 dark:text-red-400"
150 | : "text-gray-600 dark:text-gray-400"
151 | }`}
152 | >
153 | {latestVersion.scores.speedometer3 -
154 | prevSpeedometer3Score >
155 | 0
156 | ? "+"
157 | : ""}
158 | {(
159 | latestVersion.scores.speedometer3 -
160 | prevSpeedometer3Score
161 | ).toFixed(2)}
162 |
163 |
164 | )}
165 |
166 |
167 |
168 | {/* RAM Score */}
169 | {latestVersion.scores.ram && (
170 |
171 |
172 | RAM Usage
173 |
174 |
175 |
176 | {latestVersion.scores.ram.toFixed(0)}
177 |
178 |
179 | MB
180 |
181 |
182 |
183 | )}
184 |
185 | {/* Adblock Score */}
186 | {latestVersion.scores.adblock && (
187 |
188 |
189 | Adblock
190 |
191 |
192 |
193 | {latestVersion.scores.adblock.toFixed(0)}/100
194 |
195 |
207 |
208 |
209 | )}
210 |
211 |
212 |
213 |
214 | {showModal && (
215 | setShowModal(false)}
219 | />
220 | )}
221 | >
222 | );
223 | }
224 | );
225 |
226 | // Add display name for the memoized component
227 | BrowserCard.displayName = "BrowserCard";
228 |
229 | export default BrowserCard;
230 |
--------------------------------------------------------------------------------
/app/components/BrowserDetailsModal.js:
--------------------------------------------------------------------------------
1 | import {
2 | BarElement,
3 | CategoryScale,
4 | Chart as ChartJS,
5 | Legend,
6 | LineElement,
7 | LinearScale,
8 | PointElement,
9 | Title,
10 | Tooltip,
11 | } from "chart.js";
12 |
13 | import { Bar } from "react-chartjs-2";
14 | import Image from "next/image";
15 |
16 | ChartJS.register(
17 | CategoryScale,
18 | LinearScale,
19 | PointElement,
20 | LineElement,
21 | Title,
22 | Tooltip,
23 | Legend,
24 | BarElement
25 | );
26 |
27 | const BrowserDetailsModal = ({ browser, selectedPlatform, onClose }) => {
28 | const platformData = browser[selectedPlatform];
29 |
30 | // Check if platform data exists and has the correct structure
31 | if (
32 | !platformData ||
33 | !platformData.versions ||
34 | platformData.versions.length === 0
35 | ) {
36 | return (
37 |
41 |
e.stopPropagation()}
44 | role="dialog"
45 | aria-modal="true"
46 | >
47 |
48 |
49 | No Data Available
50 |
51 |
52 | No performance data available for {browser.name} on this platform.
53 |
54 |
58 | Close
59 |
60 |
61 |
62 |
63 | );
64 | }
65 |
66 | const latestVersion = platformData.versions[0];
67 | const sortedData = [...platformData.versions].reverse();
68 | const platformEngine = platformData.engine;
69 |
70 | const getEngineColor = (engine) => {
71 | switch (engine.toLowerCase()) {
72 | case "blink":
73 | return "bg-blue-100 dark:bg-sky-900 text-blue-800 dark:text-blue-100";
74 | case "gecko":
75 | return "bg-green-100 dark:bg-emerald-900 text-green-800 dark:text-green-100";
76 | case "webkit":
77 | return "bg-orange-100 dark:bg-amber-900 text-orange-800 dark:text-orange-100";
78 | default:
79 | return "bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-100";
80 | }
81 | };
82 |
83 | const chartData = {
84 | labels: sortedData.map((data) => data.version),
85 | datasets: [
86 | {
87 | label: "Speedometer 3 Score",
88 | data: sortedData.map((data) => data.scores.speedometer3),
89 | backgroundColor: "#7853E0",
90 | borderColor: "#7853E0",
91 | tension: 0.1,
92 | },
93 | ],
94 | };
95 |
96 | const chartOptions = {
97 | maintainAspectRatio: false,
98 | scales: {
99 | x: {
100 | grid: {
101 | color: "rgba(120, 83, 224, 0.1)",
102 | },
103 | ticks: {
104 | color: "#9CA3AF", // gray-400
105 | },
106 | },
107 | y: {
108 | grid: {
109 | color: "rgba(120, 83, 224, 0.1)",
110 | },
111 | ticks: {
112 | color: "#9CA3AF", // gray-400
113 | },
114 | },
115 | },
116 | plugins: {
117 | legend: {
118 | labels: {
119 | color: "#9CA3AF", // gray-400
120 | },
121 | },
122 | },
123 | };
124 |
125 | // Get platform display name
126 | const platformNames = {
127 | "macos-arm": "macOS ARM",
128 | "macos-intel": "macOS Intel",
129 | windows: "Windows",
130 | android: "Android",
131 | ipad: "iPad OS",
132 | };
133 |
134 | const platformName = platformNames[selectedPlatform] || selectedPlatform;
135 |
136 | return (
137 |
141 |
e.stopPropagation()}
144 | role="dialog"
145 | aria-modal="true"
146 | >
147 |
148 |
149 |
150 |
157 |
158 |
159 | {browser.name}
160 |
161 |
162 | Performance on {platformName}
163 |
164 |
165 |
166 |
167 |
172 | {platformEngine}
173 |
174 |
175 |
176 |
180 |
187 |
193 |
194 |
195 |
196 |
197 |
198 |
199 | Performance History on {platformName}
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 | Version History
210 |
211 |
212 | {platformData.versions.map((data, index) => (
213 |
217 |
218 |
219 |
220 | Version {data.version}
221 |
222 | {index === 0 && (
223 |
224 | Latest
225 |
226 | )}
227 |
228 |
229 | {data.scores.speedometer3.toFixed(2)}
230 |
231 |
232 |
233 | {/* Additional scores if available */}
234 | {(data.scores.ram || data.scores.adblock) && (
235 |
236 | {data.scores.ram && (
237 | RAM: {data.scores.ram.toFixed(0)} MB
238 | )}
239 | {data.scores.adblock && (
240 |
241 | Adblock: {data.scores.adblock.toFixed(0)}/100
242 |
243 | )}
244 |
245 | )}
246 |
247 |
248 | {data.releaseDate &&
249 | `Released: ${new Date(
250 | data.releaseDate
251 | ).toLocaleDateString()}`}
252 |
253 |
254 | ))}
255 |
256 |
257 |
258 |
259 |
260 | );
261 | };
262 |
263 | export default BrowserDetailsModal;
264 |
--------------------------------------------------------------------------------
/app/components/BrowserRankingList.js:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useEffect, useMemo, useState } from "react";
4 |
5 | import BrowserBarChart from "./BrowserBarChart";
6 | import BrowserCard from "./BrowserCard";
7 | import { getBrowsers } from "../lib/getBrowsers";
8 |
9 | const engineColors = {
10 | Blink:
11 | "bg-blue-100 dark:bg-sky-900 text-blue-800 dark:text-blue-100 hover:bg-blue-200 dark:hover:bg-sky-800",
12 | Gecko:
13 | "bg-green-100 dark:bg-emerald-900 text-green-800 dark:text-green-100 hover:bg-green-200 dark:hover:bg-emerald-800",
14 | WebKit:
15 | "bg-orange-100 dark:bg-amber-900 text-orange-800 dark:text-orange-100 hover:bg-orange-200 dark:hover:bg-amber-800",
16 | All: "bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-100 hover:bg-gray-200 dark:hover:bg-gray-600",
17 | };
18 |
19 | const getEngineColor = (engine) => {
20 | return (
21 | engineColors[engine] ||
22 | "bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-100 hover:bg-red-200 dark:hover:bg-red-800"
23 | );
24 | };
25 |
26 | const platformNames = {
27 | "macos-arm": "macOS ARM",
28 | "macos-intel": "macOS Intel",
29 | windows: "Windows",
30 | android: "Android",
31 | ipad: "iPad OS",
32 | };
33 |
34 | // Add this new constant for the NEW badge
35 | const NEW_PLATFORM = "android";
36 |
37 | // Skeleton Loader Component
38 | const SkeletonLoader = () => (
39 |
64 | );
65 |
66 | export default function BrowserRankingList() {
67 | const [browsers, setBrowsers] = useState([]);
68 | const [filteredBrowsers, setFilteredBrowsers] = useState([]);
69 | const [selectedEngine, setSelectedEngine] = useState("All");
70 | const [selectedPlatform, setSelectedPlatform] = useState("macos-arm");
71 | const [isLoading, setIsLoading] = useState(true);
72 | const [error, setError] = useState(null);
73 | const [selectedBrowsers, setSelectedBrowsers] = useState([]);
74 |
75 | useEffect(() => {
76 | async function fetchBrowsers() {
77 | try {
78 | const data = await getBrowsers();
79 | setBrowsers(data);
80 | setFilteredBrowsers(data);
81 | setIsLoading(false);
82 | } catch (err) {
83 | setError("Failed to load browser data");
84 | setIsLoading(false);
85 | }
86 | }
87 | fetchBrowsers();
88 | }, []);
89 |
90 | const sortBrowsersByPlatform = (browsers, platform) => {
91 | return browsers.sort((a, b) => {
92 | const aScore = a[platform]?.versions?.[0]?.scores?.speedometer3 || 0;
93 | const bScore = b[platform]?.versions?.[0]?.scores?.speedometer3 || 0;
94 | return bScore - aScore;
95 | });
96 | };
97 |
98 | const sortedBrowsers = useMemo(
99 | () => sortBrowsersByPlatform(browsers, selectedPlatform),
100 | [browsers, selectedPlatform]
101 | );
102 |
103 | useEffect(() => {
104 | const filtered =
105 | selectedEngine === "All"
106 | ? sortedBrowsers
107 | : sortedBrowsers.filter((browser) => {
108 | const platformData = browser[selectedPlatform];
109 | return platformData?.engine === selectedEngine;
110 | });
111 | setFilteredBrowsers(filtered);
112 | }, [selectedEngine, sortedBrowsers, selectedPlatform]);
113 |
114 | const engines = useMemo(() => {
115 | const platformEngines = browsers
116 | .filter((browser) => browser[selectedPlatform])
117 | .map((browser) => browser[selectedPlatform].engine)
118 | .filter(Boolean);
119 |
120 | return ["All", ...new Set(platformEngines)];
121 | }, [browsers, selectedPlatform]);
122 |
123 | const platforms = ["macos-intel", "macos-arm", "windows", "android", "ipad"];
124 |
125 | const handleEngineFilter = (engine) => {
126 | setSelectedEngine(engine);
127 | };
128 |
129 | const handlePlatformChange = (platform) => {
130 | setSelectedPlatform(platform);
131 | setSelectedEngine("All"); // Reset engine filter when platform changes
132 | };
133 |
134 | const handleBrowserSelect = (browser) => {
135 | setSelectedBrowsers((prev) => {
136 | const exists = prev.find((b) => b.name === browser.name);
137 | if (exists) {
138 | return prev.filter((b) => b.name !== browser.name);
139 | }
140 | return [...prev, browser];
141 | });
142 | };
143 |
144 | const renderPlatformButtons = () => (
145 |
150 | {platforms.map((platform) => (
151 | handlePlatformChange(platform)}
154 | className={`px-3 py-1 rounded-full text-sm relative
155 | ${
156 | selectedPlatform === platform
157 | ? "ring-2 ring-offset-2 ring-gray-300 dark:ring-gray-500 dark:ring-offset-gray-900"
158 | : ""
159 | }
160 | bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-100
161 | hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors`}
162 | role="radio"
163 | aria-checked={selectedPlatform === platform}
164 | >
165 | {platformNames[platform]}
166 | {platform === NEW_PLATFORM && (
167 |
174 | updated
175 |
176 | )}
177 |
178 | ))}
179 |
180 | );
181 |
182 | const renderEngineButtons = () => (
183 |
188 | {engines.map((engine) => (
189 | handleEngineFilter(engine)}
192 | className={`px-3 py-1 rounded-full text-sm ${getEngineColor(engine)}
193 | ${
194 | selectedEngine === engine
195 | ? "ring-2 ring-offset-2 ring-gray-300 dark:ring-gray-500 dark:ring-offset-gray-900"
196 | : ""
197 | }`}
198 | role="radio"
199 | aria-checked={selectedEngine === engine}
200 | >
201 | {engine}
202 |
203 | ))}
204 |
205 | );
206 |
207 | if (isLoading) {
208 | return (
209 |
210 | Browser Performance Rankings
211 | {renderPlatformButtons()}
212 | {renderEngineButtons()}
213 |
218 |
Loading browser data...
219 | {Array(6)
220 | .fill(0)
221 | .map((_, i) => (
222 |
223 | ))}
224 |
225 |
226 | );
227 | }
228 |
229 | if (error) {
230 | return (
231 |
232 |
233 | {error}
234 |
235 | window.location.reload()}
237 | className="px-4 py-2 bg-purple-600 dark:bg-purple-500 text-white rounded-lg hover:bg-purple-700 dark:hover:bg-purple-600 transition-colors"
238 | >
239 | Retry
240 |
241 |
242 | );
243 | }
244 |
245 | return (
246 |
247 | Browser Performance Rankings
248 | {renderPlatformButtons()}
249 | {renderEngineButtons()}
250 |
251 | {/* Browser Cards */}
252 |
256 | {filteredBrowsers.length === 0 ? (
257 |
258 | No browsers match the selected filters.
259 |
260 | ) : (
261 | filteredBrowsers.map((browser, index) => (
262 |
270 | ))
271 | )}
272 |
273 |
274 | {/* Chart Section */}
275 |
276 |
281 |
282 |
283 | );
284 | }
285 |
--------------------------------------------------------------------------------
/app/components/DarkModeToggle.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | export default function DarkModeToggle({ darkMode, toggleDarkMode }) {
4 | // Pre-calculate star positions to avoid repositioning on every render
5 | const stars = Array.from({ length: 6 }).map((_, i) => ({
6 | top: Math.random() * 100,
7 | left: Math.random() * 100,
8 | delay: Math.random() * 1500,
9 | key: `star-${i}`,
10 | }));
11 |
12 | return (
13 |
24 |
25 | {/* Sun */}
26 |
31 | {/* Main sun circle */}
32 |
33 |
34 | {/* Sun rays */}
35 | {[...Array(12)].map((_, i) => (
36 |
45 | ))}
46 |
47 |
48 | {/* Moon */}
49 |
54 | {/* Main moon circle */}
55 |
56 |
57 | {/* Moon craters */}
58 |
59 |
60 |
61 |
62 |
63 | {/* Stars (visible in dark mode) */}
64 |
70 | {stars.map((star) => (
71 |
80 | ))}
81 |
82 |
83 |
84 | );
85 | }
86 |
--------------------------------------------------------------------------------
/app/components/Explanation.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | // Collapsible section component similar to SystemInfo
4 | const ExplanationSection = ({ title, children }) => {
5 | return (
6 |
7 |
11 | {title}
12 |
19 |
25 |
26 |
27 |
28 | {children}
29 |
30 |
31 | );
32 | };
33 |
34 | export default function Explanation() {
35 | return (
36 |
40 |
44 | Understanding Browser Performance Rankings
45 |
46 |
47 |
48 |
49 | BrowseRating began as a curiosity-driven project to quantify the
50 | perceived speed differences between browsers. What started as a
51 | personal investigation has evolved into a{" "}
52 |
53 | comprehensive benchmarking platform comparing browser performance
54 | {" "}
55 | through synthetic testing methodologies.
56 |
57 |
58 |
59 |
60 | BrowseRating conducts controlled performance tests on identical
61 | hardware configurations, ensuring fair comparisons between browsers.
62 | Each browser undergoes the same synthetic tests, with detailed
63 | system specifications displayed alongside the results for complete
64 | transparency. While these benchmarks focus on DOM element creation
65 | speed, they provide valuable insights into browser capabilities
66 | across different platforms.
67 |
68 |
69 |
70 |
71 |
72 | It's important to note that while these benchmarks provide
73 | valuable comparative data, the performance differences may not be
74 | immediately noticeable in everyday browsing. Most modern browsers
75 | deliver excellent performance for typical usage, with factors like
76 | internet connectivity often having a more significant impact on user
77 | experience than rendering differences.
78 |
79 |
80 |
81 |
82 |
83 | {[
84 | "Provides objective performance comparisons across browsers",
85 | "Helps track browser optimization progress over time",
86 | "Offers insights into platform-specific performance variations",
87 | "Supports informed decision-making for power users",
88 | ].map((item, index) => (
89 |
90 |
103 |
104 | {item}
105 |
106 |
107 | ))}
108 |
109 |
110 |
111 |
112 |
113 | To provide a more comprehensive comparison, we've included
114 | average RAM usage measurements for browsers with a single active
115 | YouTube tab. Keep in mind that actual memory consumption can vary
116 | significantly based on several factors, including:
117 |
118 |
119 | {[
120 | "Number and types of installed extensions/add-ons",
121 | "Other open tabs and their content",
122 | "Background applications and system load",
123 | "Operating system memory management",
124 | ].map((item, index) => (
125 |
126 |
139 |
140 | {item}
141 |
142 |
143 | ))}
144 |
145 |
146 |
147 |
148 |
149 | Built-in ad blocking capabilities have become increasingly important
150 | for modern browsers as they directly impact both performance and
151 | user privacy. By blocking intrusive advertisements and tracking
152 | scripts at the browser level, users can experience{" "}
153 |
154 | faster page load times, reduced bandwidth usage, and better
155 | overall browsing security
156 | {" "}
157 | without relying on third-party extensions. Native ad blocking also
158 | tends to be more efficient than extension-based solutions, consuming
159 | fewer system resources while providing comprehensive protection
160 | against unwanted content and potential security threats that could
161 | be delivered through ad networks.
162 |
163 |
164 |
165 |
166 |
167 | We're committed to expanding our benchmark suite and
168 | maintaining up-to-date comparisons. While our current scores are
169 | pending updates due to technical considerations, we're
170 | preparing to conduct a comprehensive round of testing across all
171 | major browsers in the coming weeks. Stay tuned for fresh performance
172 | insights across{" "}
173 |
174 | multiple browser versions
175 |
176 | .
177 |
178 |
179 |
180 |
181 | );
182 | }
183 |
--------------------------------------------------------------------------------
/app/components/Footer.js:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 |
3 | import Image from "next/image";
4 |
5 | const DONATION_ADDRESSES = {
6 | BTC: "bc1qfyad27catyr8rtdhhydn8ummf996kxtesuw4hr",
7 | XMR: "41zM5Hk39icMLDnbAckLpJHMwMPQKAQEADYA1AvjoZw9Y9NC7atnubrWPZKXWRbpZeGg66DkstQmA1oPZurRBcvRFbQ3PLs",
8 | LTC: "ltc1qnqldulnxsxpz4g89uklsepjeqx7cajynzyr7tc",
9 | MATIC: "0x6c056E9ccB183c08e9248eAF26160B5793221513",
10 | };
11 |
12 | export default function Footer() {
13 | const [isCopied, setIsCopied] = useState(false);
14 | const [copiedCurrency, setCopiedCurrency] = useState("");
15 | const [isMobile, setIsMobile] = useState(false);
16 |
17 | useEffect(() => {
18 | // Check if device is mobile
19 | const checkMobile = () => {
20 | setIsMobile(window.innerWidth < 768);
21 | };
22 |
23 | checkMobile();
24 | window.addEventListener("resize", checkMobile);
25 |
26 | return () => window.removeEventListener("resize", checkMobile);
27 | }, []);
28 |
29 | const handleCopy = (text, currency) => {
30 | navigator.clipboard.writeText(text);
31 | setIsCopied(true);
32 | setCopiedCurrency(currency);
33 | setTimeout(() => {
34 | setIsCopied(false);
35 | setCopiedCurrency("");
36 | }, 2000);
37 | };
38 |
39 | const truncateAddress = (address, type) => {
40 | if (isMobile) {
41 | if (type === "XMR") {
42 | return `${address.slice(0, 10)}...${address.slice(-10)}`;
43 | }
44 | return `${address.slice(0, 8)}...${address.slice(-8)}`;
45 | }
46 |
47 | if (type === "XMR") {
48 | return `${address.slice(0, 20)}...${address.slice(-20)}`;
49 | }
50 | return address;
51 | };
52 |
53 | return (
54 |
58 |
59 |
60 | {/* Social Links */}
61 |
62 |
63 |
148 |
149 |
150 | {/* Developer Info */}
151 |
189 |
190 | {/* Minimal Donations Section */}
191 |
192 |
Donations
193 |
194 | {isCopied
195 | ? `${copiedCurrency} address copied! ✓`
196 | : "Click to copy"}
197 |
198 |
199 | {Object.entries(DONATION_ADDRESSES).map(([currency, address]) => (
200 |
handleCopy(address, currency)}
203 | onKeyDown={(e) => {
204 | if (e.key === "Enter" || e.key === " ") {
205 | e.preventDefault();
206 | handleCopy(address, currency);
207 | }
208 | }}
209 | className="font-mono cursor-pointer text-[10px] sm:text-xs hover:text-gray-700 transition-colors p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800"
210 | tabIndex="0"
211 | role="button"
212 | aria-label={`Copy ${currency} address: ${address}`}
213 | >
214 | {currency}: {" "}
215 |
216 | {truncateAddress(address, currency)}
217 |
218 |
219 | ))}
220 |
221 |
222 |
223 | {/* Privacy Policy Link */}
224 |
225 |
229 | Privacy Policy
230 |
231 |
232 |
233 |
234 |
235 | );
236 | }
237 |
--------------------------------------------------------------------------------
/app/components/Header.js:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 |
3 | import DarkModeToggle from "./DarkModeToggle";
4 | import Image from "next/image";
5 |
6 | export default function Header({ darkMode, toggleDarkMode }) {
7 | return (
8 |
12 | {/* Background Pattern */}
13 |
18 |
19 |
27 |
33 |
40 |
41 |
42 |
43 |
44 |
45 | {/* Content Container */}
46 |
47 |
48 | {/* Logo Section */}
49 |
66 |
67 | {/* Text Section */}
68 |
69 |
70 | BrowseRating
71 |
72 |
73 | Browser Performance Ranking for
74 |
75 |
76 | macOS / Windows / Android / iPad
77 |
78 |
79 |
80 |
81 | The score displayed below reflects the browser's performance
82 | in the Speedometer 3.1 benchmark. The higher the score, the
83 | better.
84 |
85 |
86 |
87 | Last updated: May 29, 2025
88 |
89 |
90 |
91 |
92 | The rating is updated monthly. If you would like weekly updates,
93 | consider supporting the project. Your support will motivate me
94 | to dedicate time each week to conduct these tests.
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | );
105 | }
106 |
--------------------------------------------------------------------------------
/app/components/Newsletter.js:
--------------------------------------------------------------------------------
1 | import { useRef, useState } from "react";
2 |
3 | export default function Newsletter() {
4 | const [email, setEmail] = useState("");
5 | const [isSubmitting, setIsSubmitting] = useState(false);
6 | const [submitStatus, setSubmitStatus] = useState(null);
7 | const formRef = useRef(null);
8 |
9 | const handleSubmit = async (e) => {
10 | e.preventDefault();
11 |
12 | if (!email) return;
13 |
14 | setIsSubmitting(true);
15 | setSubmitStatus(null);
16 |
17 | // Simulate form submission
18 | try {
19 | // Replace with actual API call when ready
20 | await new Promise((resolve) => setTimeout(resolve, 1000));
21 | setSubmitStatus({ success: true, message: "Thank you for subscribing!" });
22 | setEmail("");
23 | } catch (error) {
24 | setSubmitStatus({
25 | success: false,
26 | message: "Something went wrong. Please try again.",
27 | });
28 | } finally {
29 | setIsSubmitting(false);
30 | }
31 | };
32 |
33 | return (
34 |
38 |
39 |
43 | Stay Updated with Browser Performance
44 |
45 |
46 | Get notified when we publish new browser performance comparisons
47 |
48 |
49 |
50 |
112 |
113 | );
114 | }
115 |
--------------------------------------------------------------------------------
/app/components/StickyAnnouncement.js:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import React, { useState } from "react";
4 |
5 | const StickyAnnouncement = () => {
6 | const [isVisible, setIsVisible] = useState(true);
7 |
8 | if (!isVisible) {
9 | return null;
10 | }
11 |
12 | return (
13 |
14 |
15 | Subscribe to /r/aiBrowsing — A place
16 | for discussing browsers and extensions that incorporate AI features
17 |
18 |
19 |
25 | Subscribe
26 |
27 |
setIsVisible(false)}
29 | className="text-white hover:text-gray-200 text-xl font-bold leading-none flex items-center justify-center h-6 w-6 rounded-full focus:outline-none focus:ring-2 focus:ring-white focus:ring-opacity-50"
30 | aria-label="Dismiss announcement"
31 | >
32 | ×
33 |
34 |
35 |
36 | );
37 | };
38 |
39 | export default StickyAnnouncement;
40 |
--------------------------------------------------------------------------------
/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/app/favicon.ico
--------------------------------------------------------------------------------
/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | @keyframes fade-in {
6 | 0% {
7 | opacity: 0;
8 | transform: scale(0.95); /* Optional: Slightly scale down */
9 | }
10 | 100% {
11 | opacity: 1;
12 | transform: scale(1); /* Return to normal scale */
13 | }
14 | }
15 |
16 | .fade-in {
17 | animation: fade-in 0.4s ease-in-out forwards; /* Adjust duration and easing as needed */
18 | }
19 |
20 | @keyframes twinkle {
21 | 0%,
22 | 100% {
23 | opacity: 1;
24 | }
25 | 50% {
26 | opacity: 0.3;
27 | }
28 | }
29 |
30 | .animate-twinkle {
31 | animation: twinkle 2s ease-in-out infinite;
32 | }
33 |
34 | @keyframes bounce-gentle {
35 | 0%,
36 | 100% {
37 | transform: translateY(0);
38 | }
39 | 50% {
40 | transform: translateY(-5px);
41 | }
42 | }
43 |
44 | .animate-bounce-gentle {
45 | animation: bounce-gentle 2s ease-in-out infinite;
46 | }
47 |
48 | /* Improved focus styles for better accessibility */
49 | :focus-visible {
50 | outline: 2px solid #7853e0;
51 | outline-offset: 2px;
52 | border-radius: 0.25rem;
53 | }
54 |
55 | /* Ensure interactive elements have proper focus states */
56 | a:focus-visible,
57 | button:focus-visible,
58 | input:focus-visible,
59 | select:focus-visible,
60 | textarea:focus-visible,
61 | [tabindex]:focus-visible {
62 | outline: 2px solid #7853e0;
63 | outline-offset: 2px;
64 | box-shadow: 0 0 0 4px rgba(120, 83, 224, 0.2);
65 | }
66 |
67 | /* Dark mode focus styles */
68 | .dark a:focus-visible,
69 | .dark button:focus-visible,
70 | .dark input:focus-visible,
71 | .dark select:focus-visible,
72 | .dark textarea:focus-visible,
73 | .dark [tabindex]:focus-visible {
74 | outline-color: #9b7be8;
75 | box-shadow: 0 0 0 4px rgba(155, 123, 232, 0.2);
76 | }
77 |
--------------------------------------------------------------------------------
/app/layout.js:
--------------------------------------------------------------------------------
1 | import "./globals.css";
2 |
3 | import { Analytics } from "@vercel/analytics/next";
4 | import { Inter } from "next/font/google";
5 | import Script from "next/script";
6 | import StickyAnnouncement from "./components/StickyAnnouncement";
7 |
8 | const inter = Inter({ subsets: ["latin"] });
9 |
10 | export const metadata = {
11 | title: "BrowseRating - Browser Performance for macOS, Windows and Android",
12 | description:
13 | "Compare performance of macOS, Windows and Android browsers based on Speedometer 3 benchmark results, adblocking quality, and RAM usage. Find the fastest and most efficient browsers for your device.",
14 | keywords:
15 | "browser performance, browser benchmark, Speedometer 3, browser comparison, fastest browser, macOS browser, Windows browser, Android browser, adblocking quality, RAM usage",
16 | authors: [{ name: "Sergei Manvelov" }],
17 | openGraph: {
18 | title: "BrowseRating - Browser Performance Comparison",
19 | description:
20 | "Compare browser performance across macOS, Windows and Android based on Speedometer 3 benchmark results, adblocking quality, and RAM usage.",
21 | url: "https://browserating.com",
22 | siteName: "BrowseRating",
23 | locale: "en_US",
24 | type: "website",
25 | },
26 | twitter: {
27 | card: "summary_large_image",
28 | title: "BrowseRating - Browser Performance Comparison",
29 | description:
30 | "Compare browser performance across macOS, Windows and Android based on Speedometer 3 benchmark results, adblocking quality, and RAM usage.",
31 | creator: "@kawaiier101",
32 | },
33 | robots: {
34 | index: true,
35 | follow: true,
36 | },
37 | };
38 |
39 | export default function RootLayout({ children }) {
40 | return (
41 |
42 |
43 |
44 |
45 |
46 |
57 |
74 |
75 |
76 | {children}
77 |
78 |
79 |
85 |
86 |
87 | );
88 | }
89 |
--------------------------------------------------------------------------------
/app/lib/getBrowsers.js:
--------------------------------------------------------------------------------
1 | export async function getBrowsers() {
2 | const [
3 | browsersResponse,
4 | androidResponse,
5 | macosIntelResponse,
6 | macosArmResponse,
7 | windowsResponse,
8 | ipadResponse,
9 | ] = await Promise.all([
10 | fetch("/data/browsers.json"),
11 | fetch("/data/android.json"),
12 | fetch("/data/macos-intel.json"),
13 | fetch("/data/macos-arm.json"),
14 | fetch("/data/windows.json"),
15 | fetch("/data/ipad.json"),
16 | ]);
17 |
18 | if (
19 | !browsersResponse.ok ||
20 | !androidResponse.ok ||
21 | !macosIntelResponse.ok ||
22 | !macosArmResponse.ok ||
23 | !windowsResponse.ok ||
24 | !ipadResponse.ok
25 | ) {
26 | throw new Error("Failed to fetch browser data");
27 | }
28 |
29 | const [
30 | browsers,
31 | androidData,
32 | macosIntelData,
33 | macosArmData,
34 | windowsData,
35 | ipadData,
36 | ] = await Promise.all([
37 | browsersResponse.json(),
38 | androidResponse.json(),
39 | macosIntelResponse.json(),
40 | macosArmResponse.json(),
41 | windowsResponse.json(),
42 | ipadResponse.json(),
43 | ]);
44 |
45 | // Merge the data from all sources
46 | return browsers.map((browser) => {
47 | const androidBrowser = androidData.find((b) => b.name === browser.name);
48 | const macosIntelBrowser = macosIntelData.find(
49 | (b) => b.name === browser.name
50 | );
51 | const macosArmBrowser = macosArmData.find((b) => b.name === browser.name);
52 | const windowsBrowser = windowsData.find((b) => b.name === browser.name);
53 | const ipadBrowser = ipadData.find((b) => b.name === browser.name);
54 |
55 | return {
56 | ...browser,
57 | android: androidBrowser
58 | ? { versions: androidBrowser.versions, engine: androidBrowser.engine }
59 | : null,
60 | "macos-intel": macosIntelBrowser
61 | ? {
62 | versions: macosIntelBrowser.versions,
63 | engine: macosIntelBrowser.engine,
64 | }
65 | : null,
66 | "macos-arm": macosArmBrowser
67 | ? { versions: macosArmBrowser.versions, engine: macosArmBrowser.engine }
68 | : null,
69 | windows: windowsBrowser
70 | ? { versions: windowsBrowser.versions, engine: windowsBrowser.engine }
71 | : null,
72 | ipad: ipadBrowser
73 | ? { versions: ipadBrowser.versions, engine: ipadBrowser.engine }
74 | : null,
75 | };
76 | });
77 | }
78 |
--------------------------------------------------------------------------------
/app/page.js:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useEffect, useState } from "react";
4 |
5 | import About from "./components/About/About";
6 | import BrowserRankingList from "./components/BrowserRankingList";
7 | import Explanation from "./components/Explanation";
8 | import Footer from "./components/Footer";
9 | import Header from "./components/Header";
10 | import Newsletter from "./components/Newsletter";
11 |
12 | export default function Home() {
13 | const [darkMode, setDarkMode] = useState(false);
14 | const [mounted, setMounted] = useState(false);
15 |
16 | useEffect(() => {
17 | // Check initial theme preference
18 | const isDarkMode =
19 | localStorage?.getItem("darkMode") === "true" ||
20 | (!("darkMode" in localStorage) &&
21 | window?.matchMedia?.("(prefers-color-scheme: dark)")?.matches);
22 |
23 | setDarkMode(isDarkMode);
24 | if (isDarkMode) {
25 | document.documentElement.classList.add("dark");
26 | }
27 | setMounted(true);
28 | }, []);
29 |
30 | const toggleDarkMode = () => {
31 | const newDarkMode = !darkMode;
32 | setDarkMode(newDarkMode);
33 | document.documentElement.classList.toggle("dark");
34 | localStorage.setItem("darkMode", newDarkMode);
35 | };
36 |
37 | // Prevent hydration mismatch by not rendering until mounted
38 | if (!mounted) {
39 | return null;
40 | }
41 |
42 | return (
43 |
59 | );
60 | }
61 |
--------------------------------------------------------------------------------
/app/privacy/page.js:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import Footer from "../components/Footer";
4 | import Image from "next/image";
5 | import Link from "next/link";
6 | import React from "react";
7 |
8 | export default function PrivacyPage() {
9 | return (
10 | <>
11 |
28 |
29 |
30 |
31 | Privacy Policy
32 |
33 | Last updated: March 9, 2025
34 |
35 |
36 | Introduction
37 |
38 | This Privacy Policy explains how we collect, use, and protect your
39 | information when you use our website. We are committed to ensuring
40 | the privacy and security of your data while providing you with a
41 | transparent understanding of our practices.
42 |
43 |
44 |
45 | Information We Collect
46 |
47 |
48 |
49 | Newsletter Subscription
50 |
51 |
52 |
53 | We collect email addresses when you voluntarily subscribe to our
54 | newsletter through Beehive.
55 |
56 |
57 | Your email address is used solely for sending you our newsletter
58 | and related communications.
59 |
60 |
61 | You can unsubscribe from our newsletter at any time by using the
62 | unsubscribe link provided in each email.
63 |
64 |
65 |
66 |
67 | Anonymous Usage Statistics
68 |
69 |
70 | We use Counter.dev and Vercel Analytics to collect anonymous
71 | statistical information about website visits, including:
72 |
73 |
74 | Day and time of visits
75 | Device type (Phone, Tablet, or Computer)
76 | Referral source (which website the visit came from)
77 | Browser type
78 | Country (based on IP address)
79 | Operating system
80 | Screen size
81 | Preferred language
82 | Pages visited
83 | Web vitals metrics (page load time, interaction times)
84 | Route changes
85 |
86 | This data is:
87 |
88 | Collected anonymously
89 |
90 | Aggregated on hourly, daily, weekly, monthly, and yearly basis
91 |
92 |
93 | Partially deleted after certain time periods to enhance privacy
94 |
95 | Never used to personally identify individual users
96 |
97 |
98 | Technical Services
99 |
100 | We use Bunny.net as our CDN provider, which may process technical
101 | information necessary for delivering our website content efficiently
102 | and securely.
103 |
104 |
105 |
106 | How We Use Your Information
107 |
108 |
109 |
110 | Email addresses are used exclusively for:
111 |
112 | Sending newsletters you've subscribed to
113 | Communicating important website updates when necessary
114 |
115 |
116 |
117 | Anonymous usage statistics are used for:
118 |
119 | Understanding how our website is used
120 | Improving user experience
121 | Analyzing website performance
122 |
123 |
124 |
125 |
126 |
127 | Data Sharing and Third Parties
128 |
129 |
130 | We do not sell, trade, or otherwise transfer your information to
131 | third parties. We only work with the following service providers who
132 | help us operate our website:
133 |
134 |
135 | Bunny.net (CDN services)
136 | Beehive (newsletter management)
137 | Counter.dev (anonymous analytics)
138 |
139 | Vercel Analytics (anonymous performance and usage analytics)
140 |
141 |
142 |
143 | Data Security
144 |
145 | We implement appropriate security measures to protect your
146 | information. Your email address is stored securely through our
147 | newsletter service provider.
148 |
149 |
150 | Your Rights
151 |
152 |
153 | You have the right to unsubscribe from our newsletter at any time.
154 |
155 | Request information about what data we hold about you.
156 |
157 | Request deletion of your email address from our newsletter
158 | database.
159 |
160 |
161 |
162 | Contact Us
163 |
164 | If you have any questions about this Privacy Policy or our data
165 | practices, please contact us at kawaiier@tutanota.com.
166 |
167 |
168 |
169 | Changes to This Policy
170 |
171 |
172 | We may update this Privacy Policy from time to time. We will notify
173 | you of any changes by posting the new Privacy Policy on this page
174 | and updating the 'Last updated' date.
175 |
176 |
177 |
178 |
179 | >
180 | );
181 | }
182 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "paths": {
4 | "@/*": ["./*"]
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | images: {
4 | domains: ["storage.ko-fi.com"],
5 | },
6 | };
7 |
8 | export default nextConfig;
9 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "browserating",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@vercel/analytics": "^1.5.0",
13 | "chart.js": "^4.4.6",
14 | "lucide-react": "^0.475.0",
15 | "next": "14.2.6",
16 | "react": "^18",
17 | "react-chartjs-2": "^5.2.0",
18 | "react-dom": "^18"
19 | },
20 | "devDependencies": {
21 | "eslint": "^8",
22 | "eslint-config-next": "14.2.6",
23 | "postcss": "^8",
24 | "tailwindcss": "^3.4.1"
25 | },
26 | "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
27 | }
28 |
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | tailwindcss: {},
5 | },
6 | };
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/public/data/android.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Brave",
4 | "engine": "Blink",
5 | "versions": [
6 | {
7 | "version": "1.78.102",
8 | "scores": {
9 | "speedometer3": 8.08
10 | }
11 | },
12 | {
13 | "version": "1.69.164",
14 | "scores": {
15 | "speedometer3": 7.0
16 | }
17 | }
18 | ]
19 | },
20 | {
21 | "name": "Brave Beta",
22 | "engine": "Blink",
23 | "versions": [
24 | {
25 | "version": "1.70.107",
26 | "scores": {
27 | "speedometer3": 6.97
28 | }
29 | }
30 | ]
31 | },
32 | {
33 | "name": "Brave Nightly",
34 | "engine": "Blink",
35 | "versions": [
36 | {
37 | "version": "1.72.3",
38 | "scores": {
39 | "speedometer3": 6.93
40 | }
41 | }
42 | ]
43 | },
44 | {
45 | "name": "Cromite",
46 | "engine": "Blink",
47 | "versions": [
48 | {
49 | "version": "136.0.7103.125",
50 | "scores": {
51 | "speedometer3": 7.21
52 | }
53 | },
54 | {
55 | "version": "128.0.6613.120",
56 | "scores": {
57 | "speedometer3": 6.08
58 | }
59 | }
60 | ]
61 | },
62 | {
63 | "name": "DuckDuckGo Browser",
64 | "engine": "Blink",
65 | "versions": [
66 | {
67 | "version": "5.233.0",
68 | "scores": {
69 | "speedometer3": 9.07
70 | }
71 | },
72 | {
73 | "version": "5.213.0",
74 | "scores": {
75 | "speedometer3": 9.24
76 | }
77 | }
78 | ]
79 | },
80 | {
81 | "name": "Firefox",
82 | "engine": "Gecko",
83 | "versions": [
84 | {
85 | "version": "138.0.4",
86 | "scores": {
87 | "speedometer3": 5.04
88 | }
89 | },
90 | {
91 | "version": "130.0",
92 | "scores": {
93 | "speedometer3": 5.79
94 | }
95 | }
96 | ]
97 | },
98 | {
99 | "name": "Firefox Beta",
100 | "engine": "Gecko",
101 | "versions": [
102 | {
103 | "version": "131.0b5",
104 | "scores": {
105 | "speedometer3": 5.87
106 | }
107 | }
108 | ]
109 | },
110 | {
111 | "name": "Firefox Developer Edition",
112 | "engine": "Gecko",
113 | "versions": [
114 | {
115 | "version": "131.0b4",
116 | "scores": {
117 | "speedometer3": 5.87
118 | }
119 | }
120 | ]
121 | },
122 | {
123 | "name": "Firefox Nightly",
124 | "engine": "Gecko",
125 | "versions": [
126 | {
127 | "version": "132.0a1",
128 | "scores": {
129 | "speedometer3": 5.78
130 | }
131 | }
132 | ]
133 | },
134 | {
135 | "name": "Ghostery",
136 | "engine": "Gecko",
137 | "versions": [
138 | {
139 | "version": "1.0.2430",
140 | "scores": {
141 | "speedometer3": 4.14
142 | }
143 | }
144 | ]
145 | },
146 | {
147 | "name": "Google Chrome",
148 | "engine": "Blink",
149 | "versions": [
150 | {
151 | "version": "136.0.7103.126",
152 | "scores": {
153 | "speedometer3": 6.04
154 | }
155 | },
156 | {
157 | "version": "128.0.6613.146",
158 | "scores": {
159 | "speedometer3": 9.68
160 | }
161 | }
162 | ]
163 | },
164 | {
165 | "name": "Google Chrome Beta",
166 | "engine": "Blink",
167 | "versions": [
168 | {
169 | "version": "129.0.6668.38",
170 | "scores": {
171 | "speedometer3": 9.71
172 | }
173 | }
174 | ]
175 | },
176 | {
177 | "name": "Google Chrome Canary",
178 | "engine": "Blink",
179 | "versions": [
180 | {
181 | "version": "130.0.6715.0",
182 | "scores": {
183 | "speedometer3": 9.38
184 | }
185 | }
186 | ]
187 | },
188 | {
189 | "name": "Icaraven",
190 | "engine": "Gecko",
191 | "versions": [
192 | {
193 | "version": "2.31.0",
194 | "scores": {
195 | "speedometer3": 4.91
196 | }
197 | },
198 | {
199 | "version": "2.23.0",
200 | "scores": {
201 | "speedometer3": 5.94
202 | }
203 | }
204 | ]
205 | },
206 | {
207 | "name": "Kito",
208 | "engine": "Gecko",
209 | "versions": [
210 | {
211 | "version": "7.6.4.1",
212 | "scores": {
213 | "speedometer3": 3.95
214 | }
215 | }
216 | ]
217 | },
218 | {
219 | "name": "Kiwi",
220 | "engine": "Blink",
221 | "versions": [
222 | {
223 | "version": "124.0.6327.4",
224 | "scores": {
225 | "speedometer3": 5.37
226 | }
227 | }
228 | ]
229 | },
230 | {
231 | "name": "Microsoft Edge",
232 | "engine": "Blink",
233 | "versions": [
234 | {
235 | "version": "136.0.3240.91",
236 | "scores": {
237 | "speedometer3": 5.5
238 | }
239 | },
240 | {
241 | "version": "127.0.2651.1111",
242 | "scores": {
243 | "speedometer3": 5.55
244 | }
245 | }
246 | ]
247 | },
248 | {
249 | "name": "Microsoft Edge Beta",
250 | "engine": "Blink",
251 | "versions": [
252 | {
253 | "version": "129.0.2792.37",
254 | "scores": {
255 | "speedometer3": 5.04
256 | }
257 | }
258 | ]
259 | },
260 | {
261 | "name": "Microsoft Edge Canary",
262 | "engine": "Blink",
263 | "versions": [
264 | {
265 | "version": "130.0.2832.0",
266 | "scores": {
267 | "speedometer3": 5.58
268 | }
269 | }
270 | ]
271 | },
272 | {
273 | "name": "Mull",
274 | "engine": "Gecko",
275 | "versions": [
276 | {
277 | "version": "129.0.2",
278 | "scores": {
279 | "speedometer3": 3.54
280 | }
281 | }
282 | ]
283 | },
284 | {
285 | "name": "Opera",
286 | "engine": "Blink",
287 | "versions": [
288 | {
289 | "version": "89.3.4705.84083",
290 | "scores": {
291 | "speedometer3": 6.38
292 | }
293 | },
294 | {
295 | "version": "84.4.4452.81430",
296 | "scores": {
297 | "speedometer3": 5.59
298 | }
299 | }
300 | ]
301 | },
302 | {
303 | "name": "Opera Beta",
304 | "engine": "Blink",
305 | "versions": [
306 | {
307 | "version": "85.0.4475.81340",
308 | "scores": {
309 | "speedometer3": 5.49
310 | }
311 | }
312 | ]
313 | },
314 | {
315 | "name": "Opera GX",
316 | "engine": "Blink",
317 | "versions": [
318 | {
319 | "version": "2.7.5",
320 | "scores": {
321 | "speedometer3": 12.3
322 | }
323 | },
324 | {
325 | "version": "2.5.7",
326 | "scores": {
327 | "speedometer3": 8.99
328 | }
329 | }
330 | ]
331 | },
332 | {
333 | "name": "Opera Mini",
334 | "engine": "Blink",
335 | "versions": [
336 | {
337 | "version": "91.0.2254.77465",
338 | "scores": {
339 | "speedometer3": 8.41
340 | }
341 | },
342 | {
343 | "version": "84.0.2254.73823",
344 | "scores": {
345 | "speedometer3": 6.94
346 | }
347 | }
348 | ]
349 | },
350 | {
351 | "name": "Quetta",
352 | "engine": "Blink",
353 | "versions": [
354 | {
355 | "version": "1.5.5",
356 | "scores": {
357 | "speedometer3": 5.83
358 | }
359 | },
360 | {
361 | "version": "1.1.9",
362 | "scores": {
363 | "speedometer3": 4.37
364 | }
365 | }
366 | ]
367 | },
368 | {
369 | "name": "Samsung Internet",
370 | "engine": "Blink",
371 | "versions": [
372 | {
373 | "version": "28.0.0.59",
374 | "scores": {
375 | "speedometer3": 5.73
376 | }
377 | },
378 | {
379 | "version": "26.0.3.7",
380 | "scores": {
381 | "speedometer3": 5.99
382 | }
383 | }
384 | ]
385 | },
386 | {
387 | "name": "Samsung Internet Beta",
388 | "engine": "Blink",
389 | "versions": [
390 | {
391 | "version": "27.0.0.58",
392 | "scores": {
393 | "speedometer3": 6.81
394 | }
395 | }
396 | ]
397 | },
398 | {
399 | "name": "Soul",
400 | "engine": "Blink",
401 | "versions": [
402 | {
403 | "version": "1.4.72",
404 | "scores": {
405 | "speedometer3": 9.79
406 | }
407 | },
408 | {
409 | "version": "1.4.34",
410 | "scores": {
411 | "speedometer3": 9.14
412 | }
413 | }
414 | ]
415 | },
416 | {
417 | "name": "Thorium",
418 | "engine": "Blink",
419 | "versions": [
420 | {
421 | "version": "126.0.6478.246",
422 | "scores": {
423 | "speedometer3": 9.8
424 | }
425 | },
426 | {
427 | "version": "2.7.5",
428 | "scores": {
429 | "speedometer3": 7.46
430 | }
431 | }
432 | ]
433 | },
434 | {
435 | "name": "Via",
436 | "engine": "Blink",
437 | "versions": [
438 | {
439 | "version": "6.5.1",
440 | "scores": {
441 | "speedometer3": 10.95
442 | }
443 | },
444 | {
445 | "version": "5.9.0",
446 | "scores": {
447 | "speedometer3": 9.06
448 | }
449 | }
450 | ]
451 | },
452 | {
453 | "name": "Vivaldi",
454 | "engine": "Blink",
455 | "versions": [
456 | {
457 | "version": "7.4.3691.42",
458 | "scores": {
459 | "speedometer3": 8.57
460 | }
461 | },
462 | {
463 | "version": "6.9.3451.58",
464 | "scores": {
465 | "speedometer3": 6.93
466 | }
467 | }
468 | ]
469 | },
470 | {
471 | "name": "Vivaldi Snapshot",
472 | "engine": "Blink",
473 | "versions": [
474 | {
475 | "version": "6.10.3464.4",
476 | "scores": {
477 | "speedometer3": 6.47
478 | }
479 | }
480 | ]
481 | },
482 | {
483 | "name": "Waterfox",
484 | "engine": "Gecko",
485 | "versions": [
486 | {
487 | "version": "1.0.13",
488 | "scores": {
489 | "speedometer3": 3.8
490 | }
491 | },
492 | {
493 | "version": "1.0.8.2",
494 | "scores": {
495 | "speedometer3": 4.91
496 | }
497 | }
498 | ]
499 | },
500 | {
501 | "name": "Yandex Browser",
502 | "engine": "Blink",
503 | "versions": [
504 | {
505 | "version": "25.4.4.105",
506 | "scores": {
507 | "speedometer3": 7.8
508 | }
509 | },
510 | {
511 | "version": "24.7.6.41",
512 | "scores": {
513 | "speedometer3": 8.34
514 | }
515 | }
516 | ]
517 | },
518 | {
519 | "name": "Yandex Browser Alpha",
520 | "engine": "Blink",
521 | "versions": [
522 | {
523 | "version": "24.7.6.28",
524 | "scores": {
525 | "speedometer3": 8.1
526 | }
527 | }
528 | ]
529 | },
530 | {
531 | "name": "Yandex Browser Beta",
532 | "engine": "Blink",
533 | "versions": [
534 | {
535 | "version": "24.7.8.22",
536 | "scores": {
537 | "speedometer3": 8.13
538 | }
539 | }
540 | ]
541 | }
542 | ]
543 |
--------------------------------------------------------------------------------
/public/data/browsers.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Floorp",
4 | "logo": "/images/browser-logos/floorp.png",
5 | "website": "https://floorp.app/en"
6 | },
7 | {
8 | "name": "Mullvad Browser",
9 | "logo": "/images/browser-logos/mullvad.png",
10 | "website": "https://mullvad.net/en/browser"
11 | },
12 | {
13 | "name": "Librewolf",
14 | "logo": "/images/browser-logos/librewolf.svg",
15 | "website": "https://librewolf.net/"
16 | },
17 | {
18 | "name": "Firefox",
19 | "logo": "/images/browser-logos/firefox.png",
20 | "website": "https://www.mozilla.org/firefox/"
21 | },
22 | {
23 | "name": "Firefox Developer Edition",
24 | "engine": "Gecko",
25 | "logo": "/images/browser-logos/firefox-dev.png",
26 | "website": "https://www.mozilla.org/en-US/firefox/developer/"
27 | },
28 | {
29 | "name": "Firefox Beta",
30 | "logo": "/images/browser-logos/firefox-beta.png",
31 | "website": "https://www.mozilla.org/en-US/firefox/channel/desktop/#beta"
32 | },
33 | {
34 | "name": "Firefox Nightly",
35 | "logo": "/images/browser-logos/firefox-nightly.png",
36 | "website": "https://www.mozilla.org/en-US/firefox/channel/desktop/#nightly"
37 | },
38 | {
39 | "name": "Waterfox",
40 | "logo": "/images/browser-logos/waterfox.png",
41 | "website": "https://www.waterfox.net/"
42 | },
43 | {
44 | "name": "Zen Browser",
45 | "logo": "/images/browser-logos/zen.svg",
46 | "website": "https://www.zen-browser.app/"
47 | },
48 | {
49 | "name": "Zen Browser Twilight",
50 | "logo": "/images/browser-logos/zen-twilight.png",
51 | "website": "https://zen-browser.app/download/?twilight"
52 | },
53 | {
54 | "name": "Tor Browser",
55 | "logo": "/images/browser-logos/tor.png",
56 | "website": "https://www.torproject.org/download/"
57 | },
58 | {
59 | "name": "Brave",
60 | "logo": "/images/browser-logos/brave.png",
61 | "website": "https://brave.com/"
62 | },
63 | {
64 | "name": "Brave Beta",
65 | "logo": "/images/browser-logos/bravebeta.webp",
66 | "website": "https://brave.com/"
67 | },
68 | {
69 | "name": "Brave Nightly",
70 | "logo": "/images/browser-logos/bravenightly.webp",
71 | "website": "https://brave.com/"
72 | },
73 | {
74 | "name": "Google Chrome",
75 | "logo": "/images/browser-logos/chrome.png",
76 | "website": "https://www.google.com/chrome/"
77 | },
78 | {
79 | "name": "Google Chrome Canary",
80 | "logo": "/images/browser-logos/chrome-canary.png",
81 | "website": "https://www.google.com/chrome/canary/"
82 | },
83 | {
84 | "name": "Google Chrome Beta",
85 | "logo": "/images/browser-logos/chromebeta.png",
86 | "website": "https://www.google.com/chrome/beta/"
87 | },
88 | {
89 | "name": "Samsung Internet",
90 | "logo": "/images/browser-logos/samsung-internet.png",
91 | "website": "https://www.samsung.com/us/support/owners/app/samsung-internet"
92 | },
93 | {
94 | "name": "Samsung Internet Beta",
95 | "logo": "/images/browser-logos/samsung-internet-beta.png",
96 | "website": "https://www.samsung.com/us/support/owners/app/samsung-internet"
97 | },
98 | {
99 | "name": "Orion",
100 | "logo": "/images/browser-logos/orion.png",
101 | "website": "https://kagi.com/orion/"
102 | },
103 | {
104 | "name": "Safari",
105 | "logo": "/images/browser-logos/safari.png",
106 | "website": "https://www.apple.com/safari/"
107 | },
108 | {
109 | "name": "DuckDuckGo Browser",
110 | "logo": "/images/browser-logos/ddg.jpg",
111 | "website": "https://duckduckgo.com/"
112 | },
113 | {
114 | "name": "Microsoft Edge",
115 | "logo": "/images/browser-logos/edge.png",
116 | "website": "https://www.microsoft.com/edge"
117 | },
118 | {
119 | "name": "Microsoft Edge Beta",
120 | "logo": "/images/browser-logos/edge-beta.png",
121 | "website": "https://www.microsoft.com/edge"
122 | },
123 | {
124 | "name": "Microsoft Edge Canary",
125 | "logo": "/images/browser-logos/edge-canary.png",
126 | "website": "https://www.microsoft.com/edge"
127 | },
128 | {
129 | "name": "Opera",
130 | "logo": "/images/browser-logos/opera.png",
131 | "website": "https://www.opera.com/"
132 | },
133 | {
134 | "name": "Opera Beta",
135 | "logo": "/images/browser-logos/opera-beta.webp",
136 | "website": "https://www.opera.com/"
137 | },
138 | {
139 | "name": "Opera Mini",
140 | "logo": "/images/browser-logos/opera-mini.png",
141 | "website": "https://www.opera.com/"
142 | },
143 | {
144 | "name": "Opera GX",
145 | "logo": "/images/browser-logos/opera-gx.png",
146 | "website": "https://www.opera.com/gx"
147 | },
148 | {
149 | "name": "Vivaldi",
150 | "logo": "/images/browser-logos/vivaldi.png",
151 | "website": "https://vivaldi.com/"
152 | },
153 | {
154 | "name": "Vivaldi Snapshot",
155 | "logo": "/images/browser-logos/vivaldi-snapshot.png",
156 | "website": "https://vivaldi.com/"
157 | },
158 | {
159 | "name": "Yandex Browser",
160 | "logo": "/images/browser-logos/yandex.png",
161 | "website": "https://browser.yandex.com/"
162 | },
163 | {
164 | "name": "Yandex Browser Beta",
165 | "logo": "/images/browser-logos/yandex-beta.webp",
166 | "website": "https://browser.yandex.com/"
167 | },
168 | {
169 | "name": "Yandex Browser Alpha",
170 | "logo": "/images/browser-logos/yandex-alpha.png",
171 | "website": "https://browser.yandex.com/"
172 | },
173 | {
174 | "name": "Arc Browser",
175 | "logo": "/images/browser-logos/arc.png",
176 | "website": "https://arc.net/"
177 | },
178 | {
179 | "name": "Sigma OS",
180 | "logo": "/images/browser-logos/sigmaos.png",
181 | "website": "https://sigmaos.com/"
182 | },
183 | {
184 | "name": "Cromite",
185 | "logo": "/images/browser-logos/cromite.png",
186 | "website": "https://github.com/uazo/cromite"
187 | },
188 | {
189 | "name": "Kiwi",
190 | "logo": "/images/browser-logos/kiwi.png",
191 | "website": "https://kiwibrowser.com/"
192 | },
193 | {
194 | "name": "Via",
195 | "logo": "/images/browser-logos/via.png",
196 | "website": "https://www.viayoo.com/en/"
197 | },
198 | {
199 | "name": "Soul",
200 | "logo": "/images/browser-logos/soul.png",
201 | "website": "https://play.google.com/store/apps/details?id=com.mycompany.app.soulbrowser&hl=en"
202 | },
203 | {
204 | "name": "Quetta",
205 | "logo": "/images/browser-logos/quetta.png",
206 | "website": "https://www.quetta.net/"
207 | },
208 | {
209 | "name": "Thorium",
210 | "logo": "/images/browser-logos/thorium.webp",
211 | "website": "https://thorium.rocks/"
212 | },
213 | {
214 | "name": "Mull",
215 | "logo": "/images/browser-logos/mull.png",
216 | "website": "https://f-droid.org/en/packages/us.spotco.fennec_dos/"
217 | },
218 | {
219 | "name": "Icaraven",
220 | "logo": "/images/browser-logos/iceraven.png",
221 | "website": "https://github.com/fork-maintainers/iceraven-browser"
222 | },
223 | {
224 | "name": "Ghostery",
225 | "logo": "/images/browser-logos/ghostery.png",
226 | "website": "https://www.ghostery.com/ghostery-private-browser"
227 | },
228 | {
229 | "name": "Kito",
230 | "logo": "/images/browser-logos/kito.png",
231 | "website": "https://play.google.com/store/apps/details?id=com.yjllqint.kito&hl=en"
232 | },
233 | {
234 | "name": "Dia",
235 | "logo": "/images/browser-logos/dia.png",
236 | "website": "https://www.diabrowser.com/"
237 | },
238 | {
239 | "name": "Deta Surf",
240 | "logo": "/images/browser-logos/deta-surf.png",
241 | "website": "https://deta.surf/"
242 | },
243 | {
244 | "name": "Strawberry",
245 | "logo": "/images/browser-logos/strawberry.jpeg",
246 | "website": "https://strawberrybrowser.com/"
247 | }
248 | ]
249 |
--------------------------------------------------------------------------------
/public/data/ipad.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Arc Browser",
4 | "engine": "WebKit",
5 | "versions": [
6 | {
7 | "version": "1.43.0",
8 | "scores": {
9 | "speedometer3": 27.2
10 | }
11 | }
12 | ]
13 | },
14 | {
15 | "name": "Brave",
16 | "engine": "WebKit",
17 | "versions": [
18 | {
19 | "version": "1.78.1",
20 | "scores": {
21 | "speedometer3": 21.83
22 | }
23 | }
24 | ]
25 | },
26 | {
27 | "name": "Google Chrome",
28 | "engine": "WebKit",
29 | "versions": [
30 | {
31 | "version": "137.0.7151.34",
32 | "scores": {
33 | "speedometer3": 22.27
34 | }
35 | }
36 | ]
37 | },
38 | {
39 | "name": "DuckDuckGo",
40 | "engine": "WebKit",
41 | "versions": [
42 | {
43 | "version": "7.169.0",
44 | "scores": {
45 | "speedometer3": 25.07
46 | }
47 | }
48 | ]
49 | },
50 | {
51 | "name": "Firefox",
52 | "engine": "WebKit",
53 | "versions": [
54 | {
55 | "version": "138.2",
56 | "scores": {
57 | "speedometer3": 27.87
58 | }
59 | }
60 | ]
61 | },
62 | {
63 | "name": "Microsoft Edge",
64 | "engine": "WebKit",
65 | "versions": [
66 | {
67 | "version": "136.3240.77",
68 | "scores": {
69 | "speedometer3": 23.23
70 | }
71 | }
72 | ]
73 | },
74 | {
75 | "name": "Opera",
76 | "engine": "WebKit",
77 | "versions": [
78 | {
79 | "version": "5.5.3",
80 | "scores": {
81 | "speedometer3": 27.17
82 | }
83 | }
84 | ]
85 | },
86 | {
87 | "name": "Orion",
88 | "engine": "WebKit",
89 | "versions": [
90 | {
91 | "version": "1.3.23",
92 | "scores": {
93 | "speedometer3": 26.1
94 | }
95 | }
96 | ]
97 | },
98 | {
99 | "name": "Safari",
100 | "engine": "WebKit",
101 | "versions": [
102 | {
103 | "version": "18.5",
104 | "scores": {
105 | "speedometer3": 30.9
106 | }
107 | }
108 | ]
109 | },
110 | {
111 | "name": "Vivaldi",
112 | "engine": "WebKit",
113 | "versions": [
114 | {
115 | "version": "7.4.3691.46",
116 | "scores": {
117 | "speedometer3": 19.3
118 | }
119 | }
120 | ]
121 | }
122 | ]
123 |
--------------------------------------------------------------------------------
/public/data/macos-arm.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Arc Browser",
4 | "engine": "Blink",
5 | "versions": [
6 | {
7 | "version": "1.91.2",
8 | "scores": {
9 | "speedometer3": 41.32,
10 | "ram": 4853.1,
11 | "adblock": 96
12 | }
13 | },
14 | {
15 | "version": "1.89.0",
16 | "scores": {
17 | "speedometer3": 43.23,
18 | "ram": 4853.1,
19 | "adblock": 96
20 | }
21 | },
22 | {
23 | "version": "1.83.0",
24 | "scores": {
25 | "speedometer3": 38.52,
26 | "ram": 159,
27 | "adblock": 96
28 | }
29 | },
30 | {
31 | "version": "1.79.1",
32 | "scores": {
33 | "speedometer3": 37.23,
34 | "ram": 156,
35 | "adblock": 96
36 | }
37 | },
38 | {
39 | "version": "1.74.0",
40 | "scores": {
41 | "speedometer3": 37.37,
42 | "ram": 160
43 | }
44 | },
45 | {
46 | "version": "1.70.0",
47 | "scores": {
48 | "speedometer3": 38.03
49 | }
50 | },
51 | {
52 | "version": "1.66.0",
53 | "scores": {
54 | "speedometer3": 36.87
55 | }
56 | }
57 | ]
58 | },
59 | {
60 | "name": "Brave",
61 | "engine": "Blink",
62 | "versions": [
63 | {
64 | "version": "1.78.94",
65 | "scores": {
66 | "speedometer3": 43.73,
67 | "ram": 4116.6,
68 | "adblock": 96
69 | }
70 | },
71 | {
72 | "version": "1.77.95",
73 | "scores": {
74 | "speedometer3": 43.77,
75 | "ram": 4116.6,
76 | "adblock": 96
77 | }
78 | },
79 | {
80 | "version": "1.75.180",
81 | "scores": {
82 | "speedometer3": 40.91,
83 | "ram": 172,
84 | "adblock": 96
85 | }
86 | },
87 | {
88 | "version": "1.74.51",
89 | "scores": {
90 | "speedometer3": 39.37,
91 | "ram": 170,
92 | "adblock": 96
93 | }
94 | },
95 | {
96 | "version": "1.73.104",
97 | "scores": {
98 | "speedometer3": 39.07,
99 | "ram": 190
100 | }
101 | },
102 | {
103 | "version": "1.73.91",
104 | "scores": {
105 | "speedometer3": 39.2
106 | }
107 | },
108 | {
109 | "version": "1.71.118",
110 | "scores": {
111 | "speedometer3": 39.17
112 | }
113 | }
114 | ]
115 | },
116 | {
117 | "name": "Deta Surf",
118 | "engine": "Blink",
119 | "versions": [
120 | {
121 | "version": "0.4.10",
122 | "scores": {
123 | "speedometer3": 38.83
124 | }
125 | }
126 | ]
127 | },
128 | {
129 | "name": "Dia",
130 | "engine": "Blink",
131 | "versions": [
132 | {
133 | "version": "0.26.0",
134 | "scores": {
135 | "speedometer3": 40.83
136 | }
137 | }
138 | ]
139 | },
140 | {
141 | "name": "DuckDuckGo Browser",
142 | "engine": "WebKit",
143 | "versions": [
144 | {
145 | "version": "1.118.1",
146 | "scores": {
147 | "speedometer3": 35.07,
148 | "adblock": 60
149 | }
150 | },
151 | {
152 | "version": "1.115.0",
153 | "scores": {
154 | "speedometer3": 34
155 | }
156 | },
157 | {
158 | "version": "1.110.0",
159 | "scores": {
160 | "speedometer3": 34.6
161 | }
162 | }
163 | ]
164 | },
165 | {
166 | "name": "Firefox",
167 | "engine": "Gecko",
168 | "versions": [
169 | {
170 | "version": "138.0.1",
171 | "scores": {
172 | "speedometer3": 38.67,
173 | "ram": 18600,
174 | "adblock": 34
175 | }
176 | },
177 | {
178 | "version": "137.0",
179 | "scores": {
180 | "speedometer3": 38.53,
181 | "ram": 18600,
182 | "adblock": 34
183 | }
184 | },
185 | {
186 | "version": "135.0.1",
187 | "scores": {
188 | "speedometer3": 37.63,
189 | "ram": 602,
190 | "adblock": 34
191 | }
192 | },
193 | {
194 | "version": "134.0.2",
195 | "scores": {
196 | "speedometer3": 36.2,
197 | "ram": 484,
198 | "adblock": 34
199 | }
200 | },
201 | {
202 | "version": "133.0.3",
203 | "scores": {
204 | "speedometer3": 36.98,
205 | "ram": 459
206 | }
207 | },
208 | {
209 | "version": "132.0.2",
210 | "scores": {
211 | "speedometer3": 36.88
212 | }
213 | },
214 | {
215 | "version": "131.0.3",
216 | "scores": {
217 | "speedometer3": 37.36
218 | }
219 | }
220 | ]
221 | },
222 | {
223 | "name": "Firefox Developer Edition",
224 | "engine": "Gecko",
225 | "versions": [
226 | {
227 | "version": "139.0b3",
228 | "scores": {
229 | "speedometer3": 36.81,
230 | "ram": 17455,
231 | "adblock": 34
232 | }
233 | },
234 | {
235 | "version": "138.0b3",
236 | "scores": {
237 | "speedometer3": 38.28,
238 | "ram": 17455,
239 | "adblock": 34
240 | }
241 | },
242 | {
243 | "version": "136.0b9",
244 | "scores": {
245 | "speedometer3": 38.5,
246 | "ram": 708,
247 | "adblock": 34
248 | }
249 | },
250 | {
251 | "version": "135.0b9",
252 | "scores": {
253 | "speedometer3": 36.47,
254 | "ram": 705,
255 | "adblock": 34
256 | }
257 | },
258 | {
259 | "version": "134.0b10",
260 | "scores": {
261 | "speedometer3": 38.09,
262 | "ram": 609
263 | }
264 | },
265 | {
266 | "version": "134.0b1",
267 | "scores": {
268 | "speedometer3": 36.27
269 | }
270 | },
271 | {
272 | "version": "132.0b9",
273 | "scores": {
274 | "speedometer3": 37.5
275 | }
276 | }
277 | ]
278 | },
279 | {
280 | "name": "Firefox Nightly",
281 | "engine": "Gecko",
282 | "versions": [
283 | {
284 | "version": "140.0a1 (2025-05-02)",
285 | "scores": {
286 | "speedometer3": 37.66,
287 | "ram": 18658,
288 | "adblock": 34
289 | }
290 | },
291 | {
292 | "version": "139.0a1 (2025-04-06)",
293 | "scores": {
294 | "speedometer3": 38.2,
295 | "ram": 18658,
296 | "adblock": 34
297 | }
298 | },
299 | {
300 | "version": "137.0a1 (2025-02-22)",
301 | "scores": {
302 | "speedometer3": 37.6,
303 | "ram": 615,
304 | "adblock": 34
305 | }
306 | },
307 | {
308 | "version": "136.0a1 (2025-02-01)",
309 | "scores": {
310 | "speedometer3": 35.8,
311 | "ram": 645,
312 | "adblock": 34
313 | }
314 | },
315 | {
316 | "version": "135.0a1 (2024-12-27)",
317 | "scores": {
318 | "speedometer3": 37.07,
319 | "ram": 650
320 | }
321 | },
322 | {
323 | "version": "135.0a1 (2024-11-23)",
324 | "scores": {
325 | "speedometer3": 36.33
326 | }
327 | },
328 | {
329 | "version": "133.0a1",
330 | "scores": {
331 | "speedometer3": 36.57
332 | }
333 | }
334 | ]
335 | },
336 | {
337 | "name": "Google Chrome",
338 | "engine": "Blink",
339 | "versions": [
340 | {
341 | "version": "136.0.7103.49",
342 | "scores": {
343 | "speedometer3": 45.27,
344 | "ram": 8194.1,
345 | "adblock": 42
346 | }
347 | },
348 | {
349 | "version": "135.0.7049.42",
350 | "scores": {
351 | "speedometer3": 47.4,
352 | "ram": 8194.1,
353 | "adblock": 42
354 | }
355 | },
356 | {
357 | "version": "133.0.6943.127",
358 | "scores": {
359 | "speedometer3": 43.83,
360 | "ram": 93,
361 | "adblock": 42
362 | }
363 | },
364 | {
365 | "version": "132.0.6834.160",
366 | "scores": {
367 | "speedometer3": 42.37,
368 | "ram": 90,
369 | "adblock": 42
370 | }
371 | },
372 | {
373 | "version": "131.0.6778.205",
374 | "scores": {
375 | "speedometer3": 42.78,
376 | "ram": 74
377 | }
378 | },
379 | {
380 | "version": "131.0.6778.86",
381 | "scores": {
382 | "speedometer3": 42.03
383 | }
384 | },
385 | {
386 | "version": "130.0.6723.70",
387 | "scores": {
388 | "speedometer3": 40.37
389 | }
390 | }
391 | ]
392 | },
393 | {
394 | "name": "Google Chrome Canary",
395 | "engine": "Blink",
396 | "versions": [
397 | {
398 | "version": "138.0.7158.0",
399 | "scores": {
400 | "speedometer3": 46.27,
401 | "ram": 9178.4,
402 | "adblock": 42
403 | }
404 | },
405 | {
406 | "version": "137.0.7111.0",
407 | "scores": {
408 | "speedometer3": 43.1,
409 | "ram": 9178.4,
410 | "adblock": 42
411 | }
412 | },
413 | {
414 | "version": "133.0.6943.127",
415 | "scores": {
416 | "speedometer3": 44.13,
417 | "ram": 106,
418 | "adblock": 42
419 | }
420 | },
421 | {
422 | "version": "134.0.6992.0",
423 | "scores": {
424 | "speedometer3": 43.3,
425 | "ram": 96,
426 | "adblock": 42
427 | }
428 | },
429 | {
430 | "version": "133.0.6923.0",
431 | "scores": {
432 | "speedometer3": 43.53,
433 | "ram": 94
434 | }
435 | },
436 | {
437 | "version": "133.0.6860.0",
438 | "scores": {
439 | "speedometer3": 41.48
440 | }
441 | },
442 | {
443 | "version": "132.0.6799.0",
444 | "scores": {
445 | "speedometer3": 42.53
446 | }
447 | }
448 | ]
449 | },
450 | {
451 | "name": "Microsoft Edge",
452 | "engine": "Blink",
453 | "versions": [
454 | {
455 | "version": "136.0.3240.50",
456 | "scores": {
457 | "speedometer3": 46.6,
458 | "ram": 10568.5,
459 | "adblock": 42
460 | }
461 | },
462 | {
463 | "version": "135.0.3179.54",
464 | "scores": {
465 | "speedometer3": 40.53,
466 | "ram": 10568.5,
467 | "adblock": 42
468 | }
469 | },
470 | {
471 | "version": "133.0.3065.82",
472 | "scores": {
473 | "speedometer3": 40.03,
474 | "ram": 131,
475 | "adblock": 42
476 | }
477 | },
478 | {
479 | "version": "132.0.2957.127",
480 | "scores": {
481 | "speedometer3": 38.53,
482 | "ram": 127,
483 | "adblock": 42
484 | }
485 | },
486 | {
487 | "version": "131.0.2903.112",
488 | "scores": {
489 | "speedometer3": 37.41,
490 | "ram": 94
491 | }
492 | },
493 | {
494 | "version": "131.0.2903.70",
495 | "scores": {
496 | "speedometer3": 37.91
497 | }
498 | },
499 | {
500 | "version": "130.0.2849.56",
501 | "scores": {
502 | "speedometer3": 34.9
503 | }
504 | }
505 | ]
506 | },
507 | {
508 | "name": "Opera",
509 | "engine": "Blink",
510 | "versions": [
511 | {
512 | "version": "118.0.5461.60",
513 | "scores": {
514 | "speedometer3": 42.17,
515 | "ram": 2926.1,
516 | "adblock": 42
517 | }
518 | },
519 | {
520 | "version": "117.0.5408.35",
521 | "scores": {
522 | "speedometer3": 41.83,
523 | "ram": 117,
524 | "adblock": 42
525 | }
526 | },
527 | {
528 | "version": "116.0.5366.71",
529 | "scores": {
530 | "speedometer3": 40.57,
531 | "ram": 115,
532 | "adblock": 42
533 | }
534 | },
535 | {
536 | "version": "115.0.5322.119",
537 | "scores": {
538 | "speedometer3": 40.07,
539 | "ram": 105
540 | }
541 | },
542 | {
543 | "version": "114.0.5282.222",
544 | "scores": {
545 | "speedometer3": 39.23
546 | }
547 | },
548 | {
549 | "version": "114.0.5282.115",
550 | "scores": {
551 | "speedometer3": 38.3
552 | }
553 | }
554 | ]
555 | },
556 | {
557 | "name": "Opera GX",
558 | "engine": "Blink",
559 | "versions": [
560 | {
561 | "version": "118.0.5461.76",
562 | "scores": {
563 | "speedometer3": 42.76,
564 | "ram": 2551.9,
565 | "adblock": 42
566 | }
567 | },
568 | {
569 | "version": "117.0.5408.205",
570 | "scores": {
571 | "speedometer3": 39.97,
572 | "ram": 2551.9,
573 | "adblock": 42
574 | }
575 | },
576 | {
577 | "version": "116.0.5366.148",
578 | "scores": {
579 | "speedometer3": 41.8,
580 | "ram": 127,
581 | "adblock": 42
582 | }
583 | },
584 | {
585 | "version": "116.0.5366.87",
586 | "scores": {
587 | "speedometer3": 41.1,
588 | "ram": 120,
589 | "adblock": 42
590 | }
591 | },
592 | {
593 | "version": "115.0.5322.124",
594 | "scores": {
595 | "speedometer3": 40.02,
596 | "ram": 122
597 | }
598 | },
599 | {
600 | "version": "114.0.5282.233",
601 | "scores": {
602 | "speedometer3": 39.57
603 | }
604 | },
605 | {
606 | "version": "114.0.5282.123",
607 | "scores": {
608 | "speedometer3": 38.47
609 | }
610 | }
611 | ]
612 | },
613 | {
614 | "name": "Orion",
615 | "engine": "WebKit",
616 | "versions": [
617 | {
618 | "version": "0.99.133-beta",
619 | "scores": {
620 | "speedometer3": 40.77,
621 | "ram": 3022,
622 | "adblock": 100
623 | }
624 | },
625 | {
626 | "version": "0.99.132.0.3-beta",
627 | "scores": {
628 | "speedometer3": 40.5,
629 | "ram": 3022,
630 | "adblock": 100
631 | }
632 | },
633 | {
634 | "version": "0.99.131-beta",
635 | "scores": {
636 | "speedometer3": 41.43,
637 | "ram": 80,
638 | "adblock": 100
639 | }
640 | },
641 | {
642 | "version": "0.99.130.2-beta",
643 | "scores": {
644 | "speedometer3": 40.13,
645 | "ram": 79,
646 | "adblock": 100
647 | }
648 | },
649 | {
650 | "version": "0.99.130.1-beta",
651 | "scores": {
652 | "speedometer3": 41.27,
653 | "ram": 65
654 | }
655 | },
656 | {
657 | "version": "0.99.129-beta",
658 | "scores": {
659 | "speedometer3": 40.67
660 | }
661 | },
662 | {
663 | "version": "0.99.128.2.1-beta",
664 | "scores": {
665 | "speedometer3": 40.1
666 | }
667 | }
668 | ]
669 | },
670 | {
671 | "name": "Safari",
672 | "engine": "WebKit",
673 | "versions": [
674 | {
675 | "version": "18.4",
676 | "scores": {
677 | "speedometer3": 42.17,
678 | "ram": 2714.2,
679 | "adblock": 37
680 | }
681 | },
682 | {
683 | "version": "18.3",
684 | "scores": {
685 | "speedometer3": 39.43,
686 | "ram": 53,
687 | "adblock": 37
688 | }
689 | },
690 | {
691 | "version": "18.2",
692 | "scores": {
693 | "speedometer3": 40.57,
694 | "ram": 45,
695 | "adblock": 37
696 | }
697 | },
698 | {
699 | "version": "18.1.1",
700 | "scores": {
701 | "speedometer3": 43.77
702 | }
703 | },
704 | {
705 | "version": "18.01",
706 | "scores": {
707 | "speedometer3": 42.27
708 | }
709 | }
710 | ]
711 | },
712 | {
713 | "name": "Sigma OS",
714 | "engine": "WebKit",
715 | "versions": [
716 | {
717 | "version": "1.19.0.4",
718 | "scores": {
719 | "speedometer3": 29.1,
720 | "ram": 2874.7,
721 | "adblock": 77
722 | }
723 | },
724 | {
725 | "version": "1.19.0",
726 | "scores": {
727 | "speedometer3": 30.8,
728 | "ram": 180,
729 | "adblock": 77
730 | }
731 | }
732 | ]
733 | },
734 | {
735 | "name": "Strawberry",
736 | "engine": "Blink",
737 | "versions": [
738 | {
739 | "version": "0.0.39",
740 | "scores": {
741 | "speedometer3": 34.7
742 | }
743 | }
744 | ]
745 | },
746 | {
747 | "name": "Ungoogled Chromium",
748 | "engine": "Blink",
749 | "versions": [
750 | {
751 | "version": "136.0.7103.59",
752 | "scores": {
753 | "speedometer3": 38.03,
754 | "ram": 8874.3,
755 | "adblock": 42
756 | }
757 | },
758 | {
759 | "version": "135.0.7049.52",
760 | "scores": {
761 | "speedometer3": 37.03,
762 | "ram": 8874.3,
763 | "adblock": 42
764 | }
765 | },
766 | {
767 | "version": "133.0.6943.98",
768 | "scores": {
769 | "speedometer3": 36.05,
770 | "ram": 90,
771 | "adblock": 42
772 | }
773 | },
774 | {
775 | "version": "132.0.6834.110",
776 | "scores": {
777 | "speedometer3": 34.83,
778 | "ram": 78,
779 | "adblock": 42
780 | }
781 | }
782 | ]
783 | },
784 | {
785 | "name": "Vivaldi",
786 | "engine": "Blink",
787 | "versions": [
788 | {
789 | "version": "7.3.3635.11",
790 | "scores": {
791 | "speedometer3": 44.18,
792 | "ram": 3284.7,
793 | "adblock": 42
794 | }
795 | },
796 | {
797 | "version": "7.3.3635.7",
798 | "scores": {
799 | "speedometer3": 43.86,
800 | "ram": 3284.7,
801 | "adblock": 42
802 | }
803 | },
804 | {
805 | "version": "7.1.3570.54",
806 | "scores": {
807 | "speedometer3": 42.33,
808 | "ram": 113,
809 | "adblock": 42
810 | }
811 | },
812 | {
813 | "version": "7.1.3570.42",
814 | "scores": {
815 | "speedometer3": 42.05,
816 | "ram": 111,
817 | "adblock": 42
818 | }
819 | },
820 | {
821 | "version": "7.0.3495.27",
822 | "scores": {
823 | "speedometer3": 40.27,
824 | "ram": 106
825 | }
826 | },
827 | {
828 | "version": "7.0.3495.18",
829 | "scores": {
830 | "speedometer3": 39.9
831 | }
832 | },
833 | {
834 | "version": "7.0.3495.6",
835 | "scores": {
836 | "speedometer3": 39.83
837 | }
838 | }
839 | ]
840 | },
841 | {
842 | "name": "Waterfox",
843 | "engine": "Gecko",
844 | "versions": [
845 | {
846 | "version": "6.5.7",
847 | "scores": {
848 | "speedometer3": 33.44,
849 | "ram": 6783.4,
850 | "adblock": 34
851 | }
852 | },
853 | {
854 | "version": "6.5.6",
855 | "scores": {
856 | "speedometer3": 33.77,
857 | "ram": 6783.4,
858 | "adblock": 34
859 | }
860 | },
861 | {
862 | "version": "6.5.4",
863 | "scores": {
864 | "speedometer3": 34.87,
865 | "ram": 585,
866 | "adblock": 34
867 | }
868 | }
869 | ]
870 | },
871 | {
872 | "name": "Yandex Browser",
873 | "engine": "Blink",
874 | "versions": [
875 | {
876 | "version": "25.2.6.720",
877 | "scores": {
878 | "speedometer3": 34.36,
879 | "ram": 3018,
880 | "adblock": 37
881 | }
882 | },
883 | {
884 | "version": "25.2.5.949",
885 | "scores": {
886 | "speedometer3": 33.93,
887 | "ram": 3018,
888 | "adblock": 37
889 | }
890 | },
891 | {
892 | "version": "25.2.0.2113",
893 | "scores": {
894 | "speedometer3": 34.27,
895 | "ram": 118,
896 | "adblock": 37
897 | }
898 | },
899 | {
900 | "version": "24.12.0.1845",
901 | "scores": {
902 | "speedometer3": 32.81,
903 | "ram": 98,
904 | "adblock": 37
905 | }
906 | },
907 | {
908 | "version": "24.10.1.687",
909 | "scores": {
910 | "speedometer3": 32.91
911 | }
912 | },
913 | {
914 | "version": "24.10.1.616",
915 | "scores": {
916 | "speedometer3": 32.53
917 | }
918 | }
919 | ]
920 | },
921 | {
922 | "name": "Zen Browser",
923 | "engine": "Gecko",
924 | "versions": [
925 | {
926 | "version": "1.12b",
927 | "scores": {
928 | "speedometer3": 35.47,
929 | "ram": 5648.1,
930 | "adblock": 34
931 | }
932 | },
933 | {
934 | "version": "1.11.1b",
935 | "scores": {
936 | "speedometer3": 34.33,
937 | "ram": 5648.1,
938 | "adblock": 34
939 | }
940 | },
941 | {
942 | "version": "1.7.6b",
943 | "scores": {
944 | "speedometer3": 37.05,
945 | "ram": 756,
946 | "adblock": 34
947 | }
948 | },
949 | {
950 | "version": "1.7.4b",
951 | "scores": {
952 | "speedometer3": 36.07,
953 | "ram": 837,
954 | "adblock": 34
955 | }
956 | },
957 | {
958 | "version": "1.0.2-b.5",
959 | "scores": {
960 | "speedometer3": 35.73,
961 | "ram": 746
962 | }
963 | },
964 | {
965 | "version": "1.0.1-a.19",
966 | "scores": {
967 | "speedometer3": 30.13
968 | }
969 | },
970 | {
971 | "version": "1.0.1-a.12",
972 | "scores": {
973 | "speedometer3": 31.08
974 | }
975 | }
976 | ]
977 | },
978 | {
979 | "name": "Zen Browser Twilight",
980 | "engine": "Gecko",
981 | "versions": [
982 | {
983 | "version": "1.12t (2025-05-02)",
984 | "scores": {
985 | "speedometer3": 35.23,
986 | "ram": 5275.3,
987 | "adblock": 42
988 | }
989 | },
990 | {
991 | "version": "1.11.1t (2025-04-06)",
992 | "scores": {
993 | "speedometer3": 34.67,
994 | "ram": 5275.3,
995 | "adblock": 42
996 | }
997 | },
998 | {
999 | "version": "1.8t (2025-02-22)",
1000 | "scores": {
1001 | "speedometer3": 36.94,
1002 | "ram": 681,
1003 | "adblock": 42
1004 | }
1005 | },
1006 | {
1007 | "version": "1.7.4t (2025-01-30)",
1008 | "scores": {
1009 | "speedometer3": 36.07,
1010 | "ram": 805,
1011 | "adblock": 34
1012 | }
1013 | },
1014 | {
1015 | "version": "1.2t.6",
1016 | "scores": {
1017 | "speedometer3": 35.86,
1018 | "ram": 638
1019 | }
1020 | }
1021 | ]
1022 | }
1023 | ]
1024 |
--------------------------------------------------------------------------------
/public/data/macos-intel.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Arc Browser",
4 | "engine": "Blink",
5 | "versions": [
6 | {
7 | "version": "1.66.0",
8 | "scores": {
9 | "speedometer3": 13.3
10 | }
11 | },
12 | {
13 | "version": "1.59.0",
14 | "scores": {
15 | "speedometer3": 12.4
16 | }
17 | },
18 | {
19 | "version": "1.57.1",
20 | "scores": {
21 | "speedometer3": 12.4
22 | }
23 | }
24 | ]
25 | },
26 | {
27 | "name": "Brave",
28 | "engine": "Blink",
29 | "versions": [
30 | {
31 | "version": "1.71.118",
32 | "scores": {
33 | "speedometer3": 13.33
34 | }
35 | },
36 | {
37 | "version": "1.69.162",
38 | "scores": {
39 | "speedometer3": 12.27
40 | }
41 | },
42 | {
43 | "version": "1.69.153",
44 | "scores": {
45 | "speedometer3": 12.2
46 | }
47 | },
48 | {
49 | "version": "1.68.141",
50 | "scores": {
51 | "speedometer3": 8.46
52 | }
53 | }
54 | ]
55 | },
56 | {
57 | "name": "DuckDuckGo Browser",
58 | "engine": "WebKit",
59 | "versions": [
60 | {
61 | "version": "1.110.0",
62 | "scores": {
63 | "speedometer3": 6.86
64 | }
65 | },
66 | {
67 | "version": "1.105.0",
68 | "scores": {
69 | "speedometer3": 6.53
70 | }
71 | },
72 | {
73 | "version": "1.102.0",
74 | "scores": {
75 | "speedometer3": 6.89
76 | }
77 | }
78 | ]
79 | },
80 | {
81 | "name": "Firefox",
82 | "engine": "Gecko",
83 | "versions": [
84 | {
85 | "version": "131.0.3",
86 | "scores": {
87 | "speedometer3": 13.5
88 | }
89 | },
90 | {
91 | "version": "130.0",
92 | "scores": {
93 | "speedometer3": 13.47
94 | }
95 | },
96 | {
97 | "version": "129.0.2",
98 | "scores": {
99 | "speedometer3": 13.07
100 | }
101 | },
102 | {
103 | "version": "123.0",
104 | "scores": {
105 | "speedometer3": 8.35
106 | }
107 | }
108 | ]
109 | },
110 | {
111 | "name": "Firefox Developer Edition",
112 | "engine": "Gecko",
113 | "versions": [
114 | {
115 | "version": "132.0b9",
116 | "scores": {
117 | "speedometer3": 13.4
118 | }
119 | },
120 | {
121 | "version": "131.0b4",
122 | "scores": {
123 | "speedometer3": 13.37
124 | }
125 | },
126 | {
127 | "version": "130.0b8",
128 | "scores": {
129 | "speedometer3": 13.1
130 | }
131 | },
132 | {
133 | "version": "130.0b3",
134 | "scores": {
135 | "speedometer3": 8.78
136 | }
137 | }
138 | ]
139 | },
140 | {
141 | "name": "Firefox Nightly",
142 | "engine": "Gecko",
143 | "versions": [
144 | {
145 | "version": "133.0a1",
146 | "scores": {
147 | "speedometer3": 13.13
148 | }
149 | },
150 | {
151 | "version": "132.0a1",
152 | "scores": {
153 | "speedometer3": 13.07
154 | }
155 | },
156 | {
157 | "version": "131.0a1",
158 | "scores": {
159 | "speedometer3": 13.03
160 | }
161 | },
162 | {
163 | "version": "130.0b3",
164 | "scores": {
165 | "speedometer3": 8.78
166 | }
167 | }
168 | ]
169 | },
170 | {
171 | "name": "Floorp",
172 | "engine": "Gecko",
173 | "versions": [
174 | {
175 | "version": "11.19.1",
176 | "scores": {
177 | "speedometer3": 13.27
178 | }
179 | },
180 | {
181 | "version": "11.18.1",
182 | "scores": {
183 | "speedometer3": 13.4
184 | }
185 | },
186 | {
187 | "version": "11.17.6",
188 | "scores": {
189 | "speedometer3": 12.97
190 | }
191 | }
192 | ]
193 | },
194 | {
195 | "name": "Google Chrome",
196 | "engine": "Blink",
197 | "versions": [
198 | {
199 | "version": "130.0.6723.70",
200 | "scores": {
201 | "speedometer3": 14.3
202 | }
203 | },
204 | {
205 | "version": "128.0.6613.121",
206 | "scores": {
207 | "speedometer3": 13.23
208 | }
209 | },
210 | {
211 | "version": "128.0.6613.85",
212 | "scores": {
213 | "speedometer3": 12.81
214 | }
215 | }
216 | ]
217 | },
218 | {
219 | "name": "Google Chrome Canary",
220 | "engine": "Blink",
221 | "versions": [
222 | {
223 | "version": "132.0.6799.0",
224 | "scores": {
225 | "speedometer3": 15.3
226 | }
227 | },
228 | {
229 | "version": "130.0.6710.0",
230 | "scores": {
231 | "speedometer3": 14.37
232 | }
233 | },
234 | {
235 | "version": "130.0.6673.0",
236 | "scores": {
237 | "speedometer3": 12.93
238 | }
239 | }
240 | ]
241 | },
242 | {
243 | "name": "Librewolf",
244 | "engine": "Gecko",
245 | "versions": [
246 | {
247 | "version": "131.0.3-1",
248 | "scores": {
249 | "speedometer3": 9.44
250 | }
251 | },
252 | {
253 | "version": "130.0-3",
254 | "scores": {
255 | "speedometer3": 9.33
256 | }
257 | },
258 | {
259 | "version": "129.0.1-1",
260 | "scores": {
261 | "speedometer3": 9.29
262 | }
263 | },
264 | {
265 | "version": "128.0-2",
266 | "scores": {
267 | "speedometer3": 6.06
268 | }
269 | }
270 | ]
271 | },
272 | {
273 | "name": "Microsoft Edge",
274 | "engine": "Blink",
275 | "versions": [
276 | {
277 | "version": "130.0.2849.56",
278 | "scores": {
279 | "speedometer3": 13.83
280 | }
281 | },
282 | {
283 | "version": "128.0.2739.67",
284 | "scores": {
285 | "speedometer3": 13.9
286 | }
287 | },
288 | {
289 | "version": "128.0.2739.42",
290 | "scores": {
291 | "speedometer3": 13.63
292 | }
293 | }
294 | ]
295 | },
296 | {
297 | "name": "Mullvad Browser",
298 | "engine": "Gecko",
299 | "versions": [
300 | {
301 | "version": "13.5.7",
302 | "scores": {
303 | "speedometer3": 5.42
304 | }
305 | },
306 | {
307 | "version": "13.5.3",
308 | "scores": {
309 | "speedometer3": 5.48
310 | }
311 | },
312 | {
313 | "version": "13.5.2",
314 | "scores": {
315 | "speedometer3": 5.5
316 | }
317 | }
318 | ]
319 | },
320 | {
321 | "name": "Opera",
322 | "engine": "Blink",
323 | "versions": [
324 | {
325 | "version": "114.0.5282.115",
326 | "scores": {
327 | "speedometer3": 9.8
328 | }
329 | },
330 | {
331 | "version": "113.0.5230.86",
332 | "scores": {
333 | "speedometer3": 9.38
334 | }
335 | },
336 | {
337 | "version": "113.0.5230.32",
338 | "scores": {
339 | "speedometer3": 9.15
340 | }
341 | }
342 | ]
343 | },
344 | {
345 | "name": "Opera GX",
346 | "engine": "Blink",
347 | "versions": [
348 | {
349 | "version": "114.0.5282.123",
350 | "scores": {
351 | "speedometer3": 12.7
352 | }
353 | },
354 | {
355 | "version": "113.0.5230.75",
356 | "scores": {
357 | "speedometer3": 13.03
358 | }
359 | },
360 | {
361 | "version": "112.0.5197.104",
362 | "scores": {
363 | "speedometer3": 12.27
364 | }
365 | }
366 | ]
367 | },
368 | {
369 | "name": "Orion",
370 | "engine": "WebKit",
371 | "versions": [
372 | {
373 | "version": "0.99.128.2.1-beta",
374 | "scores": {
375 | "speedometer3": 11.08
376 | }
377 | }
378 | ]
379 | },
380 | {
381 | "name": "Safari",
382 | "engine": "WebKit",
383 | "versions": [
384 | {
385 | "version": "17.6",
386 | "scores": {
387 | "speedometer3": 10.51
388 | }
389 | }
390 | ]
391 | },
392 | {
393 | "name": "Sigma OS",
394 | "engine": "WebKit",
395 | "versions": [
396 | {
397 | "version": "1.17.0.8",
398 | "scores": {
399 | "speedometer3": 4.82
400 | }
401 | },
402 | {
403 | "version": "1.17.0.6",
404 | "scores": {
405 | "speedometer3": 4.74
406 | }
407 | },
408 | {
409 | "version": "1.17.0",
410 | "scores": {
411 | "speedometer3": 4.84
412 | }
413 | }
414 | ]
415 | },
416 | {
417 | "name": "Tor Browser",
418 | "engine": "Gecko",
419 | "versions": [
420 | {
421 | "version": "14.0",
422 | "scores": {
423 | "speedometer3": 7.88
424 | }
425 | },
426 | {
427 | "version": "13.5.3",
428 | "scores": {
429 | "speedometer3": 5.43
430 | }
431 | },
432 | {
433 | "version": "12.5.2",
434 | "scores": {
435 | "speedometer3": 5.48
436 | }
437 | }
438 | ]
439 | },
440 | {
441 | "name": "Vivaldi",
442 | "engine": "Blink",
443 | "versions": [
444 | {
445 | "version": "7.0.3495.6",
446 | "scores": {
447 | "speedometer3": 11.9
448 | }
449 | },
450 | {
451 | "version": "6.9.3447.44",
452 | "scores": {
453 | "speedometer3": 12.47
454 | }
455 | },
456 | {
457 | "version": "6.8.3381.55",
458 | "scores": {
459 | "speedometer3": 13.03
460 | }
461 | }
462 | ]
463 | },
464 | {
465 | "name": "Waterfox",
466 | "engine": "Gecko",
467 | "versions": [
468 | {
469 | "version": "6.0.20",
470 | "scores": {
471 | "speedometer3": 8.56
472 | }
473 | },
474 | {
475 | "version": "6.0.19",
476 | "scores": {
477 | "speedometer3": 8.59
478 | }
479 | },
480 | {
481 | "version": "6.0.18",
482 | "scores": {
483 | "speedometer3": 8.56
484 | }
485 | }
486 | ]
487 | },
488 | {
489 | "name": "Yandex Browser",
490 | "engine": "Blink",
491 | "versions": [
492 | {
493 | "version": "24.10.1.616",
494 | "scores": {
495 | "speedometer3": 11.33
496 | }
497 | },
498 | {
499 | "version": "24.7.1.1144",
500 | "scores": {
501 | "speedometer3": 10.97
502 | }
503 | },
504 | {
505 | "version": "24.7.1.1116",
506 | "scores": {
507 | "speedometer3": 11.07
508 | }
509 | }
510 | ]
511 | },
512 | {
513 | "name": "Zen Browser",
514 | "engine": "Gecko",
515 | "versions": [
516 | {
517 | "version": "1.0.1-a.12",
518 | "scores": {
519 | "speedometer3": 11.97
520 | }
521 | },
522 | {
523 | "version": "1.0.0-a39",
524 | "scores": {
525 | "speedometer3": 11.87
526 | }
527 | },
528 | {
529 | "version": "1.0.0-a28",
530 | "scores": {
531 | "speedometer3": 11.5
532 | }
533 | }
534 | ]
535 | }
536 | ]
537 |
--------------------------------------------------------------------------------
/public/data/raw-data.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/data/raw-data.xlsx
--------------------------------------------------------------------------------
/public/data/windows.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Arc Browser",
4 | "engine": "Blink",
5 | "versions": [
6 | {
7 | "version": "1.59.0",
8 | "scores": {
9 | "speedometer3": 17.23
10 | }
11 | }
12 | ]
13 | },
14 | {
15 | "name": "Brave",
16 | "engine": "Blink",
17 | "versions": [
18 | {
19 | "version": "1.69.162",
20 | "scores": {
21 | "speedometer3": 16.83
22 | }
23 | }
24 | ]
25 | },
26 | {
27 | "name": "DuckDuckGo Browser",
28 | "engine": "Blink",
29 | "versions": [
30 | {
31 | "version": "1.105.0",
32 | "scores": {
33 | "speedometer3": 17.07
34 | }
35 | }
36 | ]
37 | },
38 | {
39 | "name": "Firefox",
40 | "engine": "Gecko",
41 | "versions": [
42 | {
43 | "version": "130.0",
44 | "scores": {
45 | "speedometer3": 16.33
46 | }
47 | }
48 | ]
49 | },
50 | {
51 | "name": "Firefox Developer Edition",
52 | "engine": "Gecko",
53 | "versions": [
54 | {
55 | "version": "131.0b4",
56 | "scores": {
57 | "speedometer3": 16.13
58 | }
59 | }
60 | ]
61 | },
62 | {
63 | "name": "Firefox Nightly",
64 | "engine": "Gecko",
65 | "versions": [
66 | {
67 | "version": "132.0a1",
68 | "scores": {
69 | "speedometer3": 15.97
70 | }
71 | }
72 | ]
73 | },
74 | {
75 | "name": "Floorp",
76 | "engine": "Gecko",
77 | "versions": [
78 | {
79 | "version": "11.18.1",
80 | "scores": {
81 | "speedometer3": 15.56
82 | }
83 | }
84 | ]
85 | },
86 | {
87 | "name": "Google Chrome",
88 | "engine": "Blink",
89 | "versions": [
90 | {
91 | "version": "128.0.6613.121",
92 | "scores": {
93 | "speedometer3": 18.57
94 | }
95 | }
96 | ]
97 | },
98 | {
99 | "name": "Google Chrome Canary",
100 | "engine": "Blink",
101 | "versions": [
102 | {
103 | "version": "130.0.6710.0",
104 | "scores": {
105 | "speedometer3": 18.03
106 | }
107 | }
108 | ]
109 | },
110 | {
111 | "name": "Librewolf",
112 | "engine": "Gecko",
113 | "versions": [
114 | {
115 | "version": "130.0-3",
116 | "scores": {
117 | "speedometer3": 11.03
118 | }
119 | }
120 | ]
121 | },
122 | {
123 | "name": "Microsoft Edge",
124 | "engine": "Blink",
125 | "versions": [
126 | {
127 | "version": "128.0.2739.67",
128 | "scores": {
129 | "speedometer3": 17.4
130 | }
131 | }
132 | ]
133 | },
134 | {
135 | "name": "Mullvad Browser",
136 | "engine": "Gecko",
137 | "versions": [
138 | {
139 | "version": "13.5.3",
140 | "scores": {
141 | "speedometer3": 6.54
142 | }
143 | }
144 | ]
145 | },
146 | {
147 | "name": "Opera",
148 | "engine": "Blink",
149 | "versions": [
150 | {
151 | "version": "113.0.5230.86",
152 | "scores": {
153 | "speedometer3": 17.8
154 | }
155 | }
156 | ]
157 | },
158 | {
159 | "name": "Opera GX",
160 | "engine": "Blink",
161 | "versions": [
162 | {
163 | "version": "113.0.5230.75",
164 | "scores": {
165 | "speedometer3": 17.53
166 | }
167 | }
168 | ]
169 | },
170 | {
171 | "name": "Tor Browser",
172 | "engine": "Gecko",
173 | "versions": [
174 | {
175 | "version": "13.5.3",
176 | "scores": {
177 | "speedometer3": 5.43
178 | }
179 | },
180 | {
181 | "version": "12.5.2",
182 | "scores": {
183 | "speedometer3": 5.48
184 | }
185 | }
186 | ]
187 | },
188 | {
189 | "name": "Vivaldi",
190 | "engine": "Blink",
191 | "versions": [
192 | {
193 | "version": "6.9.3447.44",
194 | "scores": {
195 | "speedometer3": 17.87
196 | }
197 | }
198 | ]
199 | },
200 | {
201 | "name": "Waterfox",
202 | "engine": "Gecko",
203 | "versions": [
204 | {
205 | "version": "6.0.19",
206 | "scores": {
207 | "speedometer3": 10.2
208 | }
209 | }
210 | ]
211 | },
212 | {
213 | "name": "Yandex Browser",
214 | "engine": "Blink",
215 | "versions": [
216 | {
217 | "version": "24.7.1.1144",
218 | "scores": {
219 | "speedometer3": 17.6
220 | }
221 | }
222 | ]
223 | },
224 | {
225 | "name": "Zen Browser",
226 | "engine": "Gecko",
227 | "versions": [
228 | {
229 | "version": "1.0.0-a39",
230 | "scores": {
231 | "speedometer3": 14.83
232 | }
233 | },
234 | {
235 | "version": "1.0.0-a28",
236 | "scores": {
237 | "speedometer3": 11.5
238 | }
239 | }
240 | ]
241 | }
242 | ]
243 |
--------------------------------------------------------------------------------
/public/images/BlueskyLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/BlueskyLogo.png
--------------------------------------------------------------------------------
/public/images/RedditLogo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/images/TelegramLogo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/public/images/TwitterLogo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/images/browser-logos/arc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/arc.png
--------------------------------------------------------------------------------
/public/images/browser-logos/brave.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/brave.png
--------------------------------------------------------------------------------
/public/images/browser-logos/bravebeta.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/bravebeta.webp
--------------------------------------------------------------------------------
/public/images/browser-logos/bravenightly.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/bravenightly.webp
--------------------------------------------------------------------------------
/public/images/browser-logos/chrome-canary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/chrome-canary.png
--------------------------------------------------------------------------------
/public/images/browser-logos/chrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/chrome.png
--------------------------------------------------------------------------------
/public/images/browser-logos/chromebeta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/chromebeta.png
--------------------------------------------------------------------------------
/public/images/browser-logos/chromedev.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/chromedev.webp
--------------------------------------------------------------------------------
/public/images/browser-logos/cromite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/cromite.png
--------------------------------------------------------------------------------
/public/images/browser-logos/ddg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/ddg.jpg
--------------------------------------------------------------------------------
/public/images/browser-logos/deta-surf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/deta-surf.png
--------------------------------------------------------------------------------
/public/images/browser-logos/dia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/dia.png
--------------------------------------------------------------------------------
/public/images/browser-logos/edge-beta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/edge-beta.png
--------------------------------------------------------------------------------
/public/images/browser-logos/edge-canary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/edge-canary.png
--------------------------------------------------------------------------------
/public/images/browser-logos/edge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/edge.png
--------------------------------------------------------------------------------
/public/images/browser-logos/firefox-beta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/firefox-beta.png
--------------------------------------------------------------------------------
/public/images/browser-logos/firefox-dev.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/firefox-dev.png
--------------------------------------------------------------------------------
/public/images/browser-logos/firefox-nightly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/firefox-nightly.png
--------------------------------------------------------------------------------
/public/images/browser-logos/firefox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/firefox.png
--------------------------------------------------------------------------------
/public/images/browser-logos/floorp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/floorp.png
--------------------------------------------------------------------------------
/public/images/browser-logos/ghostery.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/ghostery.png
--------------------------------------------------------------------------------
/public/images/browser-logos/iceraven.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/iceraven.png
--------------------------------------------------------------------------------
/public/images/browser-logos/kito.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/kito.png
--------------------------------------------------------------------------------
/public/images/browser-logos/kiwi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/kiwi.png
--------------------------------------------------------------------------------
/public/images/browser-logos/librewolf.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
19 |
21 |
45 |
47 |
48 |
50 | image/svg+xml
51 |
53 |
54 |
55 |
56 |
57 |
62 |
68 |
73 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/public/images/browser-logos/mull.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/mull.png
--------------------------------------------------------------------------------
/public/images/browser-logos/mullvad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/mullvad.png
--------------------------------------------------------------------------------
/public/images/browser-logos/opera-beta.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/opera-beta.webp
--------------------------------------------------------------------------------
/public/images/browser-logos/opera-gx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/opera-gx.png
--------------------------------------------------------------------------------
/public/images/browser-logos/opera-mini.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/opera-mini.png
--------------------------------------------------------------------------------
/public/images/browser-logos/opera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/opera.png
--------------------------------------------------------------------------------
/public/images/browser-logos/orion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/orion.png
--------------------------------------------------------------------------------
/public/images/browser-logos/quetta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/quetta.png
--------------------------------------------------------------------------------
/public/images/browser-logos/safari.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/safari.png
--------------------------------------------------------------------------------
/public/images/browser-logos/samsung-internet-beta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/samsung-internet-beta.png
--------------------------------------------------------------------------------
/public/images/browser-logos/samsung-internet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/samsung-internet.png
--------------------------------------------------------------------------------
/public/images/browser-logos/sigmaos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/sigmaos.png
--------------------------------------------------------------------------------
/public/images/browser-logos/soul.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/soul.png
--------------------------------------------------------------------------------
/public/images/browser-logos/strawberry.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/strawberry.jpeg
--------------------------------------------------------------------------------
/public/images/browser-logos/thorium.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/thorium.webp
--------------------------------------------------------------------------------
/public/images/browser-logos/tor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/tor.png
--------------------------------------------------------------------------------
/public/images/browser-logos/via.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/via.png
--------------------------------------------------------------------------------
/public/images/browser-logos/vivaldi-snapshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/vivaldi-snapshot.png
--------------------------------------------------------------------------------
/public/images/browser-logos/vivaldi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/vivaldi.png
--------------------------------------------------------------------------------
/public/images/browser-logos/waterfox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/waterfox.png
--------------------------------------------------------------------------------
/public/images/browser-logos/yandex-alpha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/yandex-alpha.png
--------------------------------------------------------------------------------
/public/images/browser-logos/yandex-beta.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/yandex-beta.webp
--------------------------------------------------------------------------------
/public/images/browser-logos/yandex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/yandex.png
--------------------------------------------------------------------------------
/public/images/browser-logos/zen-twilight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/browser-logos/zen-twilight.png
--------------------------------------------------------------------------------
/public/images/browser-logos/zen.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/public/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kawaiier/browserating/b1c8832955fc37f3eb02d5265663679276447690/public/images/logo.png
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | darkMode: "class",
4 | content: [
5 | "./pages/**/*.{js,ts,jsx,tsx,mdx}",
6 | "./components/**/*.{js,ts,jsx,tsx,mdx}",
7 | "./app/**/*.{js,ts,jsx,tsx,mdx}",
8 | ],
9 | theme: {
10 | extend: {
11 | backgroundImage: {
12 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
13 | "gradient-conic":
14 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
15 | },
16 | keyframes: {
17 | "fade-out": {
18 | "0%": { opacity: "1" },
19 | "75%": { opacity: "1" },
20 | "100%": { opacity: "0" },
21 | },
22 | "bounce-gentle": {
23 | "0%, 100%": {
24 | transform: "rotate(12deg) translateY(-5%)",
25 | animationTimingFunction: "cubic-bezier(0.8, 0, 1, 1)",
26 | },
27 | "50%": {
28 | transform: "rotate(12deg) translateY(0)",
29 | animationTimingFunction: "cubic-bezier(0, 0, 0.2, 1)",
30 | },
31 | },
32 | },
33 | animation: {
34 | "fade-out": "fade-out 2s ease-out forwards",
35 | "bounce-gentle": "bounce-gentle 2s infinite",
36 | },
37 | },
38 | },
39 | plugins: [],
40 | };
41 |
--------------------------------------------------------------------------------