{"id":14981157,"url":"https://github.com/towhidkashem/snapchat-clone","last_synced_at":"2025-04-12T15:40:42.377Z","repository":{"id":38403034,"uuid":"259488034","full_name":"TowhidKashem/snapchat-clone","owner":"TowhidKashem","description":"👻 A Snapchat clone built with React and Redux. Written in Typescript. Styled with SASS. Tested with Cypress, Jest and Enzyme. Linted with Eslint and formatted with Prettier!","archived":false,"fork":false,"pushed_at":"2022-10-29T15:45:38.000Z","size":495255,"stargazers_count":1104,"open_issues_count":2,"forks_count":253,"subscribers_count":24,"default_branch":"master","last_synced_at":"2025-04-03T16:12:14.425Z","etag":null,"topics":["augementedreality","camera","clone","cypress","face-filters","front-end","front-end-development","frontend","javascript","jest","react","react-demo-app","react-demo-project","redux","sass","side-project","snapchat","storybook","threejs","typescript"],"latest_commit_sha":null,"homepage":"https://towhidkashem.github.io/snapchat-clone/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TowhidKashem.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-28T00:19:35.000Z","updated_at":"2025-03-30T04:40:55.000Z","dependencies_parsed_at":"2023-01-19T16:15:35.563Z","dependency_job_id":null,"html_url":"https://github.com/TowhidKashem/snapchat-clone","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TowhidKashem%2Fsnapchat-clone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TowhidKashem%2Fsnapchat-clone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TowhidKashem%2Fsnapchat-clone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TowhidKashem%2Fsnapchat-clone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TowhidKashem","download_url":"https://codeload.github.com/TowhidKashem/snapchat-clone/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248590771,"owners_count":21129887,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["augementedreality","camera","clone","cypress","face-filters","front-end","front-end-development","frontend","javascript","jest","react","react-demo-app","react-demo-project","redux","sass","side-project","snapchat","storybook","threejs","typescript"],"created_at":"2024-09-24T14:03:02.143Z","updated_at":"2025-04-12T15:40:37.366Z","avatar_url":"https://github.com/TowhidKashem.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e👻 Snapchat Clone\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./public/readme/tech-logos/react.svg\" width=\"55\" alt=\"React\" /\u003e\n  \u003cimg src=\"./public/readme/tech-logos/redux.svg\" width=\"55\" alt=\"Redux\" /\u003e\n  \u003cimg\n    src=\"./public/readme/tech-logos/typescript.svg\"\n    width=\"55\"\n    alt=\"TypeScript\"\n  /\u003e\n  \u003cimg\n    src=\"./public/readme/tech-logos/javascript.svg\"\n    width=\"55\"\n    alt=\"JavaScript\"\n  /\u003e\n  \u003cimg src=\"./public/readme/tech-logos/sass.svg\" width=\"55\" alt=\"Sass\" /\u003e\n  \u003cimg src=\"./public/readme/tech-logos/webpack.svg\" width=\"55\" alt=\"Webpack\" /\u003e\n  \u003cimg src=\"./public/readme/tech-logos/gulp.svg\" width=\"35\" alt=\"gulp\" /\u003e\n  \u003cimg src=\"./public/readme/tech-logos/cypress.svg\" width=\"55\" alt=\"Cypress\" /\u003e\n  \u003cimg src=\"./public/readme/tech-logos/jest.svg\" width=\"55\" alt=\"Jest\" /\u003e\n  \u003cimg src=\"./public/readme/tech-logos/eslint.svg\" width=\"55\" alt=\"Eslint\" /\u003e\n  \u003cimg\n    src=\"./public/readme/tech-logos/prettier.svg\"\n    width=\"55\"\n    alt=\"Prettier\"\n  /\u003e\n  \u003cimg\n    src=\"./public/readme/tech-logos/storybook.svg\"\n    width=\"50\"\n    alt=\"Storybook\"\n  /\u003e\n\u003c/div\u003e\n\n\u003ch2 align=\"center\"\u003e\n  \u003ca href=\"https://towhidkashem.github.io/snapchat-clone/\"\u003e[LIVE APP]\u003c/a\u003e\n\u003c/h2\u003e\n\n\u003cimg src=\"public/readme/filters.gif\" alt=\"Preview\" /\u003e\n\n\u003ch3 align=\"center\"\u003e\n  \u003ca href=\"https://towhidkashem.github.io/snapchat-clone/\"\u003e[Live App]\u003c/a\u003e\n  \u0026nbsp;\u0026bull;\u0026nbsp;\n  \u003ca href=\"https://www.youtube.com/embed/aRS88v-duKg?autoplay=1\"\u003e[Video Demo]\u003c/a\u003e\n\u003c/h3\u003e\n\n\u003ch2\u003e⚡️Breakdown\u003c/h2\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n    Built with \u003ccode\u003eReact\u003c/code\u003e\n    \u003cul\u003e\n      \u003cli\u003eOnly functional components using hooks\u003c/li\u003e\n      \u003cli\u003e\n        Folder structure:\n        \u003cul\u003e\n          \u003cli\u003eFlat - no greater than one level deep\u003c/li\u003e\n          \u003cli\u003e\n            Modular - each folder contains all the relevant files needed to make\n            up a particular feature (components, styles, tests, actions, etc).\n            Having everything close at hand reduces cognitive load and deleting\n            a folder removes the feature entirely from the code base without\n            having to worry about left over code\n          \u003c/li\u003e\n          \u003cli\u003e\n            Organized semantically by Feature (not by the traditional\n            \"components/containers\" model), this way of reasoning is more human\n            friendly\n          \u003c/li\u003e\n          \u003cli\u003e\u003ccode\u003ecomponents\u003c/code\u003e directory houses all shared components\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/li\u003e\n      \u003cli\u003eCustom component library showcased in \u003ccode\u003eStorybook\u003c/code\u003e\u003c/li\u003e\n      \u003cli\u003eRelatively few prod dependencies\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    Global state management via \u003ccode\u003eRedux\u003c/code\u003e\n    \u003cul\u003e\n      \u003cli\u003e\n        Uses \u003ccode\u003eRedux Toolkit\u003c/code\u003e - the official recommended\n        approach to using Redux which drastically cuts the need to write\n        boilerplate code\n      \u003c/li\u003e\n      \u003cli\u003e\n        A single \u003ccode\u003estore.ts\u003c/code\u003e file for each feature contains all actions and\n        reducers (the creators are auto generated by RTK)\n      \u003c/li\u003e\n      \u003cli\u003eFlat state tree avoids deeply nested properties\u003c/li\u003e\n      \u003cli\u003e\n        RTK has built-in support for \u003ccode\u003eImmerJS\u003c/code\u003e which allows state to\n        be safely mutated removing the need for messy object copying via spread\n        operators\n      \u003c/li\u003e\n      \u003cli\u003e\n        Uses the \u003ccode\u003euseDispatch\u003c/code\u003e and \u003ccode\u003euseSelector\u003c/code\u003e hooks\n        provided by \u003ccode\u003ereact-redux\u003c/code\u003e for accessing state values and\n        dispatching actions over the more verbose \u003ccode\u003econnect\u003c/code\u003e method\n      \u003c/li\u003e\n      \u003cli\u003eUses \u003ccode\u003ethunk\u003c/code\u003e for async operations\u003c/li\u003e\n      \u003cli\u003e\n        Integrates the powerful\n        \u003ccode\u003eRedux Devtools Extension\u003c/code\u003e for ease of development\n      \u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    Styled with \u003ccode\u003eSASS\u003c/code\u003e\n    \u003cul\u003e\n      \u003cli\u003e\n        Each view's set of rules are scoped to a single parent element via\n        nesting to avoid style clashes\n      \u003c/li\u003e\n      \u003cli\u003e\n        Use of variables, extendables and mixins to keep things DRY and uniform\n      \u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    Written in \u003ccode\u003eTypescript\u003c/code\u003e\n    \u003cul\u003e\n      \u003cli\u003e\n        To let the compiler catch bugs at build time instead of letting users\n        catch them at runtime!\n      \u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003eUnit tested with \u003ccode\u003eJest\u003c/code\u003e and \u003ccode\u003eEnzyme\u003c/code\u003e\u003c/li\u003e\n  \u003cli\u003e\n    End-to-end tested with \u003ccode\u003eCypress\u003c/code\u003e\n    \u003cul\u003e\n      \u003cli\u003e\n        Selectors use \u003ccode\u003edata\u003c/code\u003e attributes instead of classes or ids as\n        these can change often causing tests to break\n      \u003c/li\u003e\n      \u003cli\u003e\n        Integration suite covers all essential feature happy paths\n      \u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003eLinted using \u003ccode\u003eEslint\u003c/code\u003e\u003c/li\u003e\n  \u003cli\u003e\n    Code is auto formatted using \u003ccode\u003ePrettier\u003c/code\u003e (ran as a pre-commit git\n    hook) before it gets pushed to the repo\n  \u003c/li\u003e\n  \u003cli\u003e\n    Feels close to a native app if you \"add to homescreen\" on mobile\n  \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e💿 Installation\u003c/h2\u003e\n\n\u003cp\u003eRun these commands in the terminal:\u003c/p\u003e\n\n\u003col\u003e\n  \u003cli\u003e\n    \u003ccode\u003e$ git clone git@github.com:TowhidKashem/snapchat-clone.git\u003c/code\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\u003ccode\u003e$ cd snapchat-clone\u003c/code\u003e\u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003e$ npm install\u003c/code\u003e\n    \u003cul\u003e\n      \u003cli\u003e\n        This will:\n        \u003cul\u003e\n          \u003cli\u003eInstall the dependencies in package.json\u003c/li\u003e\n          \u003cli\u003e\n            Checkout\n            \u003ca href=\"https://github.com/jeeliz/jeelizFaceFilter\"\u003ejeelizFaceFilter\u003c/a\u003e\n            package (used for the filters) and set it to the last version this\n            project was tested and confirmed to work with\n          \u003c/li\u003e\n          \u003cli\u003e\n            Run \u003ccode\u003egulp\u003c/code\u003e to concatenate, minify and transpile the files\n            located in \u003ccode\u003epublic/filters/source/*.js\u003c/code\u003e into a single\n            file called \u003ccode\u003efilters.min.js\u003c/code\u003e\n          \u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    This part is optional but strongly recommended, without it you won't be able\n    to view any of the snap map features:\n    \u003cul\u003e\n      \u003cli\u003e\n        Make a Mapbox account and\n        \u003ca\n          href=\"https://docs.mapbox.com/help/glossary/access-token/\"\n          target=\"_blank\"\n          \u003eget a free API key\u003c/a\n        \u003e\n      \u003c/li\u003e\n      \u003cli\u003e\n        In the \u003ccode\u003e.env\u003c/code\u003e file enter your new API key, for example:\n        \u003cul\u003e\n          \u003cli\u003e\n            Before:\n            \u003ccode\u003eREACT_APP_MAP_BOX_API_KEY=REPLACE_WITH_API_KEY\u003c/code\u003e\n          \u003c/li\u003e\n          \u003cli\u003eAfter: \u003ccode\u003eREACT_APP_MAP_BOX_API_KEY=xy.abc123\u003c/code\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003e$ npm start\u003c/code\u003e\n    \u003cul\u003e\n      \u003cli\u003e\n        The app should open automatically in your browser usually at\n        \u003ccode\u003ehttps://localhost:3000/\u003c/code\u003e\n        \u003cul\u003e\n          \u003cli\u003e\n            In Chrome you will receive a \"Your connection is not private\"\n            warning\n            \u003cul\u003e\n              \u003cli\u003e\n                Click \"Advanced\" \u0026gt; \"Proceed to localhost (unsafe)\"\n                \u003cul\u003e\n                  \u003cli\u003e\n                    You'll get this warning because the app uses a self signed\n                    \u003ccode\u003ehttps\u003c/code\u003e certificate. The\n                    \u003ccode\u003egetUserMedia\u003c/code\u003e API used by the camera requires\n                    the \u003ccode\u003ehttps\u003c/code\u003e protocol so we run the dev server in\n                    https mode.\n                  \u003c/li\u003e\n                \u003c/ul\u003e\n              \u003c/li\u003e\n            \u003c/ul\u003e\n          \u003c/li\u003e\n          \u003cli\u003e\n            After this you will be prompted to give access to your webcam, click\n            \"Allow\"\n          \u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cbr /\u003e\n    \u003ctable\u003e\n      \u003ctbody\u003e\n        \u003ctr\u003e\n          \u003cth align=\"center\"\u003e\n            Step 1\n          \u003c/th\u003e\n          \u003cth align=\"center\"\u003e\n            Step 2\n          \u003c/th\u003e\n          \u003cth align=\"center\"\u003e\n            Step 3\n          \u003c/th\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n          \u003ctd align=\"center\" valign=\"middle\"\u003e\n            \u003cimg src=\"public/readme/step1.png\" /\u003e\n          \u003c/td\u003e\n          \u003ctd align=\"center\" valign=\"middle\"\u003e\n            \u003cimg src=\"public/readme/step2.png\" /\u003e\n          \u003c/td\u003e\n          \u003ctd align=\"center\" valign=\"middle\"\u003e\n            \u003cimg src=\"public/readme/camera.png\" /\u003e\n          \u003c/td\u003e\n        \u003c/tr\u003e\n      \u003c/tbody\u003e\n    \u003c/table\u003e\n  \u003c/li\u003e\n  \u003cli\u003eYou're all set! 🎉\u003c/li\u003e\n\u003c/ol\u003e\n\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth colspan=\"2\" align=\"left\"\u003e\n        \u003ch2\u003e🦮 Guides\u003c/h2\u003e\n      \u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\"\u003e\n        \u003cimg src=\"public/readme/guide.png\" /\u003e\n      \u003c/td\u003e\n      \u003ctd valign=\"top\"\u003e\n        Not all the buttons are actionable, many of them are there just for show\n        since this is a minimal demo. This\n        \u003ca\n          href=\"https://www.youtube.com/embed/aRS88v-duKg?autoplay=1\"\n          target=\"_blank\"\n          \u003evideo\u003c/a\n        \u003e\n        shows all the things you can currently do. Where it's not obvious which\n        buttons actually work I added red box-shadows as guides.\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth colspan=\"2\" align=\"left\"\u003e\n        \u003ch2\u003e🛠 Tooling\u003c/h2\u003e\n      \u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd valign=\"top\"\u003e\n        \u003cimg src=\"public/readme/storybook.png\" /\u003e\n        \u003cp\u003e\n          \u003cstrong\u003eStorybook\u003c/strong\u003e is used to showcase the app's custom\n          component library. You can run Storybook using the command\n          \u003ccode\u003enpm run storybook\u003c/code\u003e\n        \u003c/p\u003e\n      \u003c/td\u003e\n      \u003ctd valign=\"top\"\u003e\n        \u003cimg src=\"public/readme/redux-ext.png\" /\u003e\n        \u003cp\u003e\n          \u003cstrong\u003eRedux Devtools Extension\u003c/strong\u003e is implemented in the app,\n          it makes things like viewing the state tree, state flow and debugging\n          much easier, to use it you need to install the browser extension\n          \u003ca\n            href=\"https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en\"\n            \u003ehere\u003c/a\n          \u003e\n          or\n          \u003ca\n            href=\"https://addons.mozilla.org/en-US/firefox/addon/reduxdevtools/\"\n            \u003ehere\u003c/a\n          \u003e\n        \u003c/p\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003ch2\u003e🧪 Testing\u003c/h2\u003e\n\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth colspan=\"2\" align=\"left\"\u003e\n        \u003cstrong\u003eEnd-to-End Tests\u003c/strong\u003e\n      \u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\"\u003e\n        \u003ca href=\"https://www.youtube.com/embed/tNrx6NlTYKI?autoplay=1\"\u003e\n          \u003cimg src=\"public/readme/cypress.png\" width=\"600\" /\u003e\n        \u003c/a\u003e\n        \u003cp\u003e👆Click to see all tests run\u003c/p\u003e\n      \u003c/td\u003e\n      \u003ctd valign=\"top\"\u003e\n        \u003cul\u003e\n          \u003cli\u003e\n            All e2e tests are located in\n            \u003ccode\u003ecypress/integration/*.spec.ts\u003c/code\u003e\n            \u003cul\u003e\n              \u003cli\u003e\n                To run these first make sure the dev server is up and running\n                via \u003ccode\u003enpm start\u003c/code\u003e, then use the command\n                \u003ccode\u003enpm run e2e\u003c/code\u003e\n              \u003c/li\u003e\n              \u003cli\u003e\n                This will open the Cypress electron app. Click \"Run all specs\"\n                at the top right, you'll then get a Chrome instance and see all\n                the tests being run\n              \u003c/li\u003e\n            \u003c/ul\u003e\n          \u003c/li\u003e\n          \u003cli\u003e\n            Alternatively you can run the test suite in the terminal using the\n            command \u003ccode\u003enpm run e2e-headless\u003c/code\u003e. This command still\n            generates videos in \u003ccode\u003ecypress/videos/*.mp4\u003c/code\u003e of the tests\n            should you need them\n          \u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth colspan=\"2\" align=\"left\"\u003e\n        \u003cstrong\u003eUnit Tests\u003c/strong\u003e\n      \u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd valign=\"top\"\u003e\n        \u003cimg src=\"public/readme/unit.png\" width=\"400\" /\u003e\n      \u003c/td\u003e\n      \u003ctd valign=\"top\"\u003e\n        \u003cul\u003e\n          \u003cli\u003e\n            All the shared components in the \u003ccode\u003ecomponents\u003c/code\u003e directory have\n            unit tests inside their respective folders. They end with a\n            \u003ccode\u003e*.test.tsx\u003c/code\u003e extension.\n          \u003c/li\u003e\n          \u003cli\u003e\n            To run the unit test suite use the command\n            \u003ccode\u003enpm run test\u003c/code\u003e\n          \u003c/li\u003e\n          \u003cli\u003e\n            These tests are also automatically run on each commit, if there are\n            any failures the commit will also fail\n          \u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003ch2\u003e📝 Misc Notes\u003c/h2\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n    If you want to make changes to the filter files located in\n    \u003ccode\u003epublic/filters/src/*.js\u003c/code\u003e, run the command\n    \u003ccode\u003enpm run gulp watchJS\u003c/code\u003e so that your changes get picked up\n  \u003c/li\u003e\n  \u003cli\u003e\n    The project's \u003ccode\u003ebaseUrl\u003c/code\u003e is set to the \u003ccode\u003esrc\u003c/code\u003e directory\n    in tsconfig so you can use clean import paths like\n    \u003ccode\u003eimport Foo from 'components/Foo';\u003c/code\u003e instead of messy ones like\n    \u003ccode\u003eimport Foo from '../../components/Foo';\u003c/code\u003e. You can also use these in\n    the SASS files, e.g. \u003ccode\u003e@import '~styles/foo';\u003c/code\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    This is a purely front end demo, the \"API\" is nothing but a bunch of json\n    files with hard coded dummy data, they're located in\n    \u003ccode\u003e/public/api/*.json\u003c/code\u003e\n  \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e⚠️ Contributing\u003c/h2\u003e\n\n\u003cp\u003e\n  Please note I won't be accepting PR's on this project since it's part of my\n  personal portfolio. You're more than welcome to fork and maintain your own\n  version if you like!\n\u003c/p\u003e\n\n\u003ch2\u003e⚖️ License\u003c/h2\u003e\n\n\u003cp\u003e\n  The Snapchat name, artwork, trademark are all property of Snap Inc. This\n  project is provided for educational purposes only. It is not affiliated with\n  and has not been approved by Snap Inc.\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftowhidkashem%2Fsnapchat-clone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftowhidkashem%2Fsnapchat-clone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftowhidkashem%2Fsnapchat-clone/lists"}