{"id":22576607,"url":"https://github.com/ndolestudio/gist-cleaner","last_synced_at":"2026-03-11T01:32:02.233Z","repository":{"id":39384885,"uuid":"208085053","full_name":"NdoleStudio/gist-cleaner","owner":"NdoleStudio","description":"This is a webapp to bulk delete github gists","archived":false,"fork":false,"pushed_at":"2025-08-03T18:46:13.000Z","size":4063,"stargazers_count":26,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-03T20:41:40.877Z","etag":null,"topics":["gist","github","go","serverless","va","vercel-serverless"],"latest_commit_sha":null,"homepage":"https://gist-cleaner.ndolestudio.com","language":"JavaScript","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/NdoleStudio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2019-09-12T15:35:33.000Z","updated_at":"2025-08-03T18:46:11.000Z","dependencies_parsed_at":"2024-06-28T05:28:31.303Z","dependency_job_id":"264527c8-0baf-4261-b7fa-4096450cae25","html_url":"https://github.com/NdoleStudio/gist-cleaner","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/NdoleStudio/gist-cleaner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NdoleStudio%2Fgist-cleaner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NdoleStudio%2Fgist-cleaner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NdoleStudio%2Fgist-cleaner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NdoleStudio%2Fgist-cleaner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NdoleStudio","download_url":"https://codeload.github.com/NdoleStudio/gist-cleaner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NdoleStudio%2Fgist-cleaner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30366051,"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":["gist","github","go","serverless","va","vercel-serverless"],"created_at":"2024-12-08T04:07:20.940Z","updated_at":"2026-03-11T01:32:02.215Z","avatar_url":"https://github.com/NdoleStudio.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Gist Cleaner\n\n[![Build](https://github.com/NdoleStudio/gist-cleaner/actions/workflows/firebase.yml/badge.svg)](https://github.com/NdoleStudio/gist-cleaner/actions/workflows/firebase.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/NdoleStudio/gist-cleaner)](https://goreportcard.com/report/github.com/NdoleStudio/gist-cleaner)\n![Vercel](https://vercelbadge.vercel.app/api/NdoleStudio/gist-cleaner)\n\n\nThis is a web app to help you delete multiple gists on github at once. **Why?** Currently github doesn't provide this functionality for you to delete multiple gists at once.\n\nif you have any suggestions/questions, open a PR or issue on github. If you're not inclined to make PRs you can tweet me at [@acho_arnold](https://twitter.com/acho_arnold)!\n\n![](./frontend/public/workflow.gif)\n\n## Directory Structure\n\nThis web app follows the subscribe to the [monolithic repo philosophy](https://danluu.com/monorepo/). So there’s one and only one repo, containing deploy scripts, frontend \u0026 backend code. The frontend code is inside the [./frontend](./old) directory and the backend code is inside the [./backend](./backend) directory. There's some github-actions configuration to easily deploy to firebase when a push is one to the master branch. The code for this is found inside the [./.github/workflows](./.github/workflows) directory\n\n## Architecture\n\n### Frontend\n\n#### Dependencies\n\n- React\n- PusherJs\n- React Router\n- React-Toastify\n- Moment JS\n- React Router\n- TailwindCss\n\n#### Philosophy\n\nThis app was created using the [create react app](https://github.com/facebook/create-react-app) tool since it's written in react.js that's a really handy tool to quickly build a react app with little or no configuration. I ❤️ it.\n\nThe React Router package is used to handle the routing in the frontend. There are currently just 3 routes\n\n- `/` - This route is responsible for rendering the landing page. The code for this page is found inside the [./frontend/src/pages/LandingPage](./frontend/src/pages/LandingPage) directory \n- `/dasbhoard` - This route is responsible for rendering the dashboard page where a user can see all their gists and they can select multiple gists to delete. The code for this page is found inside the [./frontend/src/pages/Dashboard](./frontend/src/pages/Dashboard) directory.\n- `*` - This serves as a catch all route which renderers a 404 page if a user tries to visit an invalid route. The code for this page is found inside the [./frontend/src/pages/404](./frontend/src/pages/404) directory.\n\n\n[TailwindCss](https://tailwindcss.com/) is used to build the frontend as far as styling is concerned. There are a few `style.css` files which contains styles which are specific to a particular page. \n\n[React-Toastify](https://github.com/fkhadra/react-toastify) is to easily notify users when they perform a gist delete action on the app and when there's an error when doing an API request.\n\n\n[Pusher-Js](https://github.com/pusher/pusher-js) is used to send real time socket notifications from the backend to the frontend app. When a user deletes gists, was soon as each gist is deleted by the backend, it sends a notification to the user informing them of the gist begin deleted. The free pusher-js plan is used so there's a limit to `100` simultaneous connections. To make the app resource efficient, a connection to pusher is created only when the user deletes gists and as soon as all the gists are deleted, the connection is killed.\n\n[postcss-purgecss](https://github.com/FullHuman/purgecss) is used to delete unnecessary tailwind css classes which are not being used anywhere. The original size of tailwindcss is `783.5kb` but chances are that only a few classes are actually used throughout the project so `purgecss` is a really handy tool in deleted unused css files\n\n#### Hosting\n\nThis app is hosted for free on [firebase](https://firebase.google.com/) which provides SSD storage and a super fast global CDN (content delivery network). There's a github action configuration to deploy to firebase when a push is done on the `master` branch. The code for this is found in [./.github/workflows/firebase.yml](./.github/workflows/firebase.yml).\n\n#### Testing \n\nTo run tests, do the command `yarn test` currently there are just tests to ensure that the various components can be rendered without any errors. More tests are appreciated!\n\n### Backend\n\n#### Dependencies\n\n- Sentry\n- Pusher\n\n#### Philosophy\n\nThe backend is written completely in `Go` using [serverless functions](https://zeit.co/docs/v2/serverless-functions/introduction/). It's hosted on [Ziet](https://zeit.co) and the serverless functions are written with this platform in mind.\n\nRouting is done by the `Handler` method in the `main.go` file. There's a rule in the `now.json` configuration which routes all requests to this handler and this handler is responsible for calling other functions to handle the request. There are currently 3 routes\n\n- `POST` `/dashboard` - This route is responsible for providing the data which is required by the `dashboard` view in the frontend. This route is handled by the `handleDashbord` method. Here, a graphql query is run against the github api to provide all the data in 1 request. This API endpoint requires either a github `auth code` or an  `access_token`. The request body **MUST** be in a JSON format according to the structure defined in `type DashboardRequest struct`\n- `DELETE` `/delete` - This route is responsible for deleting an array of gists. The route is handled by the `handleDelete` method. And it deletes multiple gists concurrently. It's also responsible for sending a message back to the frontend when each gist is deleted and when all the gists have been deleted using `pusher`. The endpoint requires the github `access_token` and an array of gists to be deleted. The request body **MUST** be in a JSON format according to the format defined in `type DeleteRequest struct`.\n- `*` - This is catch-all route for all other requests which are not either of the 2 defined above. It just returns the API version and the URL requested.\n\n[Sentry](https://sentry.io) is used for application monitoring, with a focus on error reporting. It makes it really easy to see the errors that occur when running the serverless functions.\n\n\n#### Hosting\n\nThe backend is hosted for free on [Ziet (now.sh)](https://zeit.co) and it's handled completely using serverless functions. The [./now.json](./now.json) file provides the configuration needed for building and deploying the functions. A new deploy is made to production each time there's a push on the master branch.\n\nA point to note here is this line `{ \"source\": \"(.*)\", \"destination\": \"backend/main.go\" }` which enforces that all requests which are made to the app are sent to the `Handler` function in the `main.go` file. So this handler function acts as a router for performing the requests.\n\n#### Testing \n\nThere are no automated tests at the moment. More help will this will be appreciated! \n\n## License\n\nMIT licensed. See the [LICENSE](./LICENSE) file for details.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fndolestudio%2Fgist-cleaner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fndolestudio%2Fgist-cleaner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fndolestudio%2Fgist-cleaner/lists"}