├── .github ├── CODEOWNERS ├── FUNDING.yml ├── logo.png ├── secret_scanning.yml ├── workflows │ ├── trigger-web-deploy.yml │ ├── mirror.yml │ ├── insert-credits.yml │ ├── deploy-website.yml │ ├── check-contribution.yml │ ├── insert-comments.yml │ ├── insert-roadmap.yml │ ├── copy-guides.yml │ ├── insert-resources.yml │ └── adds-hacktoberfest-label.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── question.yml │ ├── feature-request.yml │ ├── bug.yml │ ├── resource-addition.yml │ └── user-addition.yml ├── dependabot.yml ├── pull_request_template.md ├── SUPPORT.md ├── SECURITY.md ├── PRIVACY.md ├── CODE_OF_CONDUCT.md ├── GOVERNANCE.md └── CONTRIBUTING.md ├── lib ├── .python-version ├── requirements.txt ├── tests │ ├── run_all_tests.py │ └── test_insert_contributor_content.py ├── README ├── insert_resource_list.py ├── insert_roadmap.py ├── copy_resources_to_site.py └── insert_contributor_content.py ├── web ├── src │ ├── env.d.ts │ ├── assets │ │ ├── img │ │ │ ├── logo.svg │ │ │ ├── octocat.svg │ │ │ └── octocat-colored.svg │ │ └── scss │ │ │ ├── base │ │ │ ├── _root.scss │ │ │ ├── _outline.scss │ │ │ ├── _container.scss │ │ │ ├── _color.scss │ │ │ ├── _space-content.scss │ │ │ ├── _breakpoint.scss │ │ │ ├── _list.scss │ │ │ ├── _reset.scss │ │ │ ├── _button.scss │ │ │ └── _font.scss │ │ │ └── globals.scss │ ├── pages │ │ ├── guides │ │ │ ├── index.astro │ │ │ ├── submit-your-first-pr-ui.md │ │ │ ├── open-source-for-businesses.md │ │ │ ├── submit-your-first-pr-cli.md │ │ │ ├── why-open-source.md │ │ │ └── local-git-setup.md │ │ ├── 404.astro │ │ ├── blog │ │ │ ├── [post].astro │ │ │ └── [...page].astro │ │ ├── index.astro │ │ └── contributing.md │ ├── components │ │ ├── Counter.astro │ │ ├── Footer.astro │ │ ├── ContentMedia.astro │ │ ├── SiteMeta.astro │ │ ├── GuideList.astro │ │ ├── CallToAction.astro │ │ ├── ExternalResources.astro │ │ ├── Feature.astro │ │ ├── Header.astro │ │ ├── ResponsiveToggle.astro │ │ ├── Hero.astro │ │ └── Contributors.astro │ └── layouts │ │ ├── MarkdownLayout.astro │ │ └── DefaultLayout.astro ├── .npmrc ├── public │ ├── banner.png │ ├── icon.png │ ├── favicon.png │ ├── octocat-swim.png │ ├── fonts │ │ ├── OpenSans-Bold.woff │ │ ├── OpenSans-Bold.woff2 │ │ ├── OpenSans-Italic.woff │ │ ├── OpenSans-Italic.woff2 │ │ ├── OpenSans-Regular.woff │ │ ├── OpenSans-ExtraBold.woff │ │ ├── OpenSans-ExtraBold.woff2 │ │ └── OpenSans-Regular.woff2 │ ├── social-preview-image.png │ └── favicon.svg ├── .prettierrc ├── tailwind.config.js ├── README ├── astro.config.mjs ├── package.json └── .eslintrc.js ├── .gitignore ├── Makefile ├── LICENSE ├── guides ├── submit-your-first-pr-ui.md ├── open-source-for-businesses.md ├── submit-your-first-pr-cli.md ├── roadmap.mmd ├── why-open-source.md └── local-git-setup.md └── resources.yml /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @Lissy93 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [lissy93] 2 | -------------------------------------------------------------------------------- /lib/.python-version: -------------------------------------------------------------------------------- 1 | pyenv local 3.6.15 2 | -------------------------------------------------------------------------------- /web/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// -------------------------------------------------------------------------------- /lib/requirements.txt: -------------------------------------------------------------------------------- 1 | PyYAML==6.0.1 2 | requests==2.31.0 3 | -------------------------------------------------------------------------------- /web/.npmrc: -------------------------------------------------------------------------------- 1 | # Expose Astro dependencies for `pnpm` users 2 | shamefully-hoist = true -------------------------------------------------------------------------------- /.github/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/.github/logo.png -------------------------------------------------------------------------------- /web/public/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/banner.png -------------------------------------------------------------------------------- /web/public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/icon.png -------------------------------------------------------------------------------- /web/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/favicon.png -------------------------------------------------------------------------------- /web/public/octocat-swim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/octocat-swim.png -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/fonts/OpenSans-Bold.woff -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/fonts/OpenSans-Bold.woff2 -------------------------------------------------------------------------------- /web/public/social-preview-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/social-preview-image.png -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/fonts/OpenSans-Italic.woff -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/fonts/OpenSans-Italic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/fonts/OpenSans-Regular.woff -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/fonts/OpenSans-ExtraBold.woff -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/fonts/OpenSans-ExtraBold.woff2 -------------------------------------------------------------------------------- /web/public/fonts/OpenSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubham-Bhoite/git-into-open-source/main/web/public/fonts/OpenSans-Regular.woff2 -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /web/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], 4 | theme: { 5 | extend: {}, 6 | }, 7 | plugins: [], 8 | darkMode: ['class', '.darkmode'], 9 | } 10 | -------------------------------------------------------------------------------- /web/src/assets/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/pages/guides/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import BaseLayout from '../../layouts/DefaultLayout.astro'; 3 | import GuideList from '../../components/GuideList.astro' 4 | 5 | const guides = await Astro.glob('./*.md'); 6 | const pageTitle = "Tag Index"; 7 | --- 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /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/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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /web/src/pages/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import DefaultLayout from '../layouts/DefaultLayout.astro' 3 | --- 4 | 5 | 6 |
7 |
8 |

