├── .DS_Store ├── .github ├── .DS_Store ├── label-rules.yml ├── workflows │ ├── host-reminder.yml │ ├── send-guest-guidelines.yml │ ├── notify-approved-guests.yml │ ├── standardize-issue-titles.yml │ ├── label-new-issues.yml │ └── label-all-issues.yml └── ISSUE_TEMPLATE │ ├── viernes.yml │ └── osf-guest-invite.yml ├── admin ├── process.md ├── cal-invite-copy.md ├── approved-guest.md ├── README.md ├── guest-invite.md ├── guest-assets │ ├── General-Questions.md │ ├── preguntas-generales.md │ ├── Streaming-Guide.md │ └── guia-stream.md └── project-criteria.md ├── archive ├── weekly-open-source-friday.yml └── open-source-friday.md ├── README.md └── SECURITY.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubevents/open-source-friday/HEAD/.DS_Store -------------------------------------------------------------------------------- /.github/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/githubevents/open-source-friday/HEAD/.github/.DS_Store -------------------------------------------------------------------------------- /admin/process.md: -------------------------------------------------------------------------------- 1 | ## How we do Open Source Friday 2 | 3 | To learn how we create open source friday, please visit this doc: https://gh.io/osf-process 4 | 5 | This is a full guide to assets, sourcing guests and scheduling. 6 | -------------------------------------------------------------------------------- /.github/label-rules.yml: -------------------------------------------------------------------------------- 1 | January: 2 | - '/\d{4}-01-\d{2}/' 3 | February: 4 | - '/\d{4}-02-\d{2}/' 5 | March: 6 | - '/\d{4}-03-\d{2}/' 7 | April: 8 | - '/\d{4}-04-\d{2}/' 9 | May: 10 | - '/\d{4}-05-\d{2}/' 11 | June: 12 | - '/\d{4}-06-\d{2}/' 13 | July: 14 | - '/\d{4}-07-\d{2}/' 15 | August: 16 | - '/\d{4}-08-\d{2}/' 17 | September: 18 | - '/\d{4}-09-\d{2}/' 19 | October: 20 | - '/\d{4}-10-\d{2}/' 21 | November: 22 | - '/\d{4}-11-\d{2}/' 23 | December: 24 | - '/\d{4}-12-\d{2}/' 25 | -------------------------------------------------------------------------------- /archive/weekly-open-source-friday.yml: -------------------------------------------------------------------------------- 1 | on: 2 | schedule: 3 | - cron: 0 5 * * 1 4 | name: Weekly OSF STreams 5 | jobs: 6 | createAnIssue: 7 | name: Create an issue 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | - name: Create an issue 12 | uses: bdougie/create-an-issue@e43b083ea71e22e77a81ffb4a55dacb2addb71ed 13 | env: 14 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 15 | with: 16 | args: .github/ISSUE_TEMPLATE/open-source-friday.md 17 | -------------------------------------------------------------------------------- /admin/cal-invite-copy.md: -------------------------------------------------------------------------------- 1 | ## Copy to add to cal invites (calendly, gmail appointments, etc) 2 | 3 | 4 | Open Source Friday ✨ is a place for maintainers to share what they are working on. This is an opportunity to share demos, stories, and inspiration with other GitHub users. 5 | 6 | The stream will be hosted on stream yard, but broadcasted out to our viewers on Twitch, Linkedin and Youtube. The recording will also be uploaded to GitHub's Youtube Channel. 7 | 8 | Start time for the stream will be 1:00 pm ET. 9 | We meet at 12:45pm ET for prep and tech checks. 10 | 11 | Here is a recording guide for streaming remotely. 12 | 13 | 14 | Chat soon! 15 | Kedasha & Andrea -------------------------------------------------------------------------------- /admin/approved-guest.md: -------------------------------------------------------------------------------- 1 | Dear Guest, 2 | 3 | Thank you for agreeing to join us on Open Source Friday! We're excited to have you share your project with our community. 4 | 5 | Your session will be hosted by Andrea Griffiths, Kedasha Kerr, and/or Kevin Crosby and will stream live on Twitch at 1 PM EST on your scheduled Friday. To get you set up: 6 | 7 | 1. Please select an upcoming Friday from our streaming calendar: [calendar link](https://gh.io/osf-booking) 8 | 9 | 2. After selecting your date, please open an issue titled: 10 | "Open Source Friday - [Your Project Name] - [DD-MM-YYYY]". 11 | using our guest template at this [issue link](https://gh.io/osf-issue). 12 | 13 | Once both steps are completed, we'll send you additional details about the stream setup and what to expect. 14 | 15 | Looking forward to having you on the show! 16 | 17 | With gratitude, 18 | 19 | Andrea, Kedasha, and Kevin 20 | -------------------------------------------------------------------------------- /admin/README.md: -------------------------------------------------------------------------------- 1 | This folder contains all assets for open source friday livestreams. 2 | 3 | Ideal flow for actions: 4 | 5 | - send Open Source Friday Invite Template and booking link to potential guests 6 | - they complete the form with the date selected and submit the issue 7 | - the issue is automatically assigned to LadyKerr and Andrea with the label `pending` 8 | - the issue triggers a workflow that creates a comment reminding the guest to book a time slot if t hey haven't already 9 | - we go in and add the `scheduled` label to the issue to confirm booking 10 | - At the approved label, the workflow triggers and creates a new comment in the issue reminding the hosts to create the event + assets 11 | - At the approved label the workflows triggers and creates a new comment in the issue seniding the guest instructions on how to join the event + prepare for it 12 | 13 | Not done yet: 14 | 15 | - day before the event the workflow sends a reminder to guest in the issue 16 | - post event the workflow sends a thank you message to the guest in the issue 17 | - post event the host closes the issue 18 | -------------------------------------------------------------------------------- /.github/workflows/host-reminder.yml: -------------------------------------------------------------------------------- 1 | name: Remind Hosts 2 | 3 | on: 4 | issues: 5 | types: [labeled] 6 | 7 | jobs: 8 | remind-hosts: 9 | runs-on: ubuntu-latest 10 | if: github.event.label.name == 'scheduled' 11 | steps: 12 | - name: Comment on issue 13 | uses: actions/github-script@v5 14 | with: 15 | github-token: ${{secrets.GITHUB_TOKEN}} 16 | script: | 17 | const issueComment = { 18 | owner: context.repo.owner, 19 | repo: context.repo.repo, 20 | issue_number: context.issue.number, 21 | body: `Hi @LadyKerr, @AndreaGriffiths11, and @KevinCrosby,\n\nThis stream has been scheduled. Please complete the following tasks:\n\n- [ ] Create social card\n- [ ] Create meetup link\n- [ ] Create and schedule twitch stream (Linkedin, Twitch, Youtube)\n- [ ] Schedule social media post (Twitter)\n- [ ] Send prep doc to guests\n\nYou can find the instructions in this [guide](https://github.com/githubevents/open-source-friday/blob/main/admin/guest-assets/Streaming-Guide.md).` 22 | }; github.rest.issues.createComment(issueComment); 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ![OSF Thumbnails](https://github.com/user-attachments/assets/c91aa010-a95b-45f5-97af-755c8e3532a3) 3 | 4 | 5 | 6 | ## Open Source Friday - Live Stream Event ✨ 7 | _Every Friday at 1 PM EST_ 8 | 9 | Join [Andrea Griffiths](https://www.x.com/alacolombiadev/), [Kedasha Kerr](https://www.instagram.com/itsthatlady.dev/), and [Kevin Crosby](https://www.linkedin.com/in/kevinanthonycrosby/) for Open Source Friday, where we dive into engaging discussions with maintainers from some of GitHub's most popular projects. Interested in participating? Start by checking out our [project criteria](https://github.com/githubevents/open-source-friday/blob/main/admin/project-criteria.md) and then open an issue using our [guest invite template](https://github.com/githubevents/open-source-friday/issues/new?template=osf-guest-invite.yml&assignees=AndreaGriffiths11%2CLadyKerr&labels=open-source%2Copen-source-friday%2Cpending%2Ctwitch). 10 | 11 | Don't miss this chance to explore the world of Open Source every Friday. We're live on [Twitch](https://www.twitch.tv/github), and you can catch up on previous sessions on our [YouTube playlist](https://www.youtube.com/playlist?list=PL0lo9MOBetEFmtstItnKlhJJVmMghxc0P). Join the community and expand your Open Source knowledge! 12 | 13 | 14 | -------------------------------------------------------------------------------- /admin/guest-invite.md: -------------------------------------------------------------------------------- 1 | Subject: Invitation to Participate in GitHub's Open Source Friday! 🚀 2 | 3 | Hey [Maintainer name], 4 | 5 | We’re amped up for the upcoming Open Source Friday stream and would be thrilled to have you as our featured guest. Open Source Friday is our relaxed stream where we delve into the open source code-scape and exchange some fresh insights. 🌐 6 | 7 | Here’s the simple rundown on how we'll work together: 8 | 9 | 1. First off, hit this [OSS Friday Calendar link](https://gh.io/osf-booking) to book a slot that works for you. 🗓️ 10 | 2. Next, pop over to our [repo](https://github.com/githubevents/open-source-friday/issues) and create an issue with what you're keen on chatting about. 📝 11 | 3. Our friendly bot will nudge you to book a slot if you haven't yet, and once you do, we’ll mark your issue as "scheduled". ✅ 12 | 4. That label triggers a task list on our end, ensuring everything sails smoothly on the big day. 📋 13 | 5. You’ll get a comment with stream instructions and other tidbits to prep you for the event. 🎥 14 | 6. Come event day, we’ll drop the Streamyard link in the issue for you to hop on board and join the conversation. 🛳️ 15 | 16 | Feel free to ping us if you have any questions or need more details on anything! Looking forward to some great code chatter with you. 17 | 18 | Warm regards, 19 | 20 | Kedasha and Andrea 21 | -------------------------------------------------------------------------------- /admin/guest-assets/General-Questions.md: -------------------------------------------------------------------------------- 1 | Joining the Stream 2 | You can join the stream from this link: 3 | 4 | Official start time is: 1:00 pm ET. Please try to join 10-15 minutes (12:45 or so) before so we can test audio, video, and screensharing. 5 | 6 | ## Format 7 | 8 | 1. Introduce yourself - 5 minutes 9 | 2. What is your project? 10 | 3. What inspired you to create your project or get involved in maintaining this project? 11 | 4. Demo - 5-15 minutes (usually people do a simple hello world demo or they show a small new feature that came out) 12 | 13 | #### Questions 14 | - As a maintainer, what challenges have you encountered? 15 | - What’s been a rewarding part of maintaining a project? 16 | - What are your thoughts on how we can improve diversity in open source? 17 | - How can people contribute to your project? 18 | - Any advice for folks who would like to gain more contributors, sponsors, and users for their open source projects? 19 | - Are there any questions from the audience? 20 | #### Wrap up questions (non-technical): 21 | - What is the first programming language that you learned 22 | - If money wasn’t an issue, how would you ideally spend your time? Job wise or not job wise? 23 | - What did your learn today? 24 | - What's your favorite song of all time? 25 | - What emoji best describes you? 26 | - What is your favorite ice cream flavor? 27 | - GIF - hard G or soft G? 28 | - Fave beyonce song? 29 | - What is your favorite thing about open source? 30 | 31 | End of stream..shouldn’t last more than 45 minutes 32 | -------------------------------------------------------------------------------- /.github/workflows/send-guest-guidelines.yml: -------------------------------------------------------------------------------- 1 | name: Send Instructions to Guest 2 | 3 | on: 4 | issues: 5 | types: [labeled] 6 | 7 | jobs: 8 | send-instructions: 9 | runs-on: ubuntu-latest 10 | if: github.event.label.name == 'scheduled' 11 | steps: 12 | - name: Comment on issue 13 | uses: actions/github-script@v5 14 | with: 15 | github-token: ${{secrets.GITHUB_TOKEN}} 16 | script: | 17 | const issueBody = context.payload.issue.body; 18 | const githubHandleMatch = issueBody.match(/@[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,38}/gi); 19 | if (githubHandleMatch && githubHandleMatch.length > 0) { 20 | const githubHandle = githubHandleMatch[0].substring(1); // Remove the '@' from the handle 21 | const issueComment = { 22 | owner: context.repo.owner, 23 | repo: context.repo.repo, 24 | issue_number: context.issue.number, 25 | body: `Hey @${githubHandle}✨,\n\nYou're officially scheduled for **Open Source Friday**! 🚀🎥\n\nThe stream starts at 1:00 PM ET. Please join at 12:45 PM ET for prep and tech checks. Be ready with your demo—our audience strongly prefers technical demos.\n\nHere are some guidelines on preparing for the live stream:\n\n[Preparation Instructions](https://gist.github.com/LadyKerr/9b7d6dccde55b3f30398612d1290b7dc)\n\nLet us know if you have any questions!,\nKedasha, Andrea & Kevin 👯` 26 | }; 27 | github.rest.issues.createComment(issueComment); } 28 | -------------------------------------------------------------------------------- /admin/project-criteria.md: -------------------------------------------------------------------------------- 1 | ## Open Source Friday 2 | 3 | We are very grateful for your interest in participating in our Open Source Friday live streaming program! This initiative aims to showcase exciting open source projects and help grow their contributor communities. 4 | 5 | To be considered for the program, your project should meet the following criteria: 6 | 7 | 1. Have a code of conduct, license and contributing guide in place. 8 | 2. Have a minimum of 100 stars and be hosted on GitHub. 9 | 3. Be open to new contributions from the greater developer community. 10 | 11 | Additionally, projects with the following characteristics will be given preference: 12 | 13 | - A community conversation channel (e.g., Discussion, Discord, or similar) 14 | - A triage team or structured contributor onboarding process 15 | 16 | As a maintainer or contributor, you should be: 17 | 18 | 1. Available to participate in the live stream on the designated Friday at 10am PST. We're also happy to accommodate exceptions for pre-recording sessions for certain projects. 19 | 2. Willing to receive and review the show notes and live streaming preparation guide. 20 | 3. Available for a live stream scheduled at least two weeks in advance. 21 | 22 | If your project meets these criteria and you're excited to showcase your work to a global audience, we'd love to have you on the show! Please fill out the [invitation request issue](https://github.com/githubevents/open-source-friday/issues/new?template=osf-guest-invite.yml&assignees=AndreaGriffiths11%2CLadyKerr&labels=open-source%2Copen-source-friday%2Cpending%2Ctwitch) to get started. 23 | 24 | We look forward to featuring your project and helping grow your contributor community! 25 | -------------------------------------------------------------------------------- /admin/guest-assets/preguntas-generales.md: -------------------------------------------------------------------------------- 1 | ### Unirse a la Transmisión 2 | Puedes unirte a la transmisión desde este enlace: 3 | 4 | La hora oficial de inicio es: 12:00 pm, hora del este (ET). Por favor, intenta unirte 10-15 minutos (alrededor de las 11:45) antes para que podamos probar el audio, el video y el intercambio de pantalla. 5 | 6 | ## Formato 7 | 8 | 1. Preséntate - 5 minutos 9 | 2. ¿Cuál es tu proyecto? 10 | 3. ¿Qué te inspiró a crear tu proyecto o a involucrarte en su mantenimiento? 11 | 4. Demostración - 5-15 minutos (normalmente las personas hacen una demostración sencilla de "Hola Mundo" o muestran una pequeña característica nueva que se ha añadido). 12 | 13 | #### Preguntas 14 | - Como mantenedor, ¿qué desafíos has enfrentado? 15 | - ¿Cuál ha sido la parte más gratificante de mantener un proyecto? 16 | - ¿Cuáles son tus ideas sobre cómo podemos mejorar la diversidad en el código abierto? 17 | - ¿Cómo pueden las personas contribuir a tu proyecto? 18 | - ¿Algún consejo para aquellos que deseen obtener más colaboradores, patrocinadores y usuarios para sus proyectos de código abierto? 19 | - ¿Hay preguntas de la audiencia? 20 | 21 | #### Preguntas de cierre (no técnicas): 22 | - ¿Cuál fue el primer lenguaje de programación que aprendiste? 23 | - Si el dinero no fuera un problema, ¿cómo te gustaría pasar idealmente tu tiempo? En el trabajo o no en el trabajo. 24 | - ¿Qué has aprendido hoy? 25 | - ¿Cuál es tu canción favorita de todos los tiempos? 26 | - ¿Qué emoji te describe mejor? 27 | - ¿Cuál es tu sabor de helado favorito? 28 | - GIF - ¿pronunciación con "g" fuerte o "g" suave? 29 | - Canción favorita de Beyoncé? 30 | - ¿Cuál es tu cosa favorita sobre el código abierto? 31 | 32 | Fin de la transmisión... no debería durar más de 45 minutos. 33 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | Thanks for helping make GitHub safe for everyone. 2 | 3 | # Security 4 | 5 | GitHub takes the security of our software products and services seriously, including all of the open source code repositories managed through our GitHub organizations, such as [GitHub](https://github.com/GitHub). 6 | 7 | Even though [open source repositories are outside of the scope of our bug bounty program](https://bounty.github.com/index.html#scope) and therefore not eligible for bounty rewards, we will ensure that your finding gets passed along to the appropriate maintainers for remediation. 8 | 9 | ## Reporting Security Issues 10 | 11 | If you believe you have found a security vulnerability in any GitHub-owned repository, please report it to us through coordinated disclosure. 12 | 13 | **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** 14 | 15 | Instead, please send an email to opensource-security[@]github.com. 16 | 17 | Please include as much of the information listed below as you can to help us better understand and resolve the issue: 18 | 19 | - The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting) 20 | - Full paths of source file(s) related to the manifestation of the issue 21 | - The location of the affected source code (tag/branch/commit or direct URL) 22 | - Any special configuration required to reproduce the issue 23 | - Step-by-step instructions to reproduce the issue 24 | - Proof-of-concept or exploit code (if possible) 25 | - Impact of the issue, including how an attacker might exploit the issue 26 | 27 | This information will help us triage your report more quickly. 28 | 29 | ## Policy 30 | 31 | See [GitHub's Safe Harbor Policy](https://docs.github.com/en/github/site-policy/github-bug-bounty-program-legal-safe-harbor#1-safe-harbor-terms) 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/viernes.yml: -------------------------------------------------------------------------------- 1 | name: Solicitud de Invitado para Open Source Viernes 2 | description: Complete este formulario para solicitar ser invitado en Open Source Friday 3 | title: Open Source Friday - [NOMBRE DEL PROYECTO] - [DD-MM-AAAA] 4 | labels: ["open-source-viernes", "open-source", "twitch", "pending", "spanish"] 5 | assignees: 6 | - AndreaGriffiths11 7 | - KevinCrosby 8 | body: 9 | - type: markdown 10 | attributes: 11 | value: | 12 | ## Formulario de Invitación para Invitados de Open Source Friday 13 | #### :sparkles: Por favor, complete la siguiente información para ser invitado a Open Source Viernes. La fecha de la transmisión ser confirmada al aprovar el invitado :sparkles: 14 | - type: input 15 | id: nombre 16 | attributes: 17 | label: Nombre 18 | description: Su nombre 19 | placeholder: "Kedasha Kerr" 20 | - type: input 21 | id: github_user 22 | attributes: 23 | label: Usuario de GitHub 24 | description: Su nombre de usuario en GitHub 25 | placeholder: "@LadyKerr" 26 | - type: textarea 27 | id: acerca_de_ti 28 | attributes: 29 | label: Háblanos de ti 30 | description: Por favor, comparte un poco sobre ti y tu experiencia 31 | placeholder: "Soy un desarrollador que..." 32 | - type: input 33 | id: nombre_proyecto_1 34 | attributes: 35 | label: Nombre del Proyecto 36 | description: El nombre del proyecto que te gustaría mostrar y sobre el que quieres hablar 37 | placeholder: "Proyecto Increíble" 38 | - type: input 39 | id: repo_proyecto_1 40 | attributes: 41 | label: Enlace al Repositorio del Proyecto 42 | description: El repositorio de GitHub de tu proyecto 43 | placeholder: "github.com/url-del-repo" 44 | - type: checkboxes 45 | id: fecha_transmision 46 | attributes: 47 | label: Fecha de Transmisión 48 | description: ¿Has programado una fecha para tu transmisión? 49 | options: 50 | - label: "Sí" 51 | - label: "Aún no" 52 | - type: input 53 | id: social_twitter 54 | attributes: 55 | label: URL de Twitter 56 | description: Tu perfil de Twitter 57 | placeholder: "@itsthatladydev" 58 | - type: input 59 | id: social_linkedin 60 | attributes: 61 | label: URL de LinkedIn 62 | description: Tu perfil de LinkedIn 63 | placeholder: "linkedin.com/in/tu-perfil" 64 | - type: textarea 65 | id: mas_info 66 | attributes: 67 | label: Información Adicional 68 | description: Por favor, comparte cualquier detalle adicional que quieras que sepamos sobre tu proyecto 69 | placeholder: "Me gustaría hablar sobre..." 70 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/osf-guest-invite.yml: -------------------------------------------------------------------------------- 1 | name: Open Source Friday Guest Request 2 | description: Complete this form to request to be a guest on Open Source Friday 3 | title: Open Source Friday - [PROJECT NAME] - [MM-DD-YYYY] 4 | labels: ["open-source-friday", "open-source", "twitch", "pending"] 5 | assignees: ["LadyKerr", "AndreaGriffiths11", "KevinCrosby"] 6 | 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | ## Open Source Friday Guest Invite Form 12 | #### :sparkles: Please fill out the following information to be invited to Open Source Friday. The stream occurs weekly at 1pm EST on the [GitHub Twitch Channel](https://www.twitch.tv/github). :sparkles: 13 | 14 | - type: input 15 | id: name 16 | attributes: 17 | label: Name 18 | description: Your name 19 | placeholder: "Kedasha Kerr" 20 | 21 | - type: input 22 | id: github_handle 23 | attributes: 24 | label: GitHub Handle 25 | description: Your GitHub handle 26 | placeholder: "@LadyKerr" 27 | 28 | - type: textarea 29 | id: about_you 30 | attributes: 31 | label: Tell us about yourself 32 | description: Please share a bit about yourself and your background 33 | placeholder: "I'm a developer who..." 34 | 35 | - type: input 36 | id: project_name_1 37 | attributes: 38 | label: Project Name 39 | description: The name of the project you'd like to showcase and chat about 40 | placeholder: "Awesome Project" 41 | 42 | - type: input 43 | id: project_repo_1 44 | attributes: 45 | label: Project Repo Link 46 | description: The github repository of your project 47 | placeholder: "github.com/repo-url" 48 | 49 | - type: checkboxes 50 | id: stream_date 51 | attributes: 52 | label: Stream Date 53 | description: Did you schedule a date for your stream? 54 | options: 55 | - label: "Yes" 56 | - label: "Not yet" 57 | 58 | - type: input 59 | id: dates_1 60 | attributes: 61 | label: Dates 62 | description: what date did you schedule for Open Source Friday stream? 63 | placeholder: MM-DD-YYYY 64 | 65 | - type: input 66 | id: social_twitter 67 | attributes: 68 | label: Twitter URL 69 | description: Your Twitter profile 70 | placeholder: "@itsthatladydev" 71 | 72 | - type: input 73 | id: social_linkedin 74 | attributes: 75 | label: LinkedIn URL 76 | description: Your LinkedIn profile 77 | placeholder: "linkedin.com/in/your-profile" 78 | 79 | - type: textarea 80 | id: more_info 81 | attributes: 82 | label: Additional Information 83 | description: Please share any additional details you'd like us to know about your project 84 | placeholder: "I'd like to talk about..." 85 | -------------------------------------------------------------------------------- /.github/workflows/notify-approved-guests.yml: -------------------------------------------------------------------------------- 1 | name: Notify Approved Guests 2 | 3 | on: 4 | issues: 5 | types: [labeled] 6 | 7 | jobs: 8 | notify-approved-guest: 9 | runs-on: ubuntu-latest 10 | if: github.event.label.name == 'approved' 11 | steps: 12 | - name: Comment on approved issue 13 | uses: actions/github-script@v7 14 | with: 15 | github-token: ${{ secrets.GITHUB_TOKEN }} 16 | script: | 17 | // Get the GitHub username directly from the issue author 18 | const githubHandle = context.payload.issue.user.login; 19 | 20 | console.log('Processing issue #', context.issue.number, 'by author:', githubHandle); 21 | 22 | if (githubHandle) { 23 | // Security: Enhanced validation function 24 | const isValidGitHubHandle = (handle) => { 25 | if (!handle || typeof handle !== 'string') return false; 26 | if (handle.length < 1 || handle.length > 39) return false; 27 | 28 | // Must start and end with alphanumeric, can contain hyphens in middle 29 | return /^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$|^[a-zA-Z0-9]$/.test(handle); 30 | }; 31 | 32 | if (isValidGitHubHandle(githubHandle)) { 33 | console.log('Creating comment for validated handle'); 34 | 35 | // Security: Sanitize comment content 36 | const safeHandle = githubHandle.replace(/[<>'"&]/g, ''); 37 | const commentBody = 'Hey @' + safeHandle + ' thank you for submitting your project! Looks super interesting! ✨\n\nPlease select a date from this calendar: https://gh.io/osf-booking\n\nDo let me know in this issue what date you selected for the stream! 📅'; 38 | 39 | const issueComment = { 40 | owner: context.repo.owner, 41 | repo: context.repo.repo, 42 | issue_number: context.issue.number, 43 | body: commentBody 44 | }; 45 | 46 | try { 47 | const result = await github.rest.issues.createComment(issueComment); 48 | console.log('Comment created successfully, ID:', result.data.id); 49 | } catch (error) { 50 | // Security: Don't expose error details in logs 51 | console.error('Failed to create comment for issue #', context.issue.number); 52 | // Don't re-throw to prevent workflow failure from exposing internals 53 | } 54 | } else { 55 | console.log('Handle validation failed for issue #', context.issue.number); 56 | } 57 | } else { 58 | console.log('No GitHub handle found for issue #', context.issue.number); 59 | } -------------------------------------------------------------------------------- /admin/guest-assets/Streaming-Guide.md: -------------------------------------------------------------------------------- 1 | Thank you for agreeing to speak about your project on Open Source Friday! I really appreciate you taking the time to be a part of the discussion, and I’m very excited to hear your story and showcase your project! It’s really going to help a lot of folks! 2 | 3 | # Streaming Guide for Guests 4 | All interviews are streamed live on the [GitHub Twitch Channel](https://twitch.tv/GitHub) (using Streamyard) and get edited to live on Youtube as shareable content. 5 | 6 | [Previous OSF Recordings](https://www.youtube.com/playlist?list=PL0lo9MOBetEFmtstItnKlhJJVmMghxc0P) 7 | 8 | 9 | ## Recording Software and equipment: 10 | We will use streamyard to stream on Twitch. 11 | 12 | **Multiple remote guests will need to have separate mics and headphones to cut down on room noise.** 13 | 14 | ## Format and example questions: 15 | 16 | The stream will be a laid back format: 17 | 18 | 1. Introduce yourself - 5 minutes 19 | 2. What is your project? 20 | 3. Demo - 5-10 minutes (What does it do? Do you have an example/hello-world?) 21 | 5. What was your motivation for building your project or how did this project started? 22 | 6. How can people contribute? 23 | 7. What was the last thing you pushed to using GitHub? Or What is the next thing you would like to push? 24 | 8. Are there any questions from the audience? 25 | ### Wrap up questions 26 | - What is your best tip for new contributors? 27 | - What's your favorite song of all time? 28 | - What emoji best describes you? 29 | - What is your favorite ice cream flavor? 30 | 31 | ### Goodbye – whole stream shouldn’t last more than 30-45 minutes 32 | 33 | ## General Interview Guidelines: 34 | 35 | Feel free to get specific about your experiences and provide examples on what you're talking about. Also remember the target audience is people interested in programming, but not all experts, so try to define any tech terms, and use less jargon when possible. 💡 36 | 37 | ## Lighting: 38 | 39 | There is no requirement here, but please consider lighting. [Here's a great article on the importance of lighting and how to setup lighting for you stream/webinar/video](https://livestream.com/blog/lighting-live-video-webinar). 40 | 41 | **Hardwired Ethernet is always preferred over wifi** 42 | 43 | ## Demo prep 44 | Rejoice - you know your project better than anyone, so you choose what and how to demo! 45 | 46 | ### Some other nice to-dos 47 | - Please clear your browser history and hide your bookmarks bar. (If you use Chrome, you could create a new browser profile). 48 | - Make sure that you are signed in and MFA-ed into the tools you will be using. 49 | - Please turn off notifications (do-not-disturb mode is best). 50 | - Please turn off any browser plugins you wouldn’t want to see in the recording 51 | - Please zoom-in your browser to at least 125%. 52 | - Please switch your screen resolution to 1920:1080 53 | - Select Settings -> General -> Automatically hide and show menu bar. 54 | - Select Settings -> Dock -> Automatically hide and show the Dock. 55 | - Consider making a template repo for the demo, so we can easily repeat it if needed. 56 | - Please wear headphones! 57 | - Enjoy the interview! -------------------------------------------------------------------------------- /archive/open-source-friday.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Open Source Friday stream 3 | about: Live Twitch Stream for Open Source Friday 4 | title: Open Source Friday - [PROJECT NAME] 5 | labels: open-source-friday, open-source, twitch 6 | assignees: 'LadyKerr, AndreaGriffiths11' 7 | 8 | --- 9 | 10 | [image to go here - link to Illustrator template is in Gdrive](https://drive.google.com/drive/u/0/folders/1ADOjtNPNaOUArEB4USuAOuc_xTWLeBFK) 11 | 12 | ## Todos 13 | Before: 14 | - [ ] Create assets (social card) 15 | - [ ] [Schedule social promo - Twitter + Linkedin](https://app.sproutsocial.com/) 16 | - [ ] [Create event in streamyard - Twitter, Twitch, Linkedin, Youtube channels](https://streamyard.com/teams/nCBWjEVBOAx2Rx4KOrFQyoal/broadcasts) 17 | - [ ] [Create meetup event](https://www.meetup.com/github/) 18 | - [ ] Confirm time with guest 19 | - [ ] Send preparation doc to guest [link](https://gist.github.com/bdougie/2f54b9df587eeefdb7399543f057eda5) 20 | - [ ] Choose guest topic (a good story about their project) 21 | 22 | ### Ensure/during: 23 | - Microphone, camera, setup works 24 | - You are streaming on the GitHub Twitch account not your own 25 | - Your stream setup has all the Open Source Friday graphical assets 26 | - Record the chat 27 | - Have your mod settings open 28 | 29 | ### After: 30 | - [ ] Jump into the Community Forum and continue the conversation 31 | - [ ] Post wrap up on Dev.to (choose one hot topic or overall summary of the talk) 32 | - [ ] Upload VOD to YouTube 33 | - [ ] Embed the YouTube Link in Dev.to article 34 | - [ ] Send thank you email to guest (remember to ask for their address so we can send a thank you gift) 35 | - [ ] Remove GitHub stream link so you don't accidentally stream your own content on the GitHub channel 36 | 37 | ## Details 38 | Date: 39 | Time: 10:00AM PST | 12PM CST | 1PM EST | 6PM GMT 40 | Guests' OS Repo: 41 | Meetup Link: 42 | 43 | - profile: @handle 44 | - [Invite emails templates](https://docs.google.com/document/d/1Sasimb9QWEHylMmTzuN1f7nmLS7JI3hZvihbI8bHaxs/edit) 45 | - [recording guide for remote guests](https://gist.github.com/LadyKerr/9b7d6dccde55b3f30398612d1290b7dc) 46 | 47 | ## Talking Topics 48 | 49 | (below is meant to be a guide for the conversation, we will not be able to cover everything.) 50 | 51 | ### Intro 52 | Example script (for the host): Welcome to Open Source Friday! I’m your host @handle and today we are joined by @guest. Today we are going to talk about @guest’s project @project. Welcome @guest! 53 | 54 | - Who is @handle? 55 | - How/Why did this project get started (git init story)? 56 | - How did you get into open source? 57 | - What does it do? Do you have an example/hello-world? [DEMO] 58 | - What was the last thing you pushed to using GitHub? Or What is the next thing you would like to push? 59 | - Walkthrough a good-first-issue and/or CONTRIBUTING.md. 60 | - Look at https://github.com/stars -- Let’s look at projects we starred recently and chat about why we starred them. 61 | 62 | ### Outro 63 | Script (For host): 64 | Thank you @guest for joining us today! If you want to learn more about @guest or @project, check out the links in the chat. If you want to learn more about Open Source Friday, check out https://opensourcefriday.com. We’ll be back next week with another episode of Open Source Friday. Happy coding! 65 | 66 | Link to chat: https://twitch.tv/github/chat -------------------------------------------------------------------------------- /admin/guest-assets/guia-stream.md: -------------------------------------------------------------------------------- 1 | ¡Gracias por aceptar hablar sobre tu proyecto en Open Source Viernes! Aprecio mucho que hayas dedicado tiempo a formar parte de la discusión, ¡y estoy muy emocionado de escuchar tu historia y mostrar tu proyecto! ¡Realmente va a ayudar a mucha gente! 2 | 3 | # Guía de Transmisión para Invitados 4 | Todas las entrevistas se transmiten en vivo en el [Canal de Twitch de GitHub](https://twitch.tv/GitHub) (usando Streamyard) y se editan para estar disponibles en YouTube como contenido compartible. 5 | 6 | [Grabaciones anteriores de OSF](https://www.youtube.com/playlist?list=PL0lo9MOBetEFi42pe4LGeWK0sqNaErM2i) 7 | 8 | ## Software y Equipamiento de Grabación: 9 | Utilizaremos Streamyard para tran)smitir en Twitch. 10 | 11 | **Los invitados remotos necesitarán tener micrófonos y auriculares separados para reducir el ruido ambiente.** 12 | 13 | ## Formato y Ejemplo de Preguntas: 14 | 15 | La transmisión tendrá un formato relajado: 16 | 17 | 1. Preséntate - 5 minutos 18 | 2. ¿Cuál es tu proyecto? 19 | 3. Demostración - 5-10 minutos (¿Qué hace? ¿Tienes un ejemplo/hola-mundo?) 20 | 4. ¿Cuál fue tu motivación para construir tu proyecto o cómo comenzó este proyecto? 21 | 5. ¿Cómo pueden las personas contribuir? 22 | 6. ¿Cuál fue lo último que subiste usando GitHub? ¿O qué es lo siguiente que te gustaría subir? 23 | 7. ¿Hay alguna pregunta de la audiencia? 24 | ### Preguntas de Cierre 25 | - ¿Cuál es tu mejor consejo para nuevos colaboradores? 26 | - ¿Cuál es tu canción favorita de todos los tiempos? 27 | - ¿Qué emoji te describe mejor? 28 | - ¿Cuál es tu sabor de helado favorito? 29 | 30 | ### Despedida - toda la transmisión no debería durar más de 30-45 minutos 31 | 32 | ## Directrices Generales para la Entrevista: 33 | 34 | Siéntete libre de ser específico sobre tus experiencias y proporcionar ejemplos sobre lo que estás hablando. Recuerda que la audiencia objetivo son personas interesadas en la programación, pero no todas son expertas, así que trata de definir cualquier término técnico y utiliza menos jerga cuando sea posible. 💡 35 | 36 | ## Iluminación: 37 | 38 | No hay un requisito específico aquí, pero por favor considera la iluminación. [Aquí tienes un gran artículo sobre la importancia de la iluminación y cómo configurarla para tu transmisión/webinario/video](https://livestream.com/blog/lighting-live-video-webinar). 39 | 40 | **Siempre se prefiere una conexión Ethernet por cable en lugar de Wi-Fi** 41 | 42 | ## Preparación para la Demo: 43 | ¡Alegría - conoces tu proyecto mejor que nadie, así que elige qué y cómo demostrar! 44 | 45 | ### Algunas otras cosas buenas que hacer: 46 | - Borra el historial de tu navegador y oculta la barra de marcadores. (Si usas Chrome, podrías crear un nuevo perfil de navegador). 47 | - Asegúrate de iniciar sesión y tener la autenticación de dos factores activada en las herramientas que vas a usar. 48 | - Desactiva las notificaciones (el modo no molestar es el mejor). 49 | - Desactiva cualquier complemento del navegador que no quieras ver en la grabación. 50 | - Amplía la vista de tu navegador al menos al 125%. 51 | - Cambia la resolución de tu pantalla a 1920:1080. 52 | - Selecciona Configuración -> General -> Ocultar y mostrar automáticamente la barra de menú. 53 | - Selecciona Configuración -> Dock -> Ocultar y mostrar automáticamente el Dock. 54 | - Considera crear un repositorio de plantilla para la demo, así podremos repetirla fácilmente si es necesario. 55 | - ¡Usa audifonos! 56 | - ¡Disfruta de la entrevista! 57 | -------------------------------------------------------------------------------- /.github/workflows/standardize-issue-titles.yml: -------------------------------------------------------------------------------- 1 | name: Standardize Issue Titles 2 | 3 | on: 4 | workflow_dispatch: # Allows manual triggering 5 | 6 | jobs: 7 | standardize-titles: 8 | runs-on: ubuntu-latest 9 | permissions: 10 | issues: write 11 | 12 | steps: 13 | - name: Set up Python 14 | uses: actions/setup-python@v4 15 | with: 16 | python-version: '3.10' 17 | 18 | - name: Create standardization script 19 | run: | 20 | cat > standardize_titles.py << 'EOF' 21 | import os 22 | import requests 23 | import time 24 | 25 | # Authentication 26 | token = os.environ.get("GITHUB_TOKEN") 27 | headers = { 28 | "Accept": "application/vnd.github.v3+json", 29 | "Authorization": f"token {token}" 30 | } 31 | 32 | # Repository details 33 | repo_owner = os.environ.get("REPO_OWNER") 34 | repo_name = os.environ.get("REPO_NAME") 35 | 36 | # Issue updates mapping 37 | issue_updates = [ 38 | {"number": 138, "title": "Open Source Friday - Nuxt and AI - [05-23-2025]"}, 39 | {"number": 137, "title": "Open Source Friday - SupermemoryAI - [05-16-2025]"}, 40 | {"number": 136, "title": "Open Source Friday - Effection - [TBD]"}, 41 | {"number": 135, "title": "Open Source Friday - Cluecumber - [TBD]"}, 42 | {"number": 133, "title": "Open Source Friday with OSPO - Td Bank - [04-04-2025]"}, 43 | {"number": 129, "title": "Open Source Friday - supervision - [03-28-2025]"}, 44 | {"number": 127, "title": "Open Source Friday - Convex - [05-09-2025]"}, 45 | {"number": 125, "title": "Open Source Friday - Dagger AI Agents - [TBD]"}, 46 | {"number": 117, "title": "Open Source Friday - Oqtane - [04-11-2025]"}, 47 | {"number": 116, "title": "Open Source Friday - Daytona - [04-18-2025]"}, 48 | {"number": 115, "title": "Open Source Friday - Ushahidi - [TBD]"}, 49 | {"number": 111, "title": "Open Source Friday - Connecting Workers and Public AI - [TBD]"} 50 | ] 51 | 52 | # Update each issue 53 | for update in issue_updates: 54 | try: 55 | issue_number = update["number"] 56 | new_title = update["title"] 57 | 58 | print(f"Updating issue #{issue_number} with title: {new_title}") 59 | 60 | url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/issues/{issue_number}" 61 | payload = {"title": new_title} 62 | 63 | response = requests.patch(url, json=payload, headers=headers) 64 | 65 | if response.status_code == 200: 66 | print(f"Successfully updated issue #{issue_number}") 67 | else: 68 | print(f"Error updating issue #{issue_number}: {response.status_code} - {response.text}") 69 | 70 | # Add a short delay to avoid rate limiting 71 | time.sleep(1) 72 | except Exception as e: 73 | print(f"Error updating issue #{issue_number}: {str(e)}") 74 | EOF 75 | 76 | - name: Install dependencies 77 | run: pip install requests 78 | 79 | - name: Run standardization script 80 | env: 81 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 82 | REPO_OWNER: githubevents 83 | REPO_NAME: open-source-friday 84 | run: python standardize_titles.py 85 | -------------------------------------------------------------------------------- /.github/workflows/label-new-issues.yml: -------------------------------------------------------------------------------- 1 | name: Label New Issues 2 | 3 | on: 4 | issues: 5 | types: [opened] 6 | 7 | jobs: 8 | label-new-issue: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | 13 | - name: Label New Issue 14 | uses: actions/github-script@v6 15 | with: 16 | github-token: ${{secrets.GITHUB_TOKEN}} 17 | script: | 18 | const fs = require('fs').promises; 19 | 20 | async function parseYaml(filePath) { 21 | const content = await fs.readFile(filePath, 'utf8'); 22 | const lines = content.split('\n'); 23 | const result = {}; 24 | let currentKey = null; 25 | 26 | for (const line of lines) { 27 | const trimmedLine = line.trim(); 28 | if (trimmedLine === '' || trimmedLine.startsWith('#')) continue; 29 | 30 | if (trimmedLine.includes(':')) { 31 | [currentKey, value] = trimmedLine.split(':').map(s => s.trim()); 32 | result[currentKey] = []; 33 | if (value) { 34 | result[currentKey].push(value.replace(/^['"]|['"]$/g, '')); 35 | } 36 | } else if (trimmedLine.startsWith('-') && currentKey) { 37 | let value = trimmedLine.slice(1).trim(); 38 | value = value.replace(/^['"]|['"]$/g, ''); 39 | result[currentKey].push(value); 40 | } 41 | } 42 | 43 | return result; 44 | } 45 | 46 | async function addLabelsToIssue(octokit, owner, repo, issueNumber, labels) { 47 | await octokit.rest.issues.addLabels({ 48 | owner: owner, 49 | repo: repo, 50 | issue_number: issueNumber, 51 | labels: labels 52 | }); 53 | } 54 | 55 | async function labelNewIssue() { 56 | try { 57 | console.log('Reading label rules file...'); 58 | const labelRules = await parseYaml('.github/label-rules.yml'); 59 | console.log('Parsed label rules:', JSON.stringify(labelRules, null, 2)); 60 | 61 | const issue = context.payload.issue; 62 | const title = issue.title.toLowerCase(); 63 | const labelsToAdd = []; 64 | 65 | for (const [label, keywords] of Object.entries(labelRules)) { 66 | if (keywords.some(keyword => { 67 | if (keyword.startsWith('/') && keyword.endsWith('/')) { 68 | const regex = new RegExp(keyword.slice(1, -1), 'i'); 69 | return regex.test(title); 70 | } 71 | return title.includes(keyword.toLowerCase()); 72 | })) { 73 | labelsToAdd.push(label); 74 | } 75 | } 76 | 77 | if (labelsToAdd.length > 0) { 78 | await addLabelsToIssue(github, context.repo.owner, context.repo.repo, issue.number, labelsToAdd); 79 | console.log(`Added labels to new issue #${issue.number}: ${labelsToAdd.join(', ')}`); 80 | } else { 81 | console.log(`No matching labels found for new issue #${issue.number}`); 82 | } 83 | } catch (error) { 84 | console.error('Error in workflow:', error.message); 85 | console.error('Error stack:', error.stack); 86 | core.setFailed(error.message); 87 | } 88 | } 89 | 90 | labelNewIssue(); 91 | -------------------------------------------------------------------------------- /.github/workflows/label-all-issues.yml: -------------------------------------------------------------------------------- 1 | name: Label All Issues 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * 0' # Run at midnight every Sunday 6 | workflow_dispatch: 7 | 8 | jobs: 9 | label-issues: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | 14 | - name: Label All Issues 15 | uses: actions/github-script@v6 16 | with: 17 | github-token: ${{secrets.GITHUB_TOKEN}} 18 | script: | 19 | const fs = require('fs').promises; 20 | 21 | async function parseYaml(filePath) { 22 | const content = await fs.readFile(filePath, 'utf8'); 23 | const lines = content.split('\n'); 24 | const result = {}; 25 | let currentKey = null; 26 | 27 | for (const line of lines) { 28 | const trimmedLine = line.trim(); 29 | if (trimmedLine === '' || trimmedLine.startsWith('#')) continue; 30 | 31 | if (trimmedLine.includes(':')) { 32 | [currentKey, value] = trimmedLine.split(':').map(s => s.trim()); 33 | result[currentKey] = []; 34 | if (value) { 35 | result[currentKey].push(value.replace(/^['"]|['"]$/g, '')); 36 | } 37 | } else if (trimmedLine.startsWith('-') && currentKey) { 38 | let value = trimmedLine.slice(1).trim(); 39 | value = value.replace(/^['"]|['"]$/g, ''); 40 | result[currentKey].push(value); 41 | } 42 | } 43 | 44 | return result; 45 | } 46 | 47 | async function getIssues(octokit, owner, repo, page = 1) { 48 | const response = await octokit.rest.issues.listForRepo({ 49 | owner: owner, 50 | repo: repo, 51 | state: 'all', 52 | per_page: 100, 53 | page: page 54 | }); 55 | return response.data; 56 | } 57 | 58 | async function addLabelsToIssue(octokit, owner, repo, issueNumber, labels) { 59 | await octokit.rest.issues.addLabels({ 60 | owner: owner, 61 | repo: repo, 62 | issue_number: issueNumber, 63 | labels: labels 64 | }); 65 | } 66 | 67 | async function labelAllIssues() { 68 | try { 69 | console.log('Reading label rules file...'); 70 | const labelRules = await parseYaml('.github/label-rules.yml'); 71 | console.log('Parsed label rules:', JSON.stringify(labelRules, null, 2)); 72 | 73 | let page = 1; 74 | let issues; 75 | do { 76 | issues = await getIssues(github, context.repo.owner, context.repo.repo, page); 77 | for (const issue of issues) { 78 | const title = issue.title.toLowerCase(); 79 | const labelsToAdd = []; 80 | for (const [label, keywords] of Object.entries(labelRules)) { 81 | if (keywords.some(keyword => { 82 | if (keyword.startsWith('/') && keyword.endsWith('/')) { 83 | const regex = new RegExp(keyword.slice(1, -1), 'i'); 84 | return regex.test(title); 85 | } 86 | return title.includes(keyword.toLowerCase()); 87 | })) { 88 | labelsToAdd.push(label); 89 | } 90 | } 91 | if (labelsToAdd.length > 0) { 92 | await addLabelsToIssue(github, context.repo.owner, context.repo.repo, issue.number, labelsToAdd); 93 | console.log(`Added labels to issue #${issue.number}: ${labelsToAdd.join(', ')}`); 94 | } else { 95 | console.log(`No matching labels found for issue #${issue.number}`); 96 | } 97 | } 98 | page++; 99 | } while (issues.length > 0); 100 | } catch (error) { 101 | console.error('Error in workflow:', error.message); 102 | console.error('Error stack:', error.stack); 103 | core.setFailed(error.message); 104 | } 105 | } 106 | 107 | labelAllIssues(); 108 | --------------------------------------------------------------------------------