├── .github └── FUNDING.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── SECURITY.md ├── bun.lockb ├── components.json ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── _redirects ├── favicon.ico ├── placeholder.svg └── robots.txt ├── src ├── App.css ├── App.tsx ├── app │ └── globals.css ├── components │ ├── BrakeChart.tsx │ ├── CircuitComparisonChart.tsx │ ├── DRSChart.tsx │ ├── DiscordCommunityBanner.tsx │ ├── DriverComparison.tsx │ ├── DriverComparisonTelemetry.tsx │ ├── F1Card.tsx │ ├── FeatureAnnouncementBanner.tsx │ ├── FloatingNavbar.tsx │ ├── Footer.tsx │ ├── GearMapChart.tsx │ ├── KeyMomentsHighlight.tsx │ ├── LandingFooter.tsx │ ├── MobileWarningBanner.tsx │ ├── Navbar.tsx │ ├── PositionChart.tsx │ ├── PositionsSummaryTable.tsx │ ├── PositionsTabContent.tsx │ ├── RPMChart.tsx │ ├── RacingChart.tsx │ ├── ScrollToTop.tsx │ ├── SpeedTraceChart.tsx │ ├── StintAnalysisTable.tsx │ ├── TeamPaceTable.tsx │ ├── ThrottleChart.tsx │ ├── TireStrategy.tsx │ ├── TrackEvolutionChart.tsx │ ├── TrackProgress.tsx │ └── ui │ │ ├── LoadingSpinnerF1.tsx │ │ ├── accordion.tsx │ │ ├── alert-dialog.tsx │ │ ├── alert.tsx │ │ ├── aspect-ratio.tsx │ │ ├── avatar.tsx │ │ ├── badge.tsx │ │ ├── breadcrumb.tsx │ │ ├── button.tsx │ │ ├── calendar.tsx │ │ ├── card.tsx │ │ ├── carousel.tsx │ │ ├── chart.tsx │ │ ├── checkbox.tsx │ │ ├── collapsible.tsx │ │ ├── command.tsx │ │ ├── context-menu.tsx │ │ ├── dialog.tsx │ │ ├── drawer.tsx │ │ ├── dropdown-menu.tsx │ │ ├── form.tsx │ │ ├── hover-card.tsx │ │ ├── input-otp.tsx │ │ ├── input.tsx │ │ ├── label.tsx │ │ ├── menubar.tsx │ │ ├── navigation-menu.tsx │ │ ├── pagination.tsx │ │ ├── popover.tsx │ │ ├── progress.tsx │ │ ├── radio-group.tsx │ │ ├── resizable.tsx │ │ ├── scroll-area.tsx │ │ ├── select.tsx │ │ ├── separator.tsx │ │ ├── sheet.tsx │ │ ├── sidebar.tsx │ │ ├── skeleton.tsx │ │ ├── slider.tsx │ │ ├── sonner.tsx │ │ ├── switch.tsx │ │ ├── table.tsx │ │ ├── tabs.tsx │ │ ├── textarea.tsx │ │ ├── toast.tsx │ │ ├── toaster.tsx │ │ ├── toggle-group.tsx │ │ ├── toggle.tsx │ │ ├── tooltip.tsx │ │ └── use-toast.ts ├── contexts │ ├── AuthContext.tsx │ └── SeasonContext.tsx ├── data │ └── mockData.ts ├── hooks │ ├── use-mobile.tsx │ └── use-toast.ts ├── index.css ├── lib │ ├── api.ts │ ├── driverColor.ts │ ├── teamUtils.ts │ └── utils.ts ├── main.tsx ├── pages │ ├── Dashboard.tsx │ ├── DriverDetailsPage.tsx │ ├── DriverStandings.tsx │ ├── FAQ.tsx │ ├── Landing.tsx │ ├── NotFound.tsx │ ├── PrivacyPolicy.tsx │ ├── Race.tsx │ ├── Races.tsx │ ├── TeamDetailsPage.tsx │ ├── TeamStandings.tsx │ └── TermsOfService.tsx ├── types.d.ts ├── utils │ └── donationPopupUtils.ts └── vite-env.d.ts ├── tailwind.config.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: subhashhhhhh # 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: fastlytics 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: subhashh 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 | # Vite / Build Output 13 | /dist 14 | /dist-ssr 15 | /.vite 16 | *.local 17 | 18 | # TypeScript 19 | *.tsbuildinfo 20 | 21 | # Logs 22 | logs 23 | *.log 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | pnpm-debug.log* 28 | lerna-debug.log* 29 | 30 | # Environment Variables 31 | .env* 32 | !.env.example 33 | 34 | # Editor directories and files 35 | .vscode/* 36 | !.vscode/extensions.json 37 | .idea 38 | *.suo 39 | *.ntvs* 40 | *.njsproj 41 | *.sln 42 | *.sw? 43 | 44 | # OS generated files 45 | .DS_Store 46 | Thumbs.db 47 | 48 | # Optional npm cache directory 49 | .npm 50 | 51 | # Optional eslint cache 52 | .eslintcache 53 | 54 | # Optional PNPM lockfile (if applicable, but usually committed) 55 | # pnpm-lock.yaml 56 | 57 | # Backend API Directory (Specific Rules) 58 | # Ignore the entire directory by default 59 | /backend-api/ 60 | # But DO NOT ignore a .gitignore file within it, allowing specific un-ignores 61 | !/backend-api/.gitignore 62 | # Ignore environment files within the backend directory 63 | /backend-api/.env* 64 | # Ignore Python cache/compiled files 65 | /backend-api/cache/ 66 | /backend-api/__pycache__/ 67 | /backend-api/*.pyc 68 | /.kilocode/ 69 | 70 | # Wiki documentation (not tracked in Git) 71 | WIKI.md 72 | SECURITY.md 73 | 74 | # Blog post about building Fastlytics 75 | building-fastlytics.md 76 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Subhash Gottumukkala 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🏎️ Fastlytics 2 | 3 | *A lightning-fast platform for Formula 1 fans to explore historical data, compare drivers, and simulate race strategies – no engineering degree required.* 4 | 5 | 6 | ## 🚀 Features 7 | 8 | ### 🏁 **Core Features** 9 | - **Lap Time Comparisons**: Compare drivers’ laps side-by-side (e.g., *Hamilton vs. Verstappen at Monaco*). 10 | - **Gear Shift Visualization**: See how drivers attack corners with animated gear shift maps. 11 | - **Tire Strategy Breakdowns**: Analyze pit stop efficiency and compound performance. 12 | - **Position Change Graphs**: Relive epic battles with lap-by-lap position swings. 13 | - **Track Evolution Analysis**: Watch how lap times drop as rubber builds up on the circuit. 14 | 15 | --- 16 | 17 | ## 🛠️ Tech Stack 18 | 19 | | **Category** | **Tools** | 20 | |---------------------|---------------------------------------------------------------------------| 21 | | **Frontend** | React, Tailwind CSS, shadcn/ui, Lucide React, Custom Charts | 22 | | **Backend** | Fast-F1 API, Supabase (Auth + PostgreSQL), Cloudflare R2 (Storage) | 23 | | **Infrastructure** | Docker, Oracle, Redis (Caching) | 24 | | **Misc** | Python (Data Processing), | 25 | 26 | --- 27 | 28 | ## ⚡ Quick Start 29 | 30 | ### Prerequisites 31 | 32 | - Node.js v18+ 33 | - Python 3.10+ 34 | - Docker (for local Supabase/PostgreSQL) 35 | 36 | ### Installation 37 | 38 | 1. Clone the repository: 39 | ```bash 40 | git clone https://github.com/subhashhhhhh/Fastlytics.git 41 | ``` 42 | 43 | 2. Install frontend dependencies: 44 | ```bash 45 | npm install 46 | ``` 47 | 48 | 3. Install backend dependencies: 49 | ```bash 50 | git clone https://github.com/subhashhhhhh/Fastlytics-Backend.git 51 | pip install -r requirements.txt 52 | ``` 53 | 54 | ### Environment Setup 55 | 56 | 1. Configure environment variables: 57 | ```bash 58 | cp .env.example .env 59 | ``` 60 | 61 | 2. Configure backend environment variables: 62 | ```bash 63 | cd backend-api 64 | cp .env.example .env 65 | ``` 66 | 67 | ## 🤝 Contributing 68 | **We welcome pit crew members!** 69 | 1. Fork the repository. 70 | 2. Create a branch: `git checkout -b feature/brazilian-gp-2023`. 71 | 3. Commit changes: `git commit -m "Added Hamilton’s magic telemetry"`. 72 | 4. Push: `git push origin feature/brazilian-gp-2023`. 73 | 5. Submit a PR. 74 | 75 | *No toxic rivalries allowed – this is a Ferrari/Mercedes/Red Bull neutral zone.* 🏳️ 76 | 77 | --- 78 | 79 | ## 📜 License 80 | MIT License – *Do whatever you want, but don’t blame us if your AI predicts Stroll as 2024 champion.* 81 | 82 | --- 83 | 84 | ## 🙏 Acknowledgments 85 | - **Fast-F1**: For the incredible Python library that makes this possible. 86 | - **Supabase**: For auth and database. 87 | - **You**: For not asking why we included the 2022 Ferrari strategy engine. 88 | 89 | --- 90 | 91 | *Built with ❤️ and excessive caffeine by Subhash Gottumukkala.* 92 | 93 | --- 94 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | I take the security of Fastlytics seriously. If you believe you've found a security vulnerability, please follow these steps: 6 | 7 | 1. **Do Not** disclose the vulnerability publicly on GitHub Issues or any public forum 8 | 2. Email me at [contact@fastlytics.app](mailto:contact@fastlytics.app) with details about the vulnerability 9 | 3. Include the following information in your report: 10 | - Description of the vulnerability 11 | - Steps to reproduce 12 | - Potential impact 13 | - Suggested fix (if any) 14 | 15 | ### Response Timeline 16 | 17 | - You will receive an acknowledgment of your report within 48 hours 18 | - I aim to validate and assess the severity of each report within 7 days 19 | - I will work on a fix based on severity: 20 | - Critical: 24-48 hours 21 | - High: 1 week 22 | - Medium: 2 weeks 23 | - Low: Next release cycle 24 | 25 | ### What to Expect 26 | 27 | - A timely response to your report 28 | - Regular updates on our progress addressing the issue 29 | - Credit for discovering the vulnerability (unless you request anonymity) 30 | - Notification when the vulnerability is fixed 31 | 32 | ## Security Best Practices 33 | 34 | ### For Developers 35 | 36 | 1. **API Keys**: Never commit API keys or other secrets to GitHub 37 | 2. **Authentication**: Use Supabase authentication as documented 38 | 3. **Data Handling**: Sanitize all user inputs, especially when processing custom race/driver data 39 | 4. **Dependencies**: Keep dependencies updated and regularly run security audits 40 | 41 | ### For Users 42 | 43 | 1. **Strong Passwords**: Use strong, unique passwords for your Fastlytics account 44 | 45 | ## Security Features 46 | 47 | Fastlytics employs several security measures: 48 | 49 | 1. **API Key Authentication**: Backend API endpoints are protected by API keys 50 | 2. **Authentication**: User authentication through Supabase 51 | 3. **Sanitized Inputs**: All user inputs are sanitized before processing 52 | 4. **Secure Data Storage**: Sensitive data is stored securely in Supabase/Cloudflare R2 53 | -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/subhashhhhhh/Fastlytics/ba7211c7c7701e66964c94ccadee1ec010e4a082/bun.lockb -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "src/index.css", 9 | "baseColor": "slate", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from "@eslint/js"; 2 | import globals from "globals"; 3 | import reactHooks from "eslint-plugin-react-hooks"; 4 | import reactRefresh from "eslint-plugin-react-refresh"; 5 | import tseslint from "typescript-eslint"; 6 | 7 | export default tseslint.config( 8 | { ignores: ["dist"] }, 9 | { 10 | extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 | files: ["**/*.{ts,tsx}"], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | }, 16 | plugins: { 17 | "react-hooks": reactHooks, 18 | "react-refresh": reactRefresh, 19 | }, 20 | rules: { 21 | ...reactHooks.configs.recommended.rules, 22 | "react-refresh/only-export-components": [ 23 | "warn", 24 | { allowConstantExport: true }, 25 | ], 26 | "@typescript-eslint/no-unused-vars": "off", 27 | }, 28 | } 29 | ); 30 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |Connect with other F1 fans, discuss races, share analysis, and get the latest updates from the Fastlytics team. We're building a community of passionate Formula 1 fans who love data.
35 | 36 |{message}
71 | {linkText && linkHref && ( 72 | 76 | {linkText}
68 |
{biggestGain.driver} gained {biggestGain.change} places
71 |Moved from P{biggestGain.from} to P{biggestGain.to} on Lap {biggestGain.lap}
72 |76 | No Significant Gains 77 |
78 |No driver gained more than 1 position in a single lap.
79 |
85 |
{biggestLoss.driver} lost {Math.abs(biggestLoss.change)} places
88 |Moved from P{biggestLoss.from} to P{biggestLoss.to} on Lap {biggestLoss.lap}
89 |93 | No Significant Losses 94 |
95 |No driver lost more than 1 position in a single lap.
96 |87 | For the best experience with charts and data visualizations, we recommend using a larger screen. 88 |
89 |No team pace data available for this session.
38 |161 | {body} 162 |
163 | ) 164 | }) 165 | FormMessage.displayName = "FormMessage" 166 | 167 | export { 168 | useFormField, 169 | Form, 170 | FormItem, 171 | FormLabel, 172 | FormControl, 173 | FormDescription, 174 | FormMessage, 175 | FormField, 176 | } 177 | -------------------------------------------------------------------------------- /src/components/ui/hover-card.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import * as HoverCardPrimitive from "@radix-ui/react-hover-card" 3 | 4 | import { cn } from "@/lib/utils" 5 | 6 | const HoverCard = HoverCardPrimitive.Root 7 | 8 | const HoverCardTrigger = HoverCardPrimitive.Trigger 9 | 10 | const HoverCardContent = React.forwardRef< 11 | React.ElementRef{driverDetails.nationality || 'N/A'}
72 | {/* Safely format date */} 73 |74 | Born: {driverDetails.dateOfBirth ? new Date(driverDetails.dateOfBirth).toLocaleDateString() : 'N/A'} 75 |
76 |{driverDetails.bio}
84 |{driverDetails.careerStats.wins ?? '-'}
93 |Wins
94 |{driverDetails.careerStats.podiums ?? '-'}
97 |Podiums
98 |{driverDetails.careerStats.poles ?? '-'}
101 |Pole Positions
102 |{driverDetails.careerStats.championships ?? '-'}
105 |Championships
106 |32 | The page you're looking for doesn't exist or has been moved. 33 | This section of the track is under construction. 34 |
35 | 36 |Last updated: {new Date().toLocaleDateString()}
27 | 28 |30 | Welcome to Fastlytics ("we", "us", "our"). We are committed to protecting your personal information and your right to privacy. If you have any questions or concerns about this privacy notice, or our practices with regards to your personal information, please contact us. 31 |
32 | 33 |35 | We collect personal information that you voluntarily provide to us when you register on the application, express an interest in obtaining information about us or our products and services, when you participate in activities on the application or otherwise when you contact us. 36 |
37 |38 | The personal information that we collect depends on the context of your interactions with us and the application, the choices you make and the products and features you use. The personal information we collect may include the following: email address, username, password (hashed). 39 |
40 |41 | We do not process sensitive information. 42 |
43 | 44 |46 | We use personal information collected via our application for a variety of business purposes described below. We process your personal information for these purposes in reliance on our legitimate business interests, in order to enter into or perform a contract with you, with your consent, and/or for compliance with our legal obligations. We indicate the specific processing grounds we rely on next to each purpose listed below. 47 |
48 |58 | We only share information with your consent, to comply with laws, to provide you with services, to protect your rights, or to fulfill business obligations. We do not sell your personal information. 59 |
60 |61 | We may need to share your information with third-party vendors, service providers, contractors or agents who perform services for us or on our behalf and require access to such information to do that work (e.g., Supabase for authentication and database hosting). 62 |
63 | 64 |66 | We will only keep your personal information for as long as it is necessary for the purposes set out in this privacy notice, unless a longer retention period is required or permitted by law (such as tax, accounting or other legal requirements). 67 |
68 | 69 |71 | We have implemented appropriate technical and organizational security measures designed to protect the security of any personal information we process. However, despite our safeguards and efforts to secure your information, no electronic transmission over the Internet or information storage technology can be guaranteed to be 100% secure. 72 |
73 | 74 |76 | We do not knowingly solicit data from or market to children under 18 years of age. 77 |
78 | 79 |81 | You may review, change, or terminate your account at any time by logging into your account and updating your profile or by contacting us using the contact information provided. 82 |
83 | 84 |86 | We may update this privacy notice from time to time. The updated version will be indicated by an updated "Last updated" date and the updated version will be effective as soon as it is accessible. 87 |
88 | 89 |91 | If you have questions or comments about this notice, you may email us at contact@fastlytics.app 92 |
93 | 94 |{teamDetails.nationality || 'N/A'}
76 |Base: {teamDetails.base || 'N/A'}
77 |First Entry: {teamDetails.firstEntry || 'N/A'}
78 |{teamDetails.bio}
86 |{teamDetails.careerStats.wins ?? '-'}
95 |Wins
96 |{teamDetails.careerStats.podiums ?? '-'}
99 |Podiums
100 |{teamDetails.careerStats.poles ?? '-'}
103 |Pole Positions
104 |{teamDetails.careerStats.constructorsChampionships ?? '-'}
107 |Constructors' Titles
108 |{teamDetails.careerStats.driversChampionships ?? '-'}
111 |Drivers' Titles
112 |Last updated: {new Date().toLocaleDateString()}
27 | 28 |30 | By using Fastlytics (the "Service"), you agree to be bound by these Terms of Service ("Terms"). If you disagree with any part of the terms, then you do not have permission to access the Service. 31 |
32 | 33 |35 | When you create an account with us, you guarantee that the information you provide us is accurate, complete, and current at all times. Inaccurate, incomplete, or obsolete information may result in the immediate termination of your account on the Service. You are responsible for maintaining the confidentiality of your account and password. 36 |
37 | 38 |40 | The Service and its original content (excluding Content provided by users), features and functionality are and will remain the exclusive property of Fastlytics and its licensors. The Service is protected by copyright, trademark, and other laws of both the [Your Country] and foreign countries. Our trademarks and trade dress may not be used in connection with any product or service without the prior written consent of Fastlytics. 41 |
42 |43 | Formula 1 related data is sourced from publicly available APIs (e.g., FastF1 library) and is subject to their respective terms and conditions. Fastlytics is not affiliated with Formula One group companies. F1, FORMULA ONE, FORMULA 1, FIA FORMULA ONE WORLD CHAMPIONSHIP, GRAND PRIX and related marks are trade marks of Formula One Licensing B.V. 44 |
45 | 46 |48 | Our Service may allow you to post, link, store, share and otherwise make available certain information, text, graphics, videos, or other material ("Content"). You are responsible for the Content that you post on or through the Service, including its legality, reliability, and appropriateness. 49 |
50 | 51 |53 | You may use the Service only for lawful purposes and in accordance with Terms. You agree not to use the Service in any way that violates any applicable national or international law or regulation. 54 |
55 | 56 |58 | We may terminate or suspend your account and bar access to the Service immediately, without prior notice or liability, under our sole discretion, for any reason whatsoever and without limitation, including but not limited to a breach of the Terms. 59 |
60 | 61 |63 | In no event shall Fastlytics, nor its directors, employees, partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from your access to or use of or inability to access or use the Service. 64 |
65 | 66 |68 | Your use of the Service is at your sole risk. The Service is provided on an "AS IS" and "AS AVAILABLE" basis. The Service is provided without warranties of any kind, whether express or implied, including, but not limited to, implied warranties of merchantability, fitness for a particular purpose, non-infringement or course of performance. Data accuracy is dependent on upstream sources and is not guaranteed. 69 |
70 | 71 |73 | These Terms shall be governed and construed in accordance with the laws of India, without regard to its conflict of law provisions. 74 |
75 | 76 |78 | We reserve the right, at our sole discretion, to modify or replace these Terms at any time. We will provide notice of any changes by posting the new Terms of Service on this page. 79 |
80 | 81 |83 | If you have any questions about these Terms, please contact us at contact@fastlytics.app 84 |
85 |