404

9 |
10 |
11 |
12 |
13 |

This page does not exist. Don't worry though, we got you.

14 | Let's get you home Astronout 🚀 15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /.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 | 22 | 23 | 24 | 25 | # macOS-specific files 26 | .DS_Store 27 | 28 | # vscode settings and dictionaries 29 | .vscode 30 | 31 | # webstorm settings and dictionaries 32 | .idea 33 | -------------------------------------------------------------------------------- /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 | 8 | dotenv.config(); 9 | 10 | const site = process.env.SITE_URL || undefined; 11 | const base = process.env.BASE_PATH || '/'; 12 | 13 | export default defineConfig({ 14 | site, 15 | base, 16 | compressHTML: true, 17 | integrations: [mdx(), tailwind(), compress(), sitemap()], 18 | }) 19 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /web/src/components/Footer.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import CallToAction from './CallToAction.astro' 3 | 4 | const currentYear = new Date().getFullYear() 5 | --- 6 | 7 | 19 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | # NPM updates for astro site 4 | - package-ecosystem: "npm" 5 | directory: "/web" 6 | schedule: 7 | interval: "daily" 8 | target-branch: "main" 9 | versioning-strategy: "auto" 10 | open-pull-requests-limit: 10 11 | commit-message: 12 | prefix: "[SECURITY] - Website Dependencies: " 13 | 14 | # pip updates for Python scripts 15 | - package-ecosystem: "pip" 16 | directory: "/lib" 17 | schedule: 18 | interval: "daily" 19 | target-branch: "main" 20 | versioning-strategy: "auto" 21 | open-pull-requests-limit: 10 22 | commit-message: 23 | prefix: "[SECURITY] - Python Dependencies: " 24 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /web/src/components/SiteMeta.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { title, description, url, image, author } = Astro.props 3 | 4 | let subtitle = 'Accessible Astro Starter' 5 | --- 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {title} - {subtitle} 23 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /.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 | steps: 21 | - name: Checkout your repository 🛎️ 22 | uses: actions/checkout@v3 23 | - name: Install, build, and upload site 🛠️ 24 | uses: withastro/action@v0 25 | with: 26 | path: ./web 27 | node-version: 16 28 | package-manager: npm 29 | 30 | deploy: 31 | needs: build 32 | runs-on: ubuntu-latest 33 | environment: 34 | name: github-pages 35 | url: ${{ steps.deployment.outputs.page_url }} 36 | steps: 37 | - name: Deploy to GitHub Pages 🚢 38 | id: deployment 39 | uses: actions/deploy-pages@v1 40 | -------------------------------------------------------------------------------- /web/src/components/CallToAction.astro: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Continue on GitHub

