├── .github ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── FUNDING.yml ├── GOVERNANCE.md ├── ISSUE_TEMPLATE │ ├── bug.yml │ ├── config.yml │ ├── feature-request.yml │ ├── question.yml │ ├── resource-addition.yml │ └── user-addition.yml ├── PRIVACY.md ├── README.md ├── SECURITY.md ├── SUPPORT.md ├── logo.png ├── pull_request_template.md ├── secret_scanning.yml └── workflows │ ├── adds-hacktoberfest-label.yml │ ├── check-contribution.yml │ ├── copy-guides.yml │ ├── deploy-website.yml │ ├── insert-comments.yml │ ├── insert-credits.yml │ ├── insert-resources.yml │ ├── insert-roadmap.yml │ ├── mirror.yml │ └── trigger-web-deploy.yml ├── .gitignore ├── LICENSE ├── Makefile ├── git-in-here.yml ├── guides ├── local-git-setup.md ├── open-source-for-businesses.md ├── roadmap.mmd ├── submit-your-first-pr-cli.md ├── submit-your-first-pr-ui.md └── why-open-source.md ├── lib ├── .python-version ├── README ├── copy_resources_to_site.py ├── insert_contributor_content.py ├── insert_resource_list.py ├── insert_roadmap.py ├── requirements.txt ├── tests │ ├── run_all_tests.py │ └── test_insert_contributor_content.py └── validate_pr.py ├── resources.yml └── web ├── .eslintrc.js ├── .npmrc ├── .prettierrc ├── README ├── astro.config.mjs ├── package-lock.json ├── package.json ├── public ├── banner.png ├── favicon.png ├── favicon.svg ├── fonts │ ├── OpenSans-Bold.woff │ ├── OpenSans-Bold.woff2 │ ├── OpenSans-ExtraBold.woff │ ├── OpenSans-ExtraBold.woff2 │ ├── OpenSans-Italic.woff │ ├── OpenSans-Italic.woff2 │ ├── OpenSans-Regular.woff │ └── OpenSans-Regular.woff2 ├── icon.png ├── octocat-swim.png └── social-preview-image.png ├── src ├── assets │ ├── img │ │ ├── logo.svg │ │ ├── octocat-colored.svg │ │ └── octocat.svg │ └── scss │ │ ├── base │ │ ├── _breakpoint.scss │ │ ├── _button.scss │ │ ├── _color.scss │ │ ├── _container.scss │ │ ├── _font.scss │ │ ├── _list.scss │ │ ├── _outline.scss │ │ ├── _reset.scss │ │ ├── _root.scss │ │ └── _space-content.scss │ │ └── globals.scss ├── components │ ├── CallToAction.astro │ ├── ContentMedia.astro │ ├── Contributors.astro │ ├── Counter.astro │ ├── ExternalResources.astro │ ├── Feature.astro │ ├── Footer.astro │ ├── GuideList.astro │ ├── Header.astro │ ├── Hero.astro │ ├── LanguageHeader.svelte │ ├── LanguageList.svelte │ ├── Navigation.astro │ ├── RepoList.svelte │ ├── ResponsiveToggle.astro │ └── SiteMeta.astro ├── env.d.ts ├── layouts │ ├── DefaultLayout.astro │ └── MarkdownLayout.astro ├── pages │ ├── 404.astro │ ├── blog │ │ ├── [...page].astro │ │ └── [post].astro │ ├── contributing.md │ ├── find-projects │ │ ├── [language] │ │ │ ├── [sort].astro │ │ │ └── index.astro │ │ └── index.astro │ ├── guestbook │ │ └── index.astro │ ├── guides │ │ ├── index.astro │ │ ├── local-git-setup.md │ │ ├── open-source-for-businesses.md │ │ ├── submit-your-first-pr-cli.md │ │ ├── submit-your-first-pr-ui.md │ │ └── why-open-source.md │ ├── index.astro │ └── roadmap │ │ └── index.astro └── utils │ ├── find-repos.ts │ └── languages.ts └── tailwind.config.js /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @Lissy93 2 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | > This is our code of conduct, based upon the [Contributor Covenant](https://www.contributor-covenant.org/). 4 | > It outlines a set of core values and norms that are essential in a just and equitable software commons. 5 | > You must abide by these if you wish to contribute to this project. 6 | > For contributing guidelines - see [`CONTRIBUTING.md`](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CONTRIBUTING.md) 7 | > 8 | > **TLDR; Don't be a d!ck** 9 | 10 | ## Our Pledge 11 | 12 | We as members, contributors, and leaders pledge to make participation in our 13 | community a harassment-free experience for everyone, regardless of age, body 14 | size, visible or invisible disability, ethnicity, sex characteristics, gender 15 | identity and expression, level of experience, education, socio-economic status, 16 | nationality, personal appearance, race, religion, or sexual identity 17 | and orientation. 18 | 19 | We pledge to act and interact in ways that contribute to an open, welcoming, 20 | diverse, inclusive, and healthy community. 21 | 22 | ## Our Standards 23 | 24 | Examples of behavior that contributes to a positive environment for our 25 | community include: 26 | 27 | * Demonstrating empathy and kindness toward other people 28 | * Being respectful of differing opinions, viewpoints, and experiences 29 | * Giving and gracefully accepting constructive feedback 30 | * Accepting responsibility and apologizing to those affected by our mistakes, 31 | and learning from the experience 32 | * Focusing on what is best not just for us as individuals, but for the 33 | overall community 34 | 35 | Examples of unacceptable behavior include: 36 | 37 | * The use of sexualized language or imagery, and sexual attention or 38 | advances of any kind 39 | * Trolling, insulting or derogatory comments, and personal or political attacks 40 | * Public or private harassment 41 | * Publishing others' private information, such as a physical or email 42 | address, without their explicit permission 43 | * Other conduct which could reasonably be considered inappropriate in a 44 | professional setting 45 | 46 | ## Enforcement Responsibilities 47 | 48 | Community leaders are responsible for clarifying and enforcing our standards of 49 | acceptable behavior and will take appropriate and fair corrective action in 50 | response to any behavior that they deem inappropriate, threatening, offensive, 51 | or harmful. 52 | 53 | Community leaders have the right and responsibility to remove, edit, or reject 54 | comments, commits, code, wiki edits, issues, and other contributions that are 55 | not aligned to this Code of Conduct, and will communicate reasons for moderation 56 | decisions when appropriate. 57 | 58 | ## Scope 59 | 60 | This Code of Conduct applies within all community spaces, and also applies when 61 | an individual is officially representing the community in public spaces. 62 | Examples of representing our community include using an official e-mail address, 63 | posting via an official social media account, or acting as an appointed 64 | representative at an online or offline event. 65 | 66 | ## Enforcement 67 | 68 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 69 | reported to the community leaders responsible for enforcement at 70 | alicia . 71 | All complaints will be reviewed and investigated promptly and fairly. 72 | 73 | All community leaders are obligated to respect the privacy and security of the 74 | reporter of any incident. 75 | 76 | ## Enforcement Guidelines 77 | 78 | Community leaders will follow these Community Impact Guidelines in determining 79 | the consequences for any action they deem in violation of this Code of Conduct: 80 | 81 | ### 1. Correction 82 | 83 | **Community Impact**: Use of inappropriate language or other behavior deemed 84 | unprofessional or unwelcome in the community. 85 | 86 | **Consequence**: A private, written warning from community leaders, providing 87 | clarity around the nature of the violation and an explanation of why the 88 | behavior was inappropriate. A public apology may be requested. 89 | 90 | ### 2. Warning 91 | 92 | **Community Impact**: A violation through a single incident or series 93 | of actions. 94 | 95 | **Consequence**: A warning with consequences for continued behavior. No 96 | interaction with the people involved, including unsolicited interaction with 97 | those enforcing the Code of Conduct, for a specified period of time. This 98 | includes avoiding interactions in community spaces as well as external channels 99 | like social media. Violating these terms may lead to a temporary or 100 | permanent ban. 101 | 102 | ### 3. Temporary Ban 103 | 104 | **Community Impact**: A serious violation of community standards, including 105 | sustained inappropriate behavior. 106 | 107 | **Consequence**: A temporary ban from any sort of interaction or public 108 | communication with the community for a specified period of time. No public or 109 | private interaction with the people involved, including unsolicited interaction 110 | with those enforcing the Code of Conduct, is allowed during this period. 111 | Violating these terms may lead to a permanent ban. 112 | 113 | ### 4. Permanent Ban 114 | 115 | **Community Impact**: Demonstrating a pattern of violation of community 116 | standards, including sustained inappropriate behavior, harassment of an 117 | individual, or aggression toward or disparagement of classes of individuals. 118 | 119 | **Consequence**: A permanent ban from any sort of public interaction within 120 | the community. 121 | 122 | ## Attribution 123 | 124 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 125 | version 2.0, available at 126 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 127 | 128 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 129 | enforcement ladder](https://github.com/mozilla/diversity). 130 | 131 | [homepage]: https://www.contributor-covenant.org 132 | 133 | For answers to common questions about this code of conduct, see the FAQ at 134 | https://www.contributor-covenant.org/faq. Translations are available at 135 | https://www.contributor-covenant.org/translations. 136 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [lissy93] 2 | -------------------------------------------------------------------------------- /.github/GOVERNANCE.md: -------------------------------------------------------------------------------- 1 | # Governance 2 | 3 | ## Introduction 4 | 5 | This document describes the governance principles and guidelines for [Your Repository Name]. The purpose is to ensure clarity and consistency in how the project progresses and evolves. 6 | Project Maintainers 7 | 8 | The project is overseen by a group of maintainers. These individuals have the final say on technical decisions, feature implementations, and overall project direction. 9 | 10 | **Current Maintainers:** 11 | - [@Lissy93](https://github.com/Lissy93) 12 | 13 | **Maintainers have the following responsibilities:** 14 | - Review and merge pull requests. 15 | - Address and moderate any disputes or conflicts. 16 | - Ensure the sustainability and consistency of the project. 17 | - Announce major decisions, updates, or changes to the community. 18 | 19 | ## Contributing 20 | 21 | Anyone can contribute to the project. Contributions can come in the form of code, documentation, design, and more. All contributors are encouraged to create a pull request and engage in discussions. For more information, refer to our [CONTRIBUTING.md](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CONTRIBUTING.md). 22 | 23 | ## Decision Making 24 | 25 | - **Consensus**: For most decisions, we seek a consensus among contributors. If there's disagreement, we encourage discussion to reach an agreement. 26 | - **Voting**: In rare instances where consensus cannot be reached, project maintainers may use a voting system. A simple majority will determine the outcome. 27 | - **Veto Power**: Project maintainers reserve the right to unilaterally make decisions on critical issues or veto proposals they believe are not in the best interest of the project. 28 | 29 | 30 | ## Licensing and Attribution 31 | 32 | This project is licensed under the MIT License, which allows for reuse of the code for any purpose with proper attribution and without warranty. The details of the MIT License can be found in our [LICENSE](https://github.com/Lissy93/git-into-open-source/blob/main/LICENSE) file. 33 | 34 | ### Raising a Dispute 35 | If you believe there's been a violation of the licensing terms, or you have any concerns regarding the project's use of code, assets, or intellectual property: 36 | 37 | - Initial Contact: Please reach out to the project maintainers directly via governance@mail.alicia.omg.lol detailing your concerns. 38 | - Provide Evidence: Attach any relevant documentation or evidence that supports your claim. 39 | - Await Response: The maintainers will review your claim and respond in a timely manner. 40 | 41 | ### Request for Removal 42 | 43 | If you're a contributor and wish to have your contributions removed from the project, or if this project is using or linking to your assets and you would like this removed 44 | 45 | - **Raise an Issue**: Create an issue in our GitHub repository detailing which contributions you'd like removed and your reasons. 46 | - **Maintainer Review**: The maintainers will review your request, considering project stability and other implications. 47 | - **Final Decision**: Post review, the maintainers will communicate the decision and next steps, if applicable. 48 | 49 | ### Request for Attribution 50 | 51 | We aim to give proper credit for all contributions. If you believe you have not been adequately credited for your work: 52 | 53 | - **Reach Out**: Contact the project maintainers at governance@mail.alicia.omg.lol. 54 | - **Provide Details**: Mention the specific contributions you're referring to and how you'd like to be attributed. 55 | - **Attribution Adjustment**: After verification, the maintainers will ensure proper attribution is provided in subsequent releases or documentation updates. 56 | 57 | ## Transparency and Impartiality 58 | 59 | ### Commitment to Transparency 60 | 61 | Our project thrives on open collaboration and trust. We believe in fostering an environment where decisions, processes, and actions stand up to public scrutiny. To this end: 62 | 63 | - **Clear Affiliations**: If you are submitting a PR or an issue that promotes, links to, or benefits a product/service you're affiliated with, you must clearly disclose this relationship. 64 | - **Maintainer Pledge**: We, the maintainers, pledge not to censor, alter, or delete any content to protect our personal interests. Our actions are always in the best interest of the community. 65 | 66 | ### Conflict of Interest 67 | 68 | A conflict of interest arises when personal interests may compromise the ability to act in the best interests of the project and its community. Both maintainers and contributors should be vigilant in recognizing and handling conflicts of interest: 69 | 70 | - **Declaration**: If you perceive a potential conflict of interest, declare it openly. For maintainers, this may be in a public space such as the project's communication channels. For contributors, this might be within the relevant PR or issue. 71 | - **Recusal**: In cases where a conflict of interest is determined, the affected individual should refrain from the decision-making process or from the action in question. 72 | - **Third-Party Mediation**: In situations where the path forward is unclear, consider seeking external opinions or mediation to ensure impartiality. 73 | 74 | ### Community at Heart 75 | 76 | Our primary allegiance is to the community and the collective good. We promise to: 77 | 78 | - **Prioritize Community**: Decisions are made with the community's best interest in mind. 79 | - **Open Discussions**: Encourage open discussions and feedback. Every voice, whether in agreement or dissent, is valuable and should be heard. 80 | - **Clear Documentation**: All decisions, especially those that affect the project's direction, are documented and accessible. 81 | - **Acknowledge Mistakes**: We are human, and mistakes will happen. When they do, we'll own up to them, learn, and act to rectify. 82 | 83 | By adhering to these principles, we hope to foster a transparent, impartial, and trusting environment for all our contributors and users. 84 | 85 | 86 | ## Conflict Resolution 87 | 88 | In the case of conflicts or disputes among contributors: 89 | - Try to settle differences through direct communication between parties involved. 90 | - If unresolved, bring the issue to the larger community for discussion. 91 | - As a last resort, project maintainers will intervene and make a final decision. 92 | 93 | ## Code of Conduct 94 | 95 | All contributors, maintainers, and participants in are expected to follow the project's [Code of Conduct](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CODE_OF_CONDUCT.md). This code provides guidance on how to interact respectfully and inclusively within our community. 96 | 97 | Failure to adhere to the Code of Conduct will not be taken lightly. Potential consequences for violating the Code of Conduct include: 98 | 99 | - **Warning**: For minor infractions, an official warning may be issued, reminding the individual of the Code of Conduct and the behavior expected. 100 | - **Temporary Ban**: For repeated violations or more severe infractions, an individual may be temporarily banned from contributing or participating in project discussions. 101 | - **Permanent Ban**: In extreme cases, or after multiple violations, an individual may be permanently banned from the project. 102 | 103 | Any actions taken due to violations of the Code of Conduct will be at the discretion of the project maintainers. We are committed to creating a positive and inclusive environment and will take necessary actions to ensure it remains so. 104 | 105 | ## Changes to Governance 106 | 107 | Any changes to this governance document require a consensus among project maintainers. Significant changes should be communicated to the community. 108 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: >- 3 | 🐛 Found something that isn't working as expected? 4 | Raise a ticket to get it fixed! 5 | title: '[BUG]: ' 6 | assignees: 7 | - lissy93 8 | labels: 9 | - bug 10 | body: 11 | - type: dropdown 12 | id: component 13 | attributes: 14 | label: Component 15 | description: Which part of the project does this relate to? 16 | options: 17 | - lib - Scripts used to generate content 18 | - web - The website displaying content 19 | - guides - The content of the guides 20 | - user data - Something not the .yml files 21 | - other - Not specified 22 | validations: 23 | required: true 24 | - type: textarea 25 | id: issue 26 | attributes: 27 | label: Please describe the issue 28 | description: >- 29 | Give as much information as possible, including steps to reproduce, 30 | expected output and actual output. If relevant, give details of your 31 | system or browser. 32 | placeholder: 'When using XYZ, I do ABC, I expect to see DEF, but I actually see GHI. ' 33 | validations: 34 | required: true 35 | - type: checkboxes 36 | id: confirmation 37 | attributes: 38 | label: Pre-Submission Checklist 39 | options: 40 | - label: I have checked this issue has [not already been raised](https://github.com/Lissy93/git-into-open-source/issues?q=is%3Aissue) 41 | required: true 42 | - label: I've searched the [docs](https://github.com/Lissy93/git-into-open-source/tree/main/.github) for an answer 43 | required: true 44 | - label: I agree to follow thr [Code of Conduct](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CODE_OF_CONDUCT.md) 45 | required: true 46 | - type: markdown 47 | attributes: 48 | value: >- 49 | ![thanks](https://raw.githubusercontent.com/Lissy93/git-into-open-source/main/web/public/favicon.png) 50 | Thank you for taking the time to complete this ticket! 51 | You should receive a response within 48 hours :) 52 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: General Support 4 | url: https://github.com/Lissy93/git-into-open-source/discussions 5 | about: 🫂 Need any help? We got you - check out our Discussions page 6 | - name: Author Contact 7 | url: https://aliciasykes.com/contact 8 | about: 📨 Need to get in touch with the author? You can DM us here 9 | - name: Sponsor us 10 | url: https://github.com/sponsors/lissy93 11 | about: 💖 If you've found this project helpful, consider sponsoring us on GitHub 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: >- 3 | ✨ Got a feature suggestion for something we can implement to make the project 4 | better? 5 | title: '[FEATURE]: ' 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: >- 10 | I'm always looking for ways to improve the project, so if you've got any 11 | feature suggestions at all, I'd love to hear them! If possible, could 12 | you make sure your suggestion is possible to build, and if you have any 13 | links or ideas how it might be implemented that's really help! 14 | - type: textarea 15 | id: suggestion 16 | attributes: 17 | label: Feature Suggestion 18 | description: Please explain your feature suggestion 19 | validations: 20 | required: true 21 | - type: dropdown 22 | id: worky 23 | attributes: 24 | label: Would you be up for working on this? 25 | options: 26 | - 'No' 27 | - Maybe 28 | - Yes, but with support 29 | - Hell yeah! 30 | - type: checkboxes 31 | id: confirmation 32 | attributes: 33 | label: Pre-Submission Checklist 34 | options: 35 | - label: I have checked this issue has [not already been raised](https://github.com/Lissy93/git-into-open-source/issues?q=is%3Aissue) 36 | required: true 37 | - label: I've searched the [docs](https://github.com/Lissy93/git-into-open-source/tree/main/.github) for an answer 38 | required: true 39 | - label: I agree to follow thr [Code of Conduct](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CODE_OF_CONDUCT.md) 40 | required: true 41 | - type: markdown 42 | attributes: 43 | value: >- 44 | ![thanks](https://raw.githubusercontent.com/Lissy93/git-into-open-source/main/web/public/favicon.png) 45 | Thank you for taking the time to complete this ticket! 46 | You should receive a response within 48 hours :) 47 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.yml: -------------------------------------------------------------------------------- 1 | name: Question 2 | description: 🤔 Got a question, or something you need help with? 3 | title: '[QUESTION]: ' 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: > 8 | We've now opened up 9 | [Discussions](https://github.com/Lissy93/git-into-open-source/discussions), 10 | so for more general queries, or those not aimed specifically at the repo 11 | author, you might be better off posting there instead. 12 | - type: textarea 13 | id: question-body 14 | attributes: 15 | label: Question 16 | description: Go ahead, ask us anything! 17 | - type: checkboxes 18 | id: confirmation 19 | attributes: 20 | label: Pre-Submission Checklist 21 | options: 22 | - label: I have checked this issue has [not already been raised](https://github.com/Lissy93/git-into-open-source/issues?q=is%3Aissue) 23 | required: true 24 | - label: I've searched the [docs](https://github.com/Lissy93/git-into-open-source/tree/main/.github) for an answer 25 | required: true 26 | - label: I agree to follow the [Code of Conduct](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CODE_OF_CONDUCT.md) 27 | required: true 28 | - type: markdown 29 | attributes: 30 | value: >- 31 | ![thanks](https://raw.githubusercontent.com/Lissy93/git-into-open-source/main/web/public/favicon.png) 32 | Thank you for taking the time to complete this ticket! 33 | You should receive a response within 48 hours :) 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/resource-addition.yml: -------------------------------------------------------------------------------- 1 | name: Resource Addition 2 | description: 📚 Found a great resource we should include on in the list? Suggest it here! 3 | title: '[RESOURCE_ADDITION]: ' 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: >- 8 | Did you know you can submit resources directly, by editing 9 | [`resources.yml`](https://github.com/Lissy93/git-into-open-source/blob/main/resources.yml) 10 | and opening a PR? If it's your first time, you might find [this 11 | guide](https://github.com/Lissy93/git-into-open-source/blob/main/guides/submit-your-first-pr-ui.md) 12 | helpful. 13 | - type: input 14 | id: resource-url 15 | attributes: 16 | label: Resource URL 17 | description: >- 18 | Please provide the URL to the resource you'd like considered for 19 | addition 20 | validations: 21 | required: true 22 | - type: input 23 | id: resource-description 24 | attributes: 25 | label: Resource Description 26 | description: Please provide a short description of the resource 27 | validations: 28 | required: true 29 | - type: textarea 30 | id: resource-justification 31 | attributes: 32 | label: Reasoning 33 | description: >- 34 | Please justify the addition of the resource. Why is it valuable to the 35 | community, what does it provide which isn't yet covered by existing 36 | resources 37 | - type: input 38 | id: resource-affiliation 39 | attributes: 40 | label: Affiliation 41 | description: >- 42 | Are you associated with this website or resource in any way? Declaring 43 | affiliation helps us keep things transparent. 44 | validations: 45 | required: true 46 | - type: dropdown 47 | id: worky 48 | attributes: 49 | label: Would you be up for submitting a PR for this? 50 | options: 51 | - 'No' 52 | - Maybe 53 | - Yes, but with support 54 | - Hell yeah! 55 | - type: checkboxes 56 | id: confirmation 57 | attributes: 58 | label: Pre-Submission Checklist 59 | options: 60 | - label: I have checked this issue has [not already been raised](https://github.com/Lissy93/git-into-open-source/issues?q=is%3Aissue) 61 | required: true 62 | - label: I've searched the [docs](https://github.com/Lissy93/git-into-open-source/tree/main/.github) for an answer 63 | required: true 64 | - label: I agree to follow thr [Code of Conduct](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CODE_OF_CONDUCT.md) 65 | required: true 66 | - type: markdown 67 | attributes: 68 | value: >- 69 | ![thanks](https://raw.githubusercontent.com/Lissy93/git-into-open-source/main/web/public/favicon.png) 70 | Thank you for taking the time to complete this ticket! 71 | You should receive a response within 48 hours :) 72 | 73 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/user-addition.yml: -------------------------------------------------------------------------------- 1 | name: Add your Name 2 | description: 👤 Contributor addition 3 | title: '[USER_ADDITION]: ' 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: >- 8 | If you want your name to be listed in the readme, you should submit a 9 | pull request, editing 10 | [`git-in-here.yml`](https://github.com/Lissy93/git-into-open-source/blob/main/git-in-here.yml) 11 | and following the guidelines in the [contributing 12 | doc](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CONTRIBUTING.md). 13 | If you're unsure how to get started, there are plenty of 14 | [guides](https://github.com/Lissy93/git-into-open-source#open-source-guides) 15 | and resources linked to in the readme 16 | 17 | 18 | You're welcome to proceed with submitting a ticket to get your response 19 | listed, but it may take much longer, and the preferred method is a PR 20 | (plus it's a great learning opportunity!) 21 | - type: dropdown 22 | id: worky 23 | attributes: 24 | label: Would you be up for submitting a PR for this? 25 | options: 26 | - 'No' 27 | - Maybe 28 | - Yes, but with support 29 | - Hell yeah! 30 | - type: dropdown 31 | id: question 32 | attributes: 33 | label: Question 34 | description: Reference of question you wish to answer (see git-in-here.yml for list) 35 | options: 36 | - Q1 37 | - Q2 38 | - Q3 39 | - Q4 40 | - Q5 41 | - Q6 42 | - Q7 43 | - Q8 44 | - Q9 45 | validations: 46 | required: true 47 | - type: input 48 | id: answer 49 | attributes: 50 | label: Answer 51 | description: The answer you wish to submit to your selected question 52 | validations: 53 | required: true 54 | - type: dropdown 55 | id: worky 56 | attributes: 57 | label: Would you be up for submitting a PR for this? 58 | options: 59 | - 'No' 60 | - Maybe 61 | - Yes, but with support 62 | - Hell yeah! 63 | - type: checkboxes 64 | id: confirmation 65 | attributes: 66 | label: Pre-Submission Checklist 67 | options: 68 | - label: I have checked this issue has [not already been raised](https://github.com/Lissy93/git-into-open-source/issues?q=is%3Aissue) 69 | required: true 70 | - label: I've searched the [docs](https://github.com/Lissy93/git-into-open-source/tree/main/.github) for an answer 71 | required: true 72 | - label: I agree to follow thr [Code of Conduct](https://github.com/Lissy93/git-into-open-source/blob/main/.github/CODE_OF_CONDUCT.md) 73 | required: true 74 | - type: markdown 75 | attributes: 76 | value: >- 77 | ![thanks](https://raw.githubusercontent.com/Lissy93/git-into-open-source/main/web/public/favicon.png) 78 | Thank you for taking the time to complete this ticket! 79 | You should receive a response within 48 hours :) 80 | 81 | -------------------------------------------------------------------------------- /.github/PRIVACY.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | 3 | ## Our Commitment to Privacy 4 | 5 | We take your privacy seriously. Our primary goal is to be transparent and foster trust. 6 | We believe that you have the right to understand how your information is used and given the power to make informed decisions. 7 | 8 | ## Data We Collect 9 | 10 | The nature of our project means we inherently collect very minimal data: 11 | 12 | First-Party Services 13 | - **Plausible**: The website uses a self-hosted instance Plausible Analytics solely for hit counting. It respects the "Do Not Track" browser setting and does not collect any personal data. Learn more about how Plausible respects user privacy [here](https://plausible.io/privacy-focused-web-analytics). 14 | 15 | Third-Party Services 16 | - **GitHub**: Hosting our project on GitHub might subject you to their privacy practices. We don't have any additional tracking or data collection on top of what GitHub provides. 17 | - **Netlify**: Our website is hosted on Netlify. Any interactions with our site might be subjected to Netlify's privacy policy. 18 | - **CloudFlare**: We use CloudFlare to protect our website from malicious attacks. Any interactions with our site might be subjected to CloudFlare's privacy policy. 19 | 20 | ## No Personal Data Collection 21 | 22 | We promise we don't and won't ever collect personal data from our users. Your privacy is paramount, and we aim to respect it at every level of our project. 23 | 24 | ## Addressing Concerns 25 | 26 | If you have any concerns about privacy or data security, we are here to address them: 27 | 28 | - **Prompt Response**: Reach out to us, and we'll address your concerns as swiftly as possible. 29 | - **Openness to Questions**: Anything unclear? Any part of our setup you're curious about? Ask us. We're committed to clarity and transparency. 30 | - **Feedback Welcomed**: We're always striving to do better. If you see areas where we can improve in terms of privacy or have suggestions, we're all ears. 31 | 32 | ## Your Rights 33 | 34 | You have the right to: 35 | 36 | - **Ask Questions**: We're here to clarify, explain, and justify any of our practices. 37 | - **Request Removal**: If you ever feel your privacy might have been compromised or just want to ensure your data is not stored, let us know. We'll act promptly. 38 | 39 | Your trust is important to us, and we are committed to protecting your privacy and data at all times. 40 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | We currently support the latest version of our repository for security updates. 6 | As the repository mainly consists of static files and scripts, only the latest state is considered for patches. 7 | 8 | ## Reporting a Vulnerability 9 | 10 | Your security is paramount to us. If you discover any security-related issues or vulnerabilities, we encourage you to report them responsibly. 11 | 12 | Please do not report exploitable security vulnerabilities through public GitHub issues. 13 | 14 | ### How to Report 15 | 16 | - **Email**: Send your findings to security@mail.alicia.omg.lol. Please provide as much information as possible about the vulnerability, steps to reproduce, and its potential impact. 17 | - **Expect a Confirmation**: We will acknowledge receipt of your vulnerability report within 48 hours. 18 | - **Discussion**: After initial triage, we'll engage in further discussion with you about the issue, if necessary. 19 | - **Disclosure**: Once we've assessed the issue, we'll work on a fix. We appreciate your discretion, and we will strive to address and deploy fixes in a timely manner. We will also give credit for the reported vulnerability as per your preference. 20 | 21 | ## Scope 22 | 23 | We're especially interested in vulnerabilities in: 24 | 25 | - **Data Integrity**: Manipulations or unintended uses of the data in git-in-here.yml and resources.yml. 26 | - **Scripts in /lib/**: Any issues that could lead to data corruption, leak, or other security concerns. 27 | - **Static Website in /web/**: Vulnerabilities that might expose user data, lead to misinformation, or can manipulate the content displayed. 28 | - **Guides in /guides/**: Though these are mainly markdown files, any misuse that could lead to confusion or misinformation is crucial. 29 | 30 | While these are our primary areas of interest, any security-related concerns in other parts of the repository are also welcome. 31 | Safe Harbor 32 | 33 | We aim to encourage the responsible disclosure of security vulnerabilities. We will not take legal action against individuals who provide such reports. We consider ethical hacking activities conducted consistent with this policy a "permitted" action. 34 | -------------------------------------------------------------------------------- /.github/SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support 2 | 3 | First and foremost, thank you for using our project! We're committed to providing a welcoming environment and ensuring all users can utilize our work effectively. This document outlines the various avenues available if you need help. 4 | 5 | ## 📖 Documentation 6 | 7 | Before reaching out with your query, we recommend: 8 | 9 | 1. Reviewing the [`README`](/.github/README.md) for an overview of the project. 10 | 2. Checking out our [`CONTRIBUTING`](/.github/CONTRIBUTING.md) guidelines if you're looking to submit changes. 11 | 3. Familiarizing yourself with our [`CODE_OF_CONDUCT`](/.github/CODE_OF_CONDUCT.md) to understand community behavior expectations. 12 | 13 | ## 🐛 Bug Reports & Feature Requests 14 | 15 | If you've identified a bug or want to request a new feature: 16 | 17 | 1. Search the [Issues](https://github.com/lissy93/git-into-open-source/issues) to see if it's already been reported. 18 | 2. If not, open a new issue! Please provide as much information as possible to help us understand and address the issue quickly. 19 | 20 | ## 💬 Discussion & Questions 21 | 22 | For general discussion, questions about the project, or if you're unsure where to start: 23 | 24 | 1. Join our community chat (if applicable). 25 | 2. Start a discussion on the project's [Discussion tab](https://github.com/lissy93/git-into-open-source/discussions). 26 | 3. Reach out to the maintainers or community on [Twitter](https://twitter.com/Lissy_Sykes) or another social platform if you use one. 27 | 28 | ## 🚀 Get Involved! 29 | 30 | If you're excited about our project, there are many ways to get involved: 31 | 32 | 1. Star the repository – it helps boost visibility and shows your support! 33 | 2. Check out "good first issues" or "help wanted" tags in the [Issues section](https://github.com/lissy93/git-into-open-source/issues) to get started with contributions. 34 | 3. Spread the word in your network and community. 35 | 36 | ## 📧 Contact 37 | 38 | If you have specific concerns or need to reach out directly, contact the core maintainers: 39 | 40 | - **Your Name** - [Email](mailto:youremail@example.com) 41 | 42 | -------------------------------------------------------------------------------- /.github/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/.github/logo.png -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | **PR Type:** ___ 4 | 5 | 6 | **Affiliation:** N/A 7 | 8 | 9 | **Ticket:** N/A 10 | 11 | 12 | **Checklist:** 13 | - [ ] I've read Contributing Guidelines 14 | - [ ] I agree to follow the Code of Conduct 15 | 16 | 17 | -------------------------------------------------------------------------------- /.github/secret_scanning.yml: -------------------------------------------------------------------------------- 1 | # Configuration for secret scanning alerts 2 | 3 | # Action to be taken when a secret is detected 4 | action: audit 5 | 6 | # If we need to disable specific alerts, add the pattern to the below array 7 | # This is NOT recommended! 8 | disabledPatterns: 9 | -------------------------------------------------------------------------------- /.github/workflows/adds-hacktoberfest-label.yml: -------------------------------------------------------------------------------- 1 | # If a PR is opened within October, then add Hacktoberfest label 2 | # Also supports other challenges, like NovemberSoftwareChallenge and 24PR-December 3 | name: 🎃 Add Hacktoberfest Label 4 | 5 | on: 6 | pull_request_target: 7 | types: 8 | - opened 9 | 10 | permissions: 11 | issues: write 12 | pull-requests: write 13 | 14 | jobs: 15 | add-label: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: 📆 Check current month 19 | id: check-date 20 | run: | 21 | MONTH=$(date +'%m') 22 | if [[ "$MONTH" == "10" ]]; then 23 | echo "::set-output name=month::october" 24 | elif [[ "$MONTH" == "11" ]]; then 25 | echo "::set-output name=month::november" 26 | elif [[ "$MONTH" == "12" ]]; then 27 | echo "::set-output name=month::december" 28 | else 29 | echo "::set-output name=month::other" 30 | fi 31 | - name: 🏷️ Add labels based on month 32 | uses: actions/github-script@v3 33 | with: 34 | github-token: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }} 35 | script: | 36 | let labelsToAdd = []; 37 | switch ("${{ steps.check-date.outputs.month }}") { 38 | case "october": 39 | labelsToAdd.push('hacktoberfest-accepted'); 40 | break; 41 | case "november": 42 | labelsToAdd.push('NovemberSoftwareChallenge'); 43 | break; 44 | case "december": 45 | labelsToAdd.push('24PR-December'); 46 | break; 47 | } 48 | if (labelsToAdd.length) { 49 | github.issues.addLabels({ 50 | issue_number: context.issue.number, 51 | owner: context.repo.owner, 52 | repo: context.repo.repo, 53 | labels: labelsToAdd 54 | }); 55 | } 56 | -------------------------------------------------------------------------------- /.github/workflows/check-contribution.yml: -------------------------------------------------------------------------------- 1 | name: 🚦 Check Contribution 2 | 3 | on: 4 | pull_request_target: 5 | paths: 6 | - 'git-in-here.yml' 7 | types: 8 | - opened 9 | - synchronize 10 | 11 | permissions: 12 | pull-requests: write 13 | contents: read 14 | 15 | jobs: 16 | check-contribution: 17 | runs-on: ubuntu-latest 18 | if: github.actor != 'lissy93' && github.actor != 'liss-bot' 19 | steps: 20 | 21 | # Checkout users branch 22 | - name: Checkout PR 🛎️ 23 | uses: actions/checkout@v2 24 | with: 25 | ref: ${{ github.event.pull_request.head.sha }} 26 | 27 | # Downloads + installs Python (used for running gen scripts) 28 | - name: Set up Python 🐍 29 | uses: actions/setup-python@v2 30 | with: 31 | python-version: '3.x' 32 | 33 | # Install contents of requirements.txt 34 | - name: Install dependencies 📥 35 | run: | 36 | python -m pip install --upgrade pip 37 | cd lib && pip install -r requirements.txt 38 | 39 | # The make command triggers all the Python scripts, generates output 40 | - name: Run make command 🔨 41 | run: make validate_pr 42 | env: 43 | GITHUB_ACTOR: ${{ github.actor }} 44 | GH_ACCESS_TOKEN: ${{ secrets.BOT_TOKEN }} 45 | GITHUB_EVENT_PATH: ${{ github.event_path }} 46 | -------------------------------------------------------------------------------- /.github/workflows/copy-guides.yml: -------------------------------------------------------------------------------- 1 | name: 📖 Copy guides to website 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [ main ] 7 | paths: ['resources.yml', 'guides/**'] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout repository 🛎️ 15 | uses: actions/checkout@v2 16 | 17 | # Get current date-time (used for commit message) 18 | - name: Get Date 📅 19 | id: date 20 | run: echo "::set-output name=date::$(date +'%d-%b-%Y')" 21 | 22 | # Downloads + installs Python (used for running gen scripts) 23 | - name: Set up Python 🐍 24 | uses: actions/setup-python@v2 25 | with: 26 | python-version: '3.x' 27 | 28 | # Install contents of requirements.txt 29 | - name: Install dependencies 📥 30 | run: | 31 | python -m pip install --upgrade pip 32 | cd lib && pip install -r requirements.txt 33 | 34 | # The make command triggers all the Python scripts, generates output 35 | - name: Run make command 🔨 36 | run: make copy_resources_to_site 37 | 38 | # Commit and push the outputed JSON files 39 | - name: Commit and push generated files ⤴️ 40 | run: | 41 | git config --global user.name "Liss-Bot" 42 | git config --global user.email "alicia-gh-bot@mail.as93.net" 43 | git pull origin main 44 | git add web/src/pages 45 | if git diff --staged --quiet; then 46 | echo "Nothin new added, so nothing to commit, exiting..." 47 | else 48 | git commit -m "Syncs guides to web (auto-generated, on ${{ steps.date.outputs.date }})" 49 | git push 50 | fi 51 | -------------------------------------------------------------------------------- /.github/workflows/deploy-website.yml: -------------------------------------------------------------------------------- 1 | name: 🌍 Deploy to GitHub Pages 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [ main ] 7 | paths: ['web/**', 'guides/**', 'resources.yml', 'git-in-here.yml'] 8 | 9 | permissions: 10 | contents: read 11 | pages: write 12 | id-token: write 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | env: 18 | SITE_URL: 'https://lissy93.github.io' 19 | BASE_PATH: '/git-into-open-source' 20 | GH_ACCESS_TOKEN: ${{ secrets.GH_WEB_PROD }} 21 | steps: 22 | - name: Checkout your repository 🛎️ 23 | uses: actions/checkout@v3 24 | - name: Install, build, and upload site 🛠️ 25 | uses: withastro/action@v0 26 | with: 27 | path: ./web 28 | node-version: 16 29 | package-manager: npm 30 | 31 | deploy: 32 | needs: build 33 | runs-on: ubuntu-latest 34 | environment: 35 | name: github-pages 36 | url: ${{ steps.deployment.outputs.page_url }} 37 | steps: 38 | - name: Deploy to GitHub Pages 🚢 39 | id: deployment 40 | uses: actions/deploy-pages@v1 41 | -------------------------------------------------------------------------------- /.github/workflows/insert-comments.yml: -------------------------------------------------------------------------------- 1 | name: 💬 Inserts Contributor Content 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [ main ] 7 | paths: ['git-in-here.yml'] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout repository 🛎️ 15 | uses: actions/checkout@v2 16 | 17 | # Get current date-time (used for commit message) 18 | - name: Get Date 📅 19 | id: date 20 | run: echo "::set-output name=date::$(date +'%d-%b-%Y')" 21 | 22 | # Downloads + installs Python (used for running gen scripts) 23 | - name: Set up Python 🐍 24 | uses: actions/setup-python@v2 25 | with: 26 | python-version: '3.x' 27 | 28 | # Install contents of requirements.txt 29 | - name: Install dependencies 📥 30 | run: | 31 | python -m pip install --upgrade pip 32 | cd lib && pip install -r requirements.txt 33 | 34 | # The make command triggers all the Python scripts, generates output 35 | - name: Run make command 🔨 36 | run: make insert_contributor_content 37 | 38 | # Commit and push the outputed JSON files 39 | - name: Commit and push generated files ⤴️ 40 | run: | 41 | git config --global user.name "Liss-Bot" 42 | git config --global user.email "alicia-gh-bot@mail.as93.net" 43 | git add .github/README.md 44 | if git diff --staged --quiet; then 45 | echo "Nothin new added, so nothing to commit, exiting..." 46 | else 47 | git commit -m "Updates readme (auto-generated, on ${{ steps.date.outputs.date }})" 48 | git push 49 | fi 50 | -------------------------------------------------------------------------------- /.github/workflows/insert-credits.yml: -------------------------------------------------------------------------------- 1 | name: 👥 Insert Credits 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '10 1 * * 0' # at 01:10 on Sunday 6 | jobs: 7 | 8 | insert-sponsors: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout 🛎️ 12 | uses: actions/checkout@v2 13 | - name: Contributors 14 | uses: akhilmhdh/contributors-readme-action@v2.3.6 15 | env: 16 | GITHUB_TOKEN: ${{ secrets.BOT_TOKEN || secrets.GITHUB_TOKEN }} 17 | with: 18 | image_size: 60 19 | collaborators: all 20 | readme_path: .github/README.md 21 | columns_per_row: 8 22 | commit_message: 'Updates contributor list' 23 | committer_username: liss-bot 24 | committer_email: liss-bot@d0h.co 25 | -------------------------------------------------------------------------------- /.github/workflows/insert-resources.yml: -------------------------------------------------------------------------------- 1 | name: 📚 Inserts Guides & Resources 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [ main ] 7 | paths: ['resources.yml'] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout repository 🛎️ 15 | uses: actions/checkout@v2 16 | 17 | # Get current date-time (used for commit message) 18 | - name: Get Date 📅 19 | id: date 20 | run: echo "::set-output name=date::$(date +'%d-%b-%Y')" 21 | 22 | # Downloads + installs Python (used for running gen scripts) 23 | - name: Set up Python 🐍 24 | uses: actions/setup-python@v2 25 | with: 26 | python-version: '3.x' 27 | 28 | # Install contents of requirements.txt 29 | - name: Install dependencies 📥 30 | run: | 31 | python -m pip install --upgrade pip 32 | cd lib && pip install -r requirements.txt 33 | 34 | # The make command triggers all the Python scripts, generates output 35 | - name: Run make command 🔨 36 | run: make insert_resource_list 37 | 38 | # Commit and push the outputed JSON files 39 | - name: Commit and push generated files ⤴️ 40 | run: | 41 | git config --global user.name "Liss-Bot" 42 | git config --global user.email "alicia-gh-bot@mail.as93.net" 43 | git pull origin main 44 | git add .github/README.md 45 | if git diff --staged --quiet; then 46 | echo "Nothin new added, so nothing to commit, exiting..." 47 | else 48 | git commit -m "Updates resource list (auto-generated, on ${{ steps.date.outputs.date }})" 49 | git push 50 | fi 51 | -------------------------------------------------------------------------------- /.github/workflows/insert-roadmap.yml: -------------------------------------------------------------------------------- 1 | name: 🛣️ Inserts Learning Roadmap 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [ main ] 7 | paths: ['guides/roadmap.mmd'] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout repository 🛎️ 15 | uses: actions/checkout@v2 16 | 17 | # Get current date-time (used for commit message) 18 | - name: Get Date 📅 19 | id: date 20 | run: echo "::set-output name=date::$(date +'%d-%b-%Y')" 21 | 22 | # Downloads + installs Python (used for running gen scripts) 23 | - name: Set up Python 🐍 24 | uses: actions/setup-python@v2 25 | with: 26 | python-version: '3.x' 27 | 28 | # Install contents of requirements.txt 29 | - name: Install dependencies 📥 30 | run: | 31 | python -m pip install --upgrade pip 32 | cd lib && pip install -r requirements.txt 33 | 34 | # The make command triggers all the Python scripts, generates output 35 | - name: Run make command 🔨 36 | run: make insert_roadmap 37 | 38 | # Commit and push the outputed JSON files 39 | - name: Commit and push generated files ⤴️ 40 | run: | 41 | git config --global user.name "Liss-Bot" 42 | git config --global user.email "alicia-gh-bot@mail.as93.net" 43 | git pull origin main 44 | git add .github/README.md 45 | if git diff --staged --quiet; then 46 | echo "Nothin new added, so nothing to commit, exiting..." 47 | else 48 | git commit -m "Updates roadmap source (auto-generated, on ${{ steps.date.outputs.date }})" 49 | git push 50 | fi 51 | -------------------------------------------------------------------------------- /.github/workflows/mirror.yml: -------------------------------------------------------------------------------- 1 | # Pushes the contents of the repo to the Codeberg mirror 2 | name: 🪞 Mirror to Codeberg 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: '10 03 * * 0' # At 03:10 on Sunday 7 | jobs: 8 | codeberg: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | with: { fetch-depth: 0 } 13 | - uses: pixta-dev/repository-mirroring-action@v1 14 | with: 15 | target_repo_url: git@codeberg.org:alicia/git-into-open-source.git 16 | ssh_private_key: ${{ secrets.CODEBERG_SSH }} 17 | -------------------------------------------------------------------------------- /.github/workflows/trigger-web-deploy.yml: -------------------------------------------------------------------------------- 1 | name: 🚢 Trigger Deployment 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | paths: 9 | - 'web/**' 10 | - 'git-in-here.yml' 11 | 12 | jobs: 13 | # This will re-deploy git-into-open-source.as93.net on Netlify 14 | trigger-netlify: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Trigger Netlify Build Hook 18 | run: | 19 | curl -X POST -d '{}' https://api.netlify.com/build_hooks/${{ secrets.NETLIFY_BUILD_HOOK_ID }} 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | 3 | # website dependencies and caches 4 | web/node_modules 5 | web/.snowpack/ 6 | 7 | # website build output 8 | web/dist 9 | 10 | # website logs 11 | web/npm-debug.log* 12 | web/yarn-debug.log* 13 | web/yarn-error.log* 14 | 15 | # website keys, secrets and config 16 | web/.env 17 | 18 | # library test caches 19 | lib/__pycache__ 20 | lib/tests/__pycache__ 21 | lib/cache 22 | 23 | # macOS-specific files 24 | .DS_Store 25 | 26 | # vscode settings and dictionaries 27 | .vscode 28 | 29 | # webstorm settings and dictionaries 30 | .idea 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-2022 Alicia Sykes 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: all install_lib_requirements insert_contributor_content copy_resources_to_site insert_resource_list install_web_dependencies build_web start_web 2 | 3 | PYTHON := $(shell which python3 2>/dev/null || which python) 4 | 5 | # Targets for lib/ 6 | install_lib_requirements: 7 | $(PYTHON) -m pip install -r lib/requirements.txt 8 | 9 | insert_contributor_content: 10 | $(PYTHON) lib/insert_contributor_content.py 11 | 12 | copy_resources_to_site: 13 | $(PYTHON) lib/copy_resources_to_site.py 14 | 15 | insert_resource_list: 16 | $(PYTHON) lib/insert_resource_list.py 17 | 18 | validate_pr: 19 | $(PYTHON) lib/validate_pr.py 20 | 21 | insert_roadmap: 22 | $(PYTHON) lib/insert_roadmap.py 23 | 24 | # Targets for web/ 25 | install_web_dependencies: 26 | cd web && npm install 27 | 28 | build_web: 29 | cd web && npm run build 30 | 31 | start_web: 32 | cd web && npm run start 33 | -------------------------------------------------------------------------------- /guides/local-git-setup.md: -------------------------------------------------------------------------------- 1 | # Complete Git Setup 2 | 3 | 4 | > This page is a work in progress. PRs welcome!
5 | > TODO: I'm going to make instructions clearer, and add screenshots 6 | 7 | This document covers: 8 | - [Creating a GitHub Account](#creating-a-github-account) 9 | - [Installing Git](#installing-git) 10 | - [Setting up SSH keys](#setting-up-ssh-keys) 11 | - [Configuring the gitconfig](#configuring-the-gitconfig) 12 | 13 | 14 | ## Creating a GitHub Account 15 | 16 | Creating a GitHub account is very easy. To create a GitHub account, follow these steps: 17 | 18 | 1. Open your web browser and go to [GitHub's website](https://github.com). 19 | 2. On the GitHub homepage, click on the "Sign up" button to start the registration process. 20 | 3. Choose a unique username for your account. 21 | 4. Provide a valid email address that you have access to. 22 | 5. Create a strong and secure password for your GitHub account. 23 | 6. Complete the CAPTCHA. 24 | 7. Once you've filled your details, click the "Create Account" button. 25 | 8. Open your email inbox and click on the verification link sent by GitHub. 26 | 9. Select the GitHub plan that suits your needs and click "Continue." 27 | 10. (Optional) Customize your GitHub account by adding a profile picture and filling out your profile information. 28 | 12. Once your account is set up, you are good to go! 29 | 30 | ## Installing Git 31 | 32 | For official installation downloads and docs, see [git-scm.com/downloads](https://git-scm.com/downloads) 33 | 34 | ### Installing Git on Windows 35 | 36 | [Git for Windows](https://gitforwindows.org/) is a complete package of all the basic git tools you'll need, with an easy GUI installer. 37 | 38 | 1. Download the latest executable from [the Git for Windows Releases](https://github.com/git-for-windows/git/releases) 39 | 2. Run the installer (by double clicking on the downloaded .exe file) 40 | 3. Follow the on-screen instructions to install git onto your machine 41 | 4. Restart explorer.exe (so the new git executable can be found) 42 | 5. Run `git --version` to verify that git has been installed correctly 43 | 44 | ### Installing Git on Mac 45 | 46 | The easiest way to install Git on MacOS is via Homebrew. 47 | 48 | 1. If you don't yet have Brew installed, install it with: 49 | `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` 50 | 2. Then install git with 51 | `brew install git` 52 | 3. Finally, verify git has been installed 53 | `git --version` 54 | 55 | ### Installing Git on Linux 56 | 57 | On Linux, the best method for installing git is using your system's native package manager. Be sure to update your repositories first. You may need to run install commands as `sudo` 58 | 59 | - Debian / Ubuntu: `apt install git` 60 | - Fedora: `dnf install git` 61 | - OpenSUSE: `zypper install git` 62 | - Gentoo: `emerge --ask --verbose dev-vcs/git` 63 | - Arch: `pacman -S git` 64 | - NixOS: `nix-env -i git` 65 | - FreeBSD: `pkg install git` 66 | - OpenBSD: `pkg_add git` 67 | - Alpine: `apk add git` 68 | 69 | --- 70 | 71 | ## Setting up SSH keys 72 | 73 | 74 | ### Intro to SSH 75 | 76 | When you push to a repo, or make any changes from your local machine, you've got two options for auth, HTTPS or SSH. With HTTPS you'll be prompted to enter a username + password each time you push, whereas with SSH you are authenticated automatically if once your key is setup. 77 | 78 | #### What is SSH Auth? 79 | SSH (or Secure Shell) authentication is a method used to establish a secure connection between a client and a server using cryptographic key pairs: a public key (which you share) and a private key (kept secret on your machine). 80 | 81 | #### How It Works: 82 | 1. You generate an SSH key pair (a public key and a private key). 83 | 2. You add the public key to GitHub (or another platform). 84 | 3. When connecting to GitHub, it will challenge the client to prove they have the corresponding private key. 85 | 4. Your machine uses its private key to respond correctly, verifying your identity without ever revealing the key itself. 86 | 87 | #### Benefits Over HTTPS Clone: 88 | - **Security**: Keys are typically more complex than passwords, making them harder to crack. 89 | - **Convenience**: Once set up, no need to enter a username/password with each interaction. 90 | - **Access Control**: Key-based authentication allows finer-grained control, like read-only or full access. 91 | 92 | #### Note for New Users: 93 | It's essential to keep your private key secure and never share it. If someone gains access to it, they have access to everything the key provides access to. Also, using a passphrase when generating SSH keys adds an extra layer of security. 94 | 95 | 96 | ### Setting up SSH 97 | 98 | #### Generating an SSH key 99 | 100 | You may already have a key, in which case you can skip this step. If you do, it'll likely be in a directory named `~/.ssh/`, you can check this by running `ls -al ~/.ssh` - if you see output, and a file ending in `.pub` then you've already got a key! 101 | 102 | Otherwise, we'll generate a new key by running: 103 | 104 | ```bash 105 | ssh-keygen -t ed25519 -C "your_email@example.com" 106 | ``` 107 | 108 |
Note for legacy systems 109 | For legacy systems which does not support Ed25519 algorithm, use: 110 | 111 | ```bash 112 | ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 113 | ``` 114 | 115 |
116 | 117 | When prompted, complete the form (if you choose to set a password, be sure to remember or make note of it!) 118 | 119 | Next we should to ensure that the SSH agent is running, and that the key is added to it. 120 | 121 | ``` 122 | eval "$(ssh-agent -s)" 123 | ssh-add ~/.ssh/id_rsa 124 | ``` 125 | 126 | #### Adding your key to GitHub 127 | 128 | Next we need to add the public key to your GitHub profile. 129 | 130 | Copy the contents of your newly generated SSH public key (the one ending in `.pub`). You can view the file by running `cat ~/.ssh/id_ed25519.pub` (if you named your key something else, update that accordingly) 131 | 132 | Next head over to GitHub, and log into your account: 133 | 1. Click on your profile photo, then click on Settings. 134 | 2. In the left sidebar, click on SSH and GPG keys. 135 | 3. Click the New SSH key button. 136 | 4. Paste Your Key 137 | 5. In the "Title" field, enter a descriptive label (like "My Laptop" or "Work PC"). 138 | 6. Paste your key into the "Key" field. 139 | 7. Click Add SSH key. 140 | 141 | 142 | --- 143 | 144 | ## Configuring the gitconfig 145 | 146 | 147 | Like other applications and services, git is configurable through a dotfile. You'll likely find your git config in `~/.gitconfig` - but it can be managed using the `git config` command. 148 | 149 | Before we make our first commit, there's a few things we need to setup in the git config. We can do this by running the following commands: 150 | 151 | ```bash 152 | git config --global user.name "Your Full Name" 153 | git config --global user.email "youremail@example.com" 154 | ``` 155 | 156 | That's all you need for now, but there's many other settings which can be tweaked here, such as setting shorthand aliases, default editor/ conflict / diff programs, enabling features, using plugins, etc. It's also possible (and sometimes preferable) to have different git configurations for different projects. 157 | 158 | To learn about those, see the [Git Configuration](https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration). 159 | -------------------------------------------------------------------------------- /guides/open-source-for-businesses.md: -------------------------------------------------------------------------------- 1 | 2 | # Open Source for Business 3 | 4 | Wish you could do more open source work at your day job? 5 | The following article should give you some pointers that you can use to help you explain the business benefits of open source to your company or boss. 6 | 7 | ### Key Benefits 8 | - Attract a higher calibre of talent 9 | - Improve reputation and brand recognition among development circles 10 | - Reflects well on you from a technological and ethical perspective 11 | - Great experience for junior developers to contribute and learn 12 | - Opportunity to showcase and share your tech standards 13 | - Cost saving potential, as once a project is off the ground, external contributors often do the bulk of maintenance and improvements 14 | - Helps you innovate quicker, the open source code and content tends to move a lot faster than corporate and propriety alternatives 15 | 16 | ### Key Disadvantages / Considerations 17 | - Comprehensive review process needs to be in place, to ensure that any content you put out is correct, ethical and able to be shared publicly 18 | - Time constraints - This will take a bit of time to get setup and going 19 | 20 | ### Case Studies 21 | - [GCHQ](https://github.com/gchq) - They've made a number of their internal tools open source (like the famous [CyberChef](https://github.com/gchq/CyberChef)), now the majority of maintenance is done by the community 22 | - [ElseWhen](https://github.com/elsewhencode/) - A small digital consultancy, which published [project-guidelines](https://github.com/elsewhencode/project-guidelines) helping them get a reputation for good coding standards 23 | - [Novu](https://novu.co/) - They [write great posts](https://dev.to/novu) on dev.to, to share knowledge 24 | - [React](https://github.com/facebook/react) - Started by Facebook, React.JS has now seen over 1000 community contributors, helping with bug fixes, docs and feature development 25 | - RedHat - A multinational company who open source the majority of their offerings, were valued at $34b (by IBM, as of 2019) 26 | 27 | ### Methods 28 | - A GitHub organisation where employees can collate and share public components, utils and knowledge 29 | - By sponsoring existing projects, which are either up and coming, or that you rely upon to do our job 30 | - By contributing to existing projects, when the opportunity to do so arises 31 | - Writing blog posts on a developer-focused site, like Dev.to 32 | 33 | -------------------------------------------------------------------------------- /guides/roadmap.mmd: -------------------------------------------------------------------------------- 1 | %%{ 2 | init: { 3 | 'theme': 'base', 4 | 'themeVariables': { 5 | 'primaryColor': '#d494ff', 6 | 'primaryTextColor': '#161618', 7 | 'primaryBorderColor': '#161618', 8 | 'lineColor': '#6befe0', 9 | 'secondaryColor': '#5F54D5', 10 | 'tertiaryColor': '#fff' 11 | } 12 | } 13 | }%% 14 | 15 | graph LR 16 | 17 | style A fill:#759ad5; 18 | style B fill:#9c86ee; 19 | style C fill:#9c86ee; 20 | style D fill:#9c86ee; 21 | style E fill:#9c86ee; 22 | style F fill:#9c86ee; 23 | style G fill:#9c86ee; 24 | style H fill:#9c86ee; 25 | 26 | A(fa:fa-code-branch Open Source Developer Roadmap) 27 | 28 | %% Stage 1 29 | A ==> B(fa:fa-play Stage 1: Introduction) 30 | B ==> B1(What is Open Source?) 31 | B1 --> B1a(Philosophy & Principles) 32 | B1 --> B1b(Benefits - Collaboration, Transparency, Community) 33 | B1 --> B1c(Challenges - Licensing, Governance, Sustainability) 34 | 35 | %% Stage 2 36 | A ==> C(fa:fa-wrench Stage 2: Fundamental Tools) 37 | C ==> C1(Version Control with Git) 38 | C1 --> C1a(Basics - Init, Add, Commit, Push, Pull) 39 | C1 --> C1b(Branching & Merging) 40 | C1 --> C1c(Handling Conflicts) 41 | C1 --> C1d(Best Practices) 42 | 43 | C ==> C2(Using GitHub/GitLab/Bitbucket) 44 | C2 --> C2a(Repositories, Issues & PRs) 45 | C2 --> C2b(Forking vs Cloning) 46 | C2 --> C2c(GitHub Actions - CI/CD Basics) 47 | 48 | %% Stage 3 49 | A ==> D(fa:fa-code Stage 3: Dive into Coding) 50 | D --> D1(Pick a Language) 51 | D1 --> D1a(Basics & Advanced Topics) 52 | D1 --> D1b(Libraries & Frameworks) 53 | D1 --> D1c(Community & Support) 54 | 55 | D ==> D2(Project Structure & Design Patterns) 56 | D2 --> D2a(Understanding Open Source Codebase) 57 | D2 --> D2b(Common Architectural Patterns) 58 | D2 --> D2c(Code Quality & Standards) 59 | 60 | %% Stage 4 61 | A ==> E(fa:fa-people-line Stage 4: Engaging with the Community) 62 | E ==> E1(Finding the Right Project) 63 | E1 --> E1a(Good First Issue & Beginner Friendly) 64 | E1 --> E1b(Project's Vision, Goals, and Roadmap) 65 | 66 | E ==> E2(Communication Skills) 67 | E2 --> E2a(Engaging in Discussions) 68 | E2 --> E2b(Reporting Bugs & Enhancements) 69 | E2 --> E2c(Code Review Ethics & Best Practices) 70 | 71 | %% Stage 5 72 | A ==> F(fa:fa-hands-holding-child Stage 5: Make Contributions) 73 | F ==> F1(Documentation & Testing) 74 | F1 --> F1a(Writing Clear Documentation) 75 | F1 --> F1b(Unit Testing & Test-Driven Development) 76 | 77 | F ==> F2(Bug Fixes & Feature Enhancements) 78 | F2 --> F2a(Debugging Strategies) 79 | F2 --> F2b(Collaborating with Project Maintainers) 80 | 81 | F ==> F3(Project Governance & Management) 82 | F3 --> F3a(Understanding Project's Governance Model) 83 | F3 --> F3b(Role of Maintainers, Contributors, and Users) 84 | 85 | %% Stage 6 86 | A ==> G(fa:fa-brain Stage 6: Advanced Topics) 87 | G ==> G1(Open Source Licensing) 88 | G1 --> G1a(Common Licenses - MIT, GPL, Apache) 89 | G1 --> G1b(Choosing a License for Your Project) 90 | 91 | G ==> G2(Sustainability & Monetization) 92 | G2 --> G2a(Donations, Crowdfunding, Grants) 93 | G2 --> G2b(Open Core, Dual Licensing, Paid Support Models) 94 | 95 | %% Stage 7 96 | A ==> H(fa:fa-rocket Stage 7: Your Own Project) 97 | H ==> H1(Starting a New Project) 98 | H1 --> H1a(Defining Vision & Scope) 99 | H1 --> H1b(Community Building & Management) 100 | 101 | H ==> H2(Continuous Integration & Deployment) 102 | H2 --> H2a(CI/CD Pipelines for Open Source) 103 | H2 --> H2b(Tools - Travis CI, CircleCI, GitHub Actions) 104 | 105 | H ==> H3(Project Leadership & Mentoring) 106 | H3 --> H3a(Nurturing New Contributors) 107 | H3 --> H3b(Setting & Managing Expectations) 108 | -------------------------------------------------------------------------------- /guides/submit-your-first-pr-cli.md: -------------------------------------------------------------------------------- 1 | # Submit your first PR (Terminal) 2 | 3 | > This page is a work in progress. PRs welcome!
4 | > TODO: I'm going to make instructions clearer, and add screenshots 5 | 6 | 7 | ### 1. Fork the Repository 8 | 9 | - Start by visiting the GitHub page of the repository you wish to contribute to. 10 | - In the top-right corner of the page, click the "Fork" button. This will create a copy of the repository under your GitHub account. 11 | 12 | ### 2. Clone Your Forked Repository 13 | 14 | - On your forked repository's main page, click the green "Code" button. Copy the URL provided. 15 | - Open your terminal or command prompt and navigate to the directory where you want to clone the repository. 16 | Enter: 17 | 18 | ```bash 19 | git clone [URL you copied] 20 | ``` 21 | 22 | This will create a local copy of your forked repository on your machine. 23 | 24 | 25 | ### 3. Navigate to the Repository's Directory 26 | 27 | Enter: 28 | 29 | ```bash 30 | cd [repository-name] 31 | ``` 32 | 33 | ### 4. Set Upstream Remote 34 | 35 | To keep track of the original repository (often called the "upstream"), enter: 36 | 37 | ```bash 38 | git remote add upstream [original repository's URL] 39 | ``` 40 | 41 | ### 5. Create a New Branch 42 | 43 | Always make changes in a new branch instead of directly on main or master. To create and switch to a new branch, enter: 44 | 45 | ```bash 46 | git checkout -b [branch-name] 47 | ``` 48 | 49 | Choose a descriptive branch name related to the changes you're planning to make. 50 | 51 | ### 6. Make Your Changes 52 | 53 | Edit, add, or remove files as needed using your preferred text editor or IDE. 54 | 55 | ### 7. Stage and Commit Changes 56 | 57 | Stage your changes with: 58 | 59 | ```bash 60 | git add . 61 | ``` 62 | 63 | Commit your changes with a descriptive message: 64 | 65 | ```bash 66 | git commit -m "Brief description of changes made" 67 | ``` 68 | 69 | ### 8. Push Changes to Your Fork 70 | 71 | Push your changes to your forked repository on GitHub: 72 | 73 | ```bash 74 | git push origin [branch-name] 75 | ``` 76 | 77 | ### 9. Open a Pull Request (PR) 78 | 79 | - Go back to your forked repository on GitHub. 80 | - Click the "New pull request" button (often GitHub will also present a quick link to create a PR from your recently pushed branch). 81 | - Ensure the base repository is the original repository you want to contribute to, and the head repository is your fork. Also, make sure the branch shown for your fork is the one you just pushed. 82 | - Fill in the PR title and description, detailing your changes and the reason for them. 83 | - Click "Create pull request". 84 | 85 | ### 10. Await Feedback 86 | 87 | - The maintainers of the original repository will review your PR. 88 | - They might request some changes. If they do, repeat steps 6-8, and the PR will automatically update with your new changes. 89 | - Engage in any discussions, answer questions, and make necessary changes as needed. 90 | 91 | ### 11. Keep Your Fork Synced 92 | 93 | Before starting new work, it's a good practice to fetch and merge changes from the upstream (original) repository: 94 | 95 | ```bash 96 | git checkout main 97 | git fetch upstream 98 | git merge upstream/main 99 | git push origin main 100 | ``` 101 | 102 | ### 12. Celebrate! 103 | 104 | Once your PR is merged, you've made a successful contribution! 105 | -------------------------------------------------------------------------------- /guides/submit-your-first-pr-ui.md: -------------------------------------------------------------------------------- 1 | # Submit your first PR (UI) 2 | 3 | > This page is a work in progress. PRs welcome!
4 | > TODO: I'm going to make instructions clearer, and add screenshots 5 | 6 | ### 1. Fork the Repository 7 | 8 | - Start by visiting the GitHub page of the repository you want to contribute to. 9 | - In the top-right corner of the page, you'll see a button labeled "Fork". Click it. 10 | - This creates a copy of the repository under your GitHub account. You'll be redirected to your fork. 11 | 12 | 13 | ### 2. Make Changes 14 | 15 | - Browse through the repository files and directories by clicking on them. 16 | - Once you've located the file, click on it to view its contents. 17 | - Click on the pencil icon (it'll be labeled "Edit this file" when you hover over it) in the top-right corner of the file viewer. 18 | - Make your changes to the file in the editor that appears. 19 | 20 | ### 3. Commit the Changes 21 | 22 | - Scroll down to the bottom of the page. You'll see a section titled "Commit changes". 23 | - Enter a short, descriptive title for your changes in the "Commit changes" box. 24 | - Optionally, provide a more detailed description in the larger text box below. 25 | - Ensure the radio button "Create a new branch for this commit and start a pull request." is selected. 26 | - Click on the green "Commit changes" button. 27 | 28 | ### 4. Open a Pull Request (PR) 29 | 30 | - After committing, you'll be taken to a new page titled "Open a pull request". 31 | - GitHub will automatically fill in some details for the PR based on your commit message. 32 | - If you want, edit the title and description of the PR to provide more context or information about your changes. The more detailed and clear you are, the easier it will be for the maintainers. 33 | - Once you're ready, click on the green "Create pull request" button. 34 | 35 | ### 5. Await Feedback 36 | 37 | - The maintainers of the original repository will be notified of your pull request. 38 | - They might provide feedback or ask for changes. Make sure to keep an eye on the PR for any comments or notifications. 39 | - If changes are requested, you can make them directly in your forked repo through the GitHub UI, and they will automatically be added to the open PR. 40 | 41 | ### 6. Celebrate! 42 | 43 | - Once your pull request is approved and merged, you've officially contributed to the project! 44 | -------------------------------------------------------------------------------- /guides/why-open-source.md: -------------------------------------------------------------------------------- 1 | # *Why Open Source Matters* 2 | 3 | *Open source software* refers to software whose source code is made freely available to the public. It's not just about the code; it encompasses a set of principles and practices that promote collaboration, transparency, and accessibility. 🌐🚀 4 | 5 | ## Collaborative Power 🤝👥 6 | 7 | | **Key Benefits** | **Description** | 8 | |-----------------------------|---------------------------------------------------------------| 9 | | Diverse Collaboration | Open source projects thrive on collaboration. Developers, designers, and enthusiasts from around the world come together to contribute their skills and expertise. | 10 | | Innovation Catalyst | This collaborative spirit leads to innovative solutions that may not have been possible in isolated environments. Different perspectives drive creative problem-solving. | 11 | 12 | ## Transparency and Trust 🔍✅ 13 | 14 | | **Key Features** | **Description** | 15 | |-----------------------------|---------------------------------------------------------------| 16 | | Code Review | Transparency is a core principle of open source. Anyone can review the source code, ensuring it's secure, reliable, and aligned with its stated purpose. | 17 | | Building Trust | This transparency builds trust among users and contributors. Knowing that code is open to scrutiny instills confidence. | 18 | 19 | ## Learning and Skill Development 📚👨‍🎓 20 | 21 | | **Advantages** | **Description** | 22 | |-----------------------------|---------------------------------------------------------------| 23 | | Hands-On Learning | Open source services as an invaluable educational resource. Developers can study the code, learn best practices, and enhance their skills through hands-on experience. | 24 | | Community Mentorship | The open source community often provides mentorship and guidance to newcomers, fostering a culture of continuous learning. | 25 | 26 | ## Cost Reduction 💰📉 27 | 28 | | **Benefits** | **Description** | 29 | |-----------------------------|---------------------------------------------------------------| 30 | | Economic Benefits | Organizations can significantly reduce their software development costs by leveraging open source solutions. Instead of building from scratch, they can build upon existing projects, saving time and financial resources. | 31 | | Resource Optimization | Cost savings extend beyond development. Organizations can allocate resources to other critical areas while benefiting from high-quality open source tools. | 32 | 33 | ## Innovation and Rapid Development 🚀🔬 34 | 35 | | **Advantages** | **Description** | 36 | |-----------------------------|---------------------------------------------------------------| 37 | | Accelerated Development | Open source accelerates the pace of software development. Developers can build upon existing projects, leveraging the collective knowledge of the community. | 38 | | Fast Iteration | Rapid development cycles allow for quick iterations and feature enhancements, resulting in the creation of innovative solutions. | 39 | 40 | ## Accessibility and Inclusivity 🌍🌈 41 | 42 | | **Benefits** | **Description** | 43 | |-----------------------------|---------------------------------------------------------------| 44 | | Universal Access | Open source software is often free to use, making it accessible to a diverse global audience, regardless of financial constraints. | 45 | | Inclusive Development | The open source community welcomes contributors from various backgrounds, promoting inclusivity and diversity in technology. | 46 | 47 | ## Longevity and Sustainability 🕰️🌱 48 | 49 | | **Advantages** | **Description** | 50 | |-----------------------------|---------------------------------------------------------------| 51 | | Sustainability | Open source projects have the potential to thrive for years or even decades. This sustainability is made possible through the support of a dedicated community of contributors. | 52 | | Community Commitment | A strong community is invested in the project's success, ensuring its longevity and continuous improvement. | 53 | 54 | ## Customization and Flexibility 🛠️🧩 55 | 56 | | **Benefits** | **Description** | 57 | |-----------------------------|---------------------------------------------------------------| 58 | | Tailored Solutions | Organizations can customize open source software to meet their specific needs and requirements, ensuring that the software aligns perfectly with their goals. | 59 | | Flexible Workflows | The flexibility of open source tools allows organizations to adapt and optimize their workflows for maximum efficiency. | 60 | 61 | ## Ethical and Philosophical Considerations 🌟📜 62 | 63 | | **Aspects** | **Description** | 64 | |-----------------------------|---------------------------------------------------------------| 65 | | Values and Principles | Open source embodies ethical and philosophical values such as openness, freedom, and sharing for the greater good. | 66 | | Alignment with Principles | Some individuals and organizations are drawn to open source not only for its practical benefits but also because it aligns with their principles and beliefs. | 67 | 68 | In conclusion, open source is a powerful force in the world of technology, promoting collaboration, transparency, and innovation. It offers numerous advantages, from cost reduction to educational opportunities, and contributes to a global community that shares a common passion for creating and improving software. 🌍👏 69 | 70 | -------------------------------------------------------------------------------- /lib/.python-version: -------------------------------------------------------------------------------- 1 | pyenv local 3.6.15 2 | -------------------------------------------------------------------------------- /lib/README: -------------------------------------------------------------------------------- 1 | Scripts used for generating the readme from user-contributed data 2 | 3 | PRE-REQUISITES 4 | -------------- 5 | 1. Ensure you've got Python (V 3.6+) installed on your system 6 | 2. Clone the repository, and cd into it 7 | 3. Install the dependencies: `pip install -r lib/requirements.txt` 8 | 4. Run a script, with `python lib/[name of script].py` 9 | 10 | SCRIPTS 11 | ------- 12 | - insert_contributor_content.py - Parses and inserts content from git-in-here.yml into the README.md 13 | - insert_resource_list.py - Inserts list of guides, and external resources into the README.md 14 | - insert_roadmap.py - Parses the Mermaid roadmap diagram, and inserts it + edit links into README.md 15 | - copy_resources_to_site.py - Copies resources from /guides to the website, combining with metadata 16 | - validate_pr.py - Checks newly updated git-in-here.yml to ensure it meets some of the guidelines 17 | 18 | DOCS 19 | ---- 20 | See the header of each script for more information on what it does, requirements and how to use it 21 | 22 | TESTS 23 | ----- 24 | Run `python -m unittest lib/tests/run_all_tests.py` 25 | 26 | CONFIG 27 | ------ 28 | There are some optional environmental variables that can be set before running some scripts 29 | - REPO_OWNER - The username / org where the repository is located (e.g. lissy93) 30 | - REPO_NAME - The name of the repository (e.g. git-into-open-source) 31 | - GH_ACCESS_TOKEN - A GitHub access token, required for higher rate-limit when fetching data 32 | -------------------------------------------------------------------------------- /lib/copy_resources_to_site.py: -------------------------------------------------------------------------------- 1 | """ 2 | Reads the list of resources from the ./resources.yml 3 | For each file, metadata will be inserted as a header 4 | Then copies it over to the website's pages directory 5 | """ 6 | 7 | import os 8 | import yaml 9 | import logging 10 | from pathlib import Path 11 | from datetime import datetime 12 | 13 | 14 | # Configure Logging 15 | LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO").upper() 16 | logging.basicConfig(level=LOG_LEVEL) 17 | logger = logging.getLogger(__name__) 18 | 19 | 20 | def read_file(file_path: str, mode: str = "r") -> str: 21 | try: 22 | with open(file_path, mode) as file: 23 | logger.info(f"Reading file: {file_path}") 24 | return yaml.safe_load(file) 25 | except FileNotFoundError: 26 | logger.error(f"Error: File {file_path} not found.") 27 | exit(1) 28 | 29 | 30 | def write_file(file_path: str, content: str, mode: str = "w") -> None: 31 | with open(file_path, mode) as f: 32 | logging.info(f"Writing to file: {file_path}") 33 | f.write(content) 34 | 35 | 36 | def main(): 37 | # Get the project root, from location of this script 38 | project_root = Path(__file__).parent.parent 39 | # The location of the YAML file to read resource list from 40 | resources_file_path = project_root / "resources.yml" 41 | # The location of the source guide files 42 | guides_directory = project_root / "guides" 43 | # The location of the destination for the guide files 44 | destination_directory = project_root / "web/src/pages/guides" 45 | 46 | data = read_file(resources_file_path) 47 | 48 | for guide in data["guides"]: 49 | source_file_path = guides_directory / f"{guide['file']}.md" 50 | 51 | if source_file_path.exists(): 52 | destination_file_path = destination_directory / f"{guide['file']}.md" 53 | 54 | header = ( 55 | f"---\n" 56 | f"layout: ../../layouts/MarkdownLayout.astro\n" 57 | f"title: {guide.get('title')}\n" 58 | f"description: {guide.get('description')}\n" 59 | f"author: {guide.get('author')}\n" 60 | f"icon: '{guide.get('icon')}'\n" 61 | f"tags: '{guide.get('tags')}'\n" 62 | f"index: '{guide.get('index')}'\n" 63 | f"created: {guide.get('created')}\n" 64 | f"updated: {datetime.now().strftime('%Y-%m-%d')}\n" 65 | f"---\n\n" 66 | 67 | f"\n\n" 69 | ) 70 | 71 | footer = ( 72 | f"\n\n\n" 80 | ) 81 | 82 | content = header + source_file_path.read_text() + footer 83 | write_file(destination_file_path, content) 84 | logging.info(f"Copied {source_file_path} to {destination_file_path}") 85 | else: 86 | logging.warning(f"Skipping {guide['file']} as doc could not be found in {source_file_path}") 87 | 88 | # Copy the contributing guidleines from ./CONTRIBUTING.md to /web/src/pages/contributing.md 89 | contributing_source_path = project_root / ".github/CONTRIBUTING.md" 90 | contributing_destination_path = project_root / "web/src/pages/contributing.md" 91 | content = contributing_source_path.read_text() 92 | contributing_headers = ( 93 | f"---\n" 94 | f"layout: ../layouts/MarkdownLayout.astro\n" 95 | f"title: Contributing Guidelines\n" 96 | f"---\n\n" 97 | f"\n\n" 98 | ) 99 | write_file(contributing_destination_path, contributing_headers + content) 100 | logging.info(f"Copied {contributing_source_path} to {contributing_destination_path}") 101 | 102 | 103 | if __name__ == "__main__": 104 | main() 105 | -------------------------------------------------------------------------------- /lib/insert_resource_list.py: -------------------------------------------------------------------------------- 1 | """ 2 | Reads list of resources from the resources.yml 3 | Then inserts a link to each into the README.md 4 | """ 5 | 6 | import os 7 | import yaml 8 | import logging 9 | from urllib.parse import urlparse 10 | 11 | # Configure Logging 12 | LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO").upper() 13 | logging.basicConfig(level=LOG_LEVEL) 14 | logger = logging.getLogger(__name__) 15 | 16 | # Determine the project root based on the script's location 17 | project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 18 | resources_file_path = os.path.join(project_root, 'resources.yml') 19 | guides_directory = os.path.join(project_root, 'guides') 20 | readme_path = os.path.join(project_root, '.github/README.md') 21 | icon_size=20 22 | 23 | logger.info("Reading the resources.yml file...") 24 | # Read the resources.yml 25 | with open(resources_file_path, 'r') as file: 26 | data = yaml.safe_load(file) 27 | 28 | # Check which guide files exist and prepare their markdown links 29 | guide_links = [] 30 | 31 | for guide in data.get("guides", []): 32 | guide_file_path = os.path.join(guides_directory, f"{guide['file']}.md") 33 | if os.path.exists(guide_file_path): 34 | iconParams = f"?height={icon_size}&color=%23{guide.get('color', '00BBF9')}" 35 | icon = f'' if guide.get("icon") else "" 36 | guide_links.append(f"- {icon} [{guide['title']}](/guides/{guide['file']}.md)") 37 | logger.info(f"Guide file found and link prepared: {guide_file_path}") 38 | else: 39 | logger.warning(f"Guide file not found: {guide_file_path}") 40 | 41 | # Prepare markdown links for external resources 42 | logger.info("Preparing external resource links...") 43 | resource_links = [] 44 | for resource in data.get("resources", []): 45 | resource_host = urlparse(resource['url']).hostname 46 | icon_tag = f"" 47 | resource_links.append(f"- {icon_tag} [{resource['title']}]({resource['url']})") 48 | 49 | logger.info("Preparing to insert project links...") 50 | project_links = [] 51 | for project in data.get("projects", []): 52 | project_links.append(f"- [{project.get('title', project['repo'])}]({project['repo']})") 53 | 54 | # Update the README.md between markers 55 | logger.info("Reading README.md file...") 56 | with open(readme_path, 'r') as file: 57 | readme_content = file.read() 58 | 59 | def update_content_between_markers(content, start_marker, end_marker, new_content): 60 | logger.info(f"Updating content between {start_marker} and {end_marker} markers...") 61 | start_index = content.find(start_marker) 62 | end_index = content.find(end_marker) 63 | 64 | if start_index != -1 and end_index != -1: 65 | before_section = content[:start_index + len(start_marker)] 66 | after_section = content[end_index:] 67 | updated_content = before_section + '\n' + '\n'.join(new_content) + '\n' + after_section 68 | return updated_content 69 | else: 70 | logger.error(f"Markers {start_marker} and {end_marker} not found.") 71 | return content 72 | 73 | # Update guides and resources in README.md 74 | readme_content = update_content_between_markers(readme_content, "", "", guide_links) 75 | readme_content = update_content_between_markers(readme_content, "", "", resource_links) 76 | readme_content = update_content_between_markers(readme_content, "", "", project_links) 77 | 78 | # Write back the updated content to README.md 79 | logger.info("Writing back to README.md...") 80 | with open(readme_path, 'w') as file: 81 | file.write(readme_content) 82 | 83 | logger.info("Script completed successfully!") 84 | -------------------------------------------------------------------------------- /lib/insert_roadmap.py: -------------------------------------------------------------------------------- 1 | """ 2 | Inserts the dynamic roadmap into the readme, as a mermaid diagram. 3 | Also adds fallback .png with pako-encoded link to mermaid.live. 4 | """ 5 | 6 | import os 7 | import json 8 | import zlib 9 | import base64 10 | import logging 11 | 12 | # Configure Logging 13 | LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO").upper() 14 | logging.basicConfig(level=LOG_LEVEL) 15 | logger = logging.getLogger(__name__) 16 | 17 | # Determine the project root based on the script's location 18 | project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 19 | mermaid_file = os.path.join(project_root, 'guides/roadmap.mmd') 20 | readme_path = os.path.join(project_root, '.github/README.md') 21 | 22 | 23 | def js_string_to_byte(data: str) -> bytes: 24 | """Convert a string to bytes using ascii encoding.""" 25 | return bytes(data, 'ascii') 26 | 27 | 28 | def js_bytes_to_string(data: bytes) -> str: 29 | """Decode bytes to a string using ascii decoding.""" 30 | return data.decode('ascii') 31 | 32 | 33 | def js_btoa(data: bytes) -> bytes: 34 | """Encode bytes to base64.""" 35 | return base64.b64encode(data) 36 | 37 | 38 | def pako_deflate(data: bytes) -> bytes: 39 | """Compress the given bytes using zlib.""" 40 | compress = zlib.compressobj(9, zlib.DEFLATED, 15, 8, zlib.Z_DEFAULT_STRATEGY) 41 | compressed_data = compress.compress(data) 42 | compressed_data += compress.flush() 43 | return compressed_data 44 | 45 | 46 | def encode_to_pako(graphMarkdown: str) -> str: 47 | """Encode the graph markdown to a pako format.""" 48 | jGraph = { 49 | "code": graphMarkdown, 50 | "mermaid": {"theme": "default"} 51 | } 52 | byteStr = js_string_to_byte(json.dumps(jGraph)) 53 | deflated = pako_deflate(byteStr) 54 | dEncode = js_btoa(deflated) 55 | return js_bytes_to_string(dEncode) 56 | 57 | 58 | def insert_mermaid_into_readme(mermaid_content: str) -> None: 59 | """Insert the mermaid content into the readme file.""" 60 | logger.info("Preparing to insert mermaid content into readme") 61 | 62 | encoded_pako = encode_to_pako(mermaid_content) 63 | view_link = f"https://mermaid.live/view#pako:{encoded_pako}" 64 | edit_link = f"https://mermaid.live/edit#pako:{encoded_pako}" 65 | # image_link = f"https://mermaid.ink/img/pako:{encoded_pako}?type=png" 66 | # Todo: Dynamically generated png link doesn't seem to be working... 67 | image_link = "https://tinyurl.com/open-source-roadmap" 68 | 69 | try: 70 | with open(readme_path, "r") as f: 71 | readme_content = f.read() 72 | 73 | start_tag = "" 74 | end_tag = "" 75 | 76 | start_idx = readme_content.index(start_tag) + len(start_tag) 77 | end_idx = readme_content.index(end_tag) 78 | 79 | before = ( 80 | "\n
\n" 81 | "🦯 Click here if you cannot see the chart\n\n" 82 | f"This diagram is written using Mermaid- [view the chart source here]({edit_link})\n\n" 83 | f"[![roadmap]({image_link})]({view_link})\n" 84 | "
\n" 85 | "\n```mermaid\n" 86 | ) 87 | 88 | after = "\n```\n" 89 | 90 | new_content = ( 91 | readme_content[:start_idx] + 92 | before + 93 | mermaid_content + 94 | after + 95 | readme_content[end_idx:] 96 | ) 97 | 98 | with open(readme_path, "w") as f: 99 | f.write(new_content) 100 | 101 | logger.info("Mermaid content successfully inserted into readme") 102 | 103 | except Exception as e: 104 | logger.error(f"Error inserting mermaid content: {e}") 105 | raise 106 | 107 | 108 | if __name__ == "__main__": 109 | try: 110 | logger.info("Starting the process...") 111 | 112 | with open(mermaid_file, 'r') as f: 113 | mermaid_content = f.read() 114 | 115 | insert_mermaid_into_readme(mermaid_content) 116 | logger.info("All Done!") 117 | 118 | except Exception as e: 119 | logger.error(f"An error occurred: {e}") 120 | -------------------------------------------------------------------------------- /lib/requirements.txt: -------------------------------------------------------------------------------- 1 | PyYAML==6.0.1 2 | requests==2.31.0 3 | -------------------------------------------------------------------------------- /lib/tests/run_all_tests.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import os 3 | 4 | # Get the directory where the script is located 5 | current_directory = os.path.dirname(os.path.abspath(__file__)) 6 | 7 | if __name__ == "__main__": 8 | test_loader = unittest.TestLoader() 9 | # Set the start directory to the directory of this script 10 | test_suite = test_loader.discover(start_dir=current_directory, pattern='test_*.py') 11 | test_runner = unittest.TextTestRunner(verbosity=2) 12 | test_runner.run(test_suite) 13 | -------------------------------------------------------------------------------- /lib/tests/test_insert_contributor_content.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from unittest.mock import patch, mock_open, Mock 3 | 4 | import sys 5 | sys.path.append('..') 6 | from lib.insert_contributor_content import read_file, write_file, fetch_github_info, map_question_to_heading, fetch_all_stargazers, build_markdown_content 7 | 8 | class TestFetchGitHubInfo(unittest.TestCase): 9 | 10 | @patch('requests.get') 11 | 12 | def test_successful_api_call(self, mock_get): 13 | # Mock a successful response 14 | mock_response = Mock() 15 | mock_response.status_code = 200 16 | mock_response.json.return_value = { 17 | "name": "test_name", 18 | "avatar_url": "test_avatar_url" 19 | } 20 | mock_get.return_value = mock_response 21 | 22 | # Run the function and test its return value 23 | result = fetch_github_info('test_username') 24 | self.assertEqual(result['name'], 'test_name') 25 | self.assertEqual(result['avatar_url'], 'test_avatar_url') 26 | 27 | @patch('requests.get') 28 | def test_unsuccessful_api_call(self, mock_get): 29 | # Mock an unsuccessful response 30 | mock_response = Mock() 31 | mock_response.status_code = 404 # Not found status code 32 | mock_get.return_value = mock_response 33 | 34 | # Run the function and test its return value 35 | result = fetch_github_info('test_username') 36 | self.assertEqual(result['name'], 'test_username') 37 | self.assertEqual(result['avatar_url'], 'https://i.ibb.co/X231Rq8/octo-no-one.png') 38 | 39 | # TODO: Write tests for the other functions in lib/insert_contributor_content.py 40 | 41 | if __name__ == '__main__': 42 | unittest.main() 43 | -------------------------------------------------------------------------------- /resources.yml: -------------------------------------------------------------------------------- 1 | 2 | 3 | # A list of guides to display on the homepage + readme 4 | # Required Fields: 5 | # title - the title of the guide (max 60 chars) 6 | # description - a short description of the guide (max 120 chars) 7 | # file - filename of the doc must correspond to a file within the /guides directory 8 | 9 | # Optional Fields: 10 | # icon - group and name, find an icon here: https://icones.js.org/ 11 | # color - a hex code but without the hash (#) 12 | # author - can be set to your name, or GH username if you want to be credited 13 | # tags - a list of strings that make searching for guides easier 14 | # index - a number that determines the order of the guides 15 | # created - date the guide was created, in the format YYYY-MM-DD 16 | 17 | guides: 18 | - title: Why Open Source? 19 | description: How open source can help you learn and grow as a developer. 20 | file: why-open-source 21 | icon: raphael:opensource 22 | color: 9B5DE5 23 | index: 0 24 | 25 | - title: Submit your first PR (UI) 26 | description: Learn how to submit your first pull-request via the GitHub UI. 27 | file: submit-your-first-pr-ui 28 | icon: fa:github 29 | color: F15BB5 30 | index: 1 31 | 32 | - title: Full Local Git Setup 33 | description: Step-by-step instructions for getting all prerequisites installed. 34 | file: local-git-setup 35 | icon: mdi:git 36 | color: FEE440 37 | index: 2 38 | 39 | - title: Submit your first PR (CLI) 40 | description: Learn how to submit your first code change to a project. 41 | file: submit-your-first-pr-cli 42 | icon: ion:git-branch 43 | color: 00BBF9 44 | index: 3 45 | 46 | - title: Other open source contributions 47 | description: Not a developer? There's many other ways you can contribute without coding! 48 | file: other-open-source-contributions 49 | icon: 'fa:heart' 50 | 51 | - title: Open Source for Businesses 52 | description: See all the ways embracing open source can benefit your company. 53 | file: open-source-for-businesses 54 | icon: ic:round-business-center 55 | color: 00F5D4 56 | index: 4 57 | 58 | # A list of helpful external resources 59 | resources: 60 | - title: Simple Introduction to Git 61 | url: https://rogerdudler.github.io/git-guide/ 62 | - title: Open Source Guides from GitHub 63 | url: https://opensource.guide/ 64 | - title: Good First Issue - Find beginner-friendly tickets 65 | url: https://goodfirstissue.dev/ 66 | - title: First Contributions - Find projects to contribute to 67 | url: https://firstcontributions.github.io/ 68 | - title: Code Triage - Find Projects to Contribute to 69 | url: https://www.codetriage.com/ 70 | - title: Outreachy - Paid Open Source Internships for Beginners 71 | url: https://www.outreachy.org/ 72 | - title: Learn Git - Comprehensive yet simple guide from BitBucket 73 | url: https://www.atlassian.com/git/tutorials/learn-git-with-bitbucket-cloud 74 | - title: Git Immersion - Quick walk through of Git 75 | url: https://gitimmersion.com 76 | - title: Git Tips & Tricks 77 | url: https://github.com/git-tips/tips 78 | - title: GitHub Cheatsheet and Hidden Features 79 | url: https://github.com/tiimgreen/github-cheat-sheet 80 | - title: Git GUIs for Windows, Mac and Linux 81 | url: https://git-scm.com/downloads/guis 82 | - title: All about Git Hooks 83 | url: https://githooks.com/ 84 | - title: Effective branching patterns of larger teams 85 | url: https://martinfowler.com/articles/branching-patterns.html 86 | - title: Choose an open source license 87 | url: https://choosealicense.com/ 88 | - title: Git Command Explorer 89 | url: https://gitexplorer.com/ 90 | 91 | # A list of GitHub repositories that are welcoming to first-time contributors 92 | projects: 93 | - repo: https://github.com/lissy93/git-into-open-source 94 | -------------------------------------------------------------------------------- /web/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | node: true, 4 | es2022: true, 5 | browser: true, 6 | }, 7 | extends: ['eslint:recommended', 'plugin:astro/recommended', 'plugin:astro/jsx-a11y-strict'], 8 | parserOptions: { 9 | ecmaVersion: 'latest', 10 | sourceType: 'module', 11 | }, 12 | rules: {}, 13 | overrides: [ 14 | { 15 | files: ['*.js'], 16 | rules: { 17 | 'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'], 18 | }, 19 | }, 20 | { 21 | files: ['*.astro'], 22 | parser: 'astro-eslint-parser', 23 | parserOptions: { 24 | parser: '@typescript-eslint/parser', 25 | extraFileExtensions: ['.astro'], 26 | }, 27 | rules: { 28 | 'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'], 29 | }, 30 | }, 31 | { 32 | files: ['*.ts'], 33 | parser: '@typescript-eslint/parser', 34 | extends: ['plugin:@typescript-eslint/recommended'], 35 | rules: { 36 | '@typescript-eslint/no-unused-vars': [ 37 | 'error', 38 | { argsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' }, 39 | ], 40 | '@typescript-eslint/no-non-null-assertion': 'off', 41 | }, 42 | }, 43 | { 44 | files: ['**/*.astro/*.js', '*.astro/*.js'], 45 | parser: '@typescript-eslint/parser', 46 | }, 47 | ], 48 | } 49 | -------------------------------------------------------------------------------- /web/.npmrc: -------------------------------------------------------------------------------- 1 | # Expose Astro dependencies for `pnpm` users 2 | shamefully-hoist = true -------------------------------------------------------------------------------- /web/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "semi": false, 4 | "singleQuote": true, 5 | "printWidth": 120, 6 | "plugins": ["prettier-plugin-astro", "prettier-plugin-tailwindcss"], 7 | "pluginSearchDirs": false 8 | } 9 | -------------------------------------------------------------------------------- /web/README: -------------------------------------------------------------------------------- 1 | 2 | This is a simple staticly generated website, built with Astro. 3 | It's purpose is to provide a more interactive method to read the resources and guides. 4 | 5 | 6 | DEVELOPING INSTRUCTIONS 7 | ----------------------- 8 | You'll need Node.js installed on your system. 9 | Clone the repository, and cd into the web directory. 10 | Install dependencies, with `npm install` 11 | Then run `npm run dev` to start the development server. 12 | Or, use `npm build` and `npm start` to build & start the production app. 13 | 14 | -------------------------------------------------------------------------------- /web/astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'astro/config' 2 | import mdx from '@astrojs/mdx' 3 | import tailwind from '@astrojs/tailwind' 4 | import compress from 'astro-compress' 5 | import dotenv from 'dotenv'; 6 | import sitemap from '@astrojs/sitemap'; 7 | import svelte from '@astrojs/svelte'; 8 | 9 | dotenv.config(); 10 | 11 | const site = process.env.SITE_URL || undefined; 12 | const base = process.env.BASE_PATH || '/'; 13 | 14 | export default defineConfig({ 15 | site, 16 | base, 17 | compressHTML: true, 18 | integrations: [svelte(), mdx(), tailwind(), compress(), sitemap()], 19 | buildOptions: { 20 | jsxImportSource: '@webcomponents/element', 21 | } 22 | }) 23 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git-into-open-source", 3 | "description": "The website for the Git Into Open Source project", 4 | "version": "0.1.0", 5 | "author": "Alicia Sykes", 6 | "homepage": "https://github.com/lissy93/git-into-open-source", 7 | "license": "MIT", 8 | "scripts": { 9 | "dev": "astro dev", 10 | "start": "astro dev", 11 | "build": "astro build", 12 | "preview": "astro preview" 13 | }, 14 | "devDependencies": { 15 | "@astrojs/mdx": "^1.1.5", 16 | "@astrojs/partytown": "^2.0.1", 17 | "@astrojs/tailwind": "^5.0.3", 18 | "@typescript-eslint/eslint-plugin": "^6.7.5", 19 | "@typescript-eslint/parser": "^6.11.0", 20 | "accessible-astro-components": "^2.2.1", 21 | "astro": "^3.2.4", 22 | "astro-compress": "^2.0.6", 23 | "astro-icon": "^0.8.2", 24 | "eslint": "^8.54.0", 25 | "eslint-plugin-astro": "^0.29.1", 26 | "eslint-plugin-jsx-a11y": "^6.8.0", 27 | "prettier": "^3.0.3", 28 | "prettier-plugin-astro": "^0.12.2", 29 | "prettier-plugin-tailwindcss": "^0.5.7", 30 | "sass": "^1.69.5", 31 | "svgo": "^2.8.0", 32 | "tailwindcss": "^3.2.7" 33 | }, 34 | "dependencies": { 35 | "@astrojs/sitemap": "^3.0.2", 36 | "@astrojs/svelte": "^4.0.4", 37 | "dotenv": "^16.3.1", 38 | "js-yaml": "^4.1.0", 39 | "svelte": "^4.2.3" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /web/public/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/banner.png -------------------------------------------------------------------------------- /web/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/favicon.png -------------------------------------------------------------------------------- /web/public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/fonts/OpenSans-Bold.woff -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/fonts/OpenSans-Bold.woff2 -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/fonts/OpenSans-ExtraBold.woff -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/fonts/OpenSans-ExtraBold.woff2 -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/fonts/OpenSans-Italic.woff -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/fonts/OpenSans-Italic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/fonts/OpenSans-Regular.woff -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/fonts/OpenSans-Regular.woff2 -------------------------------------------------------------------------------- /web/public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/icon.png -------------------------------------------------------------------------------- /web/public/octocat-swim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/octocat-swim.png -------------------------------------------------------------------------------- /web/public/social-preview-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Lissy93/git-in/e34d52939efb5966108541517bb0b675c4b12e99/web/public/social-preview-image.png -------------------------------------------------------------------------------- /web/src/assets/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/assets/img/octocat-colored.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/assets/img/octocat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_breakpoint.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Breakpoint 3 | // | ------------------------------------------------------------- 4 | 5 | $breakpoints: ( 6 | "default": 0, 7 | "small": 24em, 8 | "medium": 48em, 9 | "large": 75em, 10 | "small-down": null, // these won't actually store any values 11 | "medium-down": null, 12 | "large-down": null 13 | ) !default; 14 | 15 | @mixin breakpoint($breakpoint) { 16 | @if map-has-key($breakpoints, $breakpoint) { 17 | @if str-index($breakpoint, "-down") { 18 | $breakpoint-name: str-slice($breakpoint, 0, str-index($breakpoint, "-down") - 1); 19 | @media (max-width: map-get($breakpoints, $breakpoint-name) - 0.01em) { 20 | @content; 21 | } 22 | } @else { 23 | @media (min-width: map-get($breakpoints, $breakpoint)) { 24 | @content; 25 | } 26 | } 27 | } @else if (type_of($breakpoint) == number) { 28 | @media (min-width: $breakpoint+"px") { 29 | @content; 30 | } 31 | } @else { 32 | @error "Not a correct value, check _base-breakpoints for available values."; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_button.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Button 3 | // | ------------------------------------------------------------- 4 | 5 | .button { 6 | display: inline-block; 7 | padding: 0.75rem 1rem; 8 | font-weight: bold; 9 | text-decoration: none; 10 | text-align: center; 11 | color: var(--neutral-900); 12 | background-color: var(--primary-100); 13 | border: 3px solid var(--primary-100); 14 | border-radius: 3px; 15 | transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; 16 | 17 | &:hover, 18 | &:focus { 19 | text-decoration: underline; 20 | background-color: var(--primary-200); 21 | border-color: var(--primary-200); 22 | } 23 | 24 | &:visited { 25 | color: var(--neutral-900); 26 | } 27 | 28 | &.color-secondary { 29 | background-color: var(--secondary-100); 30 | border-color: (var(--secondary-100)); 31 | 32 | &:hover, 33 | &:focus { 34 | background-color: var(--secondary-400); 35 | border-color: var(--secondary-400); 36 | } 37 | } 38 | 39 | &.color-neutral { 40 | background-color: var(--neutral-500); 41 | border-color: (var(--neutral-500)); 42 | 43 | &:hover, 44 | &:focus { 45 | background-color: var(--neutral-400); 46 | border-color: var(--neutral-400); 47 | } 48 | } 49 | 50 | &.color-info { 51 | background-color: var(--info-300); 52 | border-color: (var(--info-300)); 53 | 54 | &:hover, 55 | &:focus { 56 | background-color: var(--info-200); 57 | border-color: var(--info-200); 58 | } 59 | } 60 | 61 | &.color-success { 62 | background-color: var(--success-400); 63 | border-color: (var(--success-400)); 64 | 65 | &:hover, 66 | &:focus { 67 | background-color: var(--success-300); 68 | border-color: var(--success-300); 69 | } 70 | } 71 | 72 | &.color-warning { 73 | background-color: var(--warning-400); 74 | border-color: (var(--warning-400)); 75 | 76 | &:hover, 77 | &:focus { 78 | background-color: var(--warning-300); 79 | border-color: var(--warning-300); 80 | } 81 | } 82 | 83 | &.color-error { 84 | background-color: var(--error-300); 85 | border-color: (var(--error-300)); 86 | 87 | &:hover, 88 | &:focus { 89 | background-color: var(--error-200); 90 | border-color: var(--error-200); 91 | } 92 | } 93 | 94 | &.size-tiny { 95 | padding: 0.125rem 0.25rem; 96 | font-size: 0.75rem; 97 | line-height: 1.125rem; 98 | } 99 | 100 | &.size-small { 101 | padding: 0.25rem 0.5rem; 102 | font-size: 0.875rem; 103 | line-height: 1.3125rem; 104 | } 105 | 106 | &.size-large { 107 | padding: 0.75rem 1rem; 108 | font-size: 1.125rem; 109 | line-height: 1.6875rem; 110 | } 111 | 112 | &.size-huge { 113 | padding: 1rem 2rem; 114 | font-size: 1.25rem; 115 | line-height: 1.875rem; 116 | } 117 | 118 | &.behavior-full { 119 | display: block; 120 | width: 100%; 121 | } 122 | 123 | &.type-secondary { 124 | background-color: transparent; 125 | 126 | &:hover, 127 | &:focus { 128 | background-color: transparent; 129 | } 130 | } 131 | 132 | &.has-icon { 133 | display: flex; 134 | align-items: center; 135 | gap: 0.5rem; 136 | 137 | [astro-icon] { 138 | width: 30px; 139 | } 140 | } 141 | } 142 | 143 | .darkmode .button.type-secondary { 144 | color: var(--neutral-100); 145 | } 146 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_color.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Color 3 | // | ------------------------------------------------------------- 4 | 5 | $colors: ( 6 | primary: ( 7 | 100: hsl(276, 100%, 79%), 8 | 200: hsl(276, 79%, 69%), 9 | 300: hsl(276, 53%, 49%), 10 | 400: hsl(276, 64%, 48%), 11 | 500: hsl(276, 96%, 20%), 12 | ), 13 | secondary: ( 14 | 100: hsl(173, 81%, 68%), 15 | 200: hsl(173, 80%, 63%), 16 | 300: hsl(173, 72%, 57%), 17 | 400: hsl(173, 75%, 47%), 18 | 500: hsl(173, 90%, 30%), 19 | ), 20 | neutral: ( 21 | 100: hsl(0 0% 100%), 22 | 200: hsl(200 18% 96%), 23 | 300: hsl(200 12% 92%), 24 | 400: hsl(205 12% 88%), 25 | 500: hsl(209 13% 83%), 26 | 600: hsl(208 6% 55%), 27 | 700: hsl(210 8% 31%), 28 | 800: hsl(212 9% 22%), 29 | 900: hsl(210 10% 14%), 30 | ), 31 | dark: ( 32 | 100: hsl(240, 4%, 9%), 33 | ), 34 | ); 35 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_container.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Container 3 | // | ------------------------------------------------------------- 4 | 5 | @use "breakpoint" as *; 6 | 7 | .container { 8 | margin: 0 auto; 9 | padding: 0 calc(2rem / 2); 10 | max-width: 100%; 11 | 12 | @include breakpoint(medium) { 13 | padding: 0 2rem; 14 | } 15 | 16 | @include breakpoint(large) { 17 | padding: 0 calc(2rem / 2); 18 | max-width: 1200px; 19 | } 20 | 21 | &.stretch { 22 | max-width: 100%; 23 | } 24 | } -------------------------------------------------------------------------------- /web/src/assets/scss/base/_font.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Font 3 | // | ------------------------------------------------------------- 4 | 5 | @use 'breakpoint' as *; 6 | 7 | @font-face { 8 | font-family: 'Open Sans'; 9 | src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), url('/fonts/OpenSans-ExtraBold.woff2') format('woff2'), 10 | url('/fonts/OpenSans-ExtraBold.woff') format('woff'); 11 | font-weight: bold; 12 | font-style: normal; 13 | font-display: swap; 14 | } 15 | 16 | @font-face { 17 | font-family: 'Open Sans'; 18 | src: local('Open Sans Bold'), local('OpenSans-Bold'), url('/fonts/OpenSans-Bold.woff2') format('woff2'), 19 | url('/fonts/OpenSans-Bold.woff') format('woff'); 20 | font-weight: bold; 21 | font-style: normal; 22 | font-display: swap; 23 | } 24 | 25 | @font-face { 26 | font-family: 'Open Sans'; 27 | src: local('Open Sans Italic'), local('OpenSans-Italic'), url('/fonts/OpenSans-Italic.woff2') format('woff2'), 28 | url('/fonts/OpenSans-Italic.woff') format('woff'); 29 | font-weight: normal; 30 | font-style: italic; 31 | font-display: swap; 32 | } 33 | 34 | @font-face { 35 | font-family: 'Open Sans'; 36 | src: local('Open Sans Regular'), local('OpenSans-Regular'), url('/fonts/OpenSans-Regular.woff2') format('woff2'), 37 | url('/fonts/OpenSans-Regular.woff') format('woff'); 38 | font-weight: normal; 39 | font-style: normal; 40 | font-display: swap; 41 | } 42 | 43 | body { 44 | font-family: var(--font-family-default); 45 | text-shadow: rgba(0, 0, 0, 0.01) 0 0 1px; 46 | text-rendering: optimizeLegibility; 47 | font-synthesis: none; 48 | font-size: 1rem; 49 | line-height: 1.5rem; 50 | -webkit-text-size-adjust: 100%; 51 | -moz-osx-font-smoothing: grayscale; 52 | -webkit-font-smoothing: antialiased; 53 | 54 | a:not(.button) { 55 | color: var(--action-color); 56 | text-decoration: underline; 57 | 58 | &:visited { 59 | color: var(--action-color); 60 | } 61 | 62 | &:hover, 63 | &:focus { 64 | color: var(--action-color-state); 65 | text-decoration: none; 66 | } 67 | } 68 | 69 | :where(main) a { 70 | word-wrap: break-word; 71 | word-break: break-word; 72 | } 73 | 74 | :where(h1, h2) { 75 | font-family: var(--font-family-special); 76 | } 77 | 78 | h1, 79 | h2 { 80 | font-weight: 800; 81 | } 82 | 83 | h3, 84 | h4, 85 | h5, 86 | h6 { 87 | font-weight: 600; 88 | } 89 | 90 | h1 { 91 | font-size: 2.25rem; 92 | line-height: 3.375rem; 93 | 94 | @include breakpoint(medium) { 95 | font-size: 3rem; 96 | line-height: 3.625rem; 97 | } 98 | } 99 | 100 | h2 { 101 | font-size: 1.875rem; 102 | line-height: 2.8125rem; 103 | 104 | @include breakpoint(medium) { 105 | font-size: 2.25rem; 106 | line-height: 3.375rem; 107 | } 108 | } 109 | 110 | h3 { 111 | font-size: 1.5rem; 112 | line-height: 2.25rem; 113 | 114 | @include breakpoint(medium) { 115 | font-size: 1.875rem; 116 | line-height: 2.8125rem; 117 | } 118 | } 119 | 120 | h4 { 121 | font-size: 1.25rem; 122 | line-height: 1.875rem; 123 | 124 | @include breakpoint(medium) { 125 | font-size: 1.5rem; 126 | line-height: 2.25rem; 127 | } 128 | } 129 | 130 | h5 { 131 | font-size: 1.125rem; 132 | line-height: 1.6875rem; 133 | 134 | @include breakpoint(medium) { 135 | font-size: 1.25rem; 136 | line-height: 1.875rem; 137 | h6 { 138 | font-size: 1rem; 139 | } 140 | } 141 | 142 | line-height: 1.5rem; 143 | 144 | @include breakpoint(medium) { 145 | font-size: 1.125rem; 146 | line-height: 1.6875rem; 147 | } 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_list.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Lists 3 | // | ------------------------------------------------------------- 4 | 5 | @use 'breakpoint' as *; 6 | 7 | ul:not([class]), 8 | ol:not([class]) { 9 | margin-left: 1rem; 10 | 11 | ul, 12 | ol { 13 | padding: 0.5rem 1rem 0; 14 | } 15 | 16 | li { 17 | margin-bottom: 0.5rem; 18 | } 19 | } 20 | 21 | ul:not([class]) { 22 | > li::marker { 23 | display: block; 24 | color: var(--primary-800); 25 | } 26 | } 27 | 28 | ol.incremented { 29 | counter-reset: item; 30 | 31 | ol { 32 | counter-reset: item; 33 | } 34 | 35 | ol, 36 | ul { 37 | margin: 0.75rem 0 0 1rem; 38 | } 39 | 40 | li { 41 | display: block; 42 | margin-bottom: 0.5rem; 43 | 44 | @include breakpoint(medium) { 45 | margin-bottom: 0.75rem; 46 | } 47 | 48 | &::before { 49 | content: counters(item, '.') '. '; 50 | counter-increment: item; 51 | } 52 | 53 | &:last-child { 54 | margin-bottom: 0; 55 | } 56 | 57 | p { 58 | display: inline; 59 | } 60 | } 61 | 62 | ul { 63 | li::before { 64 | content: ''; 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_outline.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Outline 3 | // | ------------------------------------------------------------- 4 | 5 | @mixin outline { 6 | outline: 2px dotted black; 7 | outline-color: black; 8 | outline-offset: 0; 9 | -webkit-box-shadow: 0 0 0 2px white; 10 | box-shadow: 0 0 0 2px white; 11 | } 12 | 13 | *:focus, 14 | *:focus-visible { 15 | @include outline; 16 | } 17 | 18 | *:focus:not(:focus-visible) { 19 | outline: none; 20 | box-shadow: none; 21 | } 22 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_reset.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | > Reset 3 | // | ------------------------------------------------------------- 4 | 5 | html { 6 | box-sizing: border-box; 7 | scroll-behavior: smooth; 8 | 9 | @media (prefers-reduced-motion: reduce) { 10 | scroll-behavior: auto; 11 | 12 | body * { 13 | animation-duration: 0s !important; 14 | animation-delay: 0s !important; 15 | } 16 | } 17 | } 18 | 19 | *, 20 | *::after, 21 | *::before { 22 | box-sizing: inherit; 23 | } 24 | 25 | blockquote, 26 | body, 27 | figure, 28 | h1, 29 | h2, 30 | h3, 31 | h4, 32 | h5, 33 | h6, 34 | hr, 35 | li, 36 | ol, 37 | p, 38 | pre, 39 | ul { 40 | margin: 0; 41 | padding: 0; 42 | } 43 | 44 | button, 45 | input, 46 | select, 47 | textarea { 48 | color: inherit; 49 | letter-spacing: inherit; 50 | font: inherit; 51 | } 52 | 53 | input[type="text"], 54 | textarea { 55 | width: 100%; 56 | } 57 | 58 | fieldset { 59 | padding: 0; 60 | border: none; 61 | } 62 | 63 | legend { 64 | margin-bottom: 0.5rem; 65 | max-width: 100%; 66 | } 67 | 68 | button, 69 | input, 70 | textarea { 71 | border: 1px solid gray; 72 | } 73 | 74 | button { 75 | padding: 0.75em 1em; 76 | border-radius: 0; 77 | background-color: transparent; 78 | line-height: 1; 79 | } 80 | 81 | button * { 82 | pointer-events: none; 83 | } 84 | 85 | button:hover { 86 | cursor: pointer; 87 | } 88 | 89 | embed, 90 | iframe, 91 | img, 92 | object, 93 | svg, 94 | video { 95 | display: block; 96 | max-width: 100%; 97 | } 98 | 99 | table { 100 | width: 100%; 101 | table-layout: fixed; 102 | } 103 | 104 | [hidden] { 105 | display: none !important; 106 | } 107 | 108 | noscript { 109 | display: block; 110 | margin-top: 1em; 111 | margin-bottom: 1em; 112 | } 113 | 114 | [tabindex="-1"] { 115 | outline: none !important; 116 | box-shadow: none !important; 117 | } 118 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_root.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Root 3 | // | ------------------------------------------------------------- 4 | 5 | @use "color" as *; 6 | 7 | :root { 8 | @each $color, $shades in $colors { 9 | @each $shade, $value in $shades { 10 | --#{$color}-#{$shade}: #{$value}; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/src/assets/scss/base/_space-content.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Space Content 3 | // | ------------------------------------------------------------- 4 | 5 | @use 'breakpoint' as *; 6 | 7 | .space-content { 8 | > * + *, 9 | > dl > * + * { 10 | margin-top: 1.5rem; 11 | margin-bottom: 0; 12 | } 13 | 14 | > h2 { 15 | margin-top: 3rem; 16 | 17 | @include breakpoint(large) { 18 | margin-top: 4rem; 19 | } 20 | } 21 | 22 | > h3 { 23 | margin-top: 2rem; 24 | 25 | @include breakpoint(large) { 26 | margin-top: 3rem; 27 | } 28 | } 29 | 30 | > h4 { 31 | margin-top: 1.5rem; 32 | 33 | @include breakpoint(large) { 34 | margin-top: 2rem; 35 | } 36 | } 37 | 38 | > h5 { 39 | margin-top: 1rem; 40 | 41 | @include breakpoint(large) { 42 | margin-top: 1.5rem; 43 | } 44 | } 45 | 46 | > h6 { 47 | margin-top: 1rem; 48 | 49 | @include breakpoint(large) { 50 | margin-top: 1.5rem; 51 | } 52 | } 53 | 54 | > *:first-child { 55 | margin-top: 0; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /web/src/assets/scss/globals.scss: -------------------------------------------------------------------------------- 1 | // | ------------------------------------------------------------- 2 | // | Globals 3 | // | ------------------------------------------------------------- 4 | 5 | @use 'base/reset'; 6 | @use 'base/root'; 7 | @use 'base/font'; 8 | @use 'base/list'; 9 | @use 'base/container'; 10 | @use 'base/breakpoint'; 11 | @use 'base/button'; 12 | @use 'base/color'; 13 | @use 'base/outline'; 14 | @use 'base/space-content'; 15 | -------------------------------------------------------------------------------- /web/src/components/CallToAction.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Continue on GitHub

4 | Let's go! 5 |
6 |
7 | 8 | 31 | -------------------------------------------------------------------------------- /web/src/components/ContentMedia.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Media } from 'accessible-astro-components' 3 | 4 | const { imgSrc, reverseImg = false } = Astro.props 5 | --- 6 | 7 |
8 |
9 |
10 | {!reverseImg ? : ''} 11 |
12 | 13 |
14 | {reverseImg ? : ''} 15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /web/src/components/Contributors.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import yaml from 'js-yaml'; 3 | 4 | const GITHUB_TOKEN = process.env.GH_ACCESS_TOKEN; 5 | 6 | const repo = 'lissy93/git-into-open-source'; 7 | 8 | const contributorCommentsUrl = `https://raw.githubusercontent.com/${repo}/main/git-in-here.yml`; 9 | 10 | const placeholderImage = 'https://i.ibb.co/X231Rq8/octo-no-one.png'; 11 | 12 | const fetchGitHubUserInfo = async (username) => { 13 | const headers = GITHUB_TOKEN ? { 'Authorization': `token ${GITHUB_TOKEN}` } : undefined; 14 | const response = await fetch(`https://api.github.com/users/${username}`, { headers }); 15 | if (!response.ok) return null; 16 | const userInfo = await response.json(); 17 | return { 18 | fullName: userInfo.name || username, 19 | avatarUrl: userInfo.avatar_url || placeholderImage, 20 | }; 21 | }; 22 | 23 | const fetchContributorComments = async () => { 24 | const response = await fetch(contributorCommentsUrl); 25 | const textData = await response.text(); 26 | const data = yaml.load(textData); 27 | 28 | if (!data || !data.contributors) return []; 29 | 30 | // Fetch GitHub user info for each contributor 31 | for (const contributor of data.contributors) { 32 | contributor.profile = `https://github.com/${contributor.username}`; 33 | const userInfo = await fetchGitHubUserInfo(contributor.username); 34 | if (userInfo) { 35 | contributor.fullName = userInfo.fullName; 36 | contributor.avatarUrl = userInfo.avatarUrl; 37 | } 38 | } 39 | 40 | return data.contributors.reverse(); 41 | }; 42 | 43 | const fetchStargazers = async (): Promise => { 44 | const headers = GITHUB_TOKEN ? { 'Authorization': `token ${GITHUB_TOKEN}` } : undefined; 45 | let url = `https://api.github.com/repos/${repo}/stargazers?per_page=100`; 46 | let stargazers = []; 47 | 48 | const getNextLink = (linkHeader) => { 49 | if (!linkHeader) return null; 50 | const links = linkHeader.split(','); 51 | const nextLink = links.find(link => link.includes('rel="next"')); 52 | if (!nextLink) return null; 53 | const match = nextLink.match(/<(.*)>/); 54 | return match ? match[1] : null; 55 | }; 56 | 57 | while (url) { 58 | const response = await fetch(url, { headers }); 59 | const data = await response.json(); 60 | 61 | if (Array.isArray(data)) { 62 | stargazers = stargazers.concat(data.map(stargazer => stargazer.login.toLowerCase())); 63 | } else if (data.message && data.message.includes('API rate limit exceeded')) { 64 | console.warn("GitHub API rate limit exceeded"); 65 | break; 66 | } 67 | 68 | url = getNextLink(response.headers.get('Link')); 69 | } 70 | 71 | return stargazers; 72 | }; 73 | 74 | const contributors = await fetchContributorComments(); 75 | 76 | const stargazers = await fetchStargazers(); 77 | 78 | const stargazerClass = (username) => stargazers.includes(username.toLowerCase()) ? 'stargazer' : ''; 79 | 80 | --- 81 | 82 |
83 |

84 | Want to be included here? 85 | Just add your name to git-in-here.yml, 86 | then check out the contributing guide to submit a PR. 87 |

88 | 104 |
105 | 106 | 191 | -------------------------------------------------------------------------------- /web/src/components/Counter.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { count, title, sub } = Astro.props 3 | --- 4 | 5 |
6 |

{count}

7 |

{title}

8 |

{sub}

9 |
10 | 11 | 16 | -------------------------------------------------------------------------------- /web/src/components/ExternalResources.astro: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | import yaml from 'js-yaml'; 4 | 5 | const resourcesUrl = 'https://raw.githubusercontent.com/Lissy93/git-into-open-source/main/resources.yml' 6 | 7 | const fetchResources = async (url) => { 8 | const response = await fetch(url); 9 | const textData = await response.text(); 10 | const data = yaml.load(textData); 11 | return data.resources || []; 12 | }; 13 | 14 | const resources = await fetchResources(resourcesUrl); 15 | 16 | const getHostname = (url) => { 17 | try { 18 | const { hostname } = new URL(url); 19 | return hostname; 20 | } catch (error) { 21 | return 'as93.net'; 22 | } 23 | }; 24 | 25 | --- 26 | 27 | 28 |
29 |

Resources

30 |
    31 | { resources && resources.map((resource) => ( 32 |
  • 33 | 34 | {resource.title} 35 |
  • 36 | ) 37 | ) } 38 |
39 |
40 | 41 | 70 | -------------------------------------------------------------------------------- /web/src/components/Feature.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon' 3 | 4 | const { icon = 'mdi:rocket', title = 'Title', link = '#' } = Astro.props 5 | --- 6 | 7 | 8 |
9 | 10 |
11 |

{title}

12 |

13 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Hic, corporis. 14 |

15 |
16 |
17 |
18 | 19 | 76 | -------------------------------------------------------------------------------- /web/src/components/Footer.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import CallToAction from './CallToAction.astro' 3 | 4 | const currentYear = new Date().getFullYear() 5 | 6 | const { hideContinue } = Astro.props; 7 | 8 | --- 9 | 10 | 22 | -------------------------------------------------------------------------------- /web/src/components/GuideList.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Feature from './Feature.astro' 3 | 4 | const { guides, title } = Astro.props; 5 | 6 | --- 7 | 8 | { title &&

{title}

} 9 | 10 |
11 | { 12 | guides 13 | .sort((a, b) => { 14 | const indexA = a.frontmatter.index ?? Infinity; 15 | const indexB = b.frontmatter.index ?? Infinity; 16 | return indexA - indexB; 17 | }) 18 | .map((guide) => { 19 | const { icon, title, description } = guide.frontmatter; 20 | return ( 21 | 22 | { description } 23 | 24 | ) 25 | }) 26 | } 27 |
28 | 29 | 46 | -------------------------------------------------------------------------------- /web/src/components/Header.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Navigation from '../components/Navigation.astro' 3 | import { SkipLinks } from 'accessible-astro-components' 4 | import { Icon } from 'astro-icon' 5 | 6 | const guides = await Astro.glob('./../pages/guides/*.md'); 7 | 8 | --- 9 | 10 |
11 | 12 | 13 | 16 | 19 | 22 | 25 | 36 | 41 | 42 |
43 | 44 | 75 | -------------------------------------------------------------------------------- /web/src/components/Hero.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon' 3 | 4 | const callToActionLinks = [ 5 | { 6 | href: 'guestbook', 7 | icon: 'edit-twotone', 8 | text: 'Guestbook', 9 | description: 'Sign the guestbook, by submitting a PR', 10 | }, 11 | { 12 | href: 'guides', 13 | icon: 'laptop-twotone', 14 | text: 'Guides', 15 | description: 'Tutorials to help you get started', 16 | }, 17 | { 18 | href: 'find-projects', 19 | icon: 'search-twotone', 20 | text: 'Find Projects', 21 | description: 'Browse open source projects welcoming to first-time contributors', 22 | }, 23 | // { 24 | // href: 'roadmap', 25 | // icon: 'arrows-horizontal-alt', 26 | // text: 'Roadmap', 27 | // description: 'A roadmap to help you go from zero to hero in open source', 28 | // }, 29 | { 30 | href: 'https://github.com/lissy93/git-into-open-source', 31 | icon: 'github-twotone', 32 | text: 'Continue on GitHub', 33 | description: 'Discover more, and contribute via our GitHub repository', 34 | }, 35 | ]; 36 | 37 | --- 38 | 39 |
40 |
41 |
42 |
43 |

44 | 45 | Git into
46 | Open Source
47 |

48 |
49 |

Tools, guides and resources to help you kickstart your open source journey

50 |

51 | Not sure where to start? Why not submit a PR adding your username to 52 | 53 | git-in-here.yml 54 | ! 55 |

56 |
57 |
58 | { callToActionLinks.map((link, indx) => ( 59 | 60 | 61 | {link.text} 62 | 63 | ))} 64 |
65 |
66 | Git In! 67 |
68 |
69 |
70 | 71 | 101 | -------------------------------------------------------------------------------- /web/src/components/LanguageHeader.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 |
15 |
16 | 17 |

{language.name}

18 |
19 |
20 | Sort by: 21 | {#each sortOptions as option} 22 | {option.replaceAll('-', ' ')} 23 | {/each} 24 |
25 |
26 | 27 |

28 | The following {language.name} projects have been tagged 29 | as welcoming for first-time contributors. 30 |

31 | 32 | 76 | -------------------------------------------------------------------------------- /web/src/components/LanguageList.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 |

Pick a language, any language

14 |

15 | Choose a programming language below, to see a list of repositories 16 | that have been as marked as welcoming for first-time contributors. 17 |

18 | 28 |
29 | 30 | 77 | -------------------------------------------------------------------------------- /web/src/components/RepoList.svelte: -------------------------------------------------------------------------------- 1 | 33 | 34 | {#if repos.length > 0} 35 |
    36 | {#each repos as repo, index} 37 |
  • 38 | 39 | 40 | {repo.owner.login}/{repo.name} 41 | 42 | {#if repo.description} 43 |

    {repo.description}

    44 | {/if} 45 |

    46 | Created {formatCreatedDate(repo.created_at)} 47 | Updated {formatUpdatedDate(repo.updated_at)} 48 |

    49 | 50 |

    51 | {repo.stargazers_count} 52 | {#if repo.license} 53 | {repo.license.name} 54 | {/if} 55 |

    56 | 57 | {#if repo.homepage } 58 | {repo.homepage} 59 | {/if} 60 |
  • 61 | {/each} 62 |
63 | {:else} 64 |

Nothing

65 | {/if} 66 | 67 | 68 | 141 | -------------------------------------------------------------------------------- /web/src/components/ResponsiveToggle.astro: -------------------------------------------------------------------------------- 1 | 11 | 12 | 37 | 38 | 63 | -------------------------------------------------------------------------------- /web/src/components/SiteMeta.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { title, description, url, image, author } = Astro.props 3 | 4 | let subtitle = 'Git into Open Source' 5 | --- 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {title} - {subtitle} 23 | -------------------------------------------------------------------------------- /web/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// -------------------------------------------------------------------------------- /web/src/layouts/DefaultLayout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import '../assets/scss/globals.scss' 3 | import SiteMeta from '../components/SiteMeta.astro' 4 | import Header from '../components/Header.astro' 5 | import Footer from '../components/Footer.astro' 6 | 7 | const { 8 | title = 'Git into Open Source', 9 | description = 'Guides and resources to help you get started with open source software development.', 10 | url, 11 | image = '/social-preview-image.png', 12 | author = 'Alicia Sykes', 13 | hideContinue = false, 14 | } = Astro.props 15 | --- 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 35 | 36 | 37 | 38 |
39 |
40 | 41 |
42 |