├── .eslintrc.json ├── .github ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── suggest_project.yml ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yml └── workflows │ ├── deploy.yml │ └── pr.yml ├── .gitignore ├── .husky └── pre-commit ├── .prettierrc ├── CNAME ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SUPPORT.md ├── components ├── Footer │ ├── Footer.module.scss │ └── Footer.tsx ├── GeneralFilter.tsx ├── HappyCommitsInfo.tsx ├── HappyContainer.tsx ├── Header │ ├── Header.module.scss │ └── Header.tsx ├── HeroContainer.tsx ├── IssueItem.tsx ├── IssueList.tsx ├── LanguageFilter.tsx ├── Layout.tsx ├── RepositoryDescription.tsx ├── RepositoryIssueNumberIndicator.tsx ├── RepositoryItem.tsx ├── RepositoryItemTopBar.tsx ├── RepositoryLinkTitle.tsx ├── RepositoryList.tsx ├── RepositoryMetadata.tsx └── SDGFilter.tsx ├── constants.ts ├── context └── AppDataContext.tsx ├── generate.ts ├── generated.json ├── happycommits.json ├── hooks └── useAppData.tsx ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── _app.tsx ├── _document.tsx └── index.tsx ├── postcss.config.js ├── public ├── android-favicon.png ├── apple-touch-icon.png ├── favicon.png ├── for-good-first-issue.svg ├── github.svg └── robots.txt ├── styles ├── favicon.ico └── globals.scss ├── tailwind.config.js ├── templates ├── CODEOWNERS └── CODE_OF_CONDUCT.md ├── topics.json ├── topics.ts ├── tsconfig.json └── types.ts /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "plugin:@typescript-eslint/recommended", 4 | "next", 5 | "next/core-web-vitals", 6 | "prettier" 7 | ], 8 | "parser": "@typescript-eslint/parser", 9 | "parserOptions": { 10 | "ecmaFeatures": { 11 | "jsx": true 12 | }, 13 | "ecmaVersion": 12, 14 | "sourceType": "module" 15 | }, 16 | "plugins": ["@typescript-eslint"] 17 | } 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/suggest_project.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: 💪 Suggest a Project 3 | description: Have a project that we should be listing? Let us know! 4 | title: "[New Project]: " 5 | labels: ["💪 New Project"] 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | # Thank you for taking the time to help us improve the app! 11 | - type: checkboxes 12 | attributes: 13 | label: Is this project already existing in the app? 14 | description: Please search the happycommits.json file in the root directory. 15 | options: 16 | - label: I have searched the existing projects 17 | required: true 18 | - type: textarea 19 | attributes: 20 | label: Tell us about the project 21 | description: Please provide a link to the github repo and tell us why the 22 | project would be a good fit! 23 | validations: 24 | required: yes 25 | - type: checkboxes 26 | id: DPG 27 | attributes: 28 | label: Is the Project a DPG (Digital Public Good) 29 | description: You can check the DPG Registry 30 | [here](https://digitalpublicgoods.net/registry/), 31 | options: 32 | - label: "Yes" 33 | - label: "No" 34 | - type: checkboxes 35 | id: SDGs 36 | attributes: 37 | label: Does the project list which Sustainable Development Goals it addresses in 38 | its labels? 39 | description: View the SDGs [here](https://sdgs.un.org/goals) and view how a 40 | project lists them in their labels 41 | [here](https://github.com/rubyforgood/human-essentials)! 42 | options: 43 | - label: "Yes" 44 | - label: "No" 45 | - type: checkboxes 46 | id: terms 47 | attributes: 48 | label: Code of Conduct 49 | description: By submitting this issue, you agree to follow our [Code of 50 | Conduct](https://github.com/github/.github/blob/main/CODE_OF_CONDUCT.md) 51 | options: 52 | - label: I've read the Code of Conduct and understand my responsibilities as a 53 | member of the GitHub community 54 | required: true 55 | - type: textarea 56 | attributes: 57 | label: Anything else? 58 | description: > 59 | Links? References? Anything that will give us more context about 60 | the issue you are encountering! 61 | 62 | 63 | Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. 64 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | <!-- If adding a project to For Good First Issue please uncomment and include the following: 2 | 3 | #### ℹ️ Repository information 4 | 5 | **The repository**: 6 | 7 | - [ ] Is a social good project. 8 | - Link: 9 | - [ ] Is for a DPG (Digital Public Good) 10 | - [ ] The project has tags in in its description denoting which SDGs it addresses. ie `sdg-1`, `sdg-2`, etc. 11 | - [ ] The project has a contributing file. 12 | - [ ] The project has a code of conduct file. 13 | - [ ] The project has a license. 14 | - [ ] Actively maintained (last updated less than 1 months ago). 15 | --> 16 | 17 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to forgoodfirstissue.github.com 2 | 3 | on: 4 | # Runs on pushes targeting the default branch 5 | push: 6 | branches: ["deploy"] 7 | 8 | # Allows you to run this workflow manually from the Actions tab 9 | workflow_dispatch: 10 | 11 | # Allows you to trigger this workflow from another workflow 12 | workflow_call: 13 | 14 | # Cron schedule, everyday at midnight 15 | schedule: 16 | - cron: '0 */6 * * *' 17 | 18 | 19 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 20 | permissions: 21 | contents: write 22 | pages: write 23 | id-token: write 24 | 25 | # Allow one concurrent deployment 26 | concurrency: 27 | group: "pages" 28 | cancel-in-progress: true 29 | 30 | jobs: 31 | # Build job 32 | build: 33 | runs-on: ubuntu-latest 34 | steps: 35 | - name: Checkout 36 | uses: actions/checkout@v3 37 | - name: Setup Node 38 | uses: actions/setup-node@v3 39 | with: 40 | node-version: "18" 41 | cache: ${{ steps.detect-package-manager.outputs.manager }} 42 | - name: Setup Pages 43 | uses: actions/configure-pages@v2 44 | with: 45 | # Automatically inject basePath in your Next.js configuration file and disable 46 | # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized). 47 | # 48 | # You may remove this line if you want to manage the configuration yourself. 49 | static_site_generator: next 50 | - name: Restore cache 51 | uses: actions/cache@v3 52 | with: 53 | path: | 54 | .next/cache 55 | # Generate a new cache whenever packages or source files change. 56 | key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} 57 | # If source files changed but packages didn't, rebuild from a prior cache. 58 | restore-keys: | 59 | ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}- 60 | - name: Install dependencies 61 | run: npm install 62 | - name: Build with Next.js 63 | run: npm run build 64 | env: 65 | GH_PERSONAL_ACCESS_TOKEN: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} 66 | - name: Update happycommits.json 67 | uses: stefanzweifel/git-auto-commit-action@3ea6ae190baf489ba007f7c92608f33ce20ef04a #v4.16.0 68 | with: 69 | commit_message: update generated.json [skip actions] 70 | branch: deploy 71 | file_pattern: 'generated.json' 72 | skip_checkout: true 73 | push_options: '--force' 74 | - name: Upload artifact 75 | uses: actions/upload-pages-artifact@v3.0.1 76 | with: 77 | path: ./out 78 | 79 | # Deployment job 80 | deploy: 81 | environment: 82 | name: github-pages 83 | url: ${{ steps.deployment.outputs.page_url }} 84 | runs-on: ubuntu-latest 85 | needs: build 86 | steps: 87 | - name: Deploy to GitHub Pages 88 | id: deployment 89 | uses: actions/deploy-pages@v4.0.5 90 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: Check pull request 2 | 3 | on: [push, pull_request] 4 | 5 | permissions: 6 | actions: write 7 | contents: read 8 | pages: write 9 | 10 | jobs: 11 | # Build job 12 | build: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v3 17 | - name: Setup Node 18 | uses: actions/setup-node@v3 19 | with: 20 | node-version: "18" 21 | cache: ${{ steps.detect-package-manager.outputs.manager }} 22 | - name: Setup Pages 23 | uses: actions/configure-pages@v2 24 | with: 25 | # Automatically inject basePath in your Next.js configuration file and disable 26 | # server side image optimization (https://nextjs.org/docs/api-reference/next/image#unoptimized). 27 | # 28 | # You may remove this line if you want to manage the configuration yourself. 29 | static_site_generator: next 30 | - name: Restore cache 31 | uses: actions/cache@v3 32 | with: 33 | path: | 34 | .next/cache 35 | # Generate a new cache whenever packages or source files change. 36 | key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} 37 | # If source files changed but packages didn't, rebuild from a prior cache. 38 | restore-keys: | 39 | ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}- 40 | - name: Install dependencies 41 | run: npm install 42 | - name: Build with Next.js 43 | run: npm run build 44 | env: 45 | GH_PERSONAL_ACCESS_TOKEN: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} 46 | - name: Upload artifact 47 | uses: actions/upload-pages-artifact@v3.0.1 48 | with: 49 | path: ./out 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | /.history 3 | 4 | # dependencies 5 | /node_modules 6 | /.pnp 7 | .pnp.js 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | .pnpm-debug.log* 28 | 29 | # local env files 30 | .env*.local 31 | 32 | # vercel 33 | .vercel 34 | 35 | # typescript 36 | *.tsbuildinfo 37 | next-env.d.ts 38 | .vscode 39 | .todo 40 | public/sitemap.xml 41 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npm run lint 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "tabWidth": 2, 4 | "trailingComma": "none", 5 | "bracketSpacing": true, 6 | "importOrder": ["^@core/(.*)$", "^@server/(.*)$", "^@ui/(.*)$", "^[./]"], 7 | "importOrderSeparation": true, 8 | "importOrderSortSpecifiers": true 9 | } 10 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | forgoodfirstissue.dev 2 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing 2 | 3 | [fork]: https://github.com/github/forgoodfirstissue/fork 4 | [pr]: https://github.com/github/forgoodfirstissue/compare 5 | [style]: https://github.com/github/forgoodfirstissue/blob/main/.eslintrc.json 6 | [code-of-conduct]: CODE_OF_CONDUCT.md 7 | 8 | Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. 9 | 10 | Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE.md). 11 | 12 | Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. 13 | 14 | ## Submitting a pull request 15 | 16 | 1. [Fork][fork] and clone the repository 17 | 1. Configure and install the dependencies: `npm install` 18 | 1. Make sure linter passes on your machine: `npm run lint` 19 | 1. Create a new branch: `git checkout -b my-branch-name` 20 | 1. Make your change, add tests, and make sure the tests and linter still pass 21 | 1. Push to your fork and [submit a pull request][pr] 22 | 1. Pat yourself on the back and wait for your pull request to be reviewed and merged. 23 | 24 | Here are a few things you can do that will increase the likelihood of your pull request being accepted: 25 | 26 | - Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests. 27 | - Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). 28 | 29 | ## Resources 30 | 31 | - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) 32 | - [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) 33 | - [GitHub Help](https://help.github.com) 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2020 DeepSource Corp. 2 | Copyright 2022 Luca Cavallin <nillavac@gmail.com> 3 | Copyright 2023 GitHub Social Impact and Ruby for Good 4 | 5 | Permission 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: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE 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. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Welcome! 👋🏼 2 | 3 | **For Good First Issue** curates social impact and civic tech open source projects that are looking for contributors and lists issues on those projects that are tagged with Help Wanted or Good First Issue. 4 | 5 | Open-source maintainers are always looking to get more people involved, but it can be challenging to become a contributor. For Good First Issue lowers the barrier for future contributions to social and civic good projects - and this is why it exists. 6 | 7 | ## Adding a new project 8 | 9 | You're welcome to add a new project in For Good First Issue, just follow these steps: 10 | 11 | - To maintain the quality of projects in For Good First Issue, please make sure the GitHub repository you want to add meets the following criteria: 12 | 13 | - It is a social impact or civic tech project. 14 | 15 | - Ideally, it tags its issues with `help wanted` or `good first issue`. 16 | 17 | - In the repository description it lists the sdg(s) it is working on. See [here](https://github.com/rubyforgood/human-essentials) for an example. 18 | 19 | - It contains a README.md with detailed setup instructions for the project, and a CONTRIBUTING.md with guidelines for new contributors. 20 | 21 | - It is actively maintained (last update less than 1 month ago). 22 | 23 | - Add your repository's path (in the format `owner/name` and lexicographic order) to [happycommits.json](happycommits.json). 24 | 25 | - Create a new pull-request. Please add the link to the issues page of the repository in the PR description. Once the pull request is merged, the changes will be live on the site. 26 | 27 | ## How does it work? 28 | 29 | First Issue is a static website that uses Next.js, React and Typescript. The data shown on the website is loaded from the [generated.json](generated.json) file, which is generated by [generate.ts](generate.ts) by querying the GitHub API to fetch issues from the repositories listed in [happycommits.json](happycommits.json). The labels defined in [happycommits.json](happycommits.json) are used to filter issues for the repositories. 30 | 31 | To contribute new features and changes to the website, you would want to run the app locally. Please follow these steps: 32 | 33 | 34 | ## How to setup the project locally 35 | 1. Fork the repository, clone it locally, create a new branch to work on a specific feature or bug fix without affecting the main branch of the repository. Make sure you have a recent version of Node.js installed on your computer. 36 | 1. You can use the included [generated.json](generated.json) as dummy data or you can run `npm run prebuild` to fetch the latest data from GitHub yourself: for this, you will need to set the `GH_PERSONAL_ACCESS_TOKEN` environment variable to a valid GitHub Personal Access Token (PAT). Notice: repositories not matching the criteria listed above (see rules in [generated.json](generated.json)) are automatically removed from [happycommits.json](happycommits.json) when the [generated.json](generated.json) script runs. 37 | 1. Start the development server and open the app in your browser. 38 | 39 | ```bash 40 | # install the dependencies 41 | $ npm install 42 | # start the development server 43 | $ npm run dev 44 | ``` 45 | 46 | Good to know when you commit: the project contains a `pre-commit` hook that runs linters automatically to ensure code quality! 47 | 48 | #### Credits 49 | 50 | This project is based on [good-first-issue](https://github.com/deepsourcelabs/good-first-issue) and [first-issue](https://github.com/lucavallin/first-issue). 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support 2 | 3 | ## How to file issues and get help 4 | 5 | This project uses GitHub issues to track bugs and feature requests. Please search the existing issues before filing new issues to avoid duplicates. For new issues, file your bug or feature request as a new issue. 6 | 7 | For help or questions about using this project, please file an issue! 8 | 9 | For Good First Issue is under active development and maintained by GitHub staff **AND THE COMMUNITY**. We will do our best to respond to support, feature requests, and community questions in a timely manner. 10 | 11 | ## GitHub Support Policy 12 | 13 | Support for this project is limited to the resources listed above. 14 | -------------------------------------------------------------------------------- /components/Footer/Footer.module.scss: -------------------------------------------------------------------------------- 1 | 2 | .footer { 3 | margin-top: 120px; 4 | z-index: 2; 5 | background: #0d1117; 6 | color: #959da5; 7 | 8 | ul { 9 | list-style-type: none; 10 | padding: 0; 11 | margin: 0; 12 | } 13 | 14 | a { 15 | font-size: 14px; 16 | text-decoration: none; 17 | color: var(--fgColor-muted, var(--color-fg-muted)) !important; 18 | } 19 | 20 | .footer__container { 21 | width: 90%; 22 | max-width: 1280px; 23 | margin: 0 auto; 24 | display: flex; 25 | flex-wrap: wrap; 26 | justify-content: space-between; 27 | padding-top: 36px; 28 | 29 | @media (min-width: 800px) { 30 | display: flex; 31 | flex-wrap: nowrap; 32 | padding-top: 76px; 33 | padding-bottom: 72px; 34 | } 35 | 36 | .github { 37 | width: 100%; 38 | margin-bottom: 36px; 39 | 40 | @media (min-width: 800px) { 41 | width: calc(25% - 12px); 42 | } 43 | } 44 | 45 | .product, 46 | .platform, 47 | .support, 48 | .company { 49 | width: calc(50% - 12px); 50 | margin-bottom: 36px; 51 | 52 | @media (min-width: 800px) { 53 | width: calc(15% - 12px); 54 | } 55 | 56 | b, 57 | li { 58 | margin-bottom: 12px; 59 | } 60 | 61 | b { 62 | font-size: 18px; 63 | font-weight: bold; 64 | margin-bottom: 16px; 65 | display: block; 66 | } 67 | 68 | li:hover { 69 | text-decoration: underline; 70 | } 71 | } 72 | } 73 | 74 | .socials__wrapper { 75 | background: #161b22; 76 | font-size: 12px; 77 | p, a, small { 78 | font-size: 12px; 79 | } 80 | } 81 | 82 | .socials { 83 | width: 90%; 84 | 85 | @media (min-width: 800px) { 86 | display: flex; 87 | justify-content: space-between; 88 | align-items: center; 89 | flex-direction: row-reverse; 90 | } 91 | 92 | color: #959da5; 93 | max-width: 1280px; 94 | margin: 0 auto; 95 | padding: 8px 0; 96 | 97 | .socials__left { 98 | width: 100%; 99 | display: flex; 100 | align-items: center; 101 | justify-content: center; 102 | padding: 12px 0; 103 | 104 | li { 105 | margin: 0 8px; 106 | } 107 | 108 | 109 | @media (min-width: 800px) { 110 | justify-content: flex-start; 111 | 112 | li { 113 | margin: 0 16px 0 0; 114 | } 115 | } 116 | 117 | 118 | li:hover:not(:first-child) { 119 | text-decoration: underline; 120 | } 121 | } 122 | 123 | .socials__right { 124 | padding: 24px 0 12px; 125 | display: flex; 126 | align-items: center; 127 | justify-content: center; 128 | 129 | li { 130 | margin: 0 8px; 131 | height: 18px; 132 | } 133 | 134 | @media (min-width: 800px) { 135 | justify-content: flex-end; 136 | 137 | li { 138 | margin: 0 16px 0 0; 139 | height: 18px; 140 | } 141 | } 142 | 143 | svg { 144 | height: 18; 145 | } 146 | } 147 | } 148 | } 149 | 150 | 151 | .subscribeWrap { 152 | margin-top: 16px; 153 | p { 154 | margin-top: 6px; 155 | color: var(--fgColor-muted, var(--color-fg-muted)); 156 | } 157 | a { 158 | margin-top: 12px; 159 | } 160 | } 161 | p.textWhite { 162 | color: #fff !important; 163 | } 164 | -------------------------------------------------------------------------------- /components/Footer/Footer.tsx: -------------------------------------------------------------------------------- 1 | import styles from "./Footer.module.scss"; 2 | import {Button, Text} from '@primer/react-brand' 3 | 4 | export const Footer = () => { 5 | return ( 6 | 7 | <footer className={styles.footer}> 8 | 9 | <div className="py-5 p-10"> 10 | <div className={styles.footer__container}> 11 | <div className={styles.github}> 12 | <a 13 | href="https://github.com/" 14 | data-analytics-click="Footer, go to home, text:home" 15 | className="text-gray-dark" 16 | aria-label="Go to GitHub homepage" 17 | > 18 | <svg 19 | height="30" 20 | className="octicon octicon-logo-github" 21 | viewBox="0 0 45 16" 22 | version="1.1" 23 | width="84" 24 | aria-hidden="true" 25 | fill="white" 26 | > 27 | <path 28 | d="M18.53 12.03h-.02c.009 0 .015.01.024.011h.006l-.01-.01zm.004.011c-.093.001-.327.05-.574.05-.78 0-1.05-.36-1.05-.83V8.13h1.59c.09 0 .16-.08.16-.19v-1.7c0-.09-.08-.17-.16-.17h-1.59V3.96c0-.08-.05-.13-.14-.13h-2.16c-.09 0-.14.05-.14.13v2.17s-1.09.27-1.16.28c-.08.02-.13.09-.13.17v1.36c0 .11.08.19.17.19h1.11v3.28c0 2.44 1.7 2.69 2.86 2.69.53 0 1.17-.17 1.27-.22.06-.02.09-.09.09-.16v-1.5a.177.177 0 00-.146-.18zM42.23 9.84c0-1.81-.73-2.05-1.5-1.97-.6.04-1.08.34-1.08.34v3.52s.49.34 1.22.36c1.03.03 1.36-.34 1.36-2.25zm2.43-.16c0 3.43-1.11 4.41-3.05 4.41-1.64 0-2.52-.83-2.52-.83s-.04.46-.09.52c-.03.06-.08.08-.14.08h-1.48c-.1 0-.19-.08-.19-.17l.02-11.11c0-.09.08-.17.17-.17h2.13c.09 0 .17.08.17.17v3.77s.82-.53 2.02-.53l-.01-.02c1.2 0 2.97.45 2.97 3.88zm-8.72-3.61h-2.1c-.11 0-.17.08-.17.19v5.44s-.55.39-1.3.39-.97-.34-.97-1.09V6.25c0-.09-.08-.17-.17-.17h-2.14c-.09 0-.17.08-.17.17v5.11c0 2.2 1.23 2.75 2.92 2.75 1.39 0 2.52-.77 2.52-.77s.05.39.08.45c.02.05.09.09.16.09h1.34c.11 0 .17-.08.17-.17l.02-7.47c0-.09-.08-.17-.19-.17zm-23.7-.01h-2.13c-.09 0-.17.09-.17.2v7.34c0 .2.13.27.3.27h1.92c.2 0 .25-.09.25-.27V6.23c0-.09-.08-.17-.17-.17zm-1.05-3.38c-.77 0-1.38.61-1.38 1.38 0 .77.61 1.38 1.38 1.38.75 0 1.36-.61 1.36-1.38 0-.77-.61-1.38-1.36-1.38zm16.49-.25h-2.11c-.09 0-.17.08-.17.17v4.09h-3.31V2.6c0-.09-.08-.17-.17-.17h-2.13c-.09 0-.17.08-.17.17v11.11c0 .09.09.17.17.17h2.13c.09 0 .17-.08.17-.17V8.96h3.31l-.02 4.75c0 .09.08.17.17.17h2.13c.09 0 .17-.08.17-.17V2.6c0-.09-.08-.17-.17-.17zM8.81 7.35v5.74c0 .04-.01.11-.06.13 0 0-1.25.89-3.31.89-2.49 0-5.44-.78-5.44-5.92S2.58 1.99 5.1 2c2.18 0 3.06.49 3.2.58.04.05.06.09.06.14L7.94 4.5c0 .09-.09.2-.2.17-.36-.11-.9-.33-2.17-.33-1.47 0-3.05.42-3.05 3.73s1.5 3.7 2.58 3.7c.92 0 1.25-.11 1.25-.11v-2.3H4.88c-.11 0-.19-.08-.19-.17V7.35c0-.09.08-.17.19-.17h3.74c.11 0 .19.08.19.17z" 29 | ></path> 30 | </svg> 31 | </a> 32 | 33 | <div className={styles.subscribeWrap} data-color-mode="dark"> 34 | <Text className={styles.textWhite} as="p" weight="semibold"> 35 | Subscribe to <em>The GitHub Insider</em> 36 | </Text> 37 | <Text size="100" as="p"> 38 | Discover tips, technical guides, and best practices in our monthly newsletter for developers. 39 | </Text> 40 | <Button 41 | as="a" 42 | href="https://resources.github.com/newsletter/" 43 | hasArrow={false} 44 | > 45 | Subscribe 46 | </Button> 47 | </div> 48 | </div> 49 | <div className={styles.product}> 50 | <b>Product</b> 51 | <ul> 52 | <li> 53 | <a href="https://github.com/features">Features</a> 54 | </li> 55 | <li> 56 | <a href="https://github.com/security">Security</a> 57 | </li> 58 | <li> 59 | <a href="https://github.com/enterprise">Enterprise</a> 60 | </li> 61 | <li> 62 | <a href="https://github.com/customer-stories?type=enterprise"> 63 | Customer Stories 64 | </a> 65 | </li> 66 | <li> 67 | <a href="https://github.com/pricing">Pricing</a> 68 | </li> 69 | <li> 70 | <a href="https://resources.github.com">Resources</a> 71 | </li> 72 | </ul> 73 | </div> 74 | <div className={styles.platform}> 75 | <b>Platform</b> 76 | <ul> 77 | <li> 78 | <a href="https://developer.github.com">Developer API</a> 79 | </li> 80 | <li> 81 | <a href="http://partner.github.com/">Partners</a> 82 | </li> 83 | <li> 84 | <a href="https://atom.io">Atom</a> 85 | </li> 86 | <li> 87 | <a href="http://electron.atom.io/">Electron</a> 88 | </li> 89 | <li> 90 | <a href="https://desktop.github.com/">Github Desktop</a> 91 | </li> 92 | </ul> 93 | </div> 94 | <div className={styles.support}> 95 | <b>Support</b> 96 | <ul> 97 | <li> 98 | <a href="https://docs.github.com">Docs</a> 99 | </li> 100 | <li> 101 | <a href="https://github.community">Community Forum</a> 102 | </li> 103 | <li> 104 | <a href="https://services.github.com/"> 105 | Professional Services 106 | </a> 107 | </li> 108 | <li> 109 | <a href="https://lab.github.com/">Learning Lab</a> 110 | </li> 111 | <li> 112 | <a href="https://githubstatus.com/">Status</a> 113 | </li> 114 | <li> 115 | <a href="https://support.github.com">Contact Github</a> 116 | </li> 117 | </ul> 118 | </div> 119 | <div className={styles.company}> 120 | <b>Company</b> 121 | <ul> 122 | <li> 123 | <a href="https://github.com/about">About</a> 124 | </li> 125 | <li> 126 | <a href="https://github.blog">Blog</a> 127 | </li> 128 | <li> 129 | <a href="https://github.com/about/careers">Careers</a> 130 | </li> 131 | <li> 132 | <a href="https://github.com/about/press">Press</a> 133 | </li> 134 | <li> 135 | <a href="https://shop.github.com">Shop</a> 136 | </li> 137 | </ul> 138 | </div> 139 | </div> 140 | </div> 141 | <div className={styles.socials__wrapper}> 142 | <div className={styles.socials}> 143 | <ul className={styles.socials__right}> 144 | <li> 145 | <a 146 | href="https://twitter.com/github" 147 | data-analytics-click="Footer, go to Twitter, text:twitter" 148 | title="GitHub on Twitter" 149 | aria-label="GitHub on Twitter" 150 | > 151 | <svg 152 | xmlns="http://www.w3.org/2000/svg" 153 | viewBox="0 0 24 24" 154 | height="20"> 155 | <path d="M18.2048 2.25H21.5128L14.2858 10.51L22.7878 21.75H16.1308L10.9168 14.933L4.95084 21.75H1.64084L9.37084 12.915L1.21484 2.25H8.04084L12.7538 8.481L18.2048 2.25ZM17.0438 19.77H18.8768L7.04484 4.126H5.07784L17.0438 19.77Z" fill="currentColor"></path></svg> 156 | </a> 157 | </li> 158 | <li> 159 | <a 160 | href="https://www.facebook.com/GitHub" 161 | data-analytics-click="Footer, go to Facebook, text:facebook" 162 | title="GitHub on Facebook" 163 | aria-label="GitHub on Facebook" 164 | > 165 | <svg 166 | xmlns="http://www.w3.org/2000/svg" 167 | viewBox="0 0 15.3 15.4" 168 | height="18" 169 | > 170 | <path 171 | d="M14.5 0H.8a.88.88 0 0 0-.8.9v13.6a.88.88 0 0 0 .8.9h7.3v-6h-2V7.1h2V5.4a2.87 2.87 0 0 1 2.5-3.1h.5a10.87 10.87 0 0 1 1.8.1v2.1h-1.3c-1 0-1.1.5-1.1 1.1v1.5h2.3l-.3 2.3h-2v5.9h3.9a.88.88 0 0 0 .9-.8V.8a.86.86 0 0 0-.8-.8z" 172 | fill="currentColor" 173 | ></path> 174 | </svg> 175 | </a> 176 | </li> 177 | <li> 178 | <a 179 | href="https://www.youtube.com/github" 180 | data-analytics-click="Footer, go to YouTube, text:youtube" 181 | title="GitHub on YouTube" 182 | aria-label="GitHub on YouTube" 183 | > 184 | <svg 185 | xmlns="http://www.w3.org/2000/svg" 186 | viewBox="0 0 19.17 13.6" 187 | height="16" 188 | > 189 | <path 190 | d="M18.77 2.13A2.4 2.4 0 0 0 17.09.42C15.59 0 9.58 0 9.58 0a57.55 57.55 0 0 0-7.5.4A2.49 2.49 0 0 0 .39 2.13 26.27 26.27 0 0 0 0 6.8a26.15 26.15 0 0 0 .39 4.67 2.43 2.43 0 0 0 1.69 1.71c1.52.42 7.5.42 7.5.42a57.69 57.69 0 0 0 7.51-.4 2.4 2.4 0 0 0 1.68-1.71 25.63 25.63 0 0 0 .4-4.67 24 24 0 0 0-.4-4.69zM7.67 9.71V3.89l5 2.91z" 191 | fill="currentColor" 192 | ></path> 193 | </svg> 194 | </a> 195 | </li> 196 | <li> 197 | <a 198 | href="https://www.linkedin.com/company/github" 199 | data-analytics-click="Footer, go to Linkedin, text:linkedin" 200 | title="GitHub on Linkedin" 201 | aria-label="GitHub on LinkedIn" 202 | > 203 | <svg 204 | xmlns="http://www.w3.org/2000/svg" 205 | viewBox="0 0 19 18" 206 | height="18" 207 | > 208 | <path 209 | d="M3.94 2A2 2 0 1 1 2 0a2 2 0 0 1 1.94 2zM4 5.48H0V18h4zm6.32 0H6.34V18h3.94v-6.57c0-3.66 4.77-4 4.77 0V18H19v-7.93c0-6.17-7.06-5.94-8.72-2.91z" 210 | fill="currentColor" 211 | ></path> 212 | </svg> 213 | </a> 214 | </li> 215 | <li> 216 | <a 217 | href="https://github.com/github" 218 | data-analytics-click="Footer, go to github's org, text:github" 219 | title="GitHub's organization" 220 | aria-label="GitHub's organization" 221 | > 222 | <svg 223 | height="20" 224 | viewBox="0 0 16 16" 225 | version="1.1" 226 | width="20" 227 | aria-hidden="true" 228 | fill="gray" 229 | > 230 | <path 231 | d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z" 232 | fill="currentColor" 233 | ></path> 234 | </svg> 235 | </a> 236 | </li> 237 | </ul> 238 | <ul className={styles.socials__left}> 239 | <li>© 2023 Github, Inc.</li> 240 | <li> 241 | <a href="https://docs.github.com/site-policy/github-terms/github-terms-of-service">Terms</a> 242 | </li> 243 | <li> 244 | <a href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement">Privacy</a> 245 | </li> 246 | </ul> 247 | </div> 248 | </div> 249 | 250 | 251 | 252 | </footer> 253 | ); 254 | }; 255 | -------------------------------------------------------------------------------- /components/GeneralFilter.tsx: -------------------------------------------------------------------------------- 1 | import { FaSearch } from "react-icons/fa"; 2 | 3 | type GeneralFilterProps = { 4 | filter: string | number | readonly string[] | undefined; 5 | setFilter: (filter: string | number | readonly string[] | undefined) => void; 6 | }; 7 | 8 | export const GeneralFilter = ({ filter, setFilter }: GeneralFilterProps) => { 9 | return ( 10 | <div className="search-form"> 11 | <FaSearch className="self-center mr-2 ml-2" /> 12 | <input 13 | type="text" 14 | value={filter} 15 | onChange={(e) => setFilter(e.target.value)} 16 | placeholder="Search Repositories" 17 | className="flex-1 rounded-sm p-2" 18 | /> 19 | </div> 20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /components/HappyCommitsInfo.tsx: -------------------------------------------------------------------------------- 1 | import { GeneralFilter } from "./GeneralFilter"; 2 | type FilterProps = { 3 | filter: string; 4 | setFilter: (filter: string) => void; 5 | }; 6 | 7 | export const HappyCommitsInfo = ({filter, setFilter}: FilterProps) => { 8 | return ( 9 | <div className="search-wrap"> 10 | <GeneralFilter 11 | filter={filter} 12 | setFilter={setFilter as (filter: string | number | readonly string[] | undefined) => void} 13 | /> 14 | </div> 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /components/HappyContainer.tsx: -------------------------------------------------------------------------------- 1 | import { HappyCommitsInfo } from "./HappyCommitsInfo"; 2 | 3 | type FilterProps = { 4 | filter: string; 5 | setFilter: (filter: string) => void; 6 | }; 7 | 8 | export const HappyContainer = ({filter, setFilter}: FilterProps) => { 9 | return ( 10 | <> 11 | <HappyCommitsInfo filter={filter} setFilter={setFilter} /> 12 | </> 13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /components/Header/Header.module.scss: -------------------------------------------------------------------------------- 1 | 2 | .siteHeader { 3 | background: #26292E; 4 | 5 | > div { 6 | height: 72px; 7 | display: flex; 8 | justify-content: space-between; 9 | align-items: center; 10 | grid-gap: 36px; 11 | max-width: 1440px; 12 | width: 90%; 13 | margin: 0 auto; 14 | } 15 | 16 | @media(max-width: 800px) { 17 | .hideSm { 18 | display: none; 19 | } 20 | 21 | a:not(.homeLink) { 22 | padding: 8px 12px; 23 | grid-gap: 4px; 24 | } 25 | 26 | .btnText { 27 | font-size: 12px !important; 28 | line-height: 1 !important; 29 | white-space: nowrap; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /components/Header/Header.tsx: -------------------------------------------------------------------------------- 1 | import styles from "./Header.module.scss"; 2 | import Link from 'next/link'; 3 | import Image from 'next/image'; 4 | import {Button} from '@primer/react-brand'; 5 | 6 | export const Header = () => { 7 | return ( 8 | <> 9 | <header className={styles.siteHeader} data-color-mode="dark"> 10 | <div> 11 | <Link href="/" className={styles.homeLink}> 12 | <Image 13 | src="/for-good-first-issue.svg" 14 | width={144} 15 | height={32} 16 | alt="For Good First Issue logo" 17 | /> 18 | </Link> 19 | <Button 20 | variant="primary" 21 | as="a" 22 | href="https://github.com/rubyforgood/happycommits/issues/new?assignees=&labels=💪+New+Project&projects=&template=suggest_project.yml&title=%5BNew+Project%5D%3A+%3Ctitle%3E" 23 | target="_blank" 24 | rel="noopener noreferrer" 25 | > 26 | <span className={styles.btnText}>Recommend a project</span> 27 | </Button> 28 | </div> 29 | </header> 30 | </> 31 | ); 32 | }; 33 | -------------------------------------------------------------------------------- /components/HeroContainer.tsx: -------------------------------------------------------------------------------- 1 | import {Hero} from '@primer/react-brand'; 2 | 3 | export const HeroContainer = () => { 4 | return ( 5 | <> 6 | <Hero className="hero" data-color-mode="dark"> 7 | <Hero.Heading size="display">Committing to a better future</Hero.Heading> 8 | <Hero.Description size="300"> 9 | Lend your skills to an open source project focused on the <a href="https://digitalpublicgoods.net/digital-public-goods/" target="_blank" rel="noopener noreferrer">Digital Public Goods (DPGs)</a>. From fighting climate change, to solving world hunger, your efforts will contribute to creating a better future for everyone. Together, we can drive positive and lasting contributions to the world, one commit at a time. 10 | <br /><br /> 11 | Explore a DPG repo below to get started. 12 | </Hero.Description> 13 | </Hero> 14 | </> 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /components/IssueItem.tsx: -------------------------------------------------------------------------------- 1 | import { Issue } from "../types"; 2 | 3 | type IssueItemProps = { 4 | issue: Issue; 5 | }; 6 | 7 | export const IssueItem = ({ issue }: IssueItemProps) => { 8 | return ( 9 | <li key={issue.url}> 10 | <span>#{issue.number}</span> 11 | <a 12 | href={issue.url} 13 | rel="noopener noreferrer" 14 | target="_blank" 15 | title="Open issue on GitHub" 16 | > 17 | {issue.title} 18 | </a> 19 | </li> 20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /components/IssueList.tsx: -------------------------------------------------------------------------------- 1 | import { Issue } from "../types"; 2 | import { IssueItem } from "./IssueItem"; 3 | 4 | type IssueListProps = { 5 | issues: Issue[]; 6 | }; 7 | 8 | export const IssuesList = ({ issues }: IssueListProps) => { 9 | return ( 10 | <ol className="repo-item__issue-list"> 11 | {issues.length > 0 ? ( 12 | issues.map((issue) => <IssueItem issue={issue} key={issue.id} />) 13 | ) : ( 14 | <li> 15 | This project does not appear to have any issues marked Help Wanted or Good First Issue. If 16 | this project speaks to you, consider seeing if there are other ways to help contribute! 17 | You can find more information on the project's GitHub page. It is also possible that they 18 | are not using issue labels or GitHub issues to track their work. 19 | </li> 20 | )} 21 | </ol> 22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /components/LanguageFilter.tsx: -------------------------------------------------------------------------------- 1 | import Select from "react-select"; 2 | 3 | type LanguageFilterProps = { 4 | setSelectedLanguages: (languages: string[]) => void; 5 | languageOptions: { value: string; label: string }[]; 6 | }; 7 | 8 | export const LanguageFilter = ({ setSelectedLanguages, languageOptions }: LanguageFilterProps) => { 9 | return ( 10 | <> 11 | <div> 12 | <label className="label">Language</label> 13 | <Select isMulti closeMenuOnSelect={false} className="" onChange={(selectedOptions) => setSelectedLanguages(selectedOptions.map((option) => option.value))} options={languageOptions} classNamePrefix="select" /> 14 | </div> 15 | </> 16 | 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /components/Layout.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | type LayoutProps = { 4 | children: React.ReactNode; 5 | }; 6 | 7 | export const Layout = ({ children }: LayoutProps) => ( 8 | <div> 9 | <main> 10 | <section> 11 | {children} 12 | </section> 13 | </main> 14 | </div> 15 | ); 16 | -------------------------------------------------------------------------------- /components/RepositoryDescription.tsx: -------------------------------------------------------------------------------- 1 | import { Repository } from "../types"; 2 | 3 | type RepositoryDescriptionProps = { 4 | repositoryDescription: Repository["description"]; 5 | }; 6 | 7 | export const RepositoryDescription = ({ repositoryDescription }: RepositoryDescriptionProps) => { 8 | return ( 9 | <p className="repo-item__desc"> 10 | {repositoryDescription}{" "} 11 | </p> 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /components/RepositoryIssueNumberIndicator.tsx: -------------------------------------------------------------------------------- 1 | import { FaChevronDown } from 'react-icons/fa'; 2 | import { FaChevronUp } from 'react-icons/fa'; 3 | 4 | type RepositoryIssueNumberIndicatorProps = { 5 | isIssueOpen: boolean; 6 | }; 7 | 8 | export const RepositoryIssueNumberIndicator = ({ 9 | isIssueOpen 10 | }: RepositoryIssueNumberIndicatorProps) => { 11 | return ( 12 | <span> 13 | {isIssueOpen ? <FaChevronUp /> : <FaChevronDown />} 14 | </span> 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /components/RepositoryItem.tsx: -------------------------------------------------------------------------------- 1 | import dayjs from "dayjs"; 2 | import relativeTime from "dayjs/plugin/relativeTime"; 3 | import React, { useEffect, useState } from "react"; 4 | 5 | import { Repository } from "../types"; 6 | import { IssuesList } from "./IssueList"; 7 | import { RepositoryDescription } from "./RepositoryDescription"; 8 | import { RepositoryItemTopBar } from "./RepositoryItemTopBar"; 9 | import { RepositoryMetadata } from "./RepositoryMetadata"; 10 | 11 | type RepositoryItemProps = { 12 | repository: Repository; 13 | }; 14 | 15 | export const RepositoryItem = ({ repository }: RepositoryItemProps) => { 16 | const [isIssueOpen, setIsIssueOpen] = useState(false); 17 | const [isIssuesListVisible, setIsIssuesListVisible] = useState(false); 18 | 19 | dayjs.extend(relativeTime); 20 | const useLastModified = (date: string) => { 21 | const [lastModified, setLastModified] = useState(""); 22 | 23 | useEffect(() => setLastModified(dayjs(date).fromNow()), [date]); 24 | 25 | return lastModified; 26 | }; 27 | const lastModified = useLastModified(repository.last_modified); 28 | 29 | useEffect(() => { 30 | if (isIssueOpen) { 31 | setIsIssuesListVisible(true); 32 | } else { 33 | // Delay unmounting to allow close animation to complete 34 | const timer = setTimeout(() => setIsIssuesListVisible(false), 300); 35 | return () => clearTimeout(timer); 36 | } 37 | }, [isIssueOpen]); 38 | 39 | return ( 40 | <div className="repo-item"> 41 | <div id={`repo-${repository.id}`}> 42 | <div onClick={() => setIsIssueOpen(!isIssueOpen)}> 43 | <RepositoryItemTopBar 44 | isIssueOpen={isIssueOpen} 45 | repositoryHasNewIssues={repository.has_new_issues} 46 | repositoryName={repository.name} 47 | repositoryNumIssues={repository.issues.length} 48 | repositoryOwner={repository.owner} 49 | repositoryUrl={repository.url} 50 | repositoryTopics={repository.topics} 51 | /> 52 | <div> 53 | <RepositoryDescription repositoryDescription={repository.description} /> 54 | 55 | <RepositoryMetadata 56 | isIssueOpen={isIssueOpen} 57 | lastModified={lastModified} 58 | repositoryLang={repository.language.display} 59 | repositoryTopics={repository.topics} 60 | repositoryNumIssues={repository.issues.length} 61 | /> 62 | </div> 63 | </div> 64 | <div className={`repo-item__issues-warper ${isIssueOpen ? 'open' : ''}`}> 65 | {isIssuesListVisible && <IssuesList issues={repository.issues} />} 66 | </div> 67 | </div> 68 | </div> 69 | ); 70 | }; 71 | -------------------------------------------------------------------------------- /components/RepositoryItemTopBar.tsx: -------------------------------------------------------------------------------- 1 | import { Repository } from "../types"; 2 | import { RepositoryIssueNumberIndicator } from "./RepositoryIssueNumberIndicator"; 3 | 4 | type RepositoryItemTopBarProps = { 5 | isIssueOpen: boolean; 6 | repositoryHasNewIssues: boolean; 7 | repositoryName: Repository["name"]; 8 | repositoryNumIssues: number; 9 | repositoryOwner: Repository["owner"]; 10 | repositoryUrl: Repository["url"]; 11 | repositoryTopics: Repository["topics"]; 12 | }; 13 | 14 | export const RepositoryItemTopBar = ({ 15 | isIssueOpen, 16 | repositoryName, 17 | repositoryOwner, 18 | repositoryUrl 19 | }: RepositoryItemTopBarProps) => { 20 | return ( 21 | <div className="repo-item__top-bar"> 22 | <a 23 | href={repositoryUrl} 24 | rel="noopener noreferrer" 25 | target="_blank" 26 | title={`Open ${repositoryOwner}/${repositoryName} on GitHub`} 27 | > 28 | <h3> 29 | <div className="repo-item__owner"> 30 | {repositoryOwner} 31 | </div> 32 | <span> / </span> 33 | <div className="repo-item__name"> 34 | {repositoryName} 35 | </div> 36 | </h3> 37 | </a> 38 | 39 | <RepositoryIssueNumberIndicator 40 | isIssueOpen={isIssueOpen} 41 | /> 42 | </div> 43 | ); 44 | }; 45 | -------------------------------------------------------------------------------- /components/RepositoryLinkTitle.tsx: -------------------------------------------------------------------------------- 1 | import { Repository } from "../types"; 2 | 3 | type RepositoryLinkTitleProps = { 4 | isIssueOpen: boolean; 5 | repositoryName: Repository["name"]; 6 | repositoryOwner: Repository["owner"]; 7 | repositoryUrl: Repository["url"]; 8 | }; 9 | 10 | export const RepositoryLinkTitle = ({ 11 | isIssueOpen, 12 | repositoryName, 13 | repositoryOwner, 14 | repositoryUrl 15 | }: RepositoryLinkTitleProps) => { 16 | return ( 17 | <a 18 | className={`text-xl font-bold group-hover:text-juniper ${isIssueOpen ? "text-juniper" : ""}`} 19 | href={repositoryUrl} 20 | rel="noopener noreferrer" 21 | target="_blank" 22 | title={`Open ${repositoryOwner}/${repositoryName} on GitHub`} 23 | > 24 | {repositoryOwner} / {repositoryName} 25 | </a> 26 | ); 27 | }; 28 | -------------------------------------------------------------------------------- /components/RepositoryList.tsx: -------------------------------------------------------------------------------- 1 | import { faCircleNotch } from "@fortawesome/free-solid-svg-icons"; 2 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; 3 | import React, { useState } from "react"; 4 | import InfiniteScroll from "react-infinite-scroll-component"; 5 | 6 | import { IndexedTopics } from "../topics"; 7 | import { Repository } from "../types"; 8 | 9 | import { LanguageFilter } from "./LanguageFilter"; 10 | import { RepositoryItem } from "./RepositoryItem"; 11 | import { SDGFilter } from "./SDGFilter"; 12 | import {Grid, Stack} from '@primer/react-brand'; 13 | 14 | 15 | type RepositoryListProps = { 16 | repositories: Repository[]; 17 | filter: string; 18 | }; 19 | 20 | const Loader = () => ( 21 | <div className="p-4 w-full flex items-center justify-center"> 22 | <FontAwesomeIcon icon={faCircleNotch} className="fa-spin" /> 23 | </div> 24 | ); 25 | 26 | export const RepositoryList = ({ repositories, filter }: RepositoryListProps) => { 27 | const itemsPerScroll = 15; 28 | const [items, setItems] = useState(itemsPerScroll); 29 | const [selectedLanguages, setSelectedLanguages] = useState<string[]>([]); 30 | const [selectedTopics, setSelectedTopics] = useState<string[]>([]); 31 | 32 | 33 | const filteredRepositories = repositories.filter((repository) => { 34 | const languageFilter = 35 | selectedLanguages.length === 0 || selectedLanguages.includes(repository.language.display); 36 | 37 | const topicFilter = 38 | selectedTopics.length === 0 || 39 | repository.topics?.some((topic) => selectedTopics.includes(topic.display)); 40 | 41 | const nameFilter = Object.values(repository).some( 42 | (value) => value && value.toString().toLowerCase().includes(filter.toLowerCase()) 43 | ); 44 | 45 | const happyContainer = Object.values(repository).some( 46 | (value) => value && value.toString().toLowerCase().includes(filter.toLowerCase()) 47 | ); 48 | return languageFilter && nameFilter && topicFilter && happyContainer; 49 | }); 50 | 51 | const uniqueLanguages = [ 52 | ...new Set(repositories.map((repository) => repository.language.display)) 53 | ]; 54 | const languageOptions = uniqueLanguages.map((language) => ({ value: language, label: language })); 55 | 56 | const uniqueTopics = [ 57 | ...new Set( 58 | repositories.flatMap((repository) => repository.topics?.map((topic) => topic.display) ?? []) 59 | ) 60 | ].sort((a, b) => parseInt(a.slice(4)) - parseInt(b.slice(4))); 61 | const topicOptions = uniqueTopics.map((topic) => ({ value: topic, label: IndexedTopics[topic] })); 62 | 63 | const loadMoreItems = () => setItems(items + itemsPerScroll); 64 | const hasMoreItems = items < filteredRepositories.length; 65 | 66 | return ( 67 | <main className="repoWrap"> 68 | <div className="grid-wrap"> 69 | <Grid> 70 | <Grid.Column span={{xsmall: 12, small: 12, medium: 12, large: 5, xlarge: 3}}> 71 | <Stack className="stack"> 72 | <LanguageFilter 73 | setSelectedLanguages={setSelectedLanguages} 74 | languageOptions={languageOptions} 75 | /> 76 | <SDGFilter setSelectedTopics={setSelectedTopics} topicOptions={topicOptions} /> 77 | </Stack> 78 | </Grid.Column> 79 | <Grid.Column className="repo-list-wrap" span={{xsmall: 12, small: 12, medium: 12, large: 7, xlarge: 9}}> 80 | <InfiniteScroll 81 | dataLength={items} 82 | next={loadMoreItems} 83 | hasMore={hasMoreItems} 84 | loader={<Loader />} 85 | > 86 | {filteredRepositories.slice(0, items).map((repository) => ( 87 | <RepositoryItem key={repository.id} repository={repository} /> 88 | ))} 89 | </InfiniteScroll> 90 | </Grid.Column> 91 | </Grid> 92 | </div> 93 | </main> 94 | ); 95 | }; 96 | -------------------------------------------------------------------------------- /components/RepositoryMetadata.tsx: -------------------------------------------------------------------------------- 1 | import { Repository } from "../types"; 2 | 3 | type RepositoryMetadataProps = { 4 | isIssueOpen: boolean; 5 | repositoryNumIssues: number; 6 | lastModified: Repository["last_modified"]; 7 | repositoryLang: Repository["language"]["display"]; 8 | repositoryTopics: Repository["topics"]; 9 | }; 10 | 11 | export const RepositoryMetadata = ({ 12 | repositoryNumIssues, 13 | lastModified, 14 | repositoryLang, 15 | repositoryTopics 16 | }: RepositoryMetadataProps) => { 17 | return ( 18 | <div className="repo-item__meta"> 19 | <div> 20 | Issues:{" "} 21 | <span> 22 | {repositoryNumIssues} 23 | {repositoryNumIssues >= 10 ? "+" : ""} 24 | </span> 25 | </div> 26 | 27 | <div> 28 | Language:{" "} 29 | <span> 30 | {repositoryLang} 31 | </span> 32 | </div> 33 | 34 | {repositoryTopics && repositoryTopics.length > 0 && <div> 35 | Label: 36 | <span> 37 | {repositoryTopics && repositoryTopics.map(topic => topic.display).join(', ')} 38 | </span> 39 | </div>} 40 | 41 | <div> 42 | Last activity: 43 | <span> 44 | {lastModified} 45 | </span> 46 | </div> 47 | </div> 48 | ); 49 | }; 50 | -------------------------------------------------------------------------------- /components/SDGFilter.tsx: -------------------------------------------------------------------------------- 1 | import Select from "react-select"; 2 | 3 | type SDGFilterProps = { 4 | setSelectedTopics: (topics: string[]) => void; 5 | topicOptions: { value: string; label: string }[]; 6 | }; 7 | 8 | export const SDGFilter = ({ setSelectedTopics, topicOptions }: SDGFilterProps) => { 9 | return ( 10 | <> 11 | <div> 12 | <label className="label">Sustainable Development Goal (SDG)</label> 13 | <Select 14 | isMulti 15 | className="" 16 | options={topicOptions} 17 | getOptionLabel={(option) => option.label} 18 | getOptionValue={(option) => option.value ?? ""} 19 | onChange={(selectedOptions) => 20 | setSelectedTopics(selectedOptions.map((option) => option.value ?? "")) 21 | } 22 | /> 23 | </div> 24 | </> 25 | ); 26 | }; 27 | -------------------------------------------------------------------------------- /constants.ts: -------------------------------------------------------------------------------- 1 | import { RepositorySortOrder } from "./types"; 2 | 3 | export const REPOSITORY_SORT_OPTIONS = [ 4 | RepositorySortOrder.LEAST_STARS, 5 | RepositorySortOrder.MOST_STARS, 6 | RepositorySortOrder.NONE 7 | ]; 8 | -------------------------------------------------------------------------------- /context/AppDataContext.tsx: -------------------------------------------------------------------------------- 1 | import React, { createContext, useState } from "react"; 2 | 3 | import data from "../generated.json"; 4 | import { AppData, CountableTag, Repository, RepositorySortOrder } from "../types"; 5 | 6 | const DEFAULT_VALUE: AppData = { 7 | languages: [], 8 | repositories: [], 9 | repositorySortOrder: RepositorySortOrder.NONE, 10 | topics: [], 11 | updateRepositorySortOrder: () => {} 12 | }; 13 | 14 | const AppDataContext = createContext<AppData>(DEFAULT_VALUE); 15 | 16 | const AppDataProvider = ({ children }: { children: React.ReactNode }) => { 17 | const { 18 | repositories: allRepositories, 19 | languages, 20 | topics 21 | }: { repositories: Repository[]; languages: CountableTag[]; topics: CountableTag[] } = data; 22 | const [repositories, setRepositories] = useState<Repository[]>(allRepositories); 23 | const [repositorySortOrder, setRepositorySortOrder] = useState<RepositorySortOrder>( 24 | RepositorySortOrder.NONE 25 | ); 26 | 27 | const updateRepositorySortOrder = (sortOrder: RepositorySortOrder) => { 28 | const isSetToDefaultSort = sortOrder === RepositorySortOrder.NONE; 29 | const shouldDeselect = !isSetToDefaultSort && sortOrder === repositorySortOrder; 30 | 31 | const finalSortOrder = shouldDeselect ? RepositorySortOrder.NONE : sortOrder; 32 | 33 | setRepositorySortOrder(finalSortOrder); 34 | updateRepositoriesOnSortChange(finalSortOrder); 35 | }; 36 | 37 | const updateRepositoriesOnSortChange = (sortOrder: RepositorySortOrder) => { 38 | let updatedRepositories: Repository[] = []; 39 | 40 | if (sortOrder === RepositorySortOrder.MOST_STARS) { 41 | updatedRepositories = [...allRepositories].sort((currentRepository, nextRepository) => { 42 | return nextRepository.stars - currentRepository.stars; 43 | }); 44 | } 45 | 46 | if (sortOrder === RepositorySortOrder.LEAST_STARS) { 47 | updatedRepositories = [...allRepositories].sort((currentRepository, nextRepository) => { 48 | return currentRepository.stars - nextRepository.stars; 49 | }); 50 | } 51 | 52 | if (sortOrder === RepositorySortOrder.NONE) { 53 | updatedRepositories = allRepositories; 54 | } 55 | 56 | setRepositories(updatedRepositories); 57 | }; 58 | 59 | const value = { 60 | languages, 61 | repositories, 62 | repositorySortOrder, 63 | topics, 64 | updateRepositorySortOrder 65 | }; 66 | 67 | return <AppDataContext.Provider value={value}>{children}</AppDataContext.Provider>; 68 | }; 69 | 70 | export { AppDataProvider, AppDataContext }; 71 | -------------------------------------------------------------------------------- /generate.ts: -------------------------------------------------------------------------------- 1 | import { Octokit } from "@octokit/core"; 2 | import { retry } from "@octokit/plugin-retry"; 3 | import { throttling } from "@octokit/plugin-throttling"; 4 | import { RequestOptions } from "@octokit/types"; 5 | import { buildSchema, GraphQLSchema, parse, validate as validateGraphQL } from "graphql"; 6 | import dayjs from "dayjs"; 7 | import fs from "fs"; 8 | import millify from "millify"; 9 | import slugify from "slugify"; 10 | 11 | import happycommits from "./happycommits.json"; 12 | import { 13 | CountableTag as CountableTagModel, 14 | Issue as IssueModel, 15 | Repository as RepositoryModel, 16 | Tag as TagModel 17 | } from "./types"; 18 | 19 | // Define interfaces for GitHub GraphQL types 20 | interface GithubRepository { 21 | id: string; 22 | name: string; 23 | owner: { 24 | login: string; 25 | }; 26 | isArchived: boolean; 27 | isDisabled: boolean; 28 | isPrivate: boolean; 29 | primaryLanguage: { 30 | id: string; 31 | name: string; 32 | } | null; 33 | stargazerCount: number; 34 | issues: { 35 | totalCount: number; 36 | edges: Array<{ 37 | node: GithubIssue; 38 | }> | null; 39 | }; 40 | pushedAt: string; 41 | licenseInfo: { 42 | name: string; 43 | } | null; 44 | description: string | null; 45 | url: string; 46 | repositoryTopics: { 47 | edges: Array<{ 48 | node: { 49 | topic: { 50 | name: string; 51 | id: string; 52 | }; 53 | }; 54 | }> | null; 55 | }; 56 | } 57 | 58 | interface GithubIssue { 59 | id: string; 60 | title: string; 61 | number: number; 62 | url: string; 63 | comments: { 64 | totalCount: number; 65 | }; 66 | createdAt: string; 67 | labels?: { 68 | edges: Array<{ 69 | node: { 70 | id: string; 71 | name: string; 72 | }; 73 | }> | null; 74 | }; 75 | } 76 | 77 | interface GraphQLResponse { 78 | search: { 79 | repositoryCount: number; 80 | edges: Array<{ 81 | node: GithubRepository; 82 | }>; 83 | }; 84 | } 85 | 86 | /** Number of repositories to query per request (max 100, but set to a smaller number to prevent timeouts) */ 87 | const REPOS_PER_REQUEST = 25; 88 | /** Maximum number of issues to retrieve per repository */ 89 | const MAX_ISSUES = 10; 90 | 91 | const validTopicNames = ['sdg-1', 'sdg-2', 'sdg-3', 'sdg-4', 'sdg-5', 'sdg-6', 'sdg-7', 'sdg-8', 'sdg-9', 'sdg-10', 'sdg-11', 'sdg-12', 'sdg-13', 'sdg-14', 'sdg-15', 'sdg-16', 'sdg-17']; 92 | 93 | // symbols to replace with slugify 94 | slugify.extend({ 95 | "#": "sharp", 96 | "+": "plus" 97 | }); 98 | 99 | // Setup Octokit (GitHub API client) 100 | const MyOctokit = Octokit.plugin(throttling, retry); 101 | const octokit = new MyOctokit({ 102 | auth: process.env.GH_PERSONAL_ACCESS_TOKEN, 103 | throttle: { 104 | onRateLimit: (retryAfter: number, options: object, octokit: Octokit, retryCount: number) => { 105 | const { method, url } = options as RequestOptions; 106 | octokit.log.warn(`Request quota exhausted for request ${method} ${url}`); 107 | 108 | if (retryCount < 1) { 109 | // only retries once 110 | octokit.log.info(`Retrying after ${retryAfter} seconds!`); 111 | return true; 112 | } 113 | }, 114 | onSecondaryRateLimit: ( 115 | retryAfter: number, 116 | options: object, 117 | octokit: Octokit, 118 | retryCount: number 119 | ) => { 120 | const { method, url } = options as RequestOptions; 121 | octokit.log.warn(`SecondaryRateLimit detected for request ${method} ${url}`); 122 | 123 | if (retryCount < 2) { 124 | // retries twice 125 | octokit.log.warn(`Retrying after ${retryAfter} seconds!`); 126 | return true; 127 | } 128 | } 129 | } 130 | }); 131 | 132 | /** 133 | * Retrieve a list of repositories by calling GitHub GraphQL API. 134 | */ 135 | const getRepositories = async ( 136 | repositories: string[], 137 | labels: string[] 138 | ): Promise<RepositoryModel[]> => { 139 | const searchQuery = [ 140 | ...repositories.map((repo) => `repo:${repo}`), 141 | "archived:false", 142 | "is:public", 143 | `pushed:>=${dayjs().add(-1, "month").format("YYYY-MM-DD")}` 144 | ].join(" "); 145 | 146 | const gqlQuery = ` 147 | query { 148 | search( 149 | query: "${searchQuery}" 150 | type: REPOSITORY 151 | first: 100 152 | ) { 153 | repositoryCount 154 | edges { 155 | node { 156 | ... on Repository { 157 | id 158 | name 159 | owner { 160 | login 161 | } 162 | isArchived 163 | isDisabled 164 | isPrivate 165 | primaryLanguage { 166 | id 167 | name 168 | } 169 | stargazerCount 170 | issues( 171 | states: OPEN 172 | filterBy: {labels: [${labels.map((label) => `"${label}"`).join(",")}]} 173 | orderBy: {field: CREATED_AT, direction: DESC} 174 | first: ${MAX_ISSUES} 175 | ) { 176 | totalCount 177 | edges { 178 | node { 179 | id 180 | title 181 | number 182 | url 183 | comments { 184 | totalCount 185 | } 186 | createdAt 187 | labels(first: 10) { 188 | edges { 189 | node { 190 | id 191 | name 192 | } 193 | } 194 | } 195 | } 196 | } 197 | } 198 | pushedAt 199 | licenseInfo { 200 | name 201 | } 202 | description 203 | url 204 | repositoryTopics(first: 20) { 205 | edges { 206 | node { 207 | topic { 208 | name 209 | id 210 | } 211 | } 212 | } 213 | } 214 | } 215 | } 216 | } 217 | } 218 | } 219 | `; 220 | 221 | // Create schema for validation 222 | const schema = buildSchema(` 223 | type Query { 224 | search(query: String!, type: SearchType!, first: Int!): SearchResultItemConnection! 225 | } 226 | 227 | enum SearchType { 228 | REPOSITORY 229 | } 230 | 231 | type SearchResultItemConnection { 232 | repositoryCount: Int! 233 | edges: [SearchResultItemEdge!]! 234 | } 235 | 236 | type SearchResultItemEdge { 237 | node: Repository! 238 | } 239 | 240 | type Repository { 241 | id: ID! 242 | name: String! 243 | owner: RepositoryOwner! 244 | isArchived: Boolean! 245 | isDisabled: Boolean! 246 | isPrivate: Boolean! 247 | primaryLanguage: Language 248 | stargazerCount: Int! 249 | issues(states: [IssueState!], filterBy: IssueFilters, orderBy: IssueOrder, first: Int!): IssueConnection! 250 | pushedAt: String! 251 | licenseInfo: License 252 | description: String 253 | url: String! 254 | repositoryTopics(first: Int!): RepositoryTopicConnection! 255 | } 256 | 257 | type RepositoryOwner { 258 | login: String! 259 | } 260 | 261 | type Language { 262 | id: ID! 263 | name: String! 264 | } 265 | 266 | type IssueConnection { 267 | totalCount: Int! 268 | edges: [IssueEdge!] 269 | } 270 | 271 | type IssueEdge { 272 | node: Issue! 273 | } 274 | 275 | type Issue { 276 | id: ID! 277 | title: String! 278 | number: Int! 279 | url: String! 280 | comments: IssueComments! 281 | createdAt: String! 282 | labels(first: Int!): LabelConnection 283 | } 284 | 285 | type IssueComments { 286 | totalCount: Int! 287 | } 288 | 289 | type LabelConnection { 290 | edges: [LabelEdge!] 291 | } 292 | 293 | type LabelEdge { 294 | node: Label! 295 | } 296 | 297 | type Label { 298 | id: ID! 299 | name: String! 300 | } 301 | 302 | type License { 303 | name: String! 304 | } 305 | 306 | type RepositoryTopicConnection { 307 | edges: [RepositoryTopicEdge!] 308 | } 309 | 310 | type RepositoryTopicEdge { 311 | node: RepositoryTopic! 312 | } 313 | 314 | type RepositoryTopic { 315 | topic: Topic! 316 | } 317 | 318 | type Topic { 319 | id: ID! 320 | name: String! 321 | } 322 | 323 | input IssueFilters { 324 | labels: [String!] 325 | } 326 | 327 | input IssueOrder { 328 | field: IssueOrderField! 329 | direction: OrderDirection! 330 | } 331 | 332 | enum IssueOrderField { 333 | CREATED_AT 334 | } 335 | 336 | enum OrderDirection { 337 | ASC 338 | DESC 339 | } 340 | 341 | enum IssueState { 342 | OPEN 343 | } 344 | `); 345 | 346 | const gqlQueryErrors = validateGraphQL(schema, parse(gqlQuery)); 347 | if (gqlQueryErrors.length > 0) { 348 | throw new Error( 349 | `GraphQL query is invalid:\n\t${gqlQueryErrors.map((error) => error.message).join("\n\t")}` 350 | ); 351 | } 352 | 353 | const searchResults = await octokit.graphql<GraphQLResponse>({ query: gqlQuery }); 354 | 355 | // map response data to our Repository model 356 | const repoData = searchResults.search.edges 357 | .map(({ node: repo }) => { 358 | if (!repo.primaryLanguage) return null; 359 | 360 | return { 361 | id: repo.id, 362 | owner: repo.owner.login, 363 | name: repo.name, 364 | description: repo.description ?? null, 365 | url: repo.url, 366 | stars: repo.stargazerCount, 367 | stars_display: millify(repo.stargazerCount), 368 | license: repo.licenseInfo?.name, 369 | last_modified: repo.pushedAt, 370 | language: { 371 | id: slugify(repo.primaryLanguage.name.toLowerCase()), 372 | display: repo.primaryLanguage.name 373 | }, 374 | topics: repo.repositoryTopics.edges 375 | ?.map((edge) => edge.node) 376 | .filter((topic) => validTopicNames.includes(topic.topic.name.toLowerCase())) 377 | .map((topic) => ({ 378 | id: slugify(topic.topic.name.toLowerCase()), 379 | display: topic.topic.name 380 | })) ?? [], 381 | issues: repo.issues.edges 382 | ?.map((edge) => edge.node) 383 | .map((issue) => ({ 384 | id: issue.id, 385 | number: issue.number, 386 | title: issue.title, 387 | url: issue.url, 388 | comments_count: issue.comments.totalCount, 389 | created_at: issue.createdAt, 390 | labels: issue.labels?.edges 391 | ?.map((edge) => edge.node) 392 | .map((label) => ({ 393 | id: slugify(label.name.toLowerCase()), 394 | display: label.name 395 | })) ?? [] 396 | })) 397 | .sort((a, b) => a.number - b.number) ?? [], 398 | has_new_issues: repo.issues.edges 399 | ?.map((edge) => edge.node) 400 | .some((issue) => dayjs().diff(dayjs(issue.createdAt), "day") <= 7) ?? false 401 | } as RepositoryModel; 402 | }) 403 | .filter((repo): repo is RepositoryModel => repo !== null); 404 | 405 | return repoData; 406 | }; 407 | 408 | [...new Set(happycommits.repositories)] 409 | .slice(0, process.env.NODE_ENV === "development" ? 200 : happycommits.repositories.length) 410 | .reduce((repoChunks: string[][], repo: string, index) => { 411 | const chunkIndex = Math.floor(index / REPOS_PER_REQUEST); 412 | if (!repoChunks[chunkIndex]) { 413 | repoChunks[chunkIndex] = []; 414 | } 415 | repoChunks[chunkIndex].push(repo); 416 | return repoChunks; 417 | }, []) 418 | .reduce<Promise<RepositoryModel[]>>(async (repoData, chunk, index, arr) => { 419 | return repoData.then(async (repos) => { 420 | console.log( 421 | `Getting repositories - chunk ${index + 1} of ${arr.length} (size: ${chunk.length})` 422 | ); 423 | const repositories = await getRepositories(chunk, happycommits.labels); 424 | 425 | await new Promise((resolve) => setTimeout(resolve, 1000)); 426 | 427 | return [...repos, ...repositories]; 428 | }); 429 | }, Promise.resolve([])) 430 | .then((repoData) => { 431 | const filterLanguages = Object.values( 432 | repoData.reduce((arr: { [key: string]: CountableTagModel }, repo: RepositoryModel) => { 433 | const { id, display } = repo.language; 434 | if (arr[id] === undefined) arr[id] = { id, display, count: 1 }; 435 | else arr[id].count++; 436 | return arr; 437 | }, {} as { [key: string]: CountableTagModel }) 438 | ) 439 | .filter((language) => language.count >= 1) 440 | .sort((a, b) => a.display.localeCompare(b.display)); 441 | 442 | const filterTopics = Object.values( 443 | repoData 444 | .filter((repo) => repo.topics !== undefined) 445 | .flatMap((repo) => repo.topics as TagModel[]) 446 | .reduce((arr: { [key: string]: CountableTagModel }, topic: TagModel) => { 447 | const { id, display } = topic; 448 | if (arr[id] === undefined) arr[id] = { id, display, count: 1 }; 449 | else arr[id].count++; 450 | return arr; 451 | }, {} as { [key: string]: CountableTagModel }) 452 | ) 453 | .filter((topic) => topic.count >= 1) 454 | .sort((a, b) => b.count - a.count); 455 | 456 | return { 457 | repositories: repoData.sort(() => Math.random() - 0.5), 458 | languages: filterLanguages, 459 | topics: filterTopics 460 | }; 461 | }) 462 | .then((data) => { 463 | fs.writeFileSync("./generated.json", JSON.stringify(data)); 464 | console.log("Generated generated.json"); 465 | 466 | const topics = data.repositories 467 | .filter((repo) => repo.topics !== undefined) 468 | .flatMap((repo) => repo.topics as TagModel[]) 469 | .map((topic) => topic.display); 470 | 471 | fs.writeFileSync("./topics.json", JSON.stringify(topics, null, 2)); 472 | console.log("Generated topics.json"); 473 | 474 | const sitemap = `<?xml version="1.0" encoding="UTF-8"?> 475 | <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 476 | <url> 477 | <loc>https://forgoodfirstissue.dev</loc> 478 | </url> 479 | ${data.languages 480 | .map( 481 | (language: CountableTagModel) => 482 | `<url><loc>https://forgoodfirstissue.dev/language/${language.id}</loc></url>` 483 | ) 484 | .join("")} 485 | ${data.topics 486 | .map( 487 | (topic: CountableTagModel) => 488 | `<url><loc>https://forgoodfirstissue.dev/topic/${topic.id}</loc></url>` 489 | ) 490 | .join("")} 491 | </urlset> 492 | `; 493 | 494 | fs.writeFileSync("./public/sitemap.xml", sitemap); 495 | console.log("Generated sitemap.xml"); 496 | }) 497 | .finally(() => { 498 | console.log("Data generation complete."); 499 | }) 500 | .catch((error: any) => { 501 | console.error(error); 502 | }); 503 | -------------------------------------------------------------------------------- /generated.json: -------------------------------------------------------------------------------- 1 | {"repositories":[{"id":"MDEwOlJlcG9zaXRvcnk0ODQxODU5OQ==","owner":"apache","name":"fineract","description":"Apache Fineract","url":"https://github.com/apache/fineract","stars":1047,"stars_display":"1K","license":"Apache License 2.0","last_modified":"2023-11-15T17:37:33Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk1NDYzMTc0NA==","owner":"Aam-Digital","name":"ndb-core","description":"Easy-to-use case management web app for NGOs anywhere in the world.","url":"https://github.com/Aam-Digital/ndb-core","stars":37,"stars_display":"37","license":"GNU General Public License v3.0","last_modified":"2023-11-15T17:11:17Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[{"id":"I_kwDOA0GdQM5I9B2l","number":1243,"title":"Make support panel accessible before login","url":"https://github.com/Aam-Digital/ndb-core/issues/1243","comments_count":1,"created_at":"2022-05-03T11:11:52Z","labels":[]},{"id":"I_kwDOA0GdQM5JC-Ib","number":1246,"title":"pin notes to top of list","url":"https://github.com/Aam-Digital/ndb-core/issues/1246","comments_count":0,"created_at":"2022-05-04T15:07:06Z","labels":[]},{"id":"I_kwDOA0GdQM5N3Fok","number":1373,"title":"UI should indicate that list only shows filtered results","url":"https://github.com/Aam-Digital/ndb-core/issues/1373","comments_count":0,"created_at":"2022-07-15T17:03:39Z","labels":[]},{"id":"I_kwDOA0GdQM5Q4iB_","number":1415,"title":"Add screen to add more authors and notes at end of \"record attendance\"","url":"https://github.com/Aam-Digital/ndb-core/issues/1415","comments_count":1,"created_at":"2022-08-31T08:34:22Z","labels":[]},{"id":"I_kwDOA0GdQM5Q58rj","number":1416,"title":"global search in toolbar for mobile screens","url":"https://github.com/Aam-Digital/ndb-core/issues/1416","comments_count":0,"created_at":"2022-08-31T13:48:21Z","labels":[]},{"id":"I_kwDOA0GdQM5ZaMT2","number":1595,"title":"Remove country icons and only show language abbreviation","url":"https://github.com/Aam-Digital/ndb-core/issues/1595","comments_count":0,"created_at":"2022-12-16T11:19:44Z","labels":[]},{"id":"I_kwDOA0GdQM5arSMz","number":1632,"title":"refactor dashboard widgets to build upon the generic dashboard-list-widget","url":"https://github.com/Aam-Digital/ndb-core/issues/1632","comments_count":0,"created_at":"2023-01-05T19:43:12Z","labels":[]},{"id":"I_kwDOA0GdQM5geo0P","number":1762,"title":"Click on Entity in disabled form should open details page","url":"https://github.com/Aam-Digital/ndb-core/issues/1762","comments_count":1,"created_at":"2023-03-10T09:31:11Z","labels":[]},{"id":"I_kwDOA0GdQM5lFwL-","number":1872,"title":"add new option from enum popup window","url":"https://github.com/Aam-Digital/ndb-core/issues/1872","comments_count":1,"created_at":"2023-05-04T13:23:18Z","labels":[]},{"id":"I_kwDOA0GdQM5sZ2mI","number":1942,"title":"Import Module: infer column mapping from column header names","url":"https://github.com/Aam-Digital/ndb-core/issues/1942","comments_count":0,"created_at":"2023-07-24T16:03:52Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNjkzMDQ0MzU=","owner":"OpenTermsArchive","name":"engine","description":"Tracks contractual documents and exposes changes to the terms of online services.","url":"https://github.com/OpenTermsArchive/engine","stars":89,"stars_display":"89","license":"European Union Public License 1.2","last_modified":"2023-10-25T15:15:22Z","language":{"id":"javascript","display":"JavaScript"},"topics":[{"id":"sdg-16","display":"sdg-16"},{"id":"sdg-9","display":"sdg-9"},{"id":"sdg-17","display":"sdg-17"}],"issues":[{"id":"I_kwDOEA1Cc85IRh3P","number":832,"title":"Improve documents validation message","url":"https://github.com/OpenTermsArchive/engine/issues/832","comments_count":3,"created_at":"2022-04-22T16:25:27Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNzMyOTczOTU=","owner":"Intelehealth","name":"Intelehealth-WebApp","description":null,"url":"https://github.com/Intelehealth/Intelehealth-WebApp","stars":12,"stars_display":"12","last_modified":"2023-11-15T08:06:17Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxMzQxNDMxODQ=","owner":"nordic-institute","name":"X-Road","description":"Source code of the X-Road® data exchange layer software","url":"https://github.com/nordic-institute/X-Road","stars":549,"stars_display":"549","license":"Other","last_modified":"2023-11-15T17:26:25Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[{"id":"I_kwDOB_7c0M5SX4NJ","number":1356,"title":"As a Security Specialist I want to study what open source tools could be used for automating X-Road security testing so that I know which tools are best suited for X-Road","url":"https://github.com/nordic-institute/X-Road/issues/1356","comments_count":0,"created_at":"2022-09-22T07:48:38Z","labels":[]},{"id":"I_kwDOB_7c0M5SX4OJ","number":1357,"title":"As a Product Owner I want that the memory allocated for Proxy component will be automatically adjusted at init phase of Security Server to correlate the amount of RAM memory to optimize the performance","url":"https://github.com/nordic-institute/X-Road/issues/1357","comments_count":0,"created_at":"2022-09-22T07:48:42Z","labels":[]},{"id":"I_kwDOB_7c0M5SX4RT","number":1359,"title":"As a Developer I want to change the Security Server installation so that the JNA library is installed to /usr/share/xroad/lib so that it wouldn't cause problems for users","url":"https://github.com/nordic-institute/X-Road/issues/1359","comments_count":0,"created_at":"2022-09-22T07:48:51Z","labels":[]},{"id":"I_kwDOB_7c0M5SX4SS","number":1360,"title":"As a Developer I want to analyse the Security Server proxy performance to find bottlenecks in the current code","url":"https://github.com/nordic-institute/X-Road/issues/1360","comments_count":2,"created_at":"2022-09-22T07:48:54Z","labels":[]},{"id":"I_kwDOB_7c0M5SX4TU","number":1361,"title":"As a product owner I want that message timestamping is refactored, so that it is more robust","url":"https://github.com/nordic-institute/X-Road/issues/1361","comments_count":0,"created_at":"2022-09-22T07:48:58Z","labels":[]},{"id":"I_kwDOB_7c0M5SX4Us","number":1362,"title":"As a Security Server Administrator I want the SO_LINGER timeout properties to work as they're documented so that I can configure socket closing behaviour based on my needs","url":"https://github.com/nordic-institute/X-Road/issues/1362","comments_count":0,"created_at":"2022-09-22T07:49:02Z","labels":[]},{"id":"I_kwDOB_7c0M5SX4WF","number":1363,"title":"As a Security Server user I want that X-Road metaservice codes are reserved so that the user can't overload them","url":"https://github.com/nordic-institute/X-Road/issues/1363","comments_count":0,"created_at":"2022-09-22T07:49:05Z","labels":[]},{"id":"I_kwDOB_7c0M5SX4Xi","number":1364,"title":"As a Developer I want that Ansible scripts support deployment of Icelandic Security Server so that it's automatized","url":"https://github.com/nordic-institute/X-Road/issues/1364","comments_count":0,"created_at":"2022-09-22T07:49:10Z","labels":[]},{"id":"I_kwDOB_7c0M5SX4Y0","number":1365,"title":"As a X-Road user I want that xroad-signer is profiled and possible bottlenecks are documented","url":"https://github.com/nordic-institute/X-Road/issues/1365","comments_count":0,"created_at":"2022-09-22T07:49:14Z","labels":[]},{"id":"I_kwDOB_7c0M5ab1YK","number":1477,"title":"As a Security Server Administrator I would like the Security Server to not return the Jetty version that is used so that automated scanners can't use it to discover a vulnerable version","url":"https://github.com/nordic-institute/X-Road/issues/1477","comments_count":0,"created_at":"2023-01-03T11:13:20Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk2NTkxNDA4Ng==","owner":"decidim","name":"decidim","description":"The participatory democracy framework. A generator and multiple gems made with Ruby on Rails","url":"https://github.com/decidim/decidim","stars":1339,"stars_display":"1.3K","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-15T15:11:03Z","language":{"id":"ruby","display":"Ruby"},"topics":[],"issues":[{"id":"MDU6SXNzdWU3NjkxMTAxNzU=","number":7034,"title":"NOT \"Enable rich text editor for participants\" + Proposal with template = text full of HTML tags","url":"https://github.com/decidim/decidim/issues/7034","comments_count":5,"created_at":"2020-12-16T17:06:41Z","labels":[]},{"id":"MDU6SXNzdWU3OTYwOTgxODU=","number":7246,"title":"Tooltip cards for user profiles not shown with sorting options","url":"https://github.com/decidim/decidim/issues/7246","comments_count":4,"created_at":"2021-01-28T15:16:37Z","labels":[]},{"id":"MDU6SXNzdWU4MTMzNDY4NTU=","number":7432,"title":"Add default order by ID on admin indexs","url":"https://github.com/decidim/decidim/issues/7432","comments_count":6,"created_at":"2021-02-22T10:07:04Z","labels":[]},{"id":"I_kwDOA-3E5s5SfMqi","number":9854,"title":"Private participants in public spaces ","url":"https://github.com/decidim/decidim/issues/9854","comments_count":4,"created_at":"2022-09-23T14:41:53Z","labels":[]},{"id":"I_kwDOA-3E5s5gxfvL","number":10552,"title":"Scope filter not working in Decidim 0.27.2","url":"https://github.com/decidim/decidim/issues/10552","comments_count":1,"created_at":"2023-03-14T14:21:17Z","labels":[]},{"id":"I_kwDOA-3E5s5nU2Gs","number":10933,"title":"404 after hiding a proposal from frontend","url":"https://github.com/decidim/decidim/issues/10933","comments_count":2,"created_at":"2023-05-31T07:00:24Z","labels":[]},{"id":"I_kwDOA-3E5s5ozzfY","number":11043,"title":"Prefer the usage of Duplicate instead of Copy in the Conference's copy feature","url":"https://github.com/decidim/decidim/issues/11043","comments_count":1,"created_at":"2023-06-15T09:22:18Z","labels":[]},{"id":"I_kwDOA-3E5s5qAlvB","number":11103,"title":"Request too large on initiative exports","url":"https://github.com/decidim/decidim/issues/11103","comments_count":1,"created_at":"2023-06-28T09:16:13Z","labels":[]},{"id":"I_kwDOA-3E5s5umVpQ","number":11489,"title":"Invalid chars in the name when login using OAuth","url":"https://github.com/decidim/decidim/issues/11489","comments_count":1,"created_at":"2023-08-17T18:58:59Z","labels":[]},{"id":"I_kwDOA-3E5s5wUap-","number":11567,"title":"Refactor the events specs to new format","url":"https://github.com/decidim/decidim/issues/11567","comments_count":0,"created_at":"2023-09-06T16:52:28Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyOTUyMTI5MDA=","owner":"truenas","name":"charts","description":"TrueNAS SCALE Apps Catalogs & Charts","url":"https://github.com/truenas/charts","stars":178,"stars_display":"178","license":"BSD 3-Clause \"New\" or \"Revised\" License","last_modified":"2023-11-15T18:03:32Z","language":{"id":"smarty","display":"Smarty"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk4MTU3NTc1OQ==","owner":"cboard-org","name":"cboard","description":"Augmentative and Alternative Communication (AAC) system with text-to-speech for the browser","url":"https://github.com/cboard-org/cboard","stars":614,"stars_display":"614","license":"GNU General Public License v3.0","last_modified":"2023-11-15T16:23:03Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[{"id":"MDU6SXNzdWU1NjE3MTQ2MTI=","number":628,"title":"Add filtering to the board lists on the communicator builder ","url":"https://github.com/cboard-org/cboard/issues/628","comments_count":3,"created_at":"2020-02-07T15:41:31Z","labels":[]},{"id":"MDU6SXNzdWU1ODkyNTY1NTQ=","number":665,"title":"Check boards exported from Cboard are successfully import on coughdrop ","url":"https://github.com/cboard-org/cboard/issues/665","comments_count":4,"created_at":"2020-03-27T16:35:17Z","labels":[]},{"id":"MDU6SXNzdWU4NjE0ODM2NDQ=","number":890,"title":"Feature: reordering elements in the output box","url":"https://github.com/cboard-org/cboard/issues/890","comments_count":3,"created_at":"2021-04-19T16:12:21Z","labels":[]},{"id":"MDU6SXNzdWU4NjE3ODg5NTY=","number":893,"title":"Feature: locked (always visible) row/column with basic phrases and emergency signals","url":"https://github.com/cboard-org/cboard/issues/893","comments_count":2,"created_at":"2021-04-19T19:46:49Z","labels":[]},{"id":"I_kwDOBNy_T85WUWo5","number":1294,"title":"Support hawkeye access application - IOS","url":"https://github.com/cboard-org/cboard/issues/1294","comments_count":1,"created_at":"2022-11-14T14:29:09Z","labels":[]},{"id":"I_kwDOBNy_T85eWedL","number":1354,"title":"Toggle password visibility","url":"https://github.com/cboard-org/cboard/issues/1354","comments_count":3,"created_at":"2023-02-13T19:44:00Z","labels":[]},{"id":"I_kwDOBNy_T85ohjHY","number":1508,"title":"Find a way to define Enviromental variables for Cordova builds","url":"https://github.com/cboard-org/cboard/issues/1508","comments_count":0,"created_at":"2023-06-12T21:29:41Z","labels":[]},{"id":"I_kwDOBNy_T85p_ubR","number":1515,"title":"\"Edit Tile\" dialog (modal window)","url":"https://github.com/cboard-org/cboard/issues/1515","comments_count":4,"created_at":"2023-06-28T06:42:53Z","labels":[]},{"id":"I_kwDOBNy_T85v5Vlr","number":1575,"title":"Add font size selector on PDF export","url":"https://github.com/cboard-org/cboard/issues/1575","comments_count":5,"created_at":"2023-09-01T12:04:30Z","labels":[]},{"id":"I_kwDOBNy_T852tDx1","number":1614,"title":"Add loading spinner on upload image","url":"https://github.com/cboard-org/cboard/issues/1614","comments_count":1,"created_at":"2023-11-13T21:34:52Z","labels":[]}],"has_new_issues":true},{"id":"R_kgDOHU9OKQ","owner":"google","name":"fhir-gateway","description":"A generic proxy server for applying access-control policies for a FHIR-store.","url":"https://github.com/google/fhir-gateway","stars":48,"stars_display":"48","license":"Other","last_modified":"2023-11-07T17:26:16Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNTEyODUyNjY=","owner":"kobotoolbox","name":"kobo-install","description":"A command-line installer for setting up and running KoboToolbox on a remote server or local computer, using kobo-docker.","url":"https://github.com/kobotoolbox/kobo-install","stars":153,"stars_display":"153","last_modified":"2023-11-14T15:42:31Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxODkzNTc0MA==","owner":"ifmeorg","name":"ifme","description":"Free, open source mental health communication web app to share experiences with loved ones","url":"https://github.com/ifmeorg/ifme","stars":1406,"stars_display":"1.4K","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-10T18:53:05Z","language":{"id":"ruby","display":"Ruby"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk2MTM5OTg0NQ==","owner":"synthetichealth","name":"synthea","description":"Synthetic Patient Population Simulator","url":"https://github.com/synthetichealth/synthea","stars":1869,"stars_display":"1.9K","license":"Apache License 2.0","last_modified":"2023-11-14T21:54:24Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[{"id":"MDU6SXNzdWUyNjU0MDg0MDc=","number":236,"title":"Medications prescribed before they were actually available","url":"https://github.com/synthetichealth/synthea/issues/236","comments_count":12,"created_at":"2017-10-13T20:21:45Z","labels":[]},{"id":"MDU6SXNzdWUyODM5NTI0NTc=","number":250,"title":"Generate Home Oxygen Qualified ","url":"https://github.com/synthetichealth/synthea/issues/250","comments_count":1,"created_at":"2017-12-21T17:29:51Z","labels":[]},{"id":"MDU6SXNzdWU0MTA4Njg2OTg=","number":476,"title":"CCDA Care Plan Goals and Activities","url":"https://github.com/synthetichealth/synthea/issues/476","comments_count":0,"created_at":"2019-02-15T17:23:47Z","labels":[]},{"id":"MDU6SXNzdWU0OTI4NDU4MTI=","number":570,"title":"Add \"resourceType\": \"ExplanationOfBenefit\" to CCDA export","url":"https://github.com/synthetichealth/synthea/issues/570","comments_count":0,"created_at":"2019-09-12T14:33:35Z","labels":[]},{"id":"I_kwDOA6jjJc4-Hfib","number":951,"title":"Python API","url":"https://github.com/synthetichealth/synthea/issues/951","comments_count":3,"created_at":"2021-11-02T10:39:48Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyODM1ODA1Nw==","owner":"unige-geohealth","name":"accessmod","description":"accessmod 5 : anisotropic accessibility analysis.","url":"https://github.com/unige-geohealth/accessmod","stars":34,"stars_display":"34","license":"GNU Lesser General Public License v3.0","last_modified":"2023-11-03T13:31:31Z","language":{"id":"r","display":"R"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzNDkwMzYzNTY=","owner":"BLSQ","name":"openhexa-app","description":"The OpenHexa app component","url":"https://github.com/BLSQ/openhexa-app","stars":10,"stars_display":"10","license":"MIT License","last_modified":"2023-11-14T14:56:07Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOGOHcLQ","owner":"undpindia","name":"dicra","description":"Data in Climate Resilient Agriculture (DiCRA) is a collaborative digital public good which provides open access to key geospatial datasets pertinent to climate resilient agriculture. These datasets are curated and validated through collaborative efforts of hundreds of data scientists and citizen scientists across the world.","url":"https://github.com/undpindia/dicra","stars":24,"stars_display":"24","license":"MIT License","last_modified":"2023-10-30T20:34:22Z","language":{"id":"jupyter-notebook","display":"Jupyter Notebook"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNDg0MDc5NTM=","owner":"rubyforgood","name":"casa","description":"Volunteer management system for nonprofit CASA, which serves foster youth in counties across America.","url":"https://github.com/rubyforgood/casa","stars":257,"stars_display":"257","license":"MIT License","last_modified":"2023-11-15T17:53:30Z","language":{"id":"ruby","display":"Ruby"},"topics":[],"issues":[{"id":"I_kwDODs5nkc5exEgk","number":4567,"title":"New Theme Landing Page Needs a javascript Required Warning","url":"https://github.com/rubyforgood/casa/issues/4567","comments_count":5,"created_at":"2023-02-17T20:26:26Z","labels":[]},{"id":"I_kwDODs5nkc5g8v7H","number":4666,"title":"Ability to lock cases for case contacts","url":"https://github.com/rubyforgood/casa/issues/4666","comments_count":13,"created_at":"2023-03-16T01:35:37Z","labels":[]},{"id":"I_kwDODs5nkc5tNdpt","number":5085,"title":"Replace Jest with Jasmine Javascript Testing Framework to the Project","url":"https://github.com/rubyforgood/casa/issues/5085","comments_count":8,"created_at":"2023-08-02T01:12:51Z","labels":[]},{"id":"I_kwDODs5nkc5uaCxv","number":5123,"title":"Bug: Flaky Test Did not Recieve Confirmation Text After Re-Sending an invitation to an Admin","url":"https://github.com/rubyforgood/casa/issues/5123","comments_count":1,"created_at":"2023-08-16T00:26:21Z","labels":[]},{"id":"I_kwDODs5nkc5uaGH7","number":5126,"title":"Bug: Flaky Test Unable to Find Warning Modal Before Attempting to Deactivate a Volunteer","url":"https://github.com/rubyforgood/casa/issues/5126","comments_count":2,"created_at":"2023-08-16T00:48:28Z","labels":[]},{"id":"I_kwDODs5nkc5v_DqR","number":5178,"title":"Make Double Language Add Error Message Full Width of Parent","url":"https://github.com/rubyforgood/casa/issues/5178","comments_count":9,"created_at":"2023-09-02T18:38:49Z","labels":[]},{"id":"I_kwDODs5nkc5yVEFS","number":5246,"title":"Allow Supervisors and Admins to See Learning Hours","url":"https://github.com/rubyforgood/casa/issues/5246","comments_count":5,"created_at":"2023-09-28T19:19:28Z","labels":[]},{"id":"I_kwDODs5nkc52lQd_","number":5348,"title":"Update \"3. Enter Contact Details\" section on Case contact form","url":"https://github.com/rubyforgood/casa/issues/5348","comments_count":5,"created_at":"2023-11-12T16:29:49Z","labels":[]},{"id":"I_kwDODs5nkc52u17n","number":5362,"title":"Bug: Volunteer Address not showing for Supervisors and Admins","url":"https://github.com/rubyforgood/casa/issues/5362","comments_count":6,"created_at":"2023-11-14T04:56:22Z","labels":[]},{"id":"I_kwDODs5nkc527E_S","number":5370,"title":"Learning Hours for the Seeder","url":"https://github.com/rubyforgood/casa/issues/5370","comments_count":0,"created_at":"2023-11-15T17:13:07Z","labels":[]}],"has_new_issues":true},{"id":"R_kgDOHjY3CA","owner":"tillioss","name":"tilli-web-app","description":"Our 3 modules (and even the modules you create in the Tilli IDE) can be accessed or reviewed with a Web browser over the World Wide Web on any mobile device. You can play/test our game here: https://tilli.teqbahn.com/tilli-web","url":"https://github.com/tillioss/tilli-web-app","stars":1,"stars_display":"1","license":"GNU Affero General Public License v3.0","last_modified":"2023-10-31T16:11:51Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[{"id":"I_kwDOHjY3CM5yywaQ","number":67,"title":"Remove the commented-out code snippets in the DropToSelection.js","url":"https://github.com/tillioss/tilli-web-app/issues/67","comments_count":1,"created_at":"2023-10-04T10:35:53Z","labels":[]}],"has_new_issues":false},{"id":"R_kgDOJ-5jJA","owner":"rubyforgood","name":"pet-rescue","description":"Pet Rescue is an application making it easy to link adopters/fosters with pets. We work with grassroots pet rescue organizations to understand how we can make the most impact.","url":"https://github.com/rubyforgood/pet-rescue","stars":18,"stars_display":"18","license":"MIT License","last_modified":"2023-11-14T13:59:57Z","language":{"id":"html","display":"HTML"},"topics":[],"issues":[{"id":"I_kwDOJ-5jJM5x_QUs","number":188,"title":"Remove extra links in the footer that aren't being used","url":"https://github.com/rubyforgood/pet-rescue/issues/188","comments_count":5,"created_at":"2023-09-25T23:09:04Z","labels":[]},{"id":"I_kwDOJ-5jJM5yC1ht","number":194,"title":"Remove unused top-nav elements that we aren't using yet","url":"https://github.com/rubyforgood/pet-rescue/issues/194","comments_count":3,"created_at":"2023-09-26T11:55:04Z","labels":[]},{"id":"I_kwDOJ-5jJM5zaYJK","number":254,"title":"Add a Contributions section to the Readme","url":"https://github.com/rubyforgood/pet-rescue/issues/254","comments_count":1,"created_at":"2023-10-10T21:28:42Z","labels":[]},{"id":"I_kwDOJ-5jJM5zbf1t","number":256,"title":"Staff can create, edit, delete, mark complete checklist items","url":"https://github.com/rubyforgood/pet-rescue/issues/256","comments_count":9,"created_at":"2023-10-11T01:14:56Z","labels":[]},{"id":"I_kwDOJ-5jJM5zbhRL","number":257,"title":"Staff can view checklist on pets show - tasks tab and interact with it","url":"https://github.com/rubyforgood/pet-rescue/issues/257","comments_count":8,"created_at":"2023-10-11T01:18:47Z","labels":[]},{"id":"I_kwDOJ-5jJM5zblku","number":259,"title":"Staff can upload and remove images for a pet","url":"https://github.com/rubyforgood/pet-rescue/issues/259","comments_count":6,"created_at":"2023-10-11T01:34:46Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNDI5MTI2NzE=","owner":"terraframe","name":"geoprism-registry","description":"GeoPrism Registry is a system for curating interlinked data through time. It's the first framework implementing the Common Geo-Registry specification.","url":"https://github.com/terraframe/geoprism-registry","stars":16,"stars_display":"16","license":"GNU Lesser General Public License v3.0","last_modified":"2023-10-31T16:11:49Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk0OTk3NjkzOQ==","owner":"learningequality","name":"kolibri","description":"Kolibri Learning Platform: the offline app for universal education","url":"https://github.com/learningequality/kolibri","stars":653,"stars_display":"653","license":"MIT License","last_modified":"2023-11-15T16:34:47Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[{"id":"I_kwDOAvqWa85x_vMw","number":11301,"title":"Linting does not pick up on badly formatted string objects","url":"https://github.com/learningequality/kolibri/issues/11301","comments_count":5,"created_at":"2023-09-26T01:42:51Z","labels":[]},{"id":"I_kwDOAvqWa85yV0gN","number":11316,"title":"Python 3.12 Support","url":"https://github.com/learningequality/kolibri/issues/11316","comments_count":3,"created_at":"2023-09-28T21:54:03Z","labels":[]},{"id":"I_kwDOAvqWa85yZL_k","number":11328,"title":"Replace KResponsiveWindow mixin by useKResponsiveWindow composable - Pdf Viewer plugin","url":"https://github.com/learningequality/kolibri/issues/11328","comments_count":4,"created_at":"2023-09-29T12:42:24Z","labels":[]},{"id":"I_kwDOAvqWa85yZPJM","number":11331,"title":"Replace KResponsiveWindow mixin by useKResponsiveWindow composable - Slideshow Viewer plugin","url":"https://github.com/learningequality/kolibri/issues/11331","comments_count":13,"created_at":"2023-09-29T12:51:22Z","labels":[]},{"id":"I_kwDOAvqWa85y1xTi","number":11350,"title":"Intermittent KeyError when handling a finished future in the task worker","url":"https://github.com/learningequality/kolibri/issues/11350","comments_count":3,"created_at":"2023-10-04T17:44:10Z","labels":[]},{"id":"I_kwDOAvqWa85zCq8P","number":11361,"title":"Add guidelines for rebasing `develop` branch to `release-v*` to Kolibri Developer Documentation","url":"https://github.com/learningequality/kolibri/issues/11361","comments_count":4,"created_at":"2023-10-06T12:32:25Z","labels":[]},{"id":"I_kwDOAvqWa850fkaO","number":11441,"title":"Android LOD - Library - The tooltip 'Remove pin from my library page' remains visible","url":"https://github.com/learningequality/kolibri/issues/11441","comments_count":2,"created_at":"2023-10-20T14:40:54Z","labels":[]},{"id":"I_kwDOAvqWa8508WRe","number":11458,"title":"Ensure \"Enter\" key press functions the same as a \"continue\" button click on all steps of the setup wizard","url":"https://github.com/learningequality/kolibri/issues/11458","comments_count":3,"created_at":"2023-10-25T18:16:50Z","labels":[]},{"id":"I_kwDOAvqWa851F3-Q","number":11465,"title":"Pressing enter to submit the Super Admin creation form in the Setup Wizard does not make form validation warnings visible","url":"https://github.com/learningequality/kolibri/issues/11465","comments_count":3,"created_at":"2023-10-26T22:41:41Z","labels":[]},{"id":"I_kwDOAvqWa851Lwbh","number":11471,"title":"Update top bar and bottom navigation appear and hide according to spec","url":"https://github.com/learningequality/kolibri/issues/11471","comments_count":0,"created_at":"2023-10-27T18:37:04Z","labels":[]}],"has_new_issues":false},{"id":"R_kgDOH_u9Kg","owner":"BLSQ","name":"iaso","description":"Georegistry + Data Collection + Microplanning","url":"https://github.com/BLSQ/iaso","stars":19,"stars_display":"19","license":"MIT License","last_modified":"2023-11-15T17:03:24Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk4MjMyMTE4NA==","owner":"OpenLMIS","name":"openlmis-ref-distro","description":"OpenLMIS v3+ Reference Distribution. Last mile health commodity information system.","url":"https://github.com/OpenLMIS/openlmis-ref-distro","stars":58,"stars_display":"58","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-08T15:29:25Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOJh-HgQ","owner":"CodeYourFuture","name":"curriculum","description":"The CYF Curriculum website","url":"https://github.com/CodeYourFuture/curriculum","stars":4,"stars_display":"4","last_modified":"2023-11-11T08:45:12Z","language":{"id":"html","display":"HTML"},"topics":[{"id":"sdg-4","display":"sdg-4"}],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNTI4Nzg0NDg=","owner":"chaynHQ","name":"soulmedicine","description":"Soul Medicine a multilingual digital service designed to deliver critical information in bite-sized pieces.","url":"https://github.com/chaynHQ/soulmedicine","stars":31,"stars_display":"31","license":"MIT License","last_modified":"2023-11-11T14:15:37Z","language":{"id":"ruby","display":"Ruby"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk0MDgzOTk4NTQ=","owner":"esatya","name":"rahat-contracts","description":null,"url":"https://github.com/esatya/rahat-contracts","stars":2,"stars_display":"2","license":"GNU Lesser General Public License v3.0","last_modified":"2023-10-24T11:19:52Z","language":{"id":"solidity","display":"Solidity"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNTA0MjI2OTY=","owner":"opensrp","name":"opensrp-server-core","description":"OpenSRP Server Core Module","url":"https://github.com/opensrp/opensrp-server-core","stars":7,"stars_display":"7","license":"Other","last_modified":"2023-11-14T12:34:10Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[{"id":"MDU6SXNzdWU1Mzg4ODE4Nzc=","number":123,"title":"Record details for users who create edit publish plans ","url":"https://github.com/opensrp/opensrp-server-core/issues/123","comments_count":0,"created_at":"2019-12-17T07:13:49Z","labels":[]},{"id":"MDU6SXNzdWU3NDA1MTQ1MTE=","number":357,"title":"Fix Flaky unit tests ","url":"https://github.com/opensrp/opensrp-server-core/issues/357","comments_count":0,"created_at":"2020-11-11T06:47:20Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk2Njk0MDUyMA==","owner":"dhis2","name":"dhis2-core","description":"DHIS 2 Core. Written in Java. Contains the service layer and Web API.","url":"https://github.com/dhis2/dhis2-core","stars":264,"stars_display":"264","license":"BSD 3-Clause \"New\" or \"Revised\" License","last_modified":"2023-11-15T13:40:39Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyMjM5MTg4NDQ=","owner":"NMF-earth","name":"nmf-app","description":"Understand and reduce your carbon footprint 🌱 iOS & Android.","url":"https://github.com/NMF-earth/nmf-app","stars":452,"stars_display":"452","license":"GNU General Public License v3.0","last_modified":"2023-11-04T19:35:30Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNjk4ODIx","owner":"medic","name":"cht-core","description":"The CHT Core Framework makes it faster to build responsive, offline-first digital health apps that equip health workers to provide better care in their communities. It is a central resource of the Community Health Toolkit.","url":"https://github.com/medic/cht-core","stars":421,"stars_display":"421","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-15T16:01:25Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[{"id":"I_kwDOACkuRc5jx_3n","number":8189,"title":"Convert app management add/edit user modal to a page","url":"https://github.com/medic/cht-core/issues/8189","comments_count":8,"created_at":"2023-04-19T01:52:37Z","labels":[]},{"id":"I_kwDOACkuRc5lOD-C","number":8220,"title":"CI \"Publish for testing\" is failing","url":"https://github.com/medic/cht-core/issues/8220","comments_count":2,"created_at":"2023-05-05T20:54:14Z","labels":[]},{"id":"I_kwDOACkuRc5qAyYj","number":8348,"title":"Adding error object to logger in sentinel/server.js","url":"https://github.com/medic/cht-core/issues/8348","comments_count":1,"created_at":"2023-06-28T09:46:12Z","labels":[]},{"id":"I_kwDOACkuRc5rkPoK","number":8395,"title":"Upgrade page - Increase the delay before displaying the \"interrupted\" warning","url":"https://github.com/medic/cht-core/issues/8395","comments_count":1,"created_at":"2023-07-14T10:51:43Z","labels":[]},{"id":"I_kwDOACkuRc5x9-5I","number":8585,"title":"Asterisk for required field in form located on new line when in `summary` group","url":"https://github.com/medic/cht-core/issues/8585","comments_count":0,"created_at":"2023-09-25T18:37:25Z","labels":[]},{"id":"I_kwDOACkuRc5ynbta","number":8605,"title":"Show URL when done running k3d script","url":"https://github.com/medic/cht-core/issues/8605","comments_count":0,"created_at":"2023-10-02T23:00:16Z","labels":[]},{"id":"I_kwDOACkuRc5y_mqT","number":8617,"title":"Remove or correct invalid setting from example configs","url":"https://github.com/medic/cht-core/issues/8617","comments_count":1,"created_at":"2023-10-06T00:57:39Z","labels":[]},{"id":"I_kwDOACkuRc5z_GDl","number":8645,"title":"Add versioning to service-worker cache","url":"https://github.com/medic/cht-core/issues/8645","comments_count":0,"created_at":"2023-10-16T19:14:57Z","labels":[]},{"id":"I_kwDOACkuRc50pChz","number":8657,"title":"Delete transition code in telemetry service","url":"https://github.com/medic/cht-core/issues/8657","comments_count":0,"created_at":"2023-10-23T11:08:45Z","labels":[]},{"id":"I_kwDOACkuRc50soix","number":8660,"title":"Link to Contact's Profile from Messages tab","url":"https://github.com/medic/cht-core/issues/8660","comments_count":3,"created_at":"2023-10-23T19:12:56Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxMDg5MTEwNzY=","owner":"mojaloop","name":"central-ledger","description":"Central Ledger hosted by a scheme to record and settle transfers","url":"https://github.com/mojaloop/central-ledger","stars":30,"stars_display":"30","license":"Other","last_modified":"2023-11-15T11:57:02Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxMDE5MTg4NQ==","owner":"openMF","name":"community-app","description":"This is the default web application built on top of the Apache Fineract platform. The Mifos X Web App (formerly called Community App) is maintained by the Mifos Initiative as a reference solution for the financial inclusion community. It is a Single-Page App (SPA) written in web standard technologies like JavaScript, CSS and HTML5. It leverages common popular frameworks/libraries such as AngularJS 1.5, Bootstrap and Font Awesome","url":"https://github.com/openMF/community-app","stars":307,"stars_display":"307","license":"Mozilla Public License 2.0","last_modified":"2023-11-06T12:12:56Z","language":{"id":"html","display":"HTML"},"topics":[],"issues":[{"id":"MDU6SXNzdWU1MTI5OTk0MzI=","number":3125,"title":"Test Issue","url":"https://github.com/openMF/community-app/issues/3125","comments_count":2,"created_at":"2019-10-27T17:58:06Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNzcxNTg0NDc=","owner":"openkfw","name":"TruBudget","description":"A blockchain-based workflow tool for efficient and transparent project management","url":"https://github.com/openkfw/TruBudget","stars":73,"stars_display":"73","license":"GNU General Public License v3.0","last_modified":"2023-11-15T13:23:10Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[{"id":"MDU6SXNzdWU0NTYyMDU2NjM=","number":328,"title":"api: Make user.intent.(grant/revoke/list)Permission global","url":"https://github.com/openkfw/TruBudget/issues/328","comments_count":0,"created_at":"2019-06-14T11:45:33Z","labels":[]},{"id":"MDU6SXNzdWU1Mjg3NTMxMTI=","number":408,"title":"ui: Preview and confirmation dialog should use the same executeactions saga","url":"https://github.com/openkfw/TruBudget/issues/408","comments_count":0,"created_at":"2019-11-26T14:15:20Z","labels":[]},{"id":"MDU6SXNzdWU3NjAwOTY3NDA=","number":686,"title":"[TECHNICAL] api: Eslint setup for import rules to mimic TypeScript Hero VS Code extension","url":"https://github.com/openkfw/TruBudget/issues/686","comments_count":1,"created_at":"2020-12-09T07:56:19Z","labels":[]},{"id":"MDU6SXNzdWU5MzcwOTY2Mzc=","number":878,"title":"Adding a link \"forgot your passeword?\" on the login screen","url":"https://github.com/openkfw/TruBudget/issues/878","comments_count":0,"created_at":"2021-07-05T13:30:13Z","labels":[]},{"id":"MDU6SXNzdWU5MzcxMDQ0NjI=","number":879,"title":"Add avatars to users","url":"https://github.com/openkfw/TruBudget/issues/879","comments_count":0,"created_at":"2021-07-05T13:39:54Z","labels":[]},{"id":"MDU6SXNzdWU5Mzk3MTYyNDQ=","number":887,"title":"Increase the size of User.ID field (currently 32-char) to 64-char","url":"https://github.com/openkfw/TruBudget/issues/887","comments_count":0,"created_at":"2021-07-08T10:32:46Z","labels":[]},{"id":"I_kwDOCo85L85GEKHm","number":1055,"title":"Provide Tag and Filter for Sub-Projects and Workflow-Items","url":"https://github.com/openkfw/TruBudget/issues/1055","comments_count":2,"created_at":"2022-03-21T14:47:18Z","labels":[]},{"id":"I_kwDOCo85L85IALal","number":1106,"title":"API custom errors in domain layer contain wrong type (intend/event mixing) SP 1","url":"https://github.com/openkfw/TruBudget/issues/1106","comments_count":1,"created_at":"2022-04-19T08:50:32Z","labels":[]},{"id":"I_kwDOCo85L85Li4z3","number":1190,"title":"Update project issue","url":"https://github.com/openkfw/TruBudget/issues/1190","comments_count":1,"created_at":"2022-06-10T11:47:18Z","labels":[]},{"id":"I_kwDOCo85L85Nr5RH","number":1228,"title":"Default currency in dashboard view","url":"https://github.com/openkfw/TruBudget/issues/1228","comments_count":0,"created_at":"2022-07-13T12:16:32Z","labels":[]}],"has_new_issues":false},{"id":"R_kgDOIiI0YQ","owner":"Bioverse-Labs","name":"forest-map-app","description":"Environmental mapping tool.","url":"https://github.com/Bioverse-Labs/forest-map-app","stars":0,"stars_display":"0","license":"MIT License","last_modified":"2023-11-03T00:34:08Z","language":{"id":"dart","display":"Dart"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzNjY0MTI5NTU=","owner":"govdirectory","name":"website","description":"Website repository for Govdirectory - a crowdsourced and fact-checked directory of official governmental online accounts and services.","url":"https://github.com/govdirectory/website","stars":32,"stars_display":"32","license":"Creative Commons Zero v1.0 Universal","last_modified":"2023-11-15T09:39:37Z","language":{"id":"html","display":"HTML"},"topics":[],"issues":[{"id":"MDU6SXNzdWU5NDA1MzEwMzA=","number":31,"title":"Investigate what social media the wikidata bots runs for ","url":"https://github.com/govdirectory/website/issues/31","comments_count":5,"created_at":"2021-07-09T08:13:28Z","labels":[]},{"id":"MDU6SXNzdWU5NDEyMDY1MTc=","number":33,"title":"Investigating hosting govdirectory.org on Wikimedia Cloud","url":"https://github.com/govdirectory/website/issues/33","comments_count":1,"created_at":"2021-07-10T08:50:13Z","labels":[]},{"id":"MDU6SXNzdWU5NDEyMzY3ODY=","number":37,"title":"Get complete coverage of Swedish agencies","url":"https://github.com/govdirectory/website/issues/37","comments_count":9,"created_at":"2021-07-10T12:02:58Z","labels":[]},{"id":"MDU6SXNzdWU5ODE4MDY4NjY=","number":98,"title":"Add fallback for head of an institution","url":"https://github.com/govdirectory/website/issues/98","comments_count":0,"created_at":"2021-08-28T11:03:14Z","labels":[]},{"id":"I_kwDOFdcEm848ZD16","number":134,"title":"\"Led by\" should take \"office held by head of government\" into account","url":"https://github.com/govdirectory/website/issues/134","comments_count":6,"created_at":"2021-10-01T10:55:53Z","labels":[]},{"id":"I_kwDOFdcEm848Zd0l","number":136,"title":"Add a maskable icon","url":"https://github.com/govdirectory/website/issues/136","comments_count":2,"created_at":"2021-10-01T12:52:34Z","labels":[]},{"id":"I_kwDOFdcEm85ThS66","number":249,"title":"Add a read more on Wikipedia button to country pages","url":"https://github.com/govdirectory/website/issues/249","comments_count":5,"created_at":"2022-10-07T14:07:02Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyMjc4NzE2NzM=","owner":"cdsframework","name":"ice","description":"Immunization Calculation Engine (ICE) Service","url":"https://github.com/cdsframework/ice","stars":9,"stars_display":"9","license":"Other","last_modified":"2023-11-03T23:18:34Z","language":{"id":"rich-text-format","display":"Rich Text Format"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxMzI1MTYxODQ=","owner":"simpledotorg","name":"simple-server","description":"The web app behind Simple.org","url":"https://github.com/simpledotorg/simple-server","stars":65,"stars_display":"65","license":"MIT License","last_modified":"2023-11-15T15:19:05Z","language":{"id":"ruby","display":"Ruby"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk3Mjg0OTQ2NA==","owner":"primeroIMS","name":"primero","description":"Primero is an application designed to help child protection workers and social workers in humanitarian and development contexts manage data on vulnerable children and survivors of violence. Please carefully read our LICENSE. If you would like access to the CPIMS+ and GBVIMS+ configurations, please contact: childprotectioninnovation@gmail.com ","url":"https://github.com/primeroIMS/primero","stars":44,"stars_display":"44","license":"Other","last_modified":"2023-11-15T14:57:20Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNjUwODEzNQ==","owner":"farmOS","name":"farmOS","description":"farmOS: A web-based farm record keeping application.","url":"https://github.com/farmOS/farmOS","stars":766,"stars_display":"766","license":"GNU General Public License v2.0","last_modified":"2023-11-12T07:56:26Z","language":{"id":"php","display":"PHP"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNzQ4ODI1OTI=","owner":"GovTechSG","name":"purple-hats","description":"Purple HATS is a customisable, automated web accessibility testing tool that allows software development teams to find and fix accessibility problems to improve persons with disabilities (PWDs) access to digital services.","url":"https://github.com/GovTechSG/purple-hats","stars":55,"stars_display":"55","license":"MIT License","last_modified":"2023-11-15T07:26:25Z","language":{"id":"ejs","display":"EJS"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNjg1Mjc2NTI=","owner":"glific","name":"glific","description":"The Main application that provides the core interface via the glific APIs","url":"https://github.com/glific/glific","stars":151,"stars_display":"151","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-15T16:05:41Z","language":{"id":"elixir","display":"Elixir"},"topics":[],"issues":[{"id":"I_kwDOEAFoJM51v8Ck","number":3177,"title":"Registration: Error message for existing account","url":"https://github.com/glific/glific/issues/3177","comments_count":0,"created_at":"2023-11-03T05:53:32Z","labels":[]},{"id":"I_kwDOEAFoJM51wk_Q","number":3180,"title":"Login:Error_handling_forgot_password","url":"https://github.com/glific/glific/issues/3180","comments_count":0,"created_at":"2023-11-03T08:30:40Z","labels":[]}],"has_new_issues":false},{"id":"R_kgDOGbaYqQ","owner":"TIP-Global-Health","name":"eheza-app","description":null,"url":"https://github.com/TIP-Global-Health/eheza-app","stars":3,"stars_display":"3","license":"Apache License 2.0","last_modified":"2023-11-14T21:40:55Z","language":{"id":"elm","display":"Elm"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk1MTkwMTI2NQ==","owner":"Intelehealth","name":"Android-Mobile-Client","description":"Intelehealth's Android Client","url":"https://github.com/Intelehealth/Android-Mobile-Client","stars":30,"stars_display":"30","license":"Mozilla Public License 2.0","last_modified":"2023-11-15T15:23:52Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNDI5NTk0MTM=","owner":"Open-Attestation","name":"open-attestation","description":"Meta framework for providing digital provenance and integrity to documents.","url":"https://github.com/Open-Attestation/open-attestation","stars":44,"stars_display":"44","license":"Apache License 2.0","last_modified":"2023-10-27T06:41:27Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOIMZT8A","owner":"datakind","name":"Data-Observation-Toolkit","description":"The Data Observation Toolkit (DOT) can be used to monitor data in order to flag problems with data integrity and scenarios that might need attention. ","url":"https://github.com/datakind/Data-Observation-Toolkit","stars":21,"stars_display":"21","license":"MIT License","last_modified":"2023-10-26T17:49:56Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyMzM3ODU1MTI=","owner":"mosip","name":"commons","description":"This repository contains common utilities and services used by other MOSIP modules","url":"https://github.com/mosip/commons","stars":8,"stars_display":"8","license":"Mozilla Public License 2.0","last_modified":"2023-11-15T05:25:28Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNTI2MTA4Mg==","owner":"healthsites","name":"healthsites","description":"Building an open data commons of health facility data with OpenStreetMap","url":"https://github.com/healthsites/healthsites","stars":135,"stars_display":"135","license":"Other","last_modified":"2023-11-02T14:39:23Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzNDY0MDkwODA=","owner":"intrahealth","name":"gofr","description":"Global Open Facility Registry (GOFR)","url":"https://github.com/intrahealth/gofr","stars":6,"stars_display":"6","license":"Apache License 2.0","last_modified":"2023-11-15T17:16:23Z","language":{"id":"glsl","display":"GLSL"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxODg2NDEzNA==","owner":"openMF","name":"android-client","description":"An android client for the MifosX platform","url":"https://github.com/openMF/android-client","stars":185,"stars_display":"185","license":"Mozilla Public License 2.0","last_modified":"2023-11-05T17:59:52Z","language":{"id":"kotlin","display":"Kotlin"},"topics":[],"issues":[{"id":"MDU6SXNzdWUyOTU0NTk0NDM=","number":851,"title":"Inconsistent charge fragment behavior","url":"https://github.com/openMF/android-client/issues/851","comments_count":1,"created_at":"2018-02-08T10:30:16Z","labels":[]},{"id":"MDU6SXNzdWUyOTU1NTIzMDY=","number":856,"title":"Toggle text on mode change","url":"https://github.com/openMF/android-client/issues/856","comments_count":1,"created_at":"2018-02-08T15:22:44Z","labels":[]},{"id":"MDU6SXNzdWU1NjIxNDIzOTM=","number":1296,"title":"\"All\" option in Spinner not updating the search result","url":"https://github.com/openMF/android-client/issues/1296","comments_count":1,"created_at":"2020-02-09T08:29:48Z","labels":[]},{"id":"MDU6SXNzdWU1OTkxMjYwMTE=","number":1501,"title":"App crashes when clicked on calendar textview twice while creating new client","url":"https://github.com/openMF/android-client/issues/1501","comments_count":2,"created_at":"2020-04-13T20:45:52Z","labels":[]},{"id":"MDU6SXNzdWU3NDMzMDM5MzM=","number":1559,"title":"Invalid toast in absence of internet connectivity while loading client info.","url":"https://github.com/openMF/android-client/issues/1559","comments_count":2,"created_at":"2020-11-15T17:29:42Z","labels":[]},{"id":"MDU6SXNzdWU3Njk5MTA3NzI=","number":1640,"title":"Invalid text in path tracker error ","url":"https://github.com/openMF/android-client/issues/1640","comments_count":2,"created_at":"2020-12-17T11:37:21Z","labels":[]},{"id":"MDU6SXNzdWU4MDAzODgyMjE=","number":1744,"title":"Improper text of Add payment details button in Payment Details","url":"https://github.com/openMF/android-client/issues/1744","comments_count":5,"created_at":"2021-02-03T14:34:50Z","labels":[]},{"id":"MDU6SXNzdWU4MDgwMDM2OTI=","number":1772,"title":"Error handling missing in GroupDetails","url":"https://github.com/openMF/android-client/issues/1772","comments_count":1,"created_at":"2021-02-14T17:21:17Z","labels":[]},{"id":"I_kwDOAR_YBs4_ugLQ","number":1861,"title":"Multiple empty extension functions declared and used, needs to be replaced.","url":"https://github.com/openMF/android-client/issues/1861","comments_count":1,"created_at":"2021-12-02T05:46:03Z","labels":[]},{"id":"I_kwDOAR_YBs5wz8uO","number":2041,"title":"Project Cleanup","url":"https://github.com/openMF/android-client/issues/2041","comments_count":0,"created_at":"2023-09-12T14:37:57Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzMDk3MjEwNTg=","owner":"JanssenProject","name":"jans","description":"An open source enterprise digital identity platform that scales: Janssen is a distribution of standards-based, developer friendly, components that are engineered to work together in any cloud. #OAuth #OpenID #FIDO","url":"https://github.com/JanssenProject/jans","stars":305,"stars_display":"305","license":"Apache License 2.0","last_modified":"2023-11-15T17:21:20Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[{"id":"I_kwDOEnX34s5geve8","number":4120,"title":"fix(docs): javadoc comments are inconsistent with code","url":"https://github.com/JanssenProject/jans/issues/4120","comments_count":10,"created_at":"2023-03-10T09:51:40Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk0NTM1NzcyNA==","owner":"huridocs","name":"uwazi","description":"Uwazi is a web-based, open-source solution for building and sharing document collections","url":"https://github.com/huridocs/uwazi","stars":202,"stars_display":"202","license":"MIT License","last_modified":"2023-11-15T15:21:04Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzNzI4MTk4NjU=","owner":"statisticsnorway","name":"statbus","description":"STATistical BUSiness register","url":"https://github.com/statisticsnorway/statbus","stars":3,"stars_display":"3","license":"Other","last_modified":"2023-11-15T15:10:03Z","language":{"id":"csharp","display":"C#"},"topics":[],"issues":[{"id":"I_kwDOFjjHmc5ccG1N","number":72,"title":"Configure linting rules","url":"https://github.com/statisticsnorway/statbus/issues/72","comments_count":0,"created_at":"2023-01-20T13:45:11Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk0NTk0NzAwMQ==","owner":"devgateway","name":"amp","description":"Aid Management Platform","url":"https://github.com/devgateway/amp","stars":7,"stars_display":"7","license":"GNU General Public License v3.0","last_modified":"2023-11-15T16:47:26Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk5MTc3ODc1OQ==","owner":"opencrvs","name":"opencrvs-core","description":"A global solution to civil registration","url":"https://github.com/opencrvs/opencrvs-core","stars":72,"stars_display":"72","license":"Other","last_modified":"2023-11-15T14:29:26Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNjU5MzM1MzA=","owner":"I-TECH-UW","name":"OpenELIS-Global-2","description":"OpenELIS 2.X is a rewrite of the original OpenELIS global with updated components and technology","url":"https://github.com/I-TECH-UW/OpenELIS-Global-2","stars":25,"stars_display":"25","license":"Mozilla Public License 2.0","last_modified":"2023-11-15T17:32:24Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[{"id":"I_kwDOCePx2s52NaG3","number":585,"title":"Add missing translation in the new React FrontEnd","url":"https://github.com/I-TECH-UW/OpenELIS-Global-2/issues/585","comments_count":19,"created_at":"2023-11-08T10:07:51Z","labels":[]}],"has_new_issues":true},{"id":"MDEwOlJlcG9zaXRvcnkxMDk4NjcyMTI=","owner":"getodk","name":"central","description":"ODK Central is a server that is easy to use, very fast, and stuffed with features that make data collection easier. Contribute and make the world a better place! ✨🗄✨","url":"https://github.com/getodk/central","stars":105,"stars_display":"105","license":"Apache License 2.0","last_modified":"2023-11-01T15:38:15Z","language":{"id":"shell","display":"Shell"},"topics":[],"issues":[{"id":"I_kwDOBoxwzM4-51IL","number":260,"title":"Additional XForm validation","url":"https://github.com/getodk/central/issues/260","comments_count":2,"created_at":"2021-11-16T21:23:02Z","labels":[]},{"id":"I_kwDOBoxwzM5Kkz2i","number":285,"title":"nginx healthcheck fails for HTTPS port other than 443","url":"https://github.com/getodk/central/issues/285","comments_count":2,"created_at":"2022-05-27T19:01:42Z","labels":[]},{"id":"I_kwDOBoxwzM5aylMC","number":376,"title":"Don't log service logs to ~/.pm2/logs/","url":"https://github.com/getodk/central/issues/376","comments_count":1,"created_at":"2023-01-06T21:43:47Z","labels":[]},{"id":"I_kwDOBoxwzM5vqQ4N","number":472,"title":"On the homepage \"Show x total” isn’t highlighted by the tab key navigation","url":"https://github.com/getodk/central/issues/472","comments_count":0,"created_at":"2023-08-30T10:01:18Z","labels":[]},{"id":"I_kwDOBoxwzM5v31En","number":474,"title":"Not only CSV extensions are linked to Entity lists.","url":"https://github.com/getodk/central/issues/474","comments_count":0,"created_at":"2023-09-01T07:33:08Z","labels":[]},{"id":"I_kwDOBoxwzM5z-agU","number":524,"title":"Review State filter does not update after locale change","url":"https://github.com/getodk/central/issues/524","comments_count":0,"created_at":"2023-10-16T17:29:36Z","labels":[]}],"has_new_issues":false},{"id":"R_kgDOHR-jTg","owner":"epiverse-trace","name":"finalsize","description":"R package to calculate the final size of an SIR epidemic in populations with heterogeneity in social contacts and disease susceptibility","url":"https://github.com/epiverse-trace/finalsize","stars":8,"stars_display":"8","license":"Other","last_modified":"2023-10-30T11:55:27Z","language":{"id":"r","display":"R"},"topics":[],"issues":[{"id":"I_kwDOHR-jTs5TtXVW","number":68,"title":"Move finalsize specific element from solver function to main finalsize() function","url":"https://github.com/epiverse-trace/finalsize/issues/68","comments_count":14,"created_at":"2022-10-11T10:29:29Z","labels":[]},{"id":"I_kwDOHR-jTs5bXXt4","number":126,"title":"Add brief explaination about the matrix operations","url":"https://github.com/epiverse-trace/finalsize/issues/126","comments_count":5,"created_at":"2023-01-13T20:11:56Z","labels":[]},{"id":"I_kwDOHR-jTs5sGEm5","number":176,"title":"Describe the underlying maths and numerical implementations in vignette","url":"https://github.com/epiverse-trace/finalsize/issues/176","comments_count":6,"created_at":"2023-07-20T09:12:34Z","labels":[]}],"has_new_issues":false},{"id":"R_kgDOGLXBLA","owner":"chaynHQ","name":"bloom-frontend","description":"Code for the for the frontend of the Bloom service.","url":"https://github.com/chaynHQ/bloom-frontend","stars":6,"stars_display":"6","license":"MIT License","last_modified":"2023-11-15T13:36:51Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[{"id":"I_kwDOGLXBLM5wavU8","number":580,"title":"Bump word-wrap from 1.2.3 to 1.2.4","url":"https://github.com/chaynHQ/bloom-frontend/issues/580","comments_count":0,"created_at":"2023-09-07T14:52:07Z","labels":[]},{"id":"I_kwDOGLXBLM5wavlr","number":581,"title":"Bump @grpc/grpc-js from 1.4.4 to 1.8.20","url":"https://github.com/chaynHQ/bloom-frontend/issues/581","comments_count":0,"created_at":"2023-09-07T14:52:45Z","labels":[]},{"id":"I_kwDOGLXBLM5waxgo","number":582,"title":"Bump protobufjs from 6.11.3 to 6.11.4","url":"https://github.com/chaynHQ/bloom-frontend/issues/582","comments_count":3,"created_at":"2023-09-07T14:57:17Z","labels":[]},{"id":"I_kwDOGLXBLM5yXW9z","number":609,"title":"Bump tough-cookie from 4.0.0 to 4.1.3","url":"https://github.com/chaynHQ/bloom-frontend/issues/609","comments_count":5,"created_at":"2023-09-29T07:16:25Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNzUwNzIx","owner":"ckan","name":"ckan","description":"CKAN is an open-source DMS (data management system) for powering data hubs and data portals. CKAN makes it easy to publish, share and use data. It powers catalog.data.gov, open.canada.ca/data, data.humdata.org among many other sites.","url":"https://github.com/ckan/ckan","stars":4084,"stars_display":"4.1K","license":"Other","last_modified":"2023-11-15T14:46:44Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzNzU5NTMyOTk=","owner":"akrosinc","name":"reveal-client","description":"Official Mobile client for Reveal implementations","url":"https://github.com/akrosinc/reveal-client","stars":2,"stars_display":"2","license":"Apache License 2.0","last_modified":"2023-11-04T06:46:33Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk2MTI2Nzc1","owner":"ushahidi","name":"platform","description":"Ushahidi Platform API version 3+","url":"https://github.com/ushahidi/platform","stars":655,"stars_display":"655","license":"Other","last_modified":"2023-11-15T05:48:07Z","language":{"id":"php","display":"PHP"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOKCedbA","owner":"credebl","name":"platform","description":"Open source, Open standards based Decentralised Identity & Verifiable Credentials Platform","url":"https://github.com/credebl/platform","stars":21,"stars_display":"21","license":"Apache License 2.0","last_modified":"2023-11-15T11:50:37Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk4OTAzNTQ2MQ==","owner":"rubyforgood","name":"human-essentials","description":"Human Essentials is an inventory management system for diaper, incontinence, and period-supply banks. It supports them in distributing to partners, tracking inventory, and reporting stats and analytics.","url":"https://github.com/rubyforgood/human-essentials","stars":386,"stars_display":"386","license":"MIT License","last_modified":"2023-11-15T05:04:34Z","language":{"id":"ruby","display":"Ruby"},"topics":[{"id":"sdg-3","display":"sdg-3"},{"id":"sdg-1","display":"sdg-1"},{"id":"sdg-10","display":"sdg-10"}],"issues":[{"id":"I_kwDOBU6Sxc5f-qJU","number":3432,"title":"Allow banks to skip partner approval process on an opt-in basis","url":"https://github.com/rubyforgood/human-essentials/issues/3432","comments_count":6,"created_at":"2023-03-05T16:13:16Z","labels":[]},{"id":"I_kwDOBU6Sxc5kI6fb","number":3556,"title":"[Investigation] Look into removing Cocoon","url":"https://github.com/rubyforgood/human-essentials/issues/3556","comments_count":2,"created_at":"2023-04-23T15:03:54Z","labels":[]},{"id":"I_kwDOBU6Sxc5kv4hH","number":3571,"title":"Update Invitation/Reset Emails","url":"https://github.com/rubyforgood/human-essentials/issues/3571","comments_count":6,"created_at":"2023-05-01T02:36:57Z","labels":[]},{"id":"I_kwDOBU6Sxc5l3STd","number":3595,"title":"[Exploration] Figure out what wicked gives us vis a vis the partner profile form","url":"https://github.com/rubyforgood/human-essentials/issues/3595","comments_count":1,"created_at":"2023-05-14T16:00:07Z","labels":[]},{"id":"I_kwDOBU6Sxc5pCwwl","number":3670,"title":"Adjustments for banks that have a different fiscal year","url":"https://github.com/rubyforgood/human-essentials/issues/3670","comments_count":16,"created_at":"2023-06-18T14:53:43Z","labels":[]},{"id":"I_kwDOBU6Sxc5pstT6","number":3687,"title":"[Bug] Inventory imports should prevent modifying already-existing inventory","url":"https://github.com/rubyforgood/human-essentials/issues/3687","comments_count":4,"created_at":"2023-06-25T14:50:26Z","labels":[]},{"id":"I_kwDOBU6Sxc5pst8p","number":3689,"title":"Check *All* the possible cases of double-clicks on submit-ish buttons","url":"https://github.com/rubyforgood/human-essentials/issues/3689","comments_count":4,"created_at":"2023-06-25T14:55:16Z","labels":[]},{"id":"I_kwDOBU6Sxc5rBCug","number":3729,"title":"Wider spread of dates on requests, distributions, purchases, donations in the seed, including some more than 1 week ago.","url":"https://github.com/rubyforgood/human-essentials/issues/3729","comments_count":0,"created_at":"2023-07-09T14:53:57Z","labels":[]},{"id":"I_kwDOBU6Sxc5s7uU4","number":3789,"title":"[BUG]: Password complexity requirements unclear","url":"https://github.com/rubyforgood/human-essentials/issues/3789","comments_count":1,"created_at":"2023-07-29T18:42:38Z","labels":[]},{"id":"I_kwDOBU6Sxc5tkViN","number":3813,"title":"Each tab on Items and Inventory should show only the content for that tab","url":"https://github.com/rubyforgood/human-essentials/issues/3813","comments_count":0,"created_at":"2023-08-06T15:05:07Z","labels":[]}],"has_new_issues":false},{"id":"R_kgDOIS8n6g","owner":"PolicyEngine","name":"policyengine-app","description":"PolicyEngine's free web app for computing the impact of public policy.","url":"https://github.com/PolicyEngine/policyengine-app","stars":25,"stars_display":"25","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-11T21:40:55Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[{"id":"I_kwDOIS8n6s50bkrw","number":752,"title":"Remove space after hyperlinked text in blog posts","url":"https://github.com/PolicyEngine/policyengine-app/issues/752","comments_count":8,"created_at":"2023-10-20T02:27:12Z","labels":[]},{"id":"I_kwDOIS8n6s50cR7p","number":753,"title":"Spacing issue on homepage action buttons","url":"https://github.com/PolicyEngine/policyengine-app/issues/753","comments_count":1,"created_at":"2023-10-20T05:40:54Z","labels":[]},{"id":"I_kwDOIS8n6s50e1FE","number":757,"title":"Homepage headline doesn't fit in box on mobile","url":"https://github.com/PolicyEngine/policyengine-app/issues/757","comments_count":0,"created_at":"2023-10-20T12:57:31Z","labels":[]},{"id":"I_kwDOIS8n6s50iGRE","number":759,"title":"Chart `Download` button/dropdown is in the left pane","url":"https://github.com/PolicyEngine/policyengine-app/issues/759","comments_count":4,"created_at":"2023-10-20T22:48:05Z","labels":[]},{"id":"I_kwDOIS8n6s50i1_4","number":760,"title":"Organization logos are hard to read on US site","url":"https://github.com/PolicyEngine/policyengine-app/issues/760","comments_count":0,"created_at":"2023-10-21T03:57:01Z","labels":[]},{"id":"I_kwDOIS8n6s50jmkd","number":767,"title":"Calculator button in the header doesn't work on mobile ","url":"https://github.com/PolicyEngine/policyengine-app/issues/767","comments_count":1,"created_at":"2023-10-21T13:18:30Z","labels":[]},{"id":"I_kwDOIS8n6s50tVEz","number":772,"title":"Homepage newsletter subscription button does nothing","url":"https://github.com/PolicyEngine/policyengine-app/issues/772","comments_count":3,"created_at":"2023-10-23T21:18:27Z","labels":[]},{"id":"I_kwDOIS8n6s50uMZL","number":775,"title":"On the Reproduce in Python page, the left arrow button is slightly further right","url":"https://github.com/PolicyEngine/policyengine-app/issues/775","comments_count":0,"created_at":"2023-10-24T00:47:55Z","labels":[]},{"id":"I_kwDOIS8n6s50uQ3V","number":776,"title":"Link to Open Collective is not a true link, disabling right-click options","url":"https://github.com/PolicyEngine/policyengine-app/issues/776","comments_count":1,"created_at":"2023-10-24T01:10:58Z","labels":[]},{"id":"I_kwDOIS8n6s5013Wz","number":814,"title":"Subscribe button hover effect doesn't work at particular breakpoint","url":"https://github.com/PolicyEngine/policyengine-app/issues/814","comments_count":2,"created_at":"2023-10-25T00:05:35Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk1OTYxMTE3MQ==","owner":"openMF","name":"mifos-mobile","description":"Repository for the Mifos Mobile Banking App for clients","url":"https://github.com/openMF/mifos-mobile","stars":232,"stars_display":"232","license":"Mozilla Public License 2.0","last_modified":"2023-11-14T19:38:49Z","language":{"id":"kotlin","display":"Kotlin"},"topics":[],"issues":[{"id":"MDU6SXNzdWU0MTUzMzYxMzc=","number":1075,"title":"Consistent UI for Apply for Loan with no internet.","url":"https://github.com/openMF/mifos-mobile/issues/1075","comments_count":4,"created_at":"2019-02-27T21:31:16Z","labels":[]},{"id":"MDU6SXNzdWU1NjA4MDc0Mjk=","number":1318,"title":"Improve Registration UI, and add required instructions for credentials. like essential character for valid password","url":"https://github.com/openMF/mifos-mobile/issues/1318","comments_count":5,"created_at":"2020-02-06T06:28:57Z","labels":[]},{"id":"MDU6SXNzdWU2MzQyMzA4NzY=","number":1495,"title":"Switching between fields for filling information","url":"https://github.com/openMF/mifos-mobile/issues/1495","comments_count":1,"created_at":"2020-06-08T06:32:00Z","labels":[]},{"id":"MDU6SXNzdWU3ODA4MzcxMjc=","number":1680,"title":"Incorrect logic in LoanApplicationFragment.kt","url":"https://github.com/openMF/mifos-mobile/issues/1680","comments_count":1,"created_at":"2021-01-06T20:47:32Z","labels":[]},{"id":"I_kwDOA42YI85L7QBi","number":1861,"title":"Update dependencies versions and make neccessary changes afterwards","url":"https://github.com/openMF/mifos-mobile/issues/1861","comments_count":4,"created_at":"2022-06-16T16:40:20Z","labels":[]},{"id":"I_kwDOA42YI85d1ag-","number":1913,"title":"Toasts are set to english even after changing the language","url":"https://github.com/openMF/mifos-mobile/issues/1913","comments_count":12,"created_at":"2023-02-07T12:58:22Z","labels":[]},{"id":"I_kwDOA42YI85ePcjM","number":1918,"title":"Even selecting dark mode, register screen was in light mode","url":"https://github.com/openMF/mifos-mobile/issues/1918","comments_count":6,"created_at":"2023-02-12T03:44:03Z","labels":[]},{"id":"I_kwDOA42YI85zvYsr","number":2366,"title":"Required Other Language Translations(Hindi, Kannada, French, etc) for strings which exists in strings.xml (en)","url":"https://github.com/openMF/mifos-mobile/issues/2366","comments_count":2,"created_at":"2023-10-13T11:52:24Z","labels":[]},{"id":"I_kwDOA42YI850T-g8","number":2412,"title":"Feat: Implement Shimmer while user details are being loaded","url":"https://github.com/openMF/mifos-mobile/issues/2412","comments_count":15,"created_at":"2023-10-19T06:31:32Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzNzA1MTMxNzg=","owner":"Global-Policy-Lab","name":"cider","description":null,"url":"https://github.com/Global-Policy-Lab/cider","stars":14,"stars_display":"14","license":"BSD 2-Clause \"Simplified\" License","last_modified":"2023-11-03T17:31:53Z","language":{"id":"jupyter-notebook","display":"Jupyter Notebook"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxMjQxNTA2Mzk=","owner":"drivendataorg","name":"zamba","description":"A Python package for identifying 42 kinds of animals, training custom models, and estimating distance from camera trap videos","url":"https://github.com/drivendataorg/zamba","stars":78,"stars_display":"78","license":"MIT License","last_modified":"2023-10-22T17:49:24Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[{"id":"I_kwDOB2Zjb848idrw","number":122,"title":"Add tests for splits and bad video data","url":"https://github.com/drivendataorg/zamba/issues/122","comments_count":3,"created_at":"2021-10-04T21:50:26Z","labels":[]},{"id":"I_kwDOB2Zjb849uw2-","number":154,"title":"Add hardware_dependent_fields to ZambaBaseModel's Config","url":"https://github.com/drivendataorg/zamba/issues/154","comments_count":0,"created_at":"2021-10-25T23:42:48Z","labels":[]},{"id":"I_kwDOB2Zjb85HO5nz","number":183,"title":"Standardize default for model_cache_dir across repo","url":"https://github.com/drivendataorg/zamba/issues/183","comments_count":0,"created_at":"2022-04-06T19:38:49Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk1MTg3OTc2","owner":"openmrs","name":"openmrs-core","description":"OpenMRS API and web application code","url":"https://github.com/openmrs/openmrs-core","stars":1265,"stars_display":"1.3K","license":"Other","last_modified":"2023-11-14T18:15:57Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOH0oJWg","owner":"ushahidi","name":"platform-client-mzima","description":null,"url":"https://github.com/ushahidi/platform-client-mzima","stars":3,"stars_display":"3","license":"Other","last_modified":"2023-11-15T15:38:51Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxOTQ0Njc2ODg=","owner":"intelligent-environments-lab","name":"CityLearn","description":"Official reinforcement learning environment for demand response and load shaping","url":"https://github.com/intelligent-environments-lab/CityLearn","stars":383,"stars_display":"383","license":"MIT License","last_modified":"2023-11-12T21:58:28Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxODY0MjMz","owner":"frappe","name":"erpnext","description":"Free and Open Source Enterprise Resource Planning (ERP)","url":"https://github.com/frappe/erpnext","stars":15246,"stars_display":"15.2K","license":"GNU General Public License v3.0","last_modified":"2023-11-15T12:33:24Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[{"id":"MDU6SXNzdWU5MjY1MDk3OTc=","number":26136,"title":"erpnext.stock.get_item_details.get_item_tax_info this method always returns 404 error Version 13.5.1","url":"https://github.com/frappe/erpnext/issues/26136","comments_count":3,"created_at":"2021-06-21T19:06:51Z","labels":[]},{"id":"I_kwDOABxyKc5i8bjN","number":34794,"title":"Auto populate Party information in Payment Entry when creating PE from Supplier/Customer Dashboard","url":"https://github.com/frappe/erpnext/issues/34794","comments_count":0,"created_at":"2023-04-09T21:26:36Z","labels":[]},{"id":"I_kwDOABxyKc5jNBm7","number":34834,"title":"Error while submitting internal sales invoice","url":"https://github.com/frappe/erpnext/issues/34834","comments_count":1,"created_at":"2023-04-12T11:14:52Z","labels":[]},{"id":"I_kwDOABxyKc5jR3qe","number":34837,"title":"Multi Company - Wrong company address in documents","url":"https://github.com/frappe/erpnext/issues/34837","comments_count":0,"created_at":"2023-04-13T03:31:24Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyODU4OTIyMTk=","owner":"google","name":"fhir-data-pipes","description":"A collection of tools for extracting FHIR resources and analytics services on top of that data.","url":"https://github.com/google/fhir-data-pipes","stars":102,"stars_display":"102","license":"Apache License 2.0","last_modified":"2023-11-15T09:58:26Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[{"id":"MDU6SXNzdWU3MDIwMTQ5Mjk=","number":19,"title":"Add enough unit-tests to reach 80% coverage.","url":"https://github.com/google/fhir-data-pipes/issues/19","comments_count":3,"created_at":"2020-09-15T15:07:32Z","labels":[]},{"id":"I_kwDOEQpee85RWqKu","number":281,"title":"Evaluate Gradle","url":"https://github.com/google/fhir-data-pipes/issues/281","comments_count":0,"created_at":"2022-09-07T16:08:08Z","labels":[]},{"id":"I_kwDOEQpee85SBvVV","number":288,"title":"Separate writing from reading/processing resources","url":"https://github.com/google/fhir-data-pipes/issues/288","comments_count":3,"created_at":"2022-09-16T16:51:28Z","labels":[]},{"id":"I_kwDOEQpee85XiiOO","number":420,"title":"Update controller UI and replace the spinner.","url":"https://github.com/google/fhir-data-pipes/issues/420","comments_count":0,"created_at":"2022-11-29T20:41:06Z","labels":[]},{"id":"I_kwDOEQpee85ZeBgS","number":452,"title":"Add an option to fetch all FHIR patient related resources","url":"https://github.com/google/fhir-data-pipes/issues/452","comments_count":0,"created_at":"2022-12-17T00:22:46Z","labels":[]},{"id":"I_kwDOEQpee85ZeKQy","number":453,"title":"Evaluate and possibly integrate an IPython notebook environment in the single machine package","url":"https://github.com/google/fhir-data-pipes/issues/453","comments_count":1,"created_at":"2022-12-17T01:22:40Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNDcyNzg=","owner":"dimagi","name":"commcare-hq","description":"CommCareHQ is the server backend for CommCare, the world's largest platform for designing, managing, and deploying robust, offline-first, mobile applications to frontline workers worldwide","url":"https://github.com/dimagi/commcare-hq","stars":472,"stars_display":"472","license":"BSD 3-Clause \"New\" or \"Revised\" License","last_modified":"2023-11-15T15:34:35Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxMzY5MTEzNTU=","owner":"Altinn","name":"altinn-studio","description":"Next generation open source Altinn platform and applications.","url":"https://github.com/Altinn/altinn-studio","stars":98,"stars_display":"98","license":"BSD 3-Clause \"New\" or \"Revised\" License","last_modified":"2023-11-15T17:22:41Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOHBFcNA","owner":"BLSQ","name":"openhexa-frontend","description":"NextJS frontend for OpenHexa","url":"https://github.com/BLSQ/openhexa-frontend","stars":1,"stars_display":"1","license":"MIT License","last_modified":"2023-11-14T14:55:15Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyMTEzODM3Nzc=","owner":"Zenysis","name":"Harmony","description":"The Harmony Analytics Platform (Harmony), developed by Zenysis Technologies, helps make sense of messy data by transforming, cleaning and enriching data from multiple sources. https://www.zenysis.com/#harmony","url":"https://github.com/Zenysis/Harmony","stars":25,"stars_display":"25","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-14T12:52:41Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNzY0NDk0ODE=","owner":"openimis","name":"openimis-dist_dkr","description":"The \"all in one\" packaged openIMIS (docker-compose)","url":"https://github.com/openimis/openimis-dist_dkr","stars":7,"stars_display":"7","license":"Other","last_modified":"2023-10-18T14:18:27Z","language":{"id":"shell","display":"Shell"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzMTMzNzM1Mw==","owner":"kobotoolbox","name":"kpi","description":"kpi is the (frontend) server for KoboToolbox. It includes an API for users to access data and manage their forms, question library, sharing settings, create reports, and export data. ","url":"https://github.com/kobotoolbox/kpi","stars":114,"stars_display":"114","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-15T17:42:11Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxMzQzMzc4NTA=","owner":"openMF","name":"web-app","description":"Mifos X Web App is the revamped version of the Mifos X Community App built on top of the Fineract Platform leveraging the popular Angular framework.","url":"https://github.com/openMF/web-app","stars":172,"stars_display":"172","license":"Mozilla Public License 2.0","last_modified":"2023-11-15T17:57:34Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNDQ5Nzc0OQ==","owner":"kobotoolbox","name":"kobocat","description":"Our (backend) server for providing blank forms to Collect and Enketo and for receiving and storing submissions. ","url":"https://github.com/kobotoolbox/kobocat","stars":110,"stars_display":"110","license":"BSD 2-Clause \"Simplified\" License","last_modified":"2023-11-14T16:20:25Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzNDkwMjY2NjM=","owner":"BLSQ","name":"openhexa-notebooks","description":"The OpenHexa notebooks component","url":"https://github.com/BLSQ/openhexa-notebooks","stars":4,"stars_display":"4","license":"MIT License","last_modified":"2023-11-14T14:58:08Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzNTAyMzQ5MDk=","owner":"Sunbird-RC","name":"sunbird-rc-core","description":"Electronic Registries and Verifiable Credentials","url":"https://github.com/Sunbird-RC/sunbird-rc-core","stars":19,"stars_display":"19","license":"MIT License","last_modified":"2023-11-15T13:06:06Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNTUxMDI1NA==","owner":"openfisca","name":"openfisca-core","description":"OpenFisca core engine. See other repositories for countries-specific code & data.","url":"https://github.com/openfisca/openfisca-core","stars":155,"stars_display":"155","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-13T17:08:52Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkzMDA1Njg0MzI=","owner":"egovernments","name":"DIVOC","description":"Open source digital platform for large scale vaccination and digital credentialing programs. Built for India scale, addresses future vaccination scenarios, digital credentialing, and beyond.","url":"https://github.com/egovernments/DIVOC","stars":163,"stars_display":"163","license":"MIT License","last_modified":"2023-10-18T12:41:47Z","language":{"id":"javascript","display":"JavaScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyODI3MTc3","owner":"openforis","name":"collect","description":"Flexible tool for creating surveys of any type","url":"https://github.com/openforis/collect","stars":49,"stars_display":"49","license":"MIT License","last_modified":"2023-11-10T22:08:25Z","language":{"id":"java","display":"Java"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOGMzuHg","owner":"chaynHQ","name":"bloom-backend","description":"Code for the backend / API of the Bloom service","url":"https://github.com/chaynHQ/bloom-backend","stars":7,"stars_display":"7","license":"MIT License","last_modified":"2023-11-10T18:37:21Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[{"id":"I_kwDOGMzuHs5yYvNp","number":321,"title":"Bump @nestjs/core from 8.0.11 to 9.0.5","url":"https://github.com/chaynHQ/bloom-backend/issues/321","comments_count":4,"created_at":"2023-09-29T11:18:19Z","labels":[]}],"has_new_issues":false},{"id":"R_kgDOGYr5WA","owner":"OpenTermsArchive","name":"contrib-declarations","description":"Documents added by volunteer contributors and historically imported from TOSBack.org. Maintenance is collaborative and volunteer-based.","url":"https://github.com/OpenTermsArchive/contrib-declarations","stars":3,"stars_display":"3","license":"European Union Public License 1.2","last_modified":"2023-10-28T15:22:17Z","language":{"id":"javascript","display":"JavaScript"},"topics":[{"id":"sdg-16","display":"sdg-16"},{"id":"sdg-9","display":"sdg-9"}],"issues":[],"has_new_issues":false},{"id":"R_kgDOH0Z4Uw","owner":"socialincome-san","name":"public","description":"Fighting global poverty with the help of everyday people and your coding skills. Public repository of the NGO and global initiative Social Income.","url":"https://github.com/socialincome-san/public","stars":49,"stars_display":"49","license":"Other","last_modified":"2023-11-15T15:37:34Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[{"id":"I_kwDOH0Z4U85RGj4_","number":38,"title":"[Admin Feature]: Adding Gravatar API","url":"https://github.com/socialincome-san/public/issues/38","comments_count":1,"created_at":"2022-09-02T23:04:13Z","labels":[]},{"id":"I_kwDOH0Z4U85XqEQ9","number":181,"title":"[Website Feature]: Corporate page for new website","url":"https://github.com/socialincome-san/public/issues/181","comments_count":3,"created_at":"2022-12-01T04:15:46Z","labels":[]},{"id":"I_kwDOH0Z4U85uRYQf","number":504,"title":" [Website Feature]: New page for survey data","url":"https://github.com/socialincome-san/public/issues/504","comments_count":0,"created_at":"2023-08-14T15:43:21Z","labels":[]},{"id":"I_kwDOH0Z4U85ulWlt","number":518,"title":"[Website Feature]: Migrate Footer","url":"https://github.com/socialincome-san/public/issues/518","comments_count":2,"created_at":"2023-08-17T16:00:01Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNDc5OTU2NzE=","owner":"coronasafe","name":"care","description":"Care is a Digital Public Good enabling TeleICU & Decentralised Administration of Healthcare Capacity across States.","url":"https://github.com/coronasafe/care","stars":187,"stars_display":"187","license":"MIT License","last_modified":"2023-11-15T13:07:42Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[{"id":"I_kwDODsgdF85IVYMn","number":725,"title":"Inventory unexpectedly marked as Low Stock ","url":"https://github.com/coronasafe/care/issues/725","comments_count":3,"created_at":"2022-04-24T06:39:25Z","labels":[]},{"id":"I_kwDODsgdF85K6RM1","number":812,"title":"Explore other alternatives to generate PDF reports","url":"https://github.com/coronasafe/care/issues/812","comments_count":15,"created_at":"2022-06-01T18:58:05Z","labels":[]},{"id":"I_kwDODsgdF85nmGEF","number":1335,"title":"Fix N+1 queries in `/api/v1/getallfacilities/`","url":"https://github.com/coronasafe/care/issues/1335","comments_count":0,"created_at":"2023-06-02T11:39:41Z","labels":[]},{"id":"I_kwDODsgdF85nmGFj","number":1336,"title":"Fix N+1 queries in `/api/v1/resource/`","url":"https://github.com/coronasafe/care/issues/1336","comments_count":0,"created_at":"2023-06-02T11:39:44Z","labels":[]},{"id":"I_kwDODsgdF85nmGG0","number":1337,"title":"Fix N+1 queries in `/api/v1/patient/`","url":"https://github.com/coronasafe/care/issues/1337","comments_count":2,"created_at":"2023-06-02T11:39:48Z","labels":[]},{"id":"I_kwDODsgdF85nmGIM","number":1338,"title":"Fix N+1 queries in `/api/v1/bed/`","url":"https://github.com/coronasafe/care/issues/1338","comments_count":1,"created_at":"2023-06-02T11:39:52Z","labels":[]},{"id":"I_kwDODsgdF85nmGJa","number":1339,"title":"Fix N+1 queries in `/api/v1/consultationbed/`","url":"https://github.com/coronasafe/care/issues/1339","comments_count":7,"created_at":"2023-06-02T11:39:55Z","labels":[]},{"id":"I_kwDODsgdF85n45_r","number":1347,"title":"TypeError: unhashable type: 'list' at `/api/v1/patient/{patient_external_id}/test_sample/{external_id}/icmr_sample/`","url":"https://github.com/coronasafe/care/issues/1347","comments_count":0,"created_at":"2023-06-06T02:43:37Z","labels":[]},{"id":"I_kwDODsgdF85psWM-","number":1411,"title":"Update the heroku deployment config","url":"https://github.com/coronasafe/care/issues/1411","comments_count":1,"created_at":"2023-06-25T11:34:55Z","labels":[]},{"id":"I_kwDODsgdF85qppBY","number":1434,"title":"Update api schema for password reset endpoints","url":"https://github.com/coronasafe/care/issues/1434","comments_count":2,"created_at":"2023-07-05T10:53:30Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk1NjE4Nzkz","owner":"globaleaks","name":"GlobaLeaks","description":"GlobaLeaks is free, open source software enabling anyone to easily set up and maintain a secure whistleblowing platform.","url":"https://github.com/globaleaks/GlobaLeaks","stars":1112,"stars_display":"1.1K","license":"Other","last_modified":"2023-11-15T17:19:45Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[{"id":"MDU6SXNzdWUxODUzNTM4Mjk=","number":1799,"title":"Ensure privacy of users is respected with exception notifications","url":"https://github.com/globaleaks/GlobaLeaks/issues/1799","comments_count":6,"created_at":"2016-10-26T10:25:05Z","labels":[]},{"id":"MDU6SXNzdWUxOTEwNDg1NDg=","number":1818,"title":"Context allow switches should disable API POSTs","url":"https://github.com/globaleaks/GlobaLeaks/issues/1818","comments_count":0,"created_at":"2016-11-22T16:05:49Z","labels":[]},{"id":"MDU6SXNzdWUyNDYzMzk3ODY=","number":2038,"title":"Properly handle display of OpenPGP keys with users but empty userids","url":"https://github.com/globaleaks/GlobaLeaks/issues/2038","comments_count":2,"created_at":"2017-07-28T12:56:54Z","labels":[]},{"id":"MDU6SXNzdWUyNTg3MzE2NjM=","number":2085,"title":"Accept DER encoded SSL material in admin/network/https API","url":"https://github.com/globaleaks/GlobaLeaks/issues/2085","comments_count":10,"created_at":"2017-09-19T08:09:07Z","labels":[]},{"id":"MDU6SXNzdWUzMDE5ODMwMzA=","number":2191,"title":"Error Message: Cannot read property 'steps' of undefined","url":"https://github.com/globaleaks/GlobaLeaks/issues/2191","comments_count":2,"created_at":"2018-03-03T09:15:46Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk2MTAyMzk2NA==","owner":"somleng","name":"somleng","description":"Open Source Cloud Communications Platform","url":"https://github.com/somleng/somleng","stars":41,"stars_display":"41","license":"MIT License","last_modified":"2023-11-15T00:01:10Z","language":{"id":"ruby","display":"Ruby"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOHjpg2Q","owner":"undp","name":"carbon-registry","description":"National Carbon Credit Registry Digital Public Good (DPG) by Digital For Climate (D4C) collaboration. Code coordinated by ExO/CDO & BPPS/Climate.","url":"https://github.com/undp/carbon-registry","stars":28,"stars_display":"28","license":"GNU Affero General Public License v3.0","last_modified":"2023-11-13T21:19:28Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxODI4NDU0MTY=","owner":"iHRIS","name":"iHRIS","description":"iHRIS V","url":"https://github.com/iHRIS/iHRIS","stars":29,"stars_display":"29","license":"GNU Lesser General Public License v3.0","last_modified":"2023-11-15T13:12:09Z","language":{"id":"html","display":"HTML"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkxNzc1MTQ2MTU=","owner":"tattle-made","name":"feluda","description":"A configurable engine for analysing multi-lingual and multi-modal content.","url":"https://github.com/tattle-made/feluda","stars":2,"stars_display":"2","license":"GNU General Public License v3.0","last_modified":"2023-11-10T01:31:15Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnk0Mzk4NjE=","owner":"moodle","name":"moodle","description":"Moodle - the world's open source learning platform","url":"https://github.com/moodle/moodle","stars":5070,"stars_display":"5.1K","license":"GNU General Public License v3.0","last_modified":"2023-11-13T06:55:31Z","language":{"id":"php","display":"PHP"},"topics":[],"issues":[],"has_new_issues":false},{"id":"R_kgDOHxhngg","owner":"OpenG2P","name":"openg2p-registry","description":null,"url":"https://github.com/OpenG2P/openg2p-registry","stars":3,"stars_display":"3","license":"Mozilla Public License 2.0","last_modified":"2023-11-15T08:24:26Z","language":{"id":"python","display":"Python"},"topics":[],"issues":[],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNDY3MTM1MTc=","owner":"WFP-VAM","name":"prism-app","description":"PRISM is an interactive map-based dashboard that simplifies the integration of geospatial data on hazards, along with information on socioeconomic vulnerability","url":"https://github.com/WFP-VAM/prism-app","stars":35,"stars_display":"35","license":"MIT License","last_modified":"2023-11-15T18:05:54Z","language":{"id":"typescript","display":"TypeScript"},"topics":[],"issues":[{"id":"MDU6SXNzdWU2NjcyNzQwMDU=","number":100,"title":"Make PRISM mobile friendly","url":"https://github.com/WFP-VAM/prism-app/issues/100","comments_count":2,"created_at":"2020-07-28T18:17:59Z","labels":[]},{"id":"MDU6SXNzdWU4NzAzMzMyOTY=","number":175,"title":"Update node-notifier to ^8.0.1 or above","url":"https://github.com/WFP-VAM/prism-app/issues/175","comments_count":0,"created_at":"2021-04-28T20:18:19Z","labels":[]},{"id":"I_kwDODrSMrc5HZIZq","number":443,"title":"Remove dependency to S3 files","url":"https://github.com/WFP-VAM/prism-app/issues/443","comments_count":0,"created_at":"2022-04-08T20:16:54Z","labels":[]},{"id":"I_kwDODrSMrc5IrqiD","number":467,"title":"Cache boundary files locally to speed up init","url":"https://github.com/WFP-VAM/prism-app/issues/467","comments_count":7,"created_at":"2022-04-28T22:48:05Z","labels":[]},{"id":"I_kwDODrSMrc5T7ncv","number":594,"title":"Find an open source alternative to Google Analytics","url":"https://github.com/WFP-VAM/prism-app/issues/594","comments_count":0,"created_at":"2022-10-13T16:55:26Z","labels":[]}],"has_new_issues":false},{"id":"MDEwOlJlcG9zaXRvcnkyNDc5Nzc2MzM=","owner":"google","name":"android-fhir","description":"The Android FHIR SDK is a set of Kotlin libraries for building offline-capable, mobile-first healthcare applications using the HL7® FHIR® standard on Android.","url":"https://github.com/google/android-fhir","stars":384,"stars_display":"384","license":"Apache License 2.0","last_modified":"2023-11-15T16:58:09Z","language":{"id":"kotlin","display":"Kotlin"},"topics":[],"issues":[{"id":"MDU6SXNzdWU5MzQ0Njc3ODI=","number":608,"title":"Fuzzy search on Patient name","url":"https://github.com/google/android-fhir/issues/608","comments_count":31,"created_at":"2021-07-01T06:40:27Z","labels":[]},{"id":"MDU6SXNzdWU5MzQ0NzkzODU=","number":609,"title":"Enable ValueSet expansion in the Search API so developers can search by ValueSet rather than disjunction of codes","url":"https://github.com/google/android-fhir/issues/609","comments_count":4,"created_at":"2021-07-01T06:55:48Z","labels":[]},{"id":"I_kwDODsfWoc48MB3V","number":800,"title":"Add location mapping widget","url":"https://github.com/google/android-fhir/issues/800","comments_count":39,"created_at":"2021-09-28T13:53:53Z","labels":[]},{"id":"I_kwDODsfWoc49wTf1","number":872,"title":"Handle Sync work that may go on for time longer than permitted by regular workmanager.","url":"https://github.com/google/android-fhir/issues/872","comments_count":1,"created_at":"2021-10-26T09:43:57Z","labels":[]},{"id":"I_kwDODsfWoc5bLkJQ","number":1803,"title":"Create a new date widget with dropdowns (SDC)","url":"https://github.com/google/android-fhir/issues/1803","comments_count":3,"created_at":"2023-01-11T21:57:57Z","labels":[]},{"id":"I_kwDODsfWoc5bLsrb","number":1805,"title":"Date picker: Add a different date picker with “spinners” ","url":"https://github.com/google/android-fhir/issues/1805","comments_count":1,"created_at":"2023-01-11T22:22:46Z","labels":[]},{"id":"I_kwDODsfWoc5hOEj8","number":1920,"title":"[IgManager] PlanDefinitionProcessor doesn't resolve the PlanDefinition from IgManager ","url":"https://github.com/google/android-fhir/issues/1920","comments_count":1,"created_at":"2023-03-19T19:11:15Z","labels":[]},{"id":"I_kwDODsfWoc5062j1","number":2297,"title":"Kokoro Check build failures due to NodeJS or OpenJDK installation failure","url":"https://github.com/google/android-fhir/issues/2297","comments_count":6,"created_at":"2023-10-25T14:37:20Z","labels":[]},{"id":"I_kwDODsfWoc51AFEb","number":2304,"title":"Run Flank in GitHub Action","url":"https://github.com/google/android-fhir/issues/2304","comments_count":6,"created_at":"2023-10-26T08:09:51Z","labels":[]},{"id":"I_kwDODsfWoc51BY39","number":2308,"title":"AndroidxTest JAR duplicates on testImplementation scope of `common` module","url":"https://github.com/google/android-fhir/issues/2308","comments_count":0,"created_at":"2023-10-26T11:21:57Z","labels":[]}],"has_new_issues":false}],"languages":[{"id":"csharp","display":"C#","count":1},{"id":"dart","display":"Dart","count":1},{"id":"ejs","display":"EJS","count":1},{"id":"elixir","display":"Elixir","count":1},{"id":"elm","display":"Elm","count":1},{"id":"glsl","display":"GLSL","count":1},{"id":"html","display":"HTML","count":5},{"id":"java","display":"Java","count":17},{"id":"javascript","display":"JavaScript","count":12},{"id":"jupyter-notebook","display":"Jupyter Notebook","count":2},{"id":"kotlin","display":"Kotlin","count":3},{"id":"php","display":"PHP","count":3},{"id":"python","display":"Python","count":19},{"id":"r","display":"R","count":2},{"id":"rich-text-format","display":"Rich Text Format","count":1},{"id":"ruby","display":"Ruby","count":7},{"id":"shell","display":"Shell","count":2},{"id":"smarty","display":"Smarty","count":1},{"id":"solidity","display":"Solidity","count":1},{"id":"typescript","display":"TypeScript","count":16}],"topics":[{"id":"sdg-16","display":"sdg-16","count":2},{"id":"sdg-9","display":"sdg-9","count":2},{"id":"sdg-4","display":"sdg-4","count":1},{"id":"sdg-17","display":"sdg-17","count":1},{"id":"sdg-3","display":"sdg-3","count":1},{"id":"sdg-1","display":"sdg-1","count":1},{"id":"sdg-10","display":"sdg-10","count":1}]} -------------------------------------------------------------------------------- /happycommits.json: -------------------------------------------------------------------------------- 1 | { 2 | "repositories": [ 3 | "a2i-dpg/ekShop", 4 | "a2i-dpg/skills-and-certification", 5 | "Aam-Digital/ndb-core", 6 | "akrosinc/reveal-client", 7 | "Altinn/altinn-studio", 8 | "Amref-Health-Africa-in-Uganda/SaniDigSMobile", 9 | "Amref-Health-Africa-in-Uganda/sanidigslive03", 10 | "apache/fineract", 11 | "AppertaFoundation/openeyes", 12 | "ArgusoftOpen/medplat", 13 | "avniproject/avni-infra", 14 | "avniproject/avni-server", 15 | "avniproject/avni-client", 16 | "avniproject/avni-webapp", 17 | "avniproject/avni-models", 18 | "Bahmni/bahmni-core", 19 | "Bioverse-Labs/deep-learning", 20 | "Bioverse-Labs/forest-map-app", 21 | "Bioverse-Labs/image-processing", 22 | "BisaMhealth/BisaApp", 23 | "BLSQ/iaso", 24 | "BLSQ/openhexa", 25 | "BLSQ/openhexa-app", 26 | "BLSQ/openhexa-frontend", 27 | "BLSQ/openhexa-notebooks", 28 | "BLSQ/openhexa-pipelines", 29 | "bookbot-hive/k2-indonesian-asr", 30 | "boxwise/boxtribute", 31 | "cdsframework/ice", 32 | "cboard-org/cboard", 33 | "chamilo/chamilo-lms", 34 | "chaynHQ/bloom-frontend", 35 | "chaynHQ/bloom-backend", 36 | "chaynHQ/soulmedicine", 37 | "ckan/ckan", 38 | "Cirrolytix/aedes_dpg", 39 | "CodeYourFuture/curriculum", 40 | "codiplaykz/coditeach", 41 | "commitglobal/hiv-support", 42 | "commitglobal/housing-platform", 43 | "commitglobal/website-factory", 44 | "consul/consul", 45 | "coronasafe/care", 46 | "ConvexityTeam/chats-api", 47 | "creativecommons/cc-legal-tools-app", 48 | "credebl/platform", 49 | "cuentoneta/cuentoneta", 50 | "DalgoT4D/DDP_backend", 51 | "DalgoT4D/webapp", 52 | "datakind/Data-Observation-Toolkit", 53 | "decentralised-dataexchange/data-exchange-agreements", 54 | "decentralised-dataexchange/dexa-protocol", 55 | "decentralised-dataexchange/dexa-sdk", 56 | "decentralised-dataexchange/acapy-mydata-did-protocol", 57 | "decentralised-dataexchange/dexa-smartcontracts", 58 | "decidim/decidim", 59 | "devgateway/amp", 60 | "devgateway/ocportal", 61 | "dimagi/commcare-hq", 62 | "dhis2/dhis2-core", 63 | "dhis2/ui", 64 | "drivendataorg/deon", 65 | "drivendataorg/zamba", 66 | "drupal/drupal", 67 | "eco-index/ecoindex-stack", 68 | "egovernments/DIGIT-OSS", 69 | "egovernments/DIVOC", 70 | "energyaccessexplorer/tool", 71 | "epiverse-trace/cfr", 72 | "epiverse-trace/finalsize", 73 | "epiverse-trace/linelist", 74 | "ersilia-os/ersilia", 75 | "esatya/rahat", 76 | "esatya/rahat-agency", 77 | "esatya/rahat-mobilizer", 78 | "esatya/rahat-vendor", 79 | "esatya/rahat-vendor-app", 80 | "esatya/rahat-contracts", 81 | "esatya/rahat-otp", 82 | "esatya/rahat-aid-connect", 83 | "farmOS/farmOS", 84 | "FASP-QAT/fasp-api", 85 | "FASP-QAT/fasp-core-ui", 86 | "frappe/erpnext", 87 | "getodk/central", 88 | "getodk/collect", 89 | "getodk/web-forms", 90 | "glific/glific", 91 | "Global-Policy-Lab/cider", 92 | "globaleaks/globaleaks-whistleblowing-software", 93 | "global-asp/global-asp", 94 | "google/android-fhir", 95 | "google/fhir-data-pipes", 96 | "google/fhir-gateway", 97 | "govdirectory/website", 98 | "GovTechSG/oobee-desktop", 99 | "GRS-DPG/GRS-WEB", 100 | "HCW-home/backend", 101 | "HCW-home/frontend-doctor", 102 | "healthsites/healthsites", 103 | "huridocs/uwazi", 104 | "hsbc/mrpusa", 105 | "ifmeorg/ifme", 106 | "ifmeorg/ifme-languagetools", 107 | "iHRIS/iHRIS", 108 | "Intelehealth/Intelehealth-WebApp", 109 | "Intelehealth/Android-Mobile-Client", 110 | "Intelehealth/intelehealth-openmrs-ui", 111 | "intelligent-environments-lab/CityLearn", 112 | "IntelliSOFT-Consulting/Newborn-Nutrition-Reference-App", 113 | "IntelliSOFT-Consulting/pvers", 114 | "interfacerproject/interfacer-gui", 115 | "intrahealth/gofr", 116 | "investtools/ivttoken", 117 | "I-TECH-UW/OpenELIS-Global-2", 118 | "jellow-aac/jellow-communicator-android", 119 | "johnsonandjohnson/openmrs-distro-cfl", 120 | "johnsonandjohnson/vxnaid", 121 | "JanssenProject/jans", 122 | "JabRef/jabref", 123 | "kimetrica/MERON_api", 124 | "kobotoolbox/kpi", 125 | "kobotoolbox/kobocat", 126 | "kobotoolbox/kobo-install", 127 | "kotanipay/Kotani-Pay-API", 128 | "kvklrao/Avyantra2023", 129 | "learningequality/kolibri", 130 | "learningequality/ricecooker", 131 | "mautic/mautic", 132 | "medic/cht-core", 133 | "Medtronic-LABS/spice-android", 134 | "Medtronic-LABS/spice-fhir-adapter", 135 | "Medtronic-LABS/spice-server", 136 | "MochCare-Gh/service-provider-portal", 137 | "mojaloop/central-ledger", 138 | "mojaloop/project", 139 | "mosip/commons", 140 | "MSH/OpenPV", 141 | "MSH/Pharmadex2", 142 | "moodle/moodle", 143 | "nordic-institute/X-Road", 144 | "NMF-earth/nmf-app", 145 | "okfn-brasil/querido-diario", 146 | "opencrvs/opencrvs-core", 147 | "openfisca/openfisca-core", 148 | "openforis/collect", 149 | "OpenG2P/openg2p-registry", 150 | "OpenG2P/openg2p-reporting", 151 | "OpenFn/core", 152 | "OpenFn/lightning", 153 | "opengovsg/FormSG", 154 | "opengovsg/isomer", 155 | "OpenLMIS/openlmis-ref-distro", 156 | "OpenMandrivaSoftware/abf-console-client", 157 | "OpenMandrivaSoftware/ossp", 158 | "OpenTeleRehab/patient-app", 159 | "OpenTeleRehab/therapist-web-app", 160 | "OpenTeleRehab/patient-service", 161 | "OpenTermsArchive/engine", 162 | "OpenTermsArchive/contrib-declarations", 163 | "Open-Attestation/open-attestation", 164 | "openimis/openimis-dist_dkr", 165 | "openmrs/openmrs-core", 166 | "openmrs/openmrs-contrib-android-client", 167 | "opencrvs/opencrvs-core", 168 | "openkfw/TruBudget", 169 | "OpenSPP/openspp-modules", 170 | "openspp-project/openspp-registry", 171 | "openspp-project/openspp-program", 172 | "openspp-project/openspp-grievance-redress-mechanism", 173 | "openspp-project/documentation", 174 | "openspp-project/openspp-docker", 175 | "opensrp/fhircore", 176 | "opensrp/opensrp-server-core", 177 | "openMF/android-client", 178 | "openMF/community-app", 179 | "openMF/mifos-mobile", 180 | "openMF/web-app", 181 | "Oky-period-tracker/period-tracker-app-whitelabelled-code", 182 | "OTTAA-Project/ottaa_project_flutter", 183 | "Ozim-Platform", 184 | "policyengine/policyengine-app", 185 | "PotLock/bos-app", 186 | "PotLock/core", 187 | "primeroIMS/primero", 188 | "project-sunbird/sunbird-learning-platform", 189 | "pryv/open-pryv.io", 190 | "qlt2020/doskaz", 191 | "rapidpro/rapidpro", 192 | "RentadroneCL/Precision_Agriculture", 193 | "reconverse/grates", 194 | "reconverse/incidence2", 195 | "reconverse/i2extras", 196 | "reconverse/outbreaks", 197 | "reconverse/reportfactory", 198 | "reconverse/trending", 199 | "reconverse/trendeval/", 200 | "rubyforgood/casa", 201 | "rubyforgood/human-essentials", 202 | "rubyforgood/pet-rescue", 203 | "safeyou-space/safeyou", 204 | "santedb/santedb-server", 205 | "Scribble-Works/preptime-website", 206 | "Scribble-Works/preptimeanalyser", 207 | "Scribble-Works/screenshot", 208 | "shoqata-organika/register-for-organic-agriculture", 209 | "simpledotorg/simple-server", 210 | "socialincome-san/public", 211 | "somleng/somleng", 212 | "SORMAS-Foundation/SORMAS-Project", 213 | "ssi-quarkid/api-zkSync", 214 | "statisticsnorway/statbus", 215 | "Sunbird-Ed/SunbirdEd-portal", 216 | "Sunbird-cQube/cQube_Base", 217 | "Sunbird-Obsrv/obsrv-core", 218 | "Sunbird-RC/sunbird-rc-core", 219 | "Sunbird-Saral/Project-Saral", 220 | "Sunbird-Serve/serve-beta", 221 | "synthetichealth/synthea", 222 | "synthetichealth/synthea-international", 223 | "TIP-Global-Health/eheza-app", 224 | "tattle-made/feluda", 225 | "tattle-made/Uli", 226 | "tazama-lf/frms-coe-lib", 227 | "tazama-lf/frms-coe-startup-lib", 228 | "the-turing-way/the-turing-way", 229 | "tillioss/tilli-web-app", 230 | "truenas/charts", 231 | "terraframe/geoprism-registry", 232 | "undp/carbon-registry", 233 | "undp/iVerify-Apps", 234 | "undpindia/data4policy", 235 | "undpindia/dicra", 236 | "UNICEFECAR/parenting-app-bebbo-mobile", 237 | "unicef/kindly", 238 | "unicef/magasin", 239 | "unige-geohealth/accessmod", 240 | "ushahidi/platform", 241 | "ushahidi/platform-client-mzima", 242 | "vrapeutic/Rodja-webXR", 243 | "WFP-VAM/prism-app", 244 | "WorldHealthOrganization/godata", 245 | "Zenysis/Harmony" 246 | ], 247 | "labels": [ 248 | "good first issue", 249 | "Help Wanted", 250 | "help wanted" 251 | ] 252 | } 253 | -------------------------------------------------------------------------------- /hooks/useAppData.tsx: -------------------------------------------------------------------------------- 1 | import { useContext } from "react"; 2 | 3 | import { AppDataContext } from "../context/AppDataContext"; 4 | 5 | export const useAppData = () => { 6 | const context = useContext(AppDataContext); 7 | 8 | if (!context) { 9 | throw new Error("useAppData must be used within an AppDataProvider"); 10 | } 11 | 12 | return context; 13 | }; 14 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-unused-vars */ 2 | /** @type {import('next').NextConfig} */ 3 | const nextConfig = { 4 | reactStrictMode: true, 5 | productionBrowserSourceMaps: true, 6 | trailingSlash: true, 7 | output: "export" 8 | } 9 | 10 | module.exports = nextConfig 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "for-good-first-issue", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "dev": "next dev", 6 | "build": "next build", 7 | "start": "next start", 8 | "lint": "next lint", 9 | "export": "next export", 10 | "prepare": "husky install", 11 | "prebuild": "ts-node generate.ts" 12 | }, 13 | "dependencies": { 14 | "@fortawesome/fontawesome-svg-core": "^6.6.1", 15 | "@fortawesome/free-regular-svg-icons": "^6.7.2", 16 | "@fortawesome/free-solid-svg-icons": "^6.4.0", 17 | "@fortawesome/react-fontawesome": "^0.2.1", 18 | "@primer/react-brand": "^0.44.1", 19 | "@types/node": "20.13.0", 20 | "@types/react": "^18.2.0", 21 | "@types/react-dom": "^18.2.0", 22 | "dayjs": "^1.11.12", 23 | "millify": "^6.1.0", 24 | "next": "15.3.2", 25 | "postcss-import": "^16.1.0", 26 | "react": "^18.2.0", 27 | "react-dom": "^18.2.0", 28 | "react-icons": "^5.5.0", 29 | "react-infinite-scroll-component": "^6.1.0", 30 | "react-select": "^5.9.0", 31 | "sass": "^1.70.0", 32 | "slugify": "^1.6.6", 33 | "typescript": "^5.7.3" 34 | }, 35 | "devDependencies": { 36 | "@octokit/core": "^5.0.2", 37 | "@octokit/graphql-schema": "^15.26.0", 38 | "@octokit/plugin-retry": "^5.0.5", 39 | "@octokit/plugin-throttling": "^8.1.3", 40 | "@octokit/types": "^12.4.0", 41 | "@trivago/prettier-plugin-sort-imports": "^5.2.0", 42 | "@types/react-infinite-scroller": "^1.2.5", 43 | "@typescript-eslint/eslint-plugin": "^8.18.0", 44 | "@typescript-eslint/parser": "^8.18.0", 45 | "autoprefixer": "^10.4.17", 46 | "eslint": "^8.37.0", 47 | "eslint-config-next": "^15.1.0", 48 | "eslint-config-prettier": "^8.6.0", 49 | "eslint-import-resolver-typescript": "^3.7.0", 50 | "eslint-plugin-prettier": "^5.0.0", 51 | "husky": "^9.1.7", 52 | "postcss": "^8.5.3", 53 | "prettier": "^3.4.2", 54 | "tailwindcss": "^3.4.16", 55 | "ts-node": "^10.9.2" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import '@primer/react-brand/lib/css/main.css'; 2 | import '@primer/react-brand/fonts/fonts.css'; 3 | import type { AppProps } from "next/app"; 4 | import Head from "next/head"; 5 | import { Layout } from "../components/Layout"; 6 | import { AppDataProvider } from "../context/AppDataContext"; 7 | import "../styles/globals.scss"; 8 | import {ThemeProvider} from '@primer/react-brand' 9 | 10 | // Fontawesome and TailwindCSS related settings 11 | //config.autoAddCss = false; 12 | 13 | // Entry point for the app 14 | export default function App({ Component, pageProps }: AppProps) { 15 | return ( 16 | <ThemeProvider> 17 | <Head> 18 | <meta name="viewport" content="width=device-width, initial-scale=1" /> 19 | </Head> 20 | <AppDataProvider> 21 | <main> 22 | <Layout> 23 | <Component {...pageProps} /> 24 | </Layout> 25 | </main> 26 | </AppDataProvider> 27 | </ThemeProvider> 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import { Head, Html, Main, NextScript } from "next/document"; 2 | 3 | export default function Document() { 4 | return ( 5 | <Html lang="en"> 6 | <Head> 7 | <meta 8 | name="description" 9 | content="Making your next open-source contribution make the world better. For Good First Issue is a curated list of accessible issues from open-source projects helping our communities. Start today!" 10 | /> 11 | 12 | <meta property="og:url" content="https://forgoodfirstissue.dev" /> 13 | <meta property="og:type" content="website" /> 14 | <meta 15 | property="og:title" 16 | content="For Good First Issue | Make your next open-source contribution matter." 17 | /> 18 | <meta property="og:image" content="https://forgoodfirstissue.dev/" /> 19 | 20 | <meta name="twitter:card" content="summary_large_image" /> 21 | <meta property="twitter:domain" content="forgoodfirstissue.dev" /> 22 | <meta property="twitter:url" content="https://forgoodfirstissue.dev" /> 23 | <meta 24 | name="twitter:title" 25 | content="For Good First Issue | Make your next open-source contribution matter." 26 | /> 27 | <meta 28 | name="twitter:description" 29 | content="Making your next open-source contribution make the world better. For Good First Issueis a curated list of accessible issues from open-source projects helping our communities. Start today!" 30 | /> 31 | <meta name="twitter:image" content="https://forgoodfirstissue.dev/" /> 32 | 33 | <meta charSet="UTF-8" /> 34 | <link rel="apple-touch-icon" type="image/png" href="/apple-touch-icon.png" /> 35 | <link rel="icon" type="image/png" href="/android-favicon.png" /> 36 | <link rel="shortcut icon" type="image/png" sizes="32x32" href="/favicon.png" /> 37 | </Head> 38 | <body> 39 | <Main /> 40 | <NextScript /> 41 | </body> 42 | </Html> 43 | ); 44 | } 45 | -------------------------------------------------------------------------------- /pages/index.tsx: -------------------------------------------------------------------------------- 1 | import Head from "next/head"; 2 | import React, { useState } from "react"; 3 | 4 | import { RepositoryList } from "../components/RepositoryList"; 5 | 6 | import { useAppData } from "../hooks/useAppData"; 7 | 8 | import { HeroContainer } from "../components/HeroContainer"; 9 | import { HappyContainer } from "../components/HappyContainer"; 10 | 11 | import { Header } from "../components/Header/Header"; 12 | import { Footer } from "../components/Footer/Footer"; 13 | 14 | import {Grid, Heading, Stack} from '@primer/react-brand'; 15 | 16 | 17 | export default function Home() { 18 | const { repositories } = useAppData(); 19 | const [filter, setFilter] = useState(""); 20 | 21 | 22 | const sortedRepositories = repositories.sort((a, b) => { 23 | if (a.issues > b.issues) { 24 | return -1; // a comes first 25 | } else if (a.issues < b.issues) { 26 | return 1; // b comes first 27 | } else { 28 | return 0; // a and b are equal 29 | } 30 | }); 31 | 32 | 33 | return ( 34 | <> 35 | <Head> 36 | <title>For Good First Issue | Make your next open-source contribution matter. 37 | 38 | 39 |
40 | 41 | 42 | 43 |
44 |
45 | 46 | 47 | 48 | Find a project 49 | 50 | 51 | 52 | 53 |
54 | 55 | 56 | 57 |
58 | 59 |