4 | Let's go! 5 |
6 |
7 | 8 | 31 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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": "^0.19.7", 16 | "@astrojs/partytown": "^2.0.1", 17 | "@astrojs/tailwind": "^4.0.0", 18 | "@typescript-eslint/eslint-plugin": "^6.7.4", 19 | "@typescript-eslint/parser": "^6.0.0", 20 | "accessible-astro-components": "^2.2.1", 21 | "astro": "^2.0.1", 22 | "astro-compress": "^2.0.6", 23 | "astro-icon": "^0.8.1", 24 | "eslint": "^8.51.0", 25 | "eslint-plugin-astro": "^0.29.1", 26 | "eslint-plugin-jsx-a11y": "^6.7.1", 27 | "prettier": "^3.0.3", 28 | "prettier-plugin-astro": "^0.12.0", 29 | "prettier-plugin-tailwindcss": "^0.5.5", 30 | "sass": "^1.69.0", 31 | "svgo": "^2.8.0", 32 | "tailwindcss": "^3.2.7" 33 | }, 34 | "dependencies": { 35 | "@astrojs/sitemap": "^3.0.1", 36 | "dotenv": "^16.3.1", 37 | "js-yaml": "^4.1.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 |
    30 | { resources && resources.map((resource) => ( 31 |
  • 32 | 33 | {resource.title} 34 |
  • 35 | ) 36 | ) } 37 |
38 |
39 | 40 | 62 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /web/src/pages/blog/[post].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import DefaultLayout from '../../layouts/DefaultLayout.astro' 3 | import { Breadcrumbs, BreadcrumbsItem } from 'accessible-astro-components' 4 | 5 | export async function getStaticPaths() { 6 | const data = await fetch('https://jsonplaceholder.typicode.com/posts').then((response) => response.json()) 7 | 8 | return data.map((post) => { 9 | return { 10 | params: { post: post.title.replaceAll(' ', '-').toLowerCase() }, 11 | props: { post }, 12 | } 13 | }) 14 | } 15 | 16 | const { post } = Astro.props 17 | --- 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 |
31 |

{post.title}


32 |

By userId: {post.userId}

33 |
34 |
35 |
36 |
37 |

{post.body}

38 |
39 |
40 |
41 | 42 | 58 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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/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/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 | -------------------------------------------------------------------------------- /web/src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import DefaultLayout from '../layouts/DefaultLayout.astro' 3 | import Hero from '../components/Hero.astro' 4 | import Feature from '../components/Feature.astro' 5 | import Counter from '../components/Counter.astro' 6 | import Contributors from '../components/Contributors.astro' 7 | import ExternalResources from '../components/ExternalResources.astro' 8 | import GuideList from '../components/GuideList.astro' 9 | const guides = await Astro.glob('./guides/*.md'); 10 | 11 | --- 12 | 13 | 14 | 15 |
16 |

Contributors

17 | 18 |
19 |
20 |
21 |

Guides

22 | 23 |
24 |
25 |
26 |
27 |

External Resources

