Repository: PLhery/unfollowNinja Branch: master Commit: b10bfac49562 Files: 137 Total size: 329.4 KB Directory structure: gitextract_xza4tmml/ ├── .github/ │ └── workflows/ │ └── server-ci.yml ├── .gitignore ├── license.md ├── readme.md ├── unfollow-monkey-ui/ │ ├── .gitignore │ ├── package.json │ ├── public/ │ │ ├── _redirects │ │ ├── favicon/ │ │ │ └── site.webmanifest │ │ ├── index.html │ │ ├── manifest.json │ │ ├── privacy-policy.txt │ │ ├── robots.txt │ │ ├── sitemap.xml │ │ └── tos.txt │ └── src/ │ ├── App.js │ ├── components/ │ │ ├── Faq.js │ │ ├── Faq.module.scss │ │ ├── Link.js │ │ ├── MiniApp/ │ │ │ ├── LanguageSelector.js │ │ │ ├── LanguageSelector.module.scss │ │ │ ├── ProCard.js │ │ │ └── ProCard.module.scss │ │ ├── MiniApp.js │ │ ├── MiniApp.module.scss │ │ ├── Navbar.js │ │ ├── Navbar.module.scss │ │ ├── Repo.js │ │ ├── Repo.module.scss │ │ ├── Section.js │ │ ├── Section.module.scss │ │ └── index.js │ ├── images/ │ │ ├── flags/ │ │ │ └── index.js │ │ └── index.js │ ├── index.js │ ├── reportWebVitals.js │ ├── service-worker.js │ ├── serviceWorkerRegistration.js │ ├── style.scss │ └── twemojis/ │ ├── Emojis.js │ └── Emojis.module.scss ├── unfollow-ninja-server/ │ ├── .dockerignore │ ├── .eslintrc.json │ ├── .prettierignore │ ├── .prettierrc.json │ ├── Dockerfile │ ├── docker-compose.yml │ ├── jest.config.js │ ├── locales/ │ │ ├── ar.json │ │ ├── de.json │ │ ├── en.json │ │ ├── es.json │ │ ├── fr.json │ │ ├── hy.json │ │ ├── id.json │ │ ├── nl.json │ │ ├── pl.json │ │ ├── pt.json │ │ ├── pt_BR.json │ │ ├── ru.json │ │ ├── sk.json │ │ ├── th.json │ │ ├── tr.json │ │ ├── uk.json │ │ ├── zgh.json │ │ └── zh_Hans.json │ ├── package.json │ ├── pm2.yml │ ├── src/ │ │ ├── api/ │ │ │ ├── admin.ts │ │ │ ├── auth.ts │ │ │ ├── stripe.ts │ │ │ └── user.ts │ │ ├── api.ts │ │ ├── dao/ │ │ │ ├── dao.ts │ │ │ ├── userDao.ts │ │ │ └── userEventDao.ts │ │ ├── jobs/ │ │ │ ├── cleanUsersWithRevokedTokens.ts │ │ │ ├── deleteRedisSnowflakeIds.ts │ │ │ ├── emptyQueue.ts │ │ │ ├── migrateCachedUsernamesFromRedisToPostres.ts │ │ │ ├── migrateFollowersFromRedisToPostres.ts │ │ │ ├── resetCachedSnowflakeIds.ts │ │ │ ├── setUsersLanguage.ts │ │ │ └── twitExperiment.ts │ │ ├── tasks/ │ │ │ ├── index.ts │ │ │ ├── notifyUser.ts │ │ │ ├── reenableFollowers.ts │ │ │ ├── sendWelcomeMessage.ts │ │ │ ├── task.ts │ │ │ └── updateMetrics.ts │ │ ├── utils/ │ │ │ ├── logger.ts │ │ │ ├── metrics.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ ├── workers/ │ │ │ ├── cacheAllFollowers.ts │ │ │ └── checkAllFollowers.ts │ │ └── workers.ts │ ├── tests/ │ │ ├── dao/ │ │ │ ├── __snapshots__/ │ │ │ │ └── userDao.spec.ts.snap │ │ │ ├── dao.spec.ts │ │ │ ├── userDao.spec.ts │ │ │ └── userEventDao.spec.ts │ │ ├── docker-compose.yml │ │ ├── tasks/ │ │ │ ├── cacheFollowers.spec.ts.disabled │ │ │ ├── checkFollowers.spec.ts.disabled │ │ │ ├── notifyUser.spec.ts │ │ │ └── sendWelcomeMessage.spec.ts │ │ └── utils.ts │ ├── tsconfig-build.json │ └── tsconfig.json └── unfollow-ninja-ui/ ├── .gitignore ├── package.json ├── public/ │ ├── _redirects │ ├── favicon/ │ │ └── site.webmanifest │ ├── index.html │ ├── manifest.json │ ├── robots.txt │ └── sitemap.xml └── src/ ├── App.js ├── components/ │ ├── Faq.js │ ├── Faq.module.scss │ ├── Link.js │ ├── MiniApp.js │ ├── MiniApp.module.scss │ ├── Navbar.js │ ├── Navbar.module.scss │ ├── Repo.js │ ├── Repo.module.scss │ ├── Section.js │ ├── Section.module.scss │ └── index.js ├── images/ │ └── index.js ├── index.js ├── reportWebVitals.js ├── service-worker.js ├── serviceWorkerRegistration.js ├── style.scss └── twemojis/ ├── Emojis.js └── Emojis.module.scss ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/server-ci.yml ================================================ name: Server CI on: push jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [18.x] steps: - name: checkout uses: actions/checkout@v2 - name: Use node ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - name: cache npm modules uses: actions/cache@v1 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: npm ci working-directory: unfollow-ninja-server run: npm ci - name: lint working-directory: unfollow-ninja-server run: npm run lint - name: build working-directory: unfollow-ninja-server run: npm run build - name: test working-directory: unfollow-ninja-server run: npm run specs docker: runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v2 - name: create an empty env file working-directory: unfollow-ninja-server run: touch .env - name: build working-directory: unfollow-ninja-server/tests run: docker-compose build - name: run tests working-directory: unfollow-ninja-server/tests run: docker-compose up --exit-code-from tests ================================================ FILE: .gitignore ================================================ # Based on https://github.com/github/gitignore/blob/master/Node.gitignore # # Logs *.log *.log.gz npm-debug.log* yarn-debug.log* yarn-error.log* # Runtime data pids *.pid *.seed *.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # nyc test coverage .nyc_output # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) bower_components # node-waf configuration .lock-wscript # Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz # Yarn Integrity file .yarn-integrity # dotenv environment variables file .env # vuepress build output .vuepress/dist # Compiled typescript dist/ # intellij idea .idea/ # test reports test-results/ # osX .DS_Store ================================================ FILE: license.md ================================================ Copyright 2019 Paul-Louis Hery https://twitter.com/plhery Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: readme.md ================================================ # Unfollow Ninja [![Server CI status](https://github.com/PLhery/unfollowNinja/workflows/Server%20CI/badge.svg)](https://github.com/PLhery/unfollowNinja/actions?query=workflow%3A%22Server+CI%22) Get notified when your Twitter account loses a follower Used by ~500 000 Twitter users (11/2021) 🇬🇧 https://unfollow-monkey.com 🇫🇷 https://unfollow.ninja ![Screenshot](https://raw.githubusercontent.com/PLhery/unfollowNinja/master/unfollow-monkey-ui/public/preview.png) --- **[Deprecated] This app was built mostly on top of Twitter API V1.1, which is now deprecated.** Feel free to reuse the UI on a personal server, but please don't reuse the name/logo on a public instance. Indeed, this software is under apache v2 license which means: - You need to aknowledge the use of this software and its license somewhere - A modified version can't have the same name ## Build the UI - clone the repo `git clone git@github.com:PLhery/unfollowNinja.git` - `cd unfollowNinja/unfollow-monkey-ui` - change `api.unfollow-monkey.com` to you own server endpoints in ui/src/components/MiniApp.js - `npm install && npm start` to serve the UI in dev mode - `npm run build` to build the UI static files in the `build` folder. Then you can host it on github pages, amazon s3, netlify, your own nginx server... ## Launch the server with docker-compose - clone the repo `git clone git@github.com:PLhery/unfollowNinja.git` - `cd unfollowNinja/unfollow-ninja-server` - create a .env file (see [.env file](#.env-file)) - `docker-compose up --build` The server will be accessible on http://localhost:4000/ By default, the db files and logs are stored in /data subfolders. Feel free to edit these, and the port/address in `docker-compose.yml` ## Launch the server manually - clone the repo `git clone git@github.com:PLhery/unfollowNinja.git` - `cd unfollowNinja/unfollow-ninja-server` - install the dependencies and build the project `npm ci && npm build` - create a .env file (see [.env file](#.env-file)) - install redis and optionally set a custom REDIS_URI + REDIS_BULL_URI in .env - launch the workers `node ./dist/api/workers` - launch the api server `node ./dist/api` - or launch both in the as a daemon with pm2 `pm2 start pm2.yml` ## .env file To get started, you'll need to create one or two twitter app https://developer.twitter.com/en/apps: - One for the first step, which only need a read access, and a callback url = https://your-ui-url/1 - One for the second step, which needs a DM sending access, and a callback url = https://your-ui-url/2 - Both need to have sign in with twitter enabled Then you can create a .env in unfollow-ninja-server to set some parameters: ``` # your first step app API key and secret CONSUMER_KEY=xxx CONSUMER_SECRET=xxx # your second step app API key DM_CONSUMER_KEY=xxx DM_CONSUMER_SECRET=xxx # your second step app API secret key # Front-end URL (without any ending /) WEB_URL=https://unfollow.ninja # a secret key to sign cookies (ex. generate yours on https://password.new) COOKIE_SIGNING_KEY=Kg8hfQoGj9GHjdKjsYqPtk6ShJqaoP # optionally: # -- The twitter account quoted in the notifications (ex. welcome to @[TWITTER_ACCOUNT]!) TWITTER_ACCOUNT=unfollowninja # -- The timezone use for follow time. ex: Europe/Paris TIMEZONE=UTC # -- Default language for the notifications (for new users). DEFAULT_LANGUAGE=en # -- Number of workers, defaults to number of CPUs CLUSTER_SIZE=2 # -- Number of unique tasks managed at the same time, defaults to 15 WORKER_RATE_LIMIT=15 # -- When this twitter user is logged in, it has access to the /admin/user/[username] debug enpoint ADMIN_USERID= # -- Sentry (API) DSN, if you want to report workers (or API) errors on sentry SENTRY_DSN= SENTRY_DSN_API= # -- If you set these variables, the server will send some metrics to these statsd / datadog servers STATSD_HOST= DD_AGENT_HOST= # -- The metrics will start with this prefix (ex metric: [prefix].check-duration.worker.[cluster-nb]) METRICS_PREFIX=uninja ``` You can also set these parameters as environment variables. ## Contribute Open an issue with your suggestions or assign yourself to an existing issue ### Translate the app to your language You can help to translate the app on https://hosted.weblate.org/projects/unfollow-monkey/notifications/ Weblate will automatically open a PR to update or add the language in this repository. ## Motivation behind improving the legacy version Legacy version: https://github.com/PLhery/unfollowNinja/tree/legacy The legacy version couldn't scale and manage thousands of users, while still checking every 2 minutes the followers. Now, the program checks 100 000 users's followers in about 3 minutes with 12 cpus. - Based on a job queue for: - Monitoring: I can see how many jobs/sec are happening, their errors, and rate limit them. - Scalability: Everything was happening in one thread. Now the work is shared between 8 workers/vCPUs. - Atomicity: When the server restart, wait for every atomic job to finish instead of interrupting them. (causing messages not sent or sent twice) - Reliability: If a job fails, prepare better retry strategies. - Use Typescript to make code more bug-proof and clearer for contributors - Split the webserver from the worker: When the worker was busy, the webserver was slow because everything was happening in the same thread. - Use redis to store the list of followers as we need to read/write them really often/quickly - I18n - Use twitter's SnowFlake IDs to get the exact follow time - New UI # Licensing [License](./license.md) (Apache V2) UnfollowNinja uses multiple open-source projects: #### Twemoji Copyright 2020 Twitter, Inc and other contributors Code licensed under the MIT License: http://opensource.org/licenses/MIT Graphics licensed under CC-BY 4.0: https://creativecommons.org/licenses/by/4.0/ ================================================ FILE: unfollow-monkey-ui/.gitignore ================================================ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies /node_modules /.pnp .pnp.js # testing /coverage # production /build # misc .DS_Store .env.local .env.development.local .env.test.local .env.production.local npm-debug.log* yarn-debug.log* yarn-error.log* ================================================ FILE: unfollow-monkey-ui/package.json ================================================ { "name": "unfollow-ninja-ui", "version": "0.1.0", "private": true, "dependencies": { "@sentry/browser": "^7.3.0", "grommet": "^2.17.5", "grommet-icons": "^4.6.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-dom-confetti": "^0.2.0", "react-github-corner": "^2.5.0", "react-scripts": "^5.0.0", "react-snap": "^1.23.0", "sass": "^1.49.8", "styled-components": "^5.3.1", "web-vitals": "^2.1.0" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "postbuild": "react-snap", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">1%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } } ================================================ FILE: unfollow-monkey-ui/public/_redirects ================================================ /1 /index.html 200 /2 /index.html 200 ================================================ FILE: unfollow-monkey-ui/public/favicon/site.webmanifest ================================================ { "name": "Unfollow Monkey", "short_name": "Unfollow Monkey", "icons": [ { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ], "theme_color": "#b742a0", "background_color": "#ffffff", "display": "standalone" } ================================================ FILE: unfollow-monkey-ui/public/index.html ================================================ Unfollow Monkey
================================================ FILE: unfollow-monkey-ui/public/manifest.json ================================================ { "short_name": "Unfollow Monkey", "name": "Unfollow Monkey", "icons": [ { "src": "favicon.ico", "sizes": "64x64 32x32 24x24 16x16", "type": "image/x-icon" } ], "start_url": ".", "display": "standalone", "theme_color": "#b742a0", "background_color": "#ffffff" } ================================================ FILE: unfollow-monkey-ui/public/privacy-policy.txt ================================================ PRIVACY POLICY - UNFOLLOW MONKEY - https://unfollow-monkey.com -------------------------------------------------------------- Effective 12/12/2021 At Unfollow Monkey, we take privacy and security seriously. This Privacy Policy outlines how Unfollow Monkey (collectively, Unfollow Monkey,” “we,” “our,” or “us”) process the information we collect about you through our website and other online services (collectively, the “Services”) and when you otherwise interact with us, such as through our customer service channels. If you are a California resident, please also see the "CCPA PRIVACY RIGHTS" section below. 1. INFORMATION WE COLLECT AND HOW WE COLLECT IT Information You Provide ----------------------- We collect information you provide when you use our Services or otherwise engage or communicate with us as described below. Identity Data, such as your name, when you buy a subscription Contact Data, such as your email address, and mailing address, when you buy a subscription Profile Data, such as your Twitter profile and authentication token Additional Data You Provide, such as via survey responses, contests/sweepstakes, customer support, or other means. Information We Collect Automatically ----------------------- As is true of many digital platforms, we also collect certain information about you automatically when you use our Services, as described below. Usage Information. We collect information about your activity on our Services, which includes device identifiers (like IP address or mobile device identifiers), pages or features you use, time and date of access, and other similar usage information. Transactional Information. When you receive, submit, or complete a transaction via the Services, we collect information about the transaction, such as transaction amount, type and nature of the transaction, and time and date of the transaction. Information Collected Through Tracking Technologies. We and our service providers also use technologies, including cookies and web beacons, to automatically collect certain types of usage and device information when you use our Services or interact with our emails. The information collected through these technologies includes your IP address, browser type, Internet service provider, platform type, device type, operating system, date and time stamp, a unique device or account ID, usage information and other similar information. For information about how to disable cookies, please see the Your Controls section below. Information We Collect from Other Sources ----------------------- We also obtain information about you from other sources as described below. Connected Services. When you connect your account to Twitter, Twitter may send us information such as your profile information from that service. This information varies and is controlled by that service or as authorized by you via your privacy settings at that service. 2. HOW WE USE YOUR INFORMATION. We use the information we collect for purposes described below or as otherwise described to you at the point of collection: Maintain and provide the Services, including to process account applications, authenticate your identity, repair our Services, and handle billing and account management; Send you transactional or relationship information, including confirmations, invoices, technical notices, customer support responses, software updates, security alerts, support and administrative messages, and information about your transactions; Send you notifications about who stopped following you on Twitter Monitor and improve our Services, including analyzing usage, research and development; Help protect the safety and security of our Services, business, and users, such as to investigate and help prevent fraud or other unlawful activity; Protect or exercise our legal rights or defend against legal claims, including to enforce and carry out contracts and agreements; and Comply with applicable laws and legal obligations, such as compliance obligations associated with being a regulated broker-dealer. 3. DISCLOSURES OF INFORMATION. We are committed to maintaining your trust, and we want you to understand when and with whom we share information about you. We share information about you in the instances described below. Authorized third-party vendors and service providers. We share information about you with third-party vendors and service providers who perform services for us, such as mailing services, tax and accounting services, web hosting, customer support, and analytics services. Legal purposes. We disclose information about you if we believe that disclosure is in accordance with, or required by, any applicable law or legal process or to protect and defend the rights, interests, safety, and security of Unfollow Monkey, our users, or the public. With your consent. We share information about you for any other purposes disclosed to you with your consent. We share information with others in an aggregated or otherwise de-identified form that does not reasonably identify you. 4. THIRD-PARTY TRACKING We use third-party analytics services to better understand your online activity and serve you targeted advertisements. For example, we use Google Analytics and you can review the “How Google uses information from sites or apps that use our services” linked here: http://www.google.com/policies/privacy/partners/ for information about how Google processes the information it collects. These companies collect information about your use of our Services and other websites and online services over time through cookies, device identifiers, or other tracking technologies. The information collected includes your IP address, web browser, mobile network information, pages viewed, time spent, links clicked, and conversion information. We and our third-party partners use this information to, among other things, analyze and track data, and determine the popularity of content. 5. DO NOT TRACK. Some web browsers transmit “do-not-track” signals to websites. We currently don’t take action in response to these signals. 6. YOUR CONTROLS. Account profile. You may update certain account profile information by logging into your account. How to control your communications preferences. You can stop receiving promotional emails from us by clicking the “unsubscribe” link in those emails. We may still send you service-related or other non-promotional communications, such as account notifications, receipts, security notices and other transactional or relationship messages. Cookie controls. Many web browsers are set to accept cookies and similar tracking technologies by default. If you prefer, you can set your browser to delete or reject these technologies. If you choose to delete or reject these technologies, this could affect certain features of our Services. Furthermore, if you use a different device, change browsers, or delete the opt-out cookies that contain your preferences, you may need to perform the opt-out task again. 7. CCPA PRIVACY RIGHTS (Do Not Sell My Personal Information) Under the CCPA, among other rights, California consumers have the right to: Request that a business that collects a consumer's personal data disclose the categories and specific pieces of personal data that a business has collected about consumers. Request that a business delete any personal data about the consumer that a business has collected. Request that a business that sells a consumer's personal data, not sell the consumer's personal data. If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us. 8. GDPR DATA PROTECTION RIGHTS We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the following: The right to access – You have the right to request copies of your personal data. We may charge you a small fee for this service. The right to rectification – You have the right to request that we correct any information you believe is inaccurate. You also have the right to request that we complete the information you believe is incomplete. The right to erasure – You have the right to request that we erase your personal data, under certain conditions. The right to restrict processing – You have the right to request that we restrict the processing of your personal data, under certain conditions. The right to object to processing – You have the right to object to our processing of your personal data, under certain conditions. The right to data portability – You have the right to request that we transfer the data that we have collected to another organization, or directly to you, under certain conditions. If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us. 8. CHILDREN. We do not knowingly collect or solicit any information from anyone under the age of 13 on these Services. In the event we learn that we have inadvertently collected personal information from a child under age 13, we will take reasonable steps to delete that information. If you believe that we might have any information from a child under 13, please contact us at help (at) unfollow-monkey.com. 9. TRANSFER OF INFORMATION. Our Services are currently designed for use only in the United States. If you are using our Services from another jurisdiction, your information may be processed in the United States or other countries that may not provide levels of data protection that are equivalent to those of your home jurisdiction. 10. CHANGES TO THIS POLICY. This Privacy Policy will evolve with time, and when we update it, we will revise the "Effective Date" above and post the new Policy and, in some cases, we provide additional notice (such as adding a statement to our website or sending you a notification). To stay informed of our privacy practices, we recommend you review the Policy on a regular basis as you continue to use our Services. 11. HOW TO CONTACT US. If you have any questions about this Privacy Policy, please contact us at help (at) unfollow-monkey.com ================================================ FILE: unfollow-monkey-ui/public/robots.txt ================================================ User-agent: * Sitemap: https://unfollow-monkey.com/sitemap.xml ================================================ FILE: unfollow-monkey-ui/public/sitemap.xml ================================================ https://unfollow-monkey.com/ ================================================ FILE: unfollow-monkey-ui/public/tos.txt ================================================ TERMS OF SERVICE - UNFOLLOW MONKEY - https://unfollow-monkey.com -------------------------------------------------------------- Last updated 12/12/2021 FRENCH LEGAL TERMS L’édition et la direction de la publication du site https://unfollow-monkey.com/ est assurée par Paul-Louis HERY, domicilié au 30 rue de Chazelles, 75017 Paris, France. Numero de telephone: 0680489983 Adresse email: help (at) unfollow-monkey.com L'hébergeur du site https://unfollow-monkey.com/ est la société PulseHeberg, dont le siège social est situé au 55 AVENUE DES CHAMPS PIERREUX, 92000 NANTERRE, avec pour adresse email contact (at) pulseheberg.com. AGREEMENT TO TERMS These Terms of Service constitute a legally binding agreement made between you, whether personally or on behalf of an entity (“you”) and Unfollow Monkey (“we,” “us” or “our”), concerning your access to and use of the unfollow-monkey.com website as well as any other media form, media channel, mobile website or mobile application related, linked, or otherwise connected thereto (collectively, the “Site”). You agree that by accessing the Site, you have read, understood, and agree to be bound by all of these Terms of Service. If you do not agree with all of these Terms of Service, then you are expressly prohibited from using the Site and you must discontinue use immediately. Supplemental Terms of Service or documents that may be posted on the Site from time to time are hereby expressly incorporated herein by reference. We reserve the right, in our sole discretion, to make changes or modifications to these Terms of Service at any time and for any reason. We will alert you about any changes by updating the “Last updated” date of these Terms of Service, and you waive any right to receive specific notice of each such change. It is your responsibility to periodically review these Terms of Service to stay informed of updates. You will be subject to, and will be deemed to have been made aware of and to have accepted, the changes in any revised Terms of Service by your continued use of the Site after the date such revised Terms of Service are posted. The information provided on the Site is not intended for distribution to or use by any person or entity in any jurisdiction or country where such distribution or use would be contrary to law or regulation or which would subject us to any registration requirement within such jurisdiction or country. Accordingly, those persons who choose to access the Site from other locations do so on their own initiative and are solely responsible for compliance with local laws, if and to the extent local laws are applicable. These Terms of Service were generated by Termly’s Terms and Conditions Generator. The Site is intended for users who are at least 13 years of age. All users who are minors in the jurisdiction in which they reside (generally under the age of 18) must have the permission of, and be directly supervised by, their parent or guardian to use the Site. If you are a minor, you must have your parent or guardian read and agree to these Terms of Service prior to you using the Site. INTELLECTUAL PROPERTY RIGHTS Unless otherwise indicated, the Site is our proprietary property and all source code, databases, functionality, software, website designs, audio, video, text, photographs, and graphics on the Site (collectively, the “Content”) and the trademarks, service marks, and logos contained therein (the “Marks”) are owned or controlled by us or licensed to us, and are protected by copyright and trademark laws and various other intellectual property rights and unfair competition laws of the United States, foreign jurisdictions, and international conventions. The Content and the Marks are provided on the Site “AS IS” for your information and personal use only. Except as expressly provided in these Terms of Service, no part of the Site and no Content or Marks may be copied, reproduced, aggregated, republished, uploaded, posted, publicly displayed, encoded, translated, transmitted, distributed, sold, licensed, or otherwise exploited for any commercial purpose whatsoever, without our express prior written permission. Provided that you are eligible to use the Site, you are granted a limited license to access and use the Site and to download or print a copy of any portion of the Content to which you have properly gained access solely for your personal, non-commercial use. We reserve all rights not expressly granted to you in and to the Site, the Content and the Marks. USER REPRESENTATIONS By using the Site, you represent and warrant that: (1) all registration information you submit will be true, accurate, current, and complete; (2) you will maintain the accuracy of such information and promptly update such registration information as necessary; (3) you have the legal capacity and you agree to comply with these Terms of Service; (4) you are not under the age of 13; (5) not a minor in the jurisdiction in which you reside, or if a minor, you have received parental permission to use the Site; (6) you will not access the Site through automated or non-human means, whether through a bot, script, or otherwise; (7) you will not use the Site for any illegal or unauthorized purpose; (8) your use of the Site will not violate any applicable law or regulation. If you provide any information that is untrue, inaccurate, not current, or incomplete, we have the right to suspend or terminate your account and refuse any and all current or future use of the Site (or any portion thereof). USER REGISTRATION You may be required to register with the Site. You agree to keep your password confidential and will be responsible for all use of your account and password. We reserve the right to remove, reclaim, or change a username you select if we determine, in our sole discretion, that such username is inappropriate, obscene, or otherwise objectionable. PROHIBITED ACTIVITIES You may not access or use the Site for any purpose other than that for which we make the Site available. The Site may not be used in connection with any commercial endeavors except those that are specifically endorsed or approved by us. As a user of the Site, you agree not to: systematically retrieve data or other content from the Site to create or compile, directly or indirectly, a collection, compilation, database, or directory without written permission from us. make any unauthorized use of the Site, including collecting usernames and/or email addresses of users by electronic or other means for the purpose of sending unsolicited email, or creating user accounts by automated means or under false pretenses. use a buying agent or purchasing agent to make purchases on the Site. use the Site to advertise or offer to sell goods and services. circumvent, disable, or otherwise interfere with security-related features of the Site, including features that prevent or restrict the use or copying of any Content or enforce limitations on the use of the Site and/or the Content contained therein. engage in unauthorized framing of or linking to the Site. trick, defraud, or mislead us and other users, especially in any attempt to learn sensitive account information such as user passwords; make improper use of our support services or submit false reports of abuse or misconduct. engage in any automated use of the system, such as using scripts to send comments or messages, or using any data mining, robots, or similar data gathering and extraction tools. interfere with, disrupt, or create an undue burden on the Site or the networks or services connected to the Site. attempt to impersonate another user or person or use the username of another user. sell or otherwise transfer your profile. use any information obtained from the Site in order to harass, abuse, or harm another person. use the Site as part of any effort to compete with us or otherwise use the Site and/or the Content for any revenue-generating endeavor or commercial enterprise. decipher, decompile, disassemble, or reverse engineer any of the software comprising or in any way making up a part of the Site. attempt to bypass any measures of the Site designed to prevent or restrict access to the Site, or any portion of the Site. harass, annoy, intimidate, or threaten any of our employees or agents engaged in providing any portion of the Site to you. delete the copyright or other proprietary rights notice from any Content. copy or adapt the Site’s software, including but not limited to Flash, PHP, HTML, JavaScript, or other code. upload or transmit (or attempt to upload or to transmit) viruses, Trojan horses, or other material, including excessive use of capital letters and spamming (continuous posting of repetitive text), that interferes with any party’s uninterrupted use and enjoyment of the Site or modifies, impairs, disrupts, alters, or interferes with the use, features, functions, operation, or maintenance of the Site. upload or transmit (or attempt to upload or to transmit) any material that acts as a passive or active information collection or transmission mechanism, including without limitation, clear graphics interchange formats (“gifs”), 1×1 pixels, web bugs, cookies, or other similar devices (sometimes referred to as “spyware” or “passive collection mechanisms” or “pcms”). except as may be the result of standard search engine or Internet browser usage, use, launch, develop, or distribute any automated system, including without limitation, any spider, robot, cheat utility, scraper, or offline reader that accesses the Site, or using or launching any unauthorized script or other software. disparage, tarnish, or otherwise harm, in our opinion, us and/or the Site. use the Site in a manner inconsistent with any applicable laws or regulations. USER GENERATED CONTRIBUTIONS The Site may invite you to chat, contribute to, or participate in blogs, message boards, online forums, and other functionality, and may provide you with the opportunity to create, submit, post, display, transmit, perform, publish, distribute, or broadcast content and materials to us or on the Site, including but not limited to text, writings, video, audio, photographs, graphics, comments, suggestions, or personal information or other material (collectively, “Contributions”). Contributions may be viewable by other users of the Site and through third-party websites. As such, any Contributions you transmit may be treated as non-confidential and non-proprietary. When you create or make available any Contributions, you thereby represent and warrant that: the creation, distribution, transmission, public display, or performance, and the accessing, downloading, or copying of your Contributions do not and will not infringe the proprietary rights, including but not limited to the copyright, patent, trademark, trade secret, or moral rights of any third party. you are the creator and owner of or have the necessary licenses, rights, consents, releases, and permissions to use and to authorize us, the Site, and other users of the Site to use your Contributions in any manner contemplated by the Site and these Terms of Service. you have the written consent, release, and/or permission of each and every identifiable individual person in your Contributions to use the name or likeness of each and every such identifiable individual person to enable inclusion and use of your Contributions in any manner contemplated by the Site and these Terms of Service. your Contributions are not false, inaccurate, or misleading. your Contributions are not unsolicited or unauthorized advertising, promotional materials, pyramid schemes, chain letters, spam, mass mailings, or other forms of solicitation. your Contributions are not obscene, lewd, lascivious, filthy, violent, harassing, libelous, slanderous, or otherwise objectionable (as determined by us). your Contributions do not ridicule, mock, disparage, intimidate, or abuse anyone. your Contributions do not advocate the violent overthrow of any government or incite, encourage, or threaten physical harm against another. your Contributions do not violate any applicable law, regulation, or rule. your Contributions do not violate the privacy or publicity rights of any third party. your Contributions do not contain any material that solicits personal information from anyone under the age of 18 or exploits people under the age of 18 in a sexual or violent manner. your Contributions do not violate any federal or state law concerning child pornography, or otherwise intended to protect the health or well-being of minors; your Contributions do not include any offensive comments that are connected to race, national origin, gender, sexual preference, or physical handicap. your Contributions do not otherwise violate, or link to material that violates, any provision of these Terms of Service, or any applicable law or regulation. Any use of the Site in violation of the foregoing violates these Terms of Service and may result in, among other things, termination or suspension of your rights to use the Site. CONTRIBUTION LICENSE By posting your Contributions to any part of the Site, or making Contributions accessible to the Site by linking your account from the Site to any of your social networking accounts, you automatically grant, and you represent and warrant that you have the right to grant, to us an unrestricted, unlimited, irrevocable, perpetual, non-exclusive, transferable, royalty-free, fully-paid, worldwide right, and license to host, use, copy, reproduce, disclose, sell, resell, publish, broadcast, retitle, archive, store, cache, publicly perform, publicly display, reformat, translate, transmit, excerpt (in whole or in part), and distribute such Contributions (including, without limitation, your image and voice) for any purpose, commercial, advertising, or otherwise, and to prepare derivative works of, or incorporate into other works, such Contributions, and grant and authorize sublicenses of the foregoing. The use and distribution may occur in any media formats and through any media channels. This license will apply to any form, media, or technology now known or hereafter developed, and includes our use of your name, company name, and franchise name, as applicable, and any of the trademarks, service marks, trade names, logos, and personal and commercial images you provide. You waive all moral rights in your Contributions, and you warrant that moral rights have not otherwise been asserted in your Contributions. We do not assert any ownership over your Contributions. You retain full ownership of all of your Contributions and any intellectual property rights or other proprietary rights associated with your Contributions. We are not liable for any statements or representations in your Contributions provided by you in any area on the Site. You are solely responsible for your Contributions to the Site and you expressly agree to exonerate us from any and all responsibility and to refrain from any legal action against us regarding your Contributions. We have the right, in our sole and absolute discretion, (1) to edit, redact, or otherwise change any Contributions; (2) to re-categorize any Contributions to place them in more appropriate locations on the Site; and (3) to pre-screen or delete any Contributions at any time and for any reason, without notice. We have no obligation to monitor your Contributions. SOCIAL MEDIA As part of the functionality of the Site, you may link your account with online accounts you have with third-party service providers (each such account, a “Third-Party Account”) by either: (1) providing your Third-Party Account login information through the Site; or (2) allowing us to access your Third-Party Account, as is permitted under the applicable Terms of Service that govern your use of each Third-Party Account. You represent and warrant that you are entitled to disclose your Third-Party Account login information to us and/or grant us access to your Third-Party Account, without breach by you of any of the Terms of Service that govern your use of the applicable Third-Party Account, and without obligating us to pay any fees or making us subject to any usage limitations imposed by the third-party service provider of the Third-Party Account. By granting us access to any Third-Party Accounts, you understand that (1) we may access, make available, and store (if applicable) any content that you have provided to and stored in your Third-Party Account (the “Social Network Content”) so that it is available on and through the Site via your account, including without limitation any friend lists and (2) we may submit to and receive from your Third-Party Account additional information to the extent you are notified when you link your account with the Third-Party Account. Depending on the Third-Party Accounts you choose and subject to the privacy settings that you have set in such Third-Party Accounts, personally identifiable information that you post to your Third-Party Accounts may be available on and through your account on the Site. Please note that if a Third-Party Account or associated service becomes unavailable or our access to such Third-Party Account is terminated by the third-party service provider, then Social Network Content may no longer be available on and through the Site. You will have the ability to disable the connection between your account on the Site and your Third-Party Accounts at any time. PLEASE NOTE THAT YOUR RELATIONSHIP WITH THE THIRD-PARTY SERVICE PROVIDERS ASSOCIATED WITH YOUR THIRD-PARTY ACCOUNTS IS GOVERNED SOLELY BY YOUR AGREEMENT(S) WITH SUCH THIRD-PARTY SERVICE PROVIDERS. We make no effort to review any Social Network Content for any purpose, including but not limited to, for accuracy, legality, or non-infringement, and we are not responsible for any Social Network Content. You acknowledge and agree that we may access your email address book associated with a Third-Party Account and your contacts list stored on your mobile device or tablet computer solely for purposes of identifying and informing you of those contacts who have also registered to use the Site. You can deactivate the connection between the Site and your Third-Party Account by contacting us using the contact information below or through your account settings (if applicable). We will attempt to delete any information stored on our servers that was obtained through such Third-Party Account, except the username and profile picture that become associated with your account. SUBMISSIONS You acknowledge and agree that any questions, comments, suggestions, ideas, feedback, or other information regarding the Site (“Submissions”) provided by you to us are non-confidential and shall become our sole property. We shall own exclusive rights, including all intellectual property rights, and shall be entitled to the unrestricted use and dissemination of these Submissions for any lawful purpose, commercial or otherwise, without acknowledgment or compensation to you. You hereby waive all moral rights to any such Submissions, and you hereby warrant that any such Submissions are original with you or that you have the right to submit such Submissions. You agree there shall be no recourse against us for any alleged or actual infringement or misappropriation of any proprietary right in your Submissions. THIRD-PARTY WEBSITES AND CONTENT The Site may contain (or you may be sent via the Site) links to other websites (“Third-Party Websites”) as well as articles, photographs, text, graphics, pictures, designs, music, sound, video, information, applications, software, and other content or items belonging to or originating from third parties (“Third-Party Content”). Such Third-Party Websites and Third-Party Content are not investigated, monitored, or checked for accuracy, appropriateness, or completeness by us, and we are not responsible for any Third-Party Websites accessed through the Site or any Third-Party Content posted on, available through, or installed from the Site, including the content, accuracy, offensiveness, opinions, reliability, privacy practices, or other policies of or contained in the Third-Party Websites or the Third-Party Content. Inclusion of, linking to, or permitting the use or installation of any Third-Party Websites or any Third-Party Content does not imply approval or endorsement thereof by us. If you decide to leave the Site and access the Third-Party Websites or to use or install any Third-Party Content, you do so at your own risk, and you should be aware these Terms of Service no longer govern. You should review the applicable terms and policies, including privacy and data gathering practices, of any website to which you navigate from the Site or relating to any applications you use or install from the Site. Any purchases you make through Third-Party Websites will be through other websites and from other companies, and we take no responsibility whatsoever in relation to such purchases which are exclusively between you and the applicable third party. You agree and acknowledge that we do not endorse the products or services offered on Third-Party Websites and you shall hold us harmless from any harm caused by your purchase of such products or services. Additionally, you shall hold us harmless from any losses sustained by you or harm caused to you relating to or resulting in any way from any Third-Party Content or any contact with Third-Party Websites. SITE MANAGEMENT We reserve the right, but not the obligation, to: (1) monitor the Site for violations of these Terms of Service; (2) take appropriate legal action against anyone who, in our sole discretion, violates the law or these Terms of Service, including without limitation, reporting such user to law enforcement authorities; (3) in our sole discretion and without limitation, refuse, restrict access to, limit the availability of, or disable (to the extent technologically feasible) any of your Contributions or any portion thereof; (4) in our sole discretion and without limitation, notice, or liability, to remove from the Site or otherwise disable all files and content that are excessive in size or are in any way burdensome to our systems; (5) otherwise manage the Site in a manner designed to protect our rights and property and to facilitate the proper functioning of the Site. PRIVACY POLICY We care about data privacy and security. Please review our Privacy Policy https://unfollow-monkey.com/privacy-policy.txt. By using the Site, you agree to be bound by our Privacy Policy, which is incorporated into these Terms of Service. Please be advised the Site is hosted in France. If you access the Site from any region of the world with laws or other requirements governing personal data collection, use, or disclosure that differ from applicable laws in France, then through your continued use of the Site, you are transferring your data to France, and you expressly consent to have your data transferred to and processed in France. Further, we do not knowingly accept, request, or solicit information from children or knowingly market to children. Therefore, in accordance with the U.S. Children’s Online Privacy Protection Act, if we receive actual knowledge that anyone under the age of 13 has provided personal information to us without the requisite and verifiable parental consent, we will delete that information from the Site as quickly as is reasonably practical. COPYRIGHT INFRINGEMENTS We respect the intellectual property rights of others. If you believe that any material available on or through the Site infringes upon any copyright you own or control, please immediately notify us using the contact information provided below (a “Notification”). A copy of your Notification will be sent to the person who posted or stored the material addressed in the Notification. Please be advised that pursuant to federal law you may be held liable for damages if you make material misrepresentations in a Notification. Thus, if you are not sure that material located on or linked to by the Site infringes your copyright, you should consider first contacting an attorney. TERM AND TERMINATION These Terms of Service shall remain in full force and effect while you use the Site. WITHOUT LIMITING ANY OTHER PROVISION OF THESE TERMS OF SERVICE, WE RESERVE THE RIGHT TO, IN OUR SOLE DISCRETION AND WITHOUT NOTICE OR LIABILITY, DENY ACCESS TO AND USE OF THE SITE (INCLUDING BLOCKING CERTAIN IP ADDRESSES), TO ANY PERSON FOR ANY REASON OR FOR NO REASON, INCLUDING WITHOUT LIMITATION FOR BREACH OF ANY REPRESENTATION, WARRANTY, OR COVENANT CONTAINED IN THESE TERMS OF SERVICE OR OF ANY APPLICABLE LAW OR REGULATION. WE MAY TERMINATE YOUR USE OR PARTICIPATION IN THE SITE OR DELETE YOUR ACCOUNT AND ANY CONTENT OR INFORMATION THAT YOU POSTED AT ANY TIME, WITHOUT WARNING, IN OUR SOLE DISCRETION. If we terminate or suspend your account for any reason, you are prohibited from registering and creating a new account under your name, a fake or borrowed name, or the name of any third party, even if you may be acting on behalf of the third party. In addition to terminating or suspending your account, we reserve the right to take appropriate legal action, including without limitation pursuing civil, criminal, and injunctive redress. MODIFICATIONS AND INTERRUPTIONS We reserve the right to change, modify, or remove the contents of the Site at any time or for any reason at our sole discretion without notice. However, we have no obligation to update any information on our Site. We also reserve the right to modify or discontinue all or part of the Site without notice at any time. We will not be liable to you or any third party for any modification, price change, suspension, or discontinuance of the Site. We cannot guarantee the Site will be available at all times. We may experience hardware, software, or other problems or need to perform maintenance related to the Site, resulting in interruptions, delays, or errors. We reserve the right to change, revise, update, suspend, discontinue, or otherwise modify the Site at any time or for any reason without notice to you. You agree that we have no liability whatsoever for any loss, damage, or inconvenience caused by your inability to access or use the Site during any downtime or discontinuance of the Site. Nothing in these Terms of Service will be construed to obligate us to maintain and support the Site or to supply any corrections, updates, or releases in connection therewith. GOVERNING LAW These terms and conditions are governed by and construed in accordance with the laws of France and you irrevocably submit to the exclusive jurisdiction of the courts in that State or location. DISPUTE RESOLUTION Option 1: Any legal action of whatever nature brought by either you or us (collectively, the “Parties” and individually, a “Party”) shall be commenced or prosecuted in the courts located in France, and the Parties hereby consent to, and waive all defenses of lack of personal jurisdiction and forum non conveniens with respect to venue and jurisdiction in such state and federal courts. CORRECTIONS There may be information on the Site that contains typographical errors, inaccuracies, or omissions that may relate to the Site, including descriptions, pricing, availability, and various other information. We reserve the right to correct any errors, inaccuracies, or omissions and to change or update the information on the Site at any time, without prior notice. DISCLAIMER THE SITE IS PROVIDED ON AN AS-IS AND AS-AVAILABLE BASIS. YOU AGREE THAT YOUR USE OF THE SITE AND OUR SERVICES WILL BE AT YOUR SOLE RISK. TO THE FULLEST EXTENT PERMITTED BY LAW, WE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, IN CONNECTION WITH THE SITE AND YOUR USE THEREOF, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. WE MAKE NO WARRANTIES OR REPRESENTATIONS ABOUT THE ACCURACY OR COMPLETENESS OF THE SITE’S CONTENT OR THE CONTENT OF ANY WEBSITES LINKED TO THE SITE AND WE WILL ASSUME NO LIABILITY OR RESPONSIBILITY FOR ANY (1) ERRORS, MISTAKES, OR INACCURACIES OF CONTENT AND MATERIALS, (2) PERSONAL INJURY OR PROPERTY DAMAGE, OF ANY NATURE WHATSOEVER, RESULTING FROM YOUR ACCESS TO AND USE OF THE SITE, (3) ANY UNAUTHORIZED ACCESS TO OR USE OF OUR SECURE SERVERS AND/OR ANY AND ALL PERSONAL INFORMATION AND/OR FINANCIAL INFORMATION STORED THEREIN, (4) ANY INTERRUPTION OR CESSATION OF TRANSMISSION TO OR FROM THE SITE, (5) ANY BUGS, VIRUSES, TROJAN HORSES, OR THE LIKE WHICH MAY BE TRANSMITTED TO OR THROUGH THE SITE BY ANY THIRD PARTY, AND/OR (6) ANY ERRORS OR OMISSIONS IN ANY CONTENT AND MATERIALS OR FOR ANY LOSS OR DAMAGE OF ANY KIND INCURRED AS A RESULT OF THE USE OF ANY CONTENT POSTED, TRANSMITTED, OR OTHERWISE MADE AVAILABLE VIA THE SITE. WE DO NOT WARRANT, ENDORSE, GUARANTEE, OR ASSUME RESPONSIBILITY FOR ANY PRODUCT OR SERVICE ADVERTISED OR OFFERED BY A THIRD PARTY THROUGH THE SITE, ANY HYPERLINKED WEBSITE, OR ANY WEBSITE OR MOBILE APPLICATION FEATURED IN ANY BANNER OR OTHER ADVERTISING, AND WE WILL NOT BE A PARTY TO OR IN ANY WAY BE RESPONSIBLE FOR MONITORING ANY TRANSACTION BETWEEN YOU AND ANY THIRD-PARTY PROVIDERS OF PRODUCTS OR SERVICES. AS WITH THE PURCHASE OF A PRODUCT OR SERVICE THROUGH ANY MEDIUM OR IN ANY ENVIRONMENT, YOU SHOULD USE YOUR BEST JUDGMENT AND EXERCISE CAUTION WHERE APPROPRIATE. LIMITATIONS OF LIABILITY IN NO EVENT WILL WE BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, SPECIAL, OR PUNITIVE DAMAGES, INCLUDING LOST PROFIT, LOST REVENUE, LOSS OF DATA, OR OTHER DAMAGES ARISING FROM YOUR USE OF THE SITE, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IF THESE LAWS APPLY TO YOU, SOME OR ALL OF THE ABOVE DISCLAIMERS OR LIMITATIONS MAY NOT APPLY TO YOU, AND YOU MAY HAVE ADDITIONAL RIGHTS.] INDEMNIFICATION You agree to defend, indemnify, and hold us harmless, including our subsidiaries, affiliates, and all of our respective officers, agents, partners, and employees, from and against any loss, damage, liability, claim, or demand, including reasonable attorneys’ fees and expenses. Notwithstanding the foregoing, we reserve the right, at your expense, to assume the exclusive defense and control of any matter for which you are required to indemnify us, and you agree to cooperate, at your expense, with our defense of such claims. We will use reasonable efforts to notify you of any such claim, action, or proceeding which is subject to this indemnification upon becoming aware of it. USER DATA We will maintain certain data that you transmit to the Site for the purpose of managing the Site, as well as data relating to your use of the Site. Although we perform regular routine backups of data, you are solely responsible for all data that you transmit or that relates to any activity you have undertaken using the Site. You agree that we shall have no liability to you for any loss or corruption of any such data, and you hereby waive any right of action against us arising from any such loss or corruption of such data. ELECTRONIC COMMUNICATIONS, TRANSACTIONS, AND SIGNATURES Visiting the Site, sending us emails, and completing online forms constitute electronic communications. You consent to receive electronic communications, and you agree that all agreements, notices, disclosures, and other communications we provide to you electronically, via email and on the Site, satisfy any legal requirement that such communication be in writing. YOU HEREBY AGREE TO THE USE OF ELECTRONIC SIGNATURES, CONTRACTS, ORDERS, AND OTHER RECORDS, AND TO ELECTRONIC DELIVERY OF NOTICES, POLICIES, AND RECORDS OF TRANSACTIONS INITIATED OR COMPLETED BY US OR VIA THE SITE. You hereby waive any rights or requirements under any statutes, regulations, rules, ordinances, or other laws in any jurisdiction which require an original signature or delivery or retention of non-electronic records, or to payments or the granting of credits by any means other than electronic means. CALIFORNIA USERS AND RESIDENTS If any complaint with us is not satisfactorily resolved, you can contact the Complaint Assistance Unit of the Division of Consumer Services of the California Department of Consumer Affairs in writing at 1625 North Market Blvd., Suite N 112, Sacramento, California 95834 or by telephone at (800) 952-5210 or (916) 445-1254. MISCELLANEOUS These Terms of Service and any policies or operating rules posted by us on the Site constitute the entire agreement and understanding between you and us. Our failure to exercise or enforce any right or provision of these Terms of Service shall not operate as a waiver of such right or provision. These Terms of Service operate to the fullest extent permissible by law. We may assign any or all of our rights and obligations to others at any time. We shall not be responsible or liable for any loss, damage, delay, or failure to act caused by any cause beyond our reasonable control. If any provision or part of a provision of these Terms of Service is determined to be unlawful, void, or unenforceable, that provision or part of the provision is deemed severable from these Terms of Service and does not affect the validity and enforceability of any remaining provisions. There is no joint venture, partnership, employment or agency relationship created between you and us as a result of these Terms of Service or use of the Site. You agree that these Terms of Service will not be construed against us by virtue of having drafted them. You hereby waive any and all defenses you may have based on the electronic form of these Terms of Service and the lack of signing by the parties hereto to execute these Terms of Service. CONTACT US In order to resolve a complaint regarding the Site or to receive further information regarding use of the Site, please contact us at: help (at) unfollow-monkey.com ================================================ FILE: unfollow-monkey-ui/src/App.js ================================================ import React from 'react'; import './style.scss'; import {Box, Grommet, Heading, Image, Paragraph, Text} from 'grommet'; import GithubCorner from "react-github-corner"; import { Faq, Link, MiniApp, Navbar, Section, Repo } from "./components"; import * as Images from './images'; const theme = { global: { font: { family: 'Open Sans', }, colors: { doc: '#4c4e6e', dark: '#1a1b46', lightPink: '#ffeeed', brand: '#70B7FD', }, }, heading: { font: { family: 'Quicksand', }, weight: 700, }, paragraph: { large: { height: '32px', }, medium: { maxWidth: '800px', }, }, }; function App() { return (
Get notified when your Twitter account loses a follower Unfollow Monkey sends you a direct message as soon as a twitter user unfollows you, blocks you, or leave Twitter, within seconds.
Unfollow Monkey is free for everyone Unfollow Monkey is based on the open-source project unfollowNinja, hosted by PulseHeberg & OVHCloud startup program and maintained by @plhery. Thanks to PulseHeberg for helping the project to remain substainable, efficient, free, supporting 300 000+ users. They also provide great and affordable servers and web hosting solutions, if you'd like to have a look! UnfollowMonkey is powered by the twitter-api-v2 node library, by the same author.
© 2020 UnfollowMonkey · TOS · Privacy · Discover also UnfollowNinja Uzzy and Affinitweet · Made with ♥ by @plhery · Available on GitHub
); } export default App; ================================================ FILE: unfollow-monkey-ui/src/components/Faq.js ================================================ import React from 'react'; import { Box, Heading, Paragraph } from "grommet/es6"; import Emojis from '../twemojis/Emojis'; import Styles from './Faq.module.scss'; function Faq(props) { return Frequently Asked Questions A friend of mine unfollowed me, but I wasn't told To avoid disturbing you too often, several filters apply to the notifications sent. To be sure to get the notification, the person must have followed you for 24 hours and unfollow 20 minutes. Will you publish tweets without my consent? We will never publish a tweet without your agreement! Only the DM account gives permission to send tweets. This is due to the way Twitter permissions work: there are only 3 sets of permissions, and we can't ask permission to send DMs without permission to send tweets. You can create a separate Twitter account dedicated to sending these messages if you wish. Why does step 2 require so many permissions? As described above, this is due to the way Twitter permissions work: there are only 3 sets of permissions, and we can't request permission to send DMs without the others. We have never extracted these tokens to use them other than in this open-source application. You can create a separate Twitter account dedicated to sending these messages if you wish, for more serenity. A possibility of chrome notifications is under consideration :). What do the different messages and emojis mean? ; } export default Faq; ================================================ FILE: unfollow-monkey-ui/src/components/Faq.module.scss ================================================ .container { background-color: rgba(255, 255, 255, 0.5); p, ul { text-align: justify; } h3 { margin-bottom: 0; max-width: 630px; } ul { max-width: 760px; } } ================================================ FILE: unfollow-monkey-ui/src/components/Link.js ================================================ import React from 'react'; const Link = (props) => ( {props.children} ); export default Link; ================================================ FILE: unfollow-monkey-ui/src/components/MiniApp/LanguageSelector.js ================================================ import React from 'react'; import {Paragraph, Select} from "grommet"; import Styles from './LanguageSelector.module.scss'; import * as Flags from '../../images/flags' import Link from "../Link"; import { Link as IconLink } from 'grommet-icons'; function LanguageSelector(props) { const LANGUAGES = [ {label: 'Arabic', code: 'ar'}, {label: 'Chinese', code: 'zh_Hans'}, {label: 'Dutch', code: 'nl'}, {label: 'English', code: 'en'}, {label: 'French', code: 'fr'}, {label: 'German', code: 'de'}, {label: 'Indonesian', code: 'id'}, {label: 'Polish', code: 'pl'}, {label: 'Portuguese', code: 'pt'}, {label: 'Portug (br)', code: 'pt_BR'}, {label: 'Spanish', code: 'es'}, {label: 'Thai', code: 'th'}, {label: 'Turkish', code: 'tr'}, {label: 'Ukrainian', code: 'uk'}, {label: 'Tamazight', code: 'zgh'}, ]; const addYours = Add yours const options = LANGUAGES.map((lang) => {'flag-' {lang.label}); options.push(addYours); return Receive your notifications in: } export default LanguageSelector; ================================================ FILE: unfollow-monkey-ui/src/components/MiniApp/LanguageSelector.module.scss ================================================ .languageSelector { padding-left: 10px; } div[role=menubar] button:disabled { opacity: 0.8; a { svg { margin-left: 11px; margin-right: 5px; } text-decoration: none; font-weight: inherit!important; } } .element { display: flex; align-items: center; .flag { height: 17px; width: 23px; margin: 0 5px; box-shadow: rgb(204, 204, 204) 1px 1px 3px; } } ================================================ FILE: unfollow-monkey-ui/src/components/MiniApp/ProCard.js ================================================ import React, {useState} from 'react'; import {Card, Paragraph, TextInput} from "grommet"; import Styles from './ProCard.module.scss'; // import {applePay, googlePay, mastercard} from "../../images"; import { API_URL } from "../MiniApp"; import Link from "../Link"; function ProCard(props) { const { user, setUserInfo, setHasError } = props; const [isWrongCode, setIsWrongCode] = useState(false); const codeChanged = (event) => { const newCode = event.target.value; if (isWrongCode) { setIsWrongCode(false); } if (newCode.length !== 6) { return; } fetch(API_URL + '/user/registerFriendCode', { method: 'put', credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({code: newCode.toUpperCase()}) }) .then(response => { console.log(response); if (response.ok) { setUserInfo({ ...user, isPro: true, }); } else if (response.status === 404) { setIsWrongCode(true); } else { return Promise.reject(); } }) .catch((e) => { setHasError(true); }); window.$crisp?.push(['set', 'session:event', [[['tryCode', { code: newCode}]]]]); } if (user.isPro) { return Congratulations, you can now enjoy UMonkey pro
You will be notified in 30sec instead of 30min 🚀
{user.hasSubscription && Manage subscription}
{ user.friendCodes && <> You can also share these codes, thx to the friends plan: }
} else { return You currently receive your notifications in 1 hour
Become pro to be notified in 30 seconds!
(Not available right now) {/*Valid on 5 Twitter accounts - {user.priceTags.friends}/year 10 days trial - easily cancel online