{"id":46906989,"url":"https://github.com/hack4impact-uiuc/life-after-hate","last_synced_at":"2026-03-11T01:23:07.839Z","repository":{"id":35185230,"uuid":"211001888","full_name":"hack4impact-uiuc/life-after-hate","owner":"hack4impact-uiuc","description":"An intuitive resource map to aid nonprofit Life After Hate staff in finding resources for individuals attempting to disengage from hate groups.","archived":false,"fork":false,"pushed_at":"2024-05-03T11:40:25.000Z","size":17752,"stargazers_count":15,"open_issues_count":27,"forks_count":0,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-05-03T15:30:57.221Z","etag":null,"topics":["cypress","full-stack","hack4impact","mongodb","nonprofit","nonprofit-organizations","react","uiuc"],"latest_commit_sha":null,"homepage":"https://www.lifeafterhate.org/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hack4impact-uiuc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-26T04:47:45.000Z","updated_at":"2024-03-03T17:50:28.000Z","dependencies_parsed_at":"2024-04-19T12:28:16.606Z","dependency_job_id":"9e58ac2a-8328-4c37-b111-27e2233c067d","html_url":"https://github.com/hack4impact-uiuc/life-after-hate","commit_stats":{"total_commits":852,"total_committers":15,"mean_commits":56.8,"dds":"0.24530516431924887","last_synced_commit":"9cad8555b52ff6bd98c7d15fae456e2f8b7a2a8a"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hack4impact-uiuc/life-after-hate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hack4impact-uiuc%2Flife-after-hate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hack4impact-uiuc%2Flife-after-hate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hack4impact-uiuc%2Flife-after-hate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hack4impact-uiuc%2Flife-after-hate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hack4impact-uiuc","download_url":"https://codeload.github.com/hack4impact-uiuc/life-after-hate/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hack4impact-uiuc%2Flife-after-hate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30365790,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"ssl_error","status_checked_at":"2026-03-10T21:40:59.357Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cypress","full-stack","hack4impact","mongodb","nonprofit","nonprofit-organizations","react","uiuc"],"created_at":"2026-03-11T01:23:07.043Z","updated_at":"2026-03-11T01:23:07.822Z","avatar_url":"https://github.com/hack4impact-uiuc.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cbr /\u003e\n  \u003ca href=\"https://www.lifeafterhate.org/\"\n    \u003e\u003cimg\n      src=\"https://upload.wikimedia.org/wikipedia/commons/f/f5/Life_After_Hate_logo.png\"\n      alt=\"Life After Hate\"\n      width=\"200\"\n  /\u003e\u003c/a\u003e\n  \u003cbr /\u003e\n  Life After Hate\n  \u003cbr /\u003e\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003e\n  A\n  \u003ca href=\"https://uiuc.hack4impact.org/\" target=\"_blank\"\u003eHack4Impact UIUC\u003c/a\u003e\n  project.\n\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca\n    href=\"https://github.com/hack4impact-uiuc/life-after-hate/actions?query=branch%3Amaster\"\n    \u003e\u003cimg\n      src=\"https://github.com/hack4impact-uiuc/life-after-hate/workflows/Testing/badge.svg\"\n  /\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/hack4impact-uiuc/life-after-hate\"\n    \u003e\u003cimg\n      src=\"https://codecov.io/gh/hack4impact-uiuc/life-after-hate/branch/master/graph/badge.svg\"\n  /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# About This Project\n\n_\"Each year, more than 250,000 people in the United States are victims of hate crimes. The vast majority are violent and more than half go unreported. Between 2008 and 2017, 71 percent of extremist-related fatalities in the U.S. were committed by members of the far right or white-supremacist movements. LAH helps people leave the violent far-right to connect with humanity and lead compassionate lives.\"_\n\n\\- Life After Hate\n\nWhen helping people leave hate groups, LAH staff members need to sift through their resources located on many different platforms: Excel, email, paper, and more. These resources can be either businesses or organizations that will support ex-hate group members willing to change.\n\nThis time sunk looking for resources is time not spent helping people exit hate groups, limiting LAH's reach as an organization. This bottleneck in the support process can also take up to days to complete. By automating and organizing the search process, we can speed up the process of matching resources to formers. We wanted to create a highly-secure, easily searchable, centralized web application to host and manage these resources. This way, we can enable LAH to spend more time serving people and accomplish their mission on a larger scale.\n\nTo learn more details about the project, please view the official [case study](https://www.evaneckels.com/work/life-after-hate).\n\n# Team\n\n\u003ctable align=\"center\"\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/alan-fang/\"\n        \u003e\u003cimg\n          src=\"./assets/team/alan.jpeg\"\n          width=\"75px;\"\n          alt=\"Alan Fang\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eAlan Fang\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eProduct Manager\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://joshbyster.com\"\n        \u003e\u003cimg\n          src=\"./assets/team/joshbyster.jpeg\"\n          width=\"75px;\"\n          alt=\"Josh Byster\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eJosh Byster\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eTechnical Lead\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.evaneckels.com\"\n        \u003e\u003cimg\n          src=\"./assets/team/evan.png\"\n          width=\"75px;\"\n          alt=\"Evan Eckels\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eEvan Eckels\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eProduct Designer\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/alicesf2/\"\n        \u003e\u003cimg\n          src=\"./assets/team/alice.jpeg\"\n          width=\"75px;\"\n          alt=\"Alice Fang\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eAlice Fang\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/rebeccaxun/\"\n        \u003e\u003cimg\n          src=\"./assets/team/rebecca.jpeg\"\n          width=\"75px;\"\n          alt=\"Rebecca Xun\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eRebecca Xun\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/laurenho025\"\n        \u003e\u003cimg\n          src=\"./assets/team/lauren.jpeg\"\n          width=\"75px;\"\n          alt=\"Lauren Ho\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eLauren Ho\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/genewang0/\"\n        \u003e\u003cimg\n          src=\"./assets/team/gene.jpeg\"\n          width=\"75px;\"\n          alt=\"Gene Wang\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eGene Wang\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/albertcao00/\"\n        \u003e\u003cimg\n          src=\"./assets/team/albert.jpg\"\n          width=\"75px;\"\n          alt=\"Albert Cao\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eAlbert Cao\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/eugenia-chen-3aa251131/\"\n        \u003e\u003cimg\n          src=\"./assets/team/eugenia.jpg\"\n          width=\"75px;\"\n          alt=\"Eugenia Chen\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eEugenia Chen\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/angad-garg/\"\n        \u003e\u003cimg\n          src=\"./assets/team/angad.jpeg\"\n          width=\"75px;\"\n          alt=\"Angad Garg\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eAngad Garg\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/aryn/\"\n        \u003e\u003cimg\n          src=\"./assets/team/aryn.jpg\"\n          width=\"75px;\"\n          alt=\"Aryn Harmon\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eAryn Harmon\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://www.linkedin.com/in/josh-burke/\"\n        \u003e\u003cimg\n          src=\"./assets/team/joshburke.jpg\"\n          width=\"75px;\"\n          alt=\"Josh Burke\"\n        /\u003e\u003cbr /\u003e\u003cb\u003eJosh Burke\u003c/b\u003e\u003c/a\n      \u003e\u003cbr /\u003e\u003csub\u003eSoftware Developer\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n# Setup Instructions\n\n## Prerequisites\n\nTo run this project locally, please first install [Docker](https://www.docker.com/) on your machine. We use Docker to allow for a more seamless development experience, allowing us to get up and running with just a few commands.\n\nYou must have [Git](https://git-scm.com/) installed as well, along with [Node.js](https://nodejs.org/en/) to use the helper utility.\n\n## Cloning the repository\n\nTo get a copy of the code to run, please [clone this repository](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository).\n\nIn your terminal:\n\n```\ngit clone https://github.com/hack4impact-uiuc/life-after-hate\n```\n\n## Creating the `.env` file\n\nTo run this app, we use external integrations with Google OAuth, Mapbox, and MapQuest. Hence, you will need to create a file named `.env` in your root directory with the below template, and provide values for the specified API keys below. Feel free to set `SESSION_SECRET` to any arbitrary string.\nThe keys may be obtained from the following sources:\n\n- [Mapbox](https://docs.mapbox.com/help/how-mapbox-works/access-tokens/)\n- [Google OAuth](https://developers.google.com/identity/protocols/oauth2)\n- [MapQuest](https://developer.mapquest.com/)\n\n```\nGOOGLE_CLIENT_ID=\nGOOGLE_CLIENT_SECRET=\nREACT_APP_MAPBOX_ACCESS_TOKEN=\nSESSION_SECRET=\nMAPQUEST_KEY=\nREACT_APP_API_URI=http://localhost:5000/api/\nFE_URI=http://localhost:3000/\nDB_URI=mongodb://db:27017/LAH_DB\nOAUTH_CALLBACK_URI=http://localhost:5000/api/auth/login/redirectURI\nMAPQUEST_URI=http://www.mapquestapi.com/geocoding/v1/\n```\n\n## Setting up `LAHUtil`\n\nYou may have trouble running the below commands on a Windows machine. If this is the case, please reach out to us for support.\n\nThis project comes bundled with an executable to help ease development located at `scripts/lahutil`. It wraps around the Docker Compose commands, so if you are familiar with those, you can skip this step and run the commands directly. Once you have completed the above step with your `.env` file, please `cd` into this repository and run the following commands in your root directory:\n\n```\nnpm install\nsudo chmod +x ./scripts/lahutil\n./scripts/lahutil\n```\n\nYou should be presented now with a menu of options at this point.\n\nOptional: you may add `lahutil` to your `PATH` environment variable to allow you to run commands directly, so instead of running `./scripts/lahutil up`, you can just run `lahutil up`.\n\nYou can add the following to your `~/.bashrc` (or `~/.zshrc` if you are using `zsh`):\n\n```\nexport PATH=~/Documents/life-after-hate/scripts:$PATH\n```\n\n## Running the app\n\nTo add mock data to the database, run the following command:\n\n```\n./scripts/lahutil seed\n```\n\nTo bypass authentication, run the following:\n\n```\n./scripts/lahutil up --admin\n```\n\nAlternatively, to run without authentication bypass (i.e. requiring you to log in), instead run:\n\n```\n./scripts/lahutil up\n```\n\nThe above may take a few minutes to run, as it will download all the appropriate packages to run the entire application.\n\nAfter this, you should be able to navigate to `localhost:3000` in a web browser to access the app. Similarly, the backend will run at `localhost:5000`. These ports are configurable within the `.env` file. If you do so, however, make sure to change the corresponding ports in `docker-compose.yml`.\n\nWhen you are finished running, you can run `lahutil down`.\n\n## Running manually without `LAHUtil`\n\nYou can instead run the following commands instead if you are running into difficulties with the above steps:\n\nTo seed the database with sample data:\n\n```bash\ndocker-compose run backend /bin/bash -c \"node utils/generate_mock_data.js\"\n```\n\nTo run the app bypassing authentication:\n\n```bash\nBYPASS_AUTH_ROLE=admin docker-compose up\n```\n\nWithout authentication bypass:\n\n```bash\ndocker-compose up\n```\n\n# Credits\n\nWe want to give credit to the following open source packages (non-exhaustive list):\n\nFrontend packages:\n\n- [React](https://reactjs.org/) for creating the single page application\n- [Redux](https://redux.js.org/) for state management\n- [DeckGL](https://deck.gl/#/) for rendering resources on a map\n- [MapboxGL](https://www.mapbox.com/) for providing the main map view\n\nBackend packages:\n\n- [Express](https://expressjs.com/) for the API layer\n- [Mongoose](https://mongoosejs.com/) for interactions with MongoDB\n- [Passport](http://www.passportjs.org/) for authentication\n- [Joi](https://github.com/hapijs/joi) for schema validation\n- [Fuse](https://fusejs.io/) for fuzzy searching\n- [Ramda](https://ramdajs.com/) for functional programming utilities\n\nTesting:\n\n- [Cypress](https://www.cypress.io/) for E2E testing\n- [Mocha](https://mochajs.org/) for backend testing\n\n# License\n\nCopyright 2020 Hack4Impact UIUC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---\n\n\u003e [lifeafterhate.org](https://www.lifeafterhate.org) \u0026nbsp;\u0026middot;\u0026nbsp;\n\u003e GitHub [@hack4impact-uiuc](https://github.com/hack4impact-uiuc/) \u0026nbsp;\u0026middot;\u0026nbsp;\n\u003e Website [uiuc.hack4impact.org](https://uiuc.hack4impact.org)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhack4impact-uiuc%2Flife-after-hate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhack4impact-uiuc%2Flife-after-hate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhack4impact-uiuc%2Flife-after-hate/lists"}