28 | 29 |
30 |
31 | 42 |
43 | 44 | 53 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /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 | 30 | 35 | 36 |
37 | 38 | 69 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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/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 | -------------------------------------------------------------------------------- /web/src/layouts/MarkdownLayout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import DefaultLayout from './DefaultLayout.astro' 3 | 4 | const { frontmatter } = Astro.props 5 | --- 6 | 7 | 8 |
9 |
10 | 11 |
12 |
13 |
14 | 15 | 78 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /web/src/components/ResponsiveToggle.astro: -------------------------------------------------------------------------------- 1 | 11 | 12 | 37 | 38 | 63 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /web/src/components/Hero.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon' 3 | --- 4 | 5 |
6 |
7 |
8 |
9 |

10 | 11 | Git into
12 | Open Source
13 |

14 |
15 |

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

16 |

17 | Not sure where to start? Why not submit a PR adding your username to 18 | 19 | git-in-here.yml 20 | ! 21 |

22 |
23 | 36 |
37 | Git In! 38 |
39 |
40 |
41 | 42 | 72 | -------------------------------------------------------------------------------- /web/src/pages/blog/[...page].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import DefaultLayout from '../../layouts/DefaultLayout.astro' 3 | import { Card, Pagination } from 'accessible-astro-components' 4 | 5 | export async function getStaticPaths({ paginate }) { 6 | const response = await fetch('https://jsonplaceholder.typicode.com/posts') 7 | const data = await response.json() 8 | 9 | return paginate(data, { pageSize: 6 }) 10 | } 11 | 12 | const { page } = Astro.props 13 | --- 14 | 15 | 19 |
20 |
21 |

Blog

22 |

23 | An example of a blog with dynamic content fetched from JSONPlaceholder using the title, body and userId. The Accessible Astro Card Component is used here to display al the posts. 26 |

27 |
28 |
29 |
30 |
31 |

Post {page.start + 1} through {page.end + 1} of {page.total} total posts

32 |
    33 | { 34 | page.data.map((post) => ( 35 |
  • 36 | 41 | {post.body} 42 | 43 |
  • 44 | )) 45 | } 46 |
47 |
48 | 56 |
57 |
58 |
59 |
60 | 61 | 77 | -------------------------------------------------------------------------------- /web/src/assets/img/octocat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /web/src/pages/guides/submit-your-first-pr-ui.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: ../../layouts/MarkdownLayout.astro 3 | title: Submit your first PR (UI) 4 | description: Learn how to submit your first pull-request via the GitHub UI. 5 | author: None 6 | icon: 'fa:github' 7 | tags: 'None' 8 | index: '1' 9 | created: None 10 | updated: 2023-10-08 11 | --- 12 | 13 | 17 | 18 | # Submit your first PR (UI) 19 | 20 | > This page is a work in progress. PRs welcome!
21 | > TODO: I'm going to make instructions clearer, and add screenshots 22 | 23 | ### 1. Fork the Repository 24 | 25 | - Start by visiting the GitHub page of the repository you want to contribute to. 26 | - In the top-right corner of the page, you'll see a button labeled "Fork". Click it. 27 | - This creates a copy of the repository under your GitHub account. You'll be redirected to your fork. 28 | 29 | 30 | ### 2. Make Changes 31 | 32 | - Browse through the repository files and directories by clicking on them. 33 | - Once you've located the file, click on it to view its contents. 34 | - 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. 35 | - Make your changes to the file in the editor that appears. 36 | 37 | ### 3. Commit the Changes 38 | 39 | - Scroll down to the bottom of the page. You'll see a section titled "Commit changes". 40 | - Enter a short, descriptive title for your changes in the "Commit changes" box. 41 | - Optionally, provide a more detailed description in the larger text box below. 42 | - Ensure the radio button "Create a new branch for this commit and start a pull request." is selected. 43 | - Click on the green "Commit changes" button. 44 | 45 | ### 4. Open a Pull Request (PR) 46 | 47 | - After committing, you'll be taken to a new page titled "Open a pull request". 48 | - GitHub will automatically fill in some details for the PR based on your commit message. 49 | - 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. 50 | - Once you're ready, click on the green "Create pull request" button. 51 | 52 | ### 5. Await Feedback 53 | 54 | - The maintainers of the original repository will be notified of your pull request. 55 | - They might provide feedback or ask for changes. Make sure to keep an eye on the PR for any comments or notifications. 56 | - 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. 57 | 58 | ### 6. Celebrate! 59 | 60 | - Once your pull request is approved and merged, you've officially contributed to the project! 61 | 62 | 63 | 71 | -------------------------------------------------------------------------------- /web/src/pages/guides/open-source-for-businesses.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: ../../layouts/MarkdownLayout.astro 3 | title: Open Source for Businesses 4 | description: See all the ways embracing open source can benefit your company. 5 | author: None 6 | icon: 'ic:round-business-center' 7 | tags: 'None' 8 | index: '4' 9 | created: None 10 | updated: 2023-10-08 11 | --- 12 | 13 | 17 | 18 | 19 | # Open Source for Business 20 | 21 | Wish you could do more open source work at your day job? 22 | 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. 23 | 24 | ### Key Benefits 25 | - Attract a higher calibre of talent 26 | - Improve reputation and brand recognition among development circles 27 | - Reflects well on you from a technological and ethical perspective 28 | - Great experience for junior developers to contribute and learn 29 | - Opportunity to showcase and share your tech standards 30 | - Cost saving potential, as once a project is off the ground, external contributors often do the bulk of maintenance and improvements 31 | - Helps you innovate quicker, the open source code and content tends to move a lot faster than corporate and propriety alternatives 32 | 33 | ### Key Disadvantages / Considerations 34 | - 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 35 | - Time constraints - This will take a bit of time to get setup and going 36 | 37 | ### Case Studies 38 | - [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 39 | - [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 40 | - [Novu](https://novu.co/) - They [write great posts](https://dev.to/novu) on dev.to, to share knowledge 41 | - [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 42 | - RedHat - A multinational company who open source the majority of their offerings, were valued at $34b (by IBM, as of 2019) 43 | 44 | ### Methods 45 | - A GitHub organisation where employees can collate and share public components, utils and knowledge 46 | - By sponsoring existing projects, which are either up and coming, or that you rely upon to do our job 47 | - By contributing to existing projects, when the opportunity to do so arises 48 | - Writing blog posts on a developer-focused site, like Dev.to 49 | 50 | 51 | 52 | 60 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | # Update the README.md between markers 50 | logger.info("Reading README.md file...") 51 | with open(readme_path, 'r') as file: 52 | readme_content = file.read() 53 | 54 | def update_content_between_markers(content, start_marker, end_marker, new_content): 55 | logger.info(f"Updating content between {start_marker} and {end_marker} markers...") 56 | start_index = content.find(start_marker) 57 | end_index = content.find(end_marker) 58 | 59 | if start_index != -1 and end_index != -1: 60 | before_section = content[:start_index + len(start_marker)] 61 | after_section = content[end_index:] 62 | updated_content = before_section + '\n' + '\n'.join(new_content) + '\n' + after_section 63 | return updated_content 64 | else: 65 | logger.error(f"Markers {start_marker} and {end_marker} not found.") 66 | return content 67 | 68 | # Update guides and resources in README.md 69 | readme_content = update_content_between_markers(readme_content, "", "", guide_links) 70 | readme_content = update_content_between_markers(readme_content, "", "", resource_links) 71 | 72 | # Write back the updated content to README.md 73 | logger.info("Writing back to README.md...") 74 | with open(readme_path, 'w') as file: 75 | file.write(readme_content) 76 | 77 | logger.info("Script completed successfully!") 78 | -------------------------------------------------------------------------------- /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/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 | } = Astro.props 14 | --- 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 34 | 35 | 36 | 37 |
38 |
39 | 40 |
41 |