<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.opensauced.pizza/community-resources/</id>
    <title>OpenSauced Blog</title>
    <updated>2024-08-19T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.opensauced.pizza/community-resources/"/>
    <subtitle>OpenSauced Blog</subtitle>
    <icon>https://docs.opensauced.pizza/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Supercharge Your GitHub Profile: Showcase Your Open Source Contributions]]></title>
        <id>https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/</id>
        <link href="https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/"/>
        <updated>2024-08-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how to add OpenSauced Dev Cards to your GitHub Profile using GitHub Actions.]]></summary>
        <content type="html"><![CDATA[<p>Last week, we launched our brand new Dev Cards with the OSCR (Open Source Contributor Rating) highlighted on the front to make it easier for you to showcase your impact in open source. To make it even easier, I've cooked up a little GitHub Action that'll automatically update your Dev Card on your GitHub profile.</p>
<p>In this post, we're gonna dive into what Dev Cards are all about, how this new GitHub Action works, and how you can get it set up.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="opensauced-dev-cards">OpenSauced Dev Cards<a href="https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/#opensauced-dev-cards" class="hash-link" aria-label="Direct link to OpenSauced Dev Cards" title="Direct link to OpenSauced Dev Cards">​</a></h2>
<p>At OpenSauced, we created <a href="https://opensauced.pizza/docs/features/dev-card/" target="_blank" rel="noopener noreferrer">dev cards to showcase your open source stats</a>.</p>
<p>We also <a href="https://opensauced.pizza/blog/introducing-OSCR" target="_blank" rel="noopener noreferrer">recently introduced the OSCR score</a> which appears prominently on dev cards now.</p>
<p>If you head on over to your OpenSauced profile page, you can see your dev card now. Here's <a href="https://oss.fyi/nickytonline" target="_blank" rel="noopener noreferrer">my OpenSauced profile</a>. There's a little pizza card button you can press to see it.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q3faduepn8vdt571w2bg.png" alt="An OpenSauced User's avatar with the dev card button to the bottom right of it." class="img_ev3q"></p>
<p>The card is interactive and can be flipped.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vyjcmg41113h3pgd3mh.gif" alt="My OpenSauced dev card" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introducing-the-opensauced-dev-card-github-action">Introducing the OpenSauced Dev Card GitHub Action<a href="https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/#introducing-the-opensauced-dev-card-github-action" class="hash-link" aria-label="Direct link to Introducing the OpenSauced Dev Card GitHub Action" title="Direct link to Introducing the OpenSauced Dev Card GitHub Action">​</a></h2>
<p>To make it easier to showcase your contributions, I've developed a GitHub Action that automates the process of fetching your OpenSauced dev card (static version) and updating it in your GitHub profile README.</p>
<p>You can check it out <a href="https://github.com/nickytonline/open-sauced-dev-card-action" target="_blank" rel="noopener noreferrer">here</a></p>
<p>This means you can have an always up-to-date representation of your open source contributions from OpenSauced stats right on your GitHub profile.</p>
<p>Here's mine on <a href="https://github.com/nickytonline" target="_blank" rel="noopener noreferrer">my GitHub profile</a></p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/359o03keegpkdg9dns8y.png" alt="My GitHub README showcasing my OpenSauced Dev Card" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-it-works">How It Works<a href="https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works">​</a></h3>
<ol>
<li>The action runs on a schedule (default is daily at midnight UTC) or can be triggered manually.</li>
<li>It fetches your dev card image from OpenSauced.</li>
<li>The image is saved to your profile README repository.</li>
<li>Your README is automatically updated with the new image.</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="setting-it-up">Setting It Up<a href="https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/#setting-it-up" class="hash-link" aria-label="Direct link to Setting It Up" title="Direct link to Setting It Up">​</a></h3>
<p><a href="https://github.com/marketplace/actions/opensauced-dev-card-action" target="_blank" rel="noopener noreferrer">View the GitHub action on the GitHub Action Marketplace</a></p>
<p>To use this action in your own GitHub profile, follow these steps:</p>
<ol>
<li>
<p>Create a workflow file (e.g., <code>.github/workflows/update-open-sauced-dev-card.yml</code>) in your profile README repository.</p>
</li>
<li>
<p>Add the following content to the file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Update OpenSauced Dev Card</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">schedule</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">cron</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0 0 * * *"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Run daily at midnight UTC</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workflow_dispatch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Allow manual triggering</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">update-dev-card</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Update Dev Card</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nickytonline/open</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sauced</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">card</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@v1.0.2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">github-token</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.GITHUB_TOKEN </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"your_username"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p>Replace "your_username" with your actual GitHub username.</p>
</li>
<li>
<p>Add the following markdown to your README.md:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">![My OpenSauced Dev Card</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">./dev-card.png</span><span class="token url" style="color:#36acaa">)</span><span class="token plain">](https://oss.fyi/your_username)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Again, replace your_username with your actual GitHub username.</p>
</li>
<li>
<p>Run the GitHub action manually the first time if you want to get an initial image. It's not a big deal if you don't, but it'll mean the image will look broken until the first time the action runs at midnight UTC.</p>
</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="making-the-most-of-your-dev-card-tips--tricks">Making the Most of Your Dev Card: Tips &amp; Tricks<a href="https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/#making-the-most-of-your-dev-card-tips--tricks" class="hash-link" aria-label="Direct link to Making the Most of Your Dev Card: Tips &amp; Tricks" title="Direct link to Making the Most of Your Dev Card: Tips &amp; Tricks">​</a></h2>
<p>If you want to make the most of your dev card on your GitHub profile? Here are some tips:</p>
<ul>
<li><strong>Prime Real Estate</strong>: Place your card where you think it will be noticed on your README. First impressions count, and you want visitors to see your open source contributions. Maybe place it between your "About Me" and your "Current Projects" for a well-rounded profile.</li>
<li><strong>Context is Key</strong>: Don't just leave your card hanging there. Add some text to introduce it. Something like: "Check out my open source contribution snapshot!"</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-secret-sauce-understanding-your-oscr-score">The Secret Sauce: Understanding Your OSCR Score<a href="https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/#the-secret-sauce-understanding-your-oscr-score" class="hash-link" aria-label="Direct link to The Secret Sauce: Understanding Your OSCR Score" title="Direct link to The Secret Sauce: Understanding Your OSCR Score">​</a></h2>
<p>Think of the OSCR as your open source score that looks at:</p>
<ul>
<li>Your contribution frequency</li>
<li>The quality of your contributions</li>
<li>Your ability to start and be a part of open source conversations</li>
</ul>
<p>Your OSCR score provides a quick snapshot of your open source activity and impact. It gives people an idea of how active and influential you are in the open source community.</p>
<p>Like any metric, your open source experience is about more than just one number.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://docs.opensauced.pizza/community-resources/supercharge-your-github-profile/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Open source contributions are a fantastic way to grow as a developer and give back to the community. With this GitHub Action and OpenSauced, you can easily showcase your efforts and inspire others to get involved.</p>
<p>Give it a try and let me know what you think!</p>
<p>Stay saucy peeps!</p>
<p>If you would like to know more about my work in open source, <a href="https://oss.fyi/nickytonline" target="_blank" rel="noopener noreferrer">follow me on OpenSauced</a>.</p>]]></content>
        <author>
            <name>Nick Taylor</name>
            <email>nick@opensauced.pizza</email>
        </author>
        <category label="open source" term="open source"/>
        <category label="open source contributor" term="open source contributor"/>
        <category label="open source contributions" term="open source contributions"/>
        <category label="open source for beginners" term="open source for beginners"/>
        <category label="open source software" term="open source software"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing OpenSSF Scorecard for OpenSauced]]></title>
        <id>https://docs.opensauced.pizza/community-resources/introducing-ossf-scorecard/</id>
        <link href="https://docs.opensauced.pizza/community-resources/introducing-ossf-scorecard/"/>
        <updated>2024-08-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how OpenSauced integrates OpenSSF Scorecard to enhance open source security and compliance.]]></summary>
        <content type="html"><![CDATA[<p>In September of 2022, the European Parliament introduced the <a href="https://digital-strategy.ec.europa.eu/en/policies/cyber-resilience-act" target="_blank" rel="noopener noreferrer">“Cyber Resilience Act”</a>,
commonly called the CRA: a new piece of legislation that requires anyone providing
digital products in the EU to meet certain security and compliance requirements.</p>
<p>But there’s a catch: before the CRA, companies providing or distributing software
would often need to take on much of the risk when ensuring safe and reliable software
was being shipped to end users. Now, software maintainers further down the supply
chain will have to carry more of that weight. Not only may certain open source
maintainers need to meet certain requirements, but they may have to provide an
up to date security profile of their project.</p>
<p><a href="https://www.linuxfoundation.org/blog/understanding-the-cyber-resilience-act" target="_blank" rel="noopener noreferrer">As the Linux Foundation puts it</a>:</p>
<blockquote>
<p>The Act shifts much of the security burden onto those who develop software,
as opposed to the users of software. This can be justified by two assumptions:
first, software developers know best how to mitigate vulnerabilities and distribute
patches; and second, it’s easier to mitigate vulnerabilities at the source than
requiring users to do so.</p>
</blockquote>
<p>There’s a lot to unpack in the CRA. And it’s still not clear how individual open
source projects, maintainers, foundations, or companies will be directly impacted
But, it’s clear that the broader open source ecosystem needs easier ways to understand
the security risk of projects deep within dependency chains. With all that in mind,
we are very excited to introduce the OpenSSF Scorecard ratings within the OpenSauced
platform.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-the-openssf-scorecard">What is the OpenSSF Scorecard?<a href="https://docs.opensauced.pizza/community-resources/introducing-ossf-scorecard/#what-is-the-openssf-scorecard" class="hash-link" aria-label="Direct link to What is the OpenSSF Scorecard?" title="Direct link to What is the OpenSSF Scorecard?">​</a></h2>
<p>The OpenSSF is <a href="https://openssf.org/" target="_blank" rel="noopener noreferrer">the Open Source Security Foundation</a>: a multidisciplinary group of
software developers, industry leaders, security professionals, researchers, and
government liaisons. The OpenSSF aims to enable the broader open source ecosystem
“to secure open source software for the greater public good.” They interface with
critical personnel across the software industry to fight for a safer technological
future.</p>
<p><a href="https://github.com/ossf/scorecard" target="_blank" rel="noopener noreferrer">The OpenSSF Scorecard project</a> is an effort
to unify what best practices open source maintainers and consumers should use to
judge if their code, practices, and dependencies are safe. Ultimately, the “scorecard”
command line interface gives any the capability to inspect repositories, run “checks”
against those repos, and derive an overall score for the risk profile of that project.
It’s a very powerful software tool that gives you a general picture of where a piece
of software is considered risky. It can also be a great starting point for any open
source maintainer to develop better practices and find out where they may need to
make improvements. By providing a standardized approach to assessing open source
security and compliance, the Scorecard helps organizations more easily identify
supply chain risks and regulatory requirements.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="opensauced-openossf-scorecards">OpenSauced OpenOSSF Scorecards<a href="https://docs.opensauced.pizza/community-resources/introducing-ossf-scorecard/#opensauced-openossf-scorecards" class="hash-link" aria-label="Direct link to OpenSauced OpenOSSF Scorecards" title="Direct link to OpenSauced OpenOSSF Scorecards">​</a></h2>
<p>Using the scorecard command line interface as a cornerstone, we’ve built infrastructure
and tooling to enable OpenSauced to capture scores for nearly all repositories on
GitHub. Anything over a 6 or a 7 is generally considered safe to use with no blaring
issues. Scores of 9 or 10 are doing phenomenally well. And projects with lower scores
should be inspected closely to understand what’s gone wrong.</p>
<p>Scorecards are enabled across all repositories. With this integration, we aim to
make it easier for software maintainers to understand the security posture of their
project and for software consumers to be assured that their dependencies are safe
to use.</p>
<p>Starting today, you can see the score for any project within individual <a href="https://opensauced.pizza/docs/features/repo-pages/" target="_blank" rel="noopener noreferrer">Repository Pages</a>.
For example, in <a href="https://app.opensauced.pizza/s/kubernetes/kubernetes" target="_blank" rel="noopener noreferrer">kubernetes/kubernetes</a>,
we can see the project is safe for use:</p>
<p><img decoding="async" loading="lazy" alt="Kubernetes Scorecard" src="https://docs.opensauced.pizza/assets/images/kubernetes-scorecard-a94f6bf0de48235174d8073412c4c762.png" width="2035" height="975" class="img_ev3q"></p>
<p>Let’s look at another example: <a href="https://app.opensauced.pizza/s/crossplane/crossplane" target="_blank" rel="noopener noreferrer">crossplane/crossplane</a>.
These maintainers are doing an awesome job of ensuring they are following best
practices for open source security and compliance!!</p>
<p><img decoding="async" loading="lazy" alt="Crossplan Scorecard" src="https://docs.opensauced.pizza/assets/images/crossplane-scorecard-0a2ac880b3e3a4cd786c460e1e9bbad6.png" width="1600" height="913" class="img_ev3q"></p>
<p>The checks that the OpenSSF Scorecard looks for involves a wide range of common
open source security practices, both “in code” and with the maintenance of the
project: e.g. checking for code review best practices, if there are “dangerous
workflows” present (like untrusted code being run and checked out during CI/CD runs),
if the project is actively maintained, the use of signed releases, and many more.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-future-of-openssf-scorecards-at-opensauced">The Future of OpenSSF Scorecards at OpenSauced<a href="https://docs.opensauced.pizza/community-resources/introducing-ossf-scorecard/#the-future-of-openssf-scorecards-at-opensauced" class="hash-link" aria-label="Direct link to The Future of OpenSSF Scorecards at OpenSauced" title="Direct link to The Future of OpenSSF Scorecards at OpenSauced">​</a></h2>
<p>We plan to bring the OpenSSF Scorecard to more of the OpenSauced platform, as we
aim to be the definitive place for open source security and compliance for maintainers
and consumers. As part of that, we’ll be bringing more details to the OpenSSF Scorecard
with how individual checks are ranked:</p>
<p><img decoding="async" loading="lazy" alt="Future Scorecard" src="https://docs.opensauced.pizza/assets/images/future-scorecard-0238e9c60507af01bb014489f9be44e9.png" width="808" height="790" class="img_ev3q"></p>
<p>We’ll also be bringing OpenSSF Scorecard to our premium offering, <a href="https://opensauced.pizza/docs/features/workspaces/" target="_blank" rel="noopener noreferrer">Workspaces</a>:</p>
<p><img decoding="async" loading="lazy" alt="Bottlerocket Scorecard Workspace" src="https://docs.opensauced.pizza/assets/images/future-scorecard-workspaces-41343add886399fdb27e9f826e15d73f.png" width="3006" height="1602" class="img_ev3q"></p>
<p>Within a Workspace, you’ll soon be able to get an idea of how each of the projects
you are tracking stack up alongside each other's score for open source security and
compliance. You can use the OpenSSF Score together with all the Workspace insights
and metrics, all in one single dashboard, to get a good idea of what’s happening within
a set of repositories and what their security posture is. In this example, I’m tracking
all the repositories within the bottlerocket-os org on GitHub, a security focused
Linux based operating system: I can see that each of the repositories has a good
rating which gives me greater confidence in the maintenance status and security
posture of this ecosystem. This also enables stakeholders and maintainers of Bottlerocket
to have a birds eye snapshot of the compliance and maintenance status of the
entire org.</p>
<p>As the CRA and similar regulations push more of the security burden onto developers,
tools like the OpenSSF Scorecard become invaluable. They offer a standardized, accessible
way to assess and improve the security of open source projects, helping maintainers
meet new compliance requirements and giving software consumers confidence in their
choices.</p>
<p>Looking ahead, we're committed to expanding these capabilities at OpenSauced. By
providing comprehensive security insights, from individual repository scores to
organization-wide overviews in Workspaces, we're working to create a more secure
and transparent open source ecosystem, to enable anyone in the open source community
to better understand their software dependencies, feel empowered to make a meaningful
change if needed, and provide helpful tools to open source maintainers to better
maintain their projects.</p>
<p>Stay saucy!</p>]]></content>
        <author>
            <name>John McBride</name>
            <email>john@opensauced.pizza</email>
        </author>
        <category label="open source security foundation" term="open source security foundation"/>
        <category label="openssf" term="openssf"/>
        <category label="openssf scorecard" term="openssf scorecard"/>
        <category label="open source" term="open source"/>
        <category label="open source compliance" term="open source compliance"/>
        <category label="open source security" term="open source security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Unexpected Power of 100 Days in Open Source]]></title>
        <id>https://docs.opensauced.pizza/community-resources/100-days-of-oss-challenge/</id>
        <link href="https://docs.opensauced.pizza/community-resources/100-days-of-oss-challenge/"/>
        <updated>2024-08-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Join us for #100DaysOfOSS, where we'll create opportunities to collaborate and learn more about open source over the next 100 days.]]></summary>
        <content type="html"><![CDATA[<p>In theory, I'm not sure that open source should <em>work</em>. Think about it: Companies usually keep their best ideas secret. But in open source, everyone shares their code openly. You'd expect most people to just use the free software without giving anything back. Not to mention trying to organize thousands of volunteers from all over the world to build something complex. But despite all these reasons why it shouldn't work, open source not only survives – it thrives. It's powering a huge part of the technology we use every day. But for many people, the idea of actually contributing to open source still feels pretty scary. Why? And more importantly, how can we change that?</p>
<p>Let's start with a personal story. When I first thought of contributing to an open source project, I was afraid. The fear of making a mistake in front of the entire internet was overwhelming. Sound familiar? If so, you're not alone. Research shows that this fear of public failure is a significant barrier to open source participation.</p>
<p>But here's the interesting part: studies also show that the most effective way to overcome this fear is through community support. When we're part of a group, our fear of failure decreases, and our willingness to take risks increases. This is where the magic happens.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="100daysofoss-challenge">#100DaysOfOSS Challenge<a href="https://docs.opensauced.pizza/community-resources/100-days-of-oss-challenge/#100daysofoss-challenge" class="hash-link" aria-label="Direct link to #100DaysOfOSS Challenge" title="Direct link to #100DaysOfOSS Challenge">​</a></h2>
<p>Our <a href="https://opensauced.pizza/docs/community/100-days-of-oss/" target="_blank" rel="noopener noreferrer">#100DaysOfOSS Challenge</a>, isn't about coding for 100 days. It's about leveraging the power of community to transform hesitation into action.</p>
<p>Here's why I think this approach works:</p>
<ol>
<li>
<p>Structured Progress: The challenge provides a clear pathway, breaking down contributing to open source into manageable weekly tasks.</p>
</li>
<li>
<p>Community Support: By connecting participants, the challenge creates a supportive peer group. This not only can reduce anxiety but also increase accountability and motivation.</p>
</li>
<li>
<p>Learning by Doing: The challenge emphasizes practical contributions, aligning with the principles of experiential learning - you don't have to know how to code to contribute.</p>
</li>
<li>
<p>Flexibility: Participants can tailor the challenge to their interests, which research shows increases intrinsic motivation and long-term engagement.</p>
</li>
</ol>
<p>This year, we have support from GitHub Education to enhance the challenge and we're introducing <a href="https://github.com/orgs/open-sauced/discussions/36" target="_blank" rel="noopener noreferrer">weekly structured posts</a> and increased community engagement opportunities. It's an experiment in scaling the benefits of community-supported learning.</p>
<p>So, here's my call to action: If you've ever been curious about open source but hesitated to jump in, join us for <a href="https://opensauced.pizza/docs/community/100-days-of-oss/" target="_blank" rel="noopener noreferrer">#100DaysOfOSS</a> with your <a href="https://github.com/orgs/open-sauced/discussions/36#discussioncomment-10152170" target="_blank" rel="noopener noreferrer">intro</a> today - we already have over 100 people!</p>
<p>P.S. If you're participating, you can also sign up for the <a href="https://news.opensauced.pizza/#/portal/signup" target="_blank" rel="noopener noreferrer">OpenSauced newsletter</a> for biweekly updates on Open Source topics to help you along your journey.</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
        <category label="open source" term="open source"/>
        <category label="open source contributor" term="open source contributor"/>
        <category label="open source challenge" term="open source challenge"/>
        <category label="how to contribute to open source" term="how to contribute to open source"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The React useRef Hook: Not Just for DOM Elements]]></title>
        <id>https://docs.opensauced.pizza/community-resources/the-react-useref-hook-not-just-for-html-elements/</id>
        <link href="https://docs.opensauced.pizza/community-resources/the-react-useref-hook-not-just-for-html-elements/"/>
        <updated>2024-07-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this post, we'll cover what the useRef hook is, some examples of how it can be used, and when it...]]></summary>
        <content type="html"><![CDATA[<p>In this post, we'll cover what the <code>useRef</code> hook is, some examples of how it can be used, and when it shouldn't be used.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-useref">What is useRef?<a href="https://docs.opensauced.pizza/community-resources/the-react-useref-hook-not-just-for-html-elements/#what-is-useref" class="hash-link" aria-label="Direct link to What is useRef?" title="Direct link to What is useRef?">​</a></h2>
<p>The <code>useRef</code> hook creates a reference object that holds a mutable value, stored in its <a href="https://react.dev/reference/react/useRef#referencing-a-value-with-a-ref" target="_blank" rel="noopener noreferrer">current</a> property. This value can be anything from a DOM element to a plain object. Unlike component state via say the <a href="https://react.dev/reference/react/useState" target="_blank" rel="noopener noreferrer">useState</a> hook, changes to a reference object via <code>useRef</code> won't trigger a re-render of your component, improving performance.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="examples">Examples<a href="https://docs.opensauced.pizza/community-resources/the-react-useref-hook-not-just-for-html-elements/#examples" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="referencing-a-dom-element-using-the-useref-hook">Referencing a DOM element using the useRef Hook<a href="https://docs.opensauced.pizza/community-resources/the-react-useref-hook-not-just-for-html-elements/#referencing-a-dom-element-using-the-useref-hook" class="hash-link" aria-label="Direct link to Referencing a DOM element using the useRef Hook" title="Direct link to Referencing a DOM element using the useRef Hook">​</a></h3>
<p>In React, state manages data that can trigger re-renders. But what if you need a way to directly access <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction" target="_blank" rel="noopener noreferrer">document object model</a> (DOM) elements that shouldn't cause re-renders? That's where the <a href="https://react.dev/reference/react/useRef" target="_blank" rel="noopener noreferrer">useRef</a> hook comes in.</p>
<p>Typically, you'd do something like this.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> useEffect</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> useRef </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"react"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">SomeComponent</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> firstNameInputRef </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">useRef</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">HTMLInputElement</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// for plain JavaScript change the above line to</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// const firstNameInputRef = useRef(null);</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">useEffect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    firstNameInputRef</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">current</span><span class="token operator" style="color:#393A34">?.</span><span class="token function" style="color:#d73a49">focus</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">form</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">label</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        First Name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">input type</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"text"</span><span class="token plain"> ref</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">firstNameInputRef</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">label</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">form</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol>
<li>We create a variable named <code>firstNameInputRef</code> using <code>useRef</code> to reference the DOM element (initially null) and use <code>useEffect</code> to focus the input element on the initial render.</li>
<li>Inside <code>useEffect</code>, we check if <code>firstNameInputRef.current</code> exists (it will be the actual DOM element after the initial render). If it does, we call <code>focus()</code> to set focus on the input.</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="referencing-a-non-dom-element-using-the-useref-hook">Referencing a non-DOM element using the useRef Hook<a href="https://docs.opensauced.pizza/community-resources/the-react-useref-hook-not-just-for-html-elements/#referencing-a-non-dom-element-using-the-useref-hook" class="hash-link" aria-label="Direct link to Referencing a non-DOM element using the useRef Hook" title="Direct link to Referencing a non-DOM element using the useRef Hook">​</a></h3>
<p>Recently, I was working on OpenSauced's <a href="https://opensauced.pizza/blog/open-source-insights-with-starsearch" target="_blank" rel="noopener noreferrer">StarSearch</a>, a Copilot for git history feature we released at the end of May 2024. You can read more about StarSearch in <a href="https://dev.to/bekahhw/introducing-starsearch-unlock-the-copilot-for-git-history-5ddb" target="_blank" rel="noopener noreferrer">We Made a Copilot Tool for you to Unlock the Power of Git History</a>.</p>
<p>The ask was to be able to start a new StarSearch conversation. To do so, I had to stop the current conversation. If you've worked with the <a href="https://openai.com/index/openai-api/" target="_blank" rel="noopener noreferrer">OpenAI</a> API or similar APIs, they typically return a <a href="https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream" target="_blank" rel="noopener noreferrer">ReadableStream</a> as a response.</p>
<p>A ReadableStream is a web API that allows data to be read in chunks as it becomes available, enabling efficient processing of large or real-time data sets. In the context of API responses, this means we can start handling the data immediately, without waiting for the entire response to complete.</p>
<p>I initially had this feature working, but ran into issues if the response started to stream. The solution, create a reference to the readable stream via the <code>useRef</code> hook and when a new conversation is started, cancel the one in progress. You can see these changes in this pull request (PR), <a href="https://github.com/open-sauced/app/pull/3637" target="_blank" rel="noopener noreferrer">fix: now a new StarSearch chat can be started if one was in progress</a>.</p>
<p>So now, if someone presses the <em>Create a New Conversation</em> button, I cancel the current streaming response from StarSearch, e.g.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> streamRef </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">useRef</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">ReadableStreamDefaultReader</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name builtin">string</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// for plain JavaScript change the above line to</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// const streamRef = useRef();</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">onNewChat</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    streamRef</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">current</span><span class="token operator" style="color:#393A34">?.</span><span class="token function" style="color:#d73a49">cancel</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol>
<li>We create a variable named <code>streamRef</code> using <code>useRef</code> to hold a reference to the current <a href="https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader" target="_blank" rel="noopener noreferrer">ReadableStreamDefaultReader</a>.</li>
<li>The <code>onNewChat</code> function checks if <code>streamRef.current</code> exists (meaning a stream is ongoing).</li>
<li>If a stream exists, we call <code>cancel()</code> on <code>streamRef.current</code> to stop it before starting a new conversation.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="wrapping-up">Wrapping Up<a href="https://docs.opensauced.pizza/community-resources/the-react-useref-hook-not-just-for-html-elements/#wrapping-up" class="hash-link" aria-label="Direct link to Wrapping Up" title="Direct link to Wrapping Up">​</a></h2>
<p><code>useRef</code> was the perfect solution for my use case. Maybe you'll find the <code>useRef</code> hook useful for something other than referencing a DOM element as well.</p>
<p>You can store almost anything in a reference object via the <code>useRef</code> hook, and it won't cause re-renders in your component. If you're persisting component state, opt for <code>useState</code> or other hooks like <code>useReducer</code> so that the component does re-render.</p>
<p>For further reading on the <code>useRef</code> hook, I highly recommend checking out the React documentation for the <a href="https://react.dev/reference/react/useRef" target="_blank" rel="noopener noreferrer">useRef hook</a>.</p>
<p>Stay saucy peeps!</p>
<p>If you would like to know more about my work in open source, <a href="https://oss.fyi/nickytonline" target="_blank" rel="noopener noreferrer">follow me on OpenSauced</a>.</p>]]></content>
        <author>
            <name>Nick Taylor</name>
            <email>nick@opensauced.pizza</email>
        </author>
        <category label="react" term="react"/>
        <category label="javascript" term="javascript"/>
        <category label="webdev" term="webdev"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Valibot: A New Approach to Data Validation in JavaScript]]></title>
        <id>https://docs.opensauced.pizza/community-resources/valibot-a-new-approach-to-data-validation-in-javascript/</id>
        <link href="https://docs.opensauced.pizza/community-resources/valibot-a-new-approach-to-data-validation-in-javascript/"/>
        <updated>2024-06-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[I recently got to hang with the creator of Valibot, Fabian Hiller on a live stream. We discussed its...]]></summary>
        <content type="html"><![CDATA[<p>I recently got to hang with the creator of <a href="https://valibot.dev/" target="_blank" rel="noopener noreferrer">Valibot</a>, <a href="https://megalink.io/fabian" target="_blank" rel="noopener noreferrer">Fabian Hiller</a> on a live stream. We discussed its history of the project and did some live coding with Valibot. Let’s dig in.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-history-of-valibot">The history of Valibot<a href="https://docs.opensauced.pizza/community-resources/valibot-a-new-approach-to-data-validation-in-javascript/#the-history-of-valibot" class="hash-link" aria-label="Direct link to The history of Valibot" title="Direct link to The history of Valibot">​</a></h2>
<p>If video is your jam, check out this highlight from the live stream that summarizes the history of Valibot.</p>
<a href="https://www.twitch.tv/videos/2172124000"></a><a href="https://www.twitch.tv/videos/2172124000" target="_blank" rel="noopener noreferrer">https://www.twitch.tv/videos/2172124000</a>
<p>During <a href="https://valibot.dev/thesis.pdf" target="_blank" rel="noopener noreferrer">his thesis work</a>, developer Fabian Hiller found himself with dedicated time to pursue an idea he'd been mulling over - creating a new modular data validation library for JavaScript. This led to the birth of Valibot.</p>
<p>Fabian had previously worked on <a href="https://modularforms.dev/" target="_blank" rel="noopener noreferrer">Modular Forms</a>, but he wanted to bring that same modular philosophy to data validation. While popular validation libraries like <a href="https://zod.dev/" target="_blank" rel="noopener noreferrer">Zod</a> offer excellent APIs, Fabian felt there was room to take modularity even further.</p>
<blockquote>
<p>"For Zod, it doesn't make sense to make it extremely modular as Valibot, because most Zod users love Zod for its API", Fabian explained. "This would probably be too big of a breaking change."</p>
</blockquote>
<p>Instead of trying to rebuild Zod from the ground up, he decided a fresh start made more sense. Valibot aims for ultimate modularity, allowing developers to compose small, reusable validation units together.</p>
<p>Fabian didn't work in isolation. He reached out to Zod's creator Colin McDonnell, but the timing didn't line up for deeper collaboration initially. Fabian remains in touch with McDonnell and other open source maintainers though.</p>
<blockquote>
<p>"I'm sure improvements I made in Valibot will hopefully improve other libraries, and other libraries will hopefully affect and improve Valibot," he said. "I hope at the end we end up with great open source projects, and the community can choose what they prefer."</p>
</blockquote>
<p>With Valibot, Fabian hopes to provide developers a new, composable approach to data validation. And by cross-pollinating with other libraries, he aims to push the entire JavaScript validation ecosystem forward.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-first-look-at-valibot">A First Look at Valibot<a href="https://docs.opensauced.pizza/community-resources/valibot-a-new-approach-to-data-validation-in-javascript/#a-first-look-at-valibot" class="hash-link" aria-label="Direct link to A First Look at Valibot" title="Direct link to A First Look at Valibot">​</a></h2>
<p>If you want to experiment with Valibot, I recommend you check out the <a href="https://valibot.dev/playground/" target="_blank" rel="noopener noreferrer">Valibot playground</a>. Fabian actually <a href="https://x.com/FabianHiller/status/1801975870917087644" target="_blank" rel="noopener noreferrer">made a change to enable prettier support</a> after our live stream! 🤩</p>
<p>Also, <a href="https://valibot.dev/blog/valibot-v0.31.0-is-finally-available/" target="_blank" rel="noopener noreferrer">version 0.31.0 was recently released</a> with a whole rework of the API.</p>
<p>Let's start of simple. We want to create an e-mail validator. Valibot makes this pretty easy for us.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> v </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"valibot"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> EmailSchema </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">pipe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">email</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> validEmail </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">safeParse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">EmailSchema</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"jane@example.com"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">validEmail</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>First, we import the Valibot package. Next, we create a schema for a valid email, <code>const EmailSchema = v.pipe(v.string(), v.email());</code></p>
<p><code>v.pipe</code> is so powerful. It allows us to chain validators. First, we check that the input is a string via <code>v.string()</code>, and next, if it's a valid email via <code>v.email()</code>.</p>
<p>If you run this in the playground, you'll get the following output.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[LOG]: {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  typed: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  success: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  output: "jane@example.com",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  issues: undefined</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can view the following example in <a href="https://valibot.dev/playground/?code=JYWwDg9gTgLgBAKjgQwM5wG5wGZQiOAcg2QBtgAjCGQgbgCh6BjCAO1XgFERlhSBlJgAsApjzgBeTADowwMCIAUGaRyjBWAc0UBKADQyxvUrp0NmbDpjLAAJt2OSZqZNhEAFZFFRKHfQaI8BoQAVsisIgACIgAeyOCkItIsIIRmjCzsEInSpBDaJOT2PHzpQA" target="_blank" rel="noopener noreferrer">this Valibot playground</a>.</p>
<p>Let's see what happens when we have an invalid email.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> v </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"valibot"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> EmailSchema </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">pipe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">email</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> validEmail </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">safeParse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">EmailSchema</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"janeexample.com"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">validEmail</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If we run the updated playground, it will now output the following:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[LOG]: {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  typed: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  success: false,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  output: "janeexample.com",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  issues: [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      kind: "validation",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      type: "email",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      input: "janeexample.com",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      expected: null,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      received: "\"janeexample.com\"",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      message: "Invalid email: Received \"janeexample.com\"",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      requirement: RegExp,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      path: undefined,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      issues: undefined,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      lang: undefined,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      abortEarly: undefined,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      abortPipeEarly: undefined</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can view the updated example in <a href="https://valibot.dev/playground/?code=JYWwDg9gTgLgBAKjgQwM5wG5wGZQiOAcg2QBtgAjCGQgbgCh6BjCAO1XgFERlhSBlJgAsApjzgBeTADowwMCIAUGaRyjBWAc0UBKADQyxvUrp0NmbDpjLAAJt2OSZqZNhEAFZFFRKHfQaI8BoQAVsisIiIAHsjgpCLSLCCEZows7BDx0qQQ2iTk9jx8qUA" target="_blank" rel="noopener noreferrer">this Valibot playground</a>.</p>
<p>You can see an example of valibot in action in a recent pull request of mine.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">query</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sharedChatId </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parseSchema</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">UuidSchema</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">query</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    searchParams</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sharedChatId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">captureException</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Failed to parse UUID for StarSearch. UUID: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">sharedChatId</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        cause</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> error</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Invalid shared Chat ID"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<a href="https://github.com/open-sauced/app/pull/3563"></a><a href="https://github.com/open-sauced/app/pull/3563" target="_blank" rel="noopener noreferrer">https://github.com/open-sauced/app/pull/3563</a>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="contributing-to-valibot">Contributing to Valibot<a href="https://docs.opensauced.pizza/community-resources/valibot-a-new-approach-to-data-validation-in-javascript/#contributing-to-valibot" class="hash-link" aria-label="Direct link to Contributing to Valibot" title="Direct link to Contributing to Valibot">​</a></h2>
<p>Valibot is open source, like many things in the JavaScript ecosystem.</p>
<p>The project has a low <a href="https://opensauced.pizza/blog/Understanding-the-Lottery-Factor" target="_blank" rel="noopener noreferrer">lottery factor</a>, and it also has high <a href="https://opensauced.pizza/docs/features/repo-pages/#insights-into-contributor-confidence" target="_blank" rel="noopener noreferrer">contributor confidence</a> (many stargazers and forkers come back later on to make a meaningful contribution).</p>
<p><a href="https://app.opensauced.pizza/s/fabian-hiller/valibot" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qf7pw9laidwspqzqu59t.png" alt="Valibot repository page on OpenSauced" class="img_ev3q"></a></p>
<p>If you're looking to contribute to open source in the JavaScript/TypeScript ecosystem, Valibot might be up your alley.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="wrapping-up">Wrapping Up<a href="https://docs.opensauced.pizza/community-resources/valibot-a-new-approach-to-data-validation-in-javascript/#wrapping-up" class="hash-link" aria-label="Direct link to Wrapping Up" title="Direct link to Wrapping Up">​</a></h2>
<p>We only scratched the surface of Valibot, but I encourage you to check it out. Valibot was highlighted in the latest bytes.dev issue, <a href="https://bytes.dev/archives/297" target="_blank" rel="noopener noreferrer">VALIBOT AND THE CIRCLE OF LIFE</a>. You know a library is gaining traction if bytes.dev covers it!</p>
<p>Stay saucy peeps!</p>
<p>If you would like to know more about my work in open source, <a href="https://oss.fyi/nickytonline" target="_blank" rel="noopener noreferrer">follow me on OpenSauced</a>.</p>]]></content>
        <author>
            <name>Nick Taylor</name>
            <email>nick@opensauced.pizza</email>
        </author>
        <category label="javascript" term="javascript"/>
        <category label="typescript" term="typescript"/>
        <category label="webdev" term="webdev"/>
        <category label="opensource" term="opensource"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to Find Open Source Projects to Contribute To]]></title>
        <id>https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/</id>
        <link href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/"/>
        <updated>2024-06-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[If you want to learn how to find open source projects to contribute to, this post offers a list of ways to find the right project to contribute to.]]></summary>
        <content type="html"><![CDATA[<p>One of the top questions I get is “How do I find an open-source project to contribute to?” It’s a fair question because there’s a lot of encouragement to contribute, but not a clear path to find the right issue for you. The truth is that maybe you shouldn't be looking for a place to contribute at all. Maybe you need to understand what your real goals are and start by building something you need, understanding open source projects and communities, and approaching contributions with a goal to improve the project rather than improving your resume.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="start-by-building-something-you-need">Start by Building Something You Need<a href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/#start-by-building-something-you-need" class="hash-link" aria-label="Direct link to Start by Building Something You Need" title="Direct link to Start by Building Something You Need">​</a></h2>
<p>When you build something for yourself, you develop a deeper understanding of your own goals, requirements for a project, and how to solve specific problems.</p>
<p>When you're building for yourself, you become more familiar with the complexity of coding, problem-solving, and project management.
Building your own project first also teaches valuable lessons in ownership and responsibility. You learn to see a project through from conception to implementation, and how to approach the challenges that come up along the way. What you learn from this experience will help you approach open source contributions with the right mindset and make informed and thoughtful contributions to projects that benefit their communities.</p>
<p>You'll learn more about how to align your efforts with the needs of the project and its users, which ultimately leads to a more rewarding and effective contribution experience.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="understand-your-skills-and-interests">Understand Your Skills and Interests<a href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/#understand-your-skills-and-interests" class="hash-link" aria-label="Direct link to Understand Your Skills and Interests" title="Direct link to Understand Your Skills and Interests">​</a></h3>
<p>Working on your open projects can help you better understand your skill-level and what you have the ability to take on. It’s so important to understand, in fact, that I wrote a whole post on it: <a href="https://dev.to/opensauced/how-to-assess-your-skill-level-before-contributing-to-open-source-4pn3" target="_blank" rel="noopener noreferrer">How to Assess Your Skill Level Before Contributing to Open Source</a>.</p>
<p>Once you have a good understanding of your skill level, you can better assess your ability to make meaningful contributions. If you’re a beginner, don’t take on a complicated issue that requires more experience. Likewise, if you are an experienced programmer, don’t take an issue that’s meant for someone in their early career stages.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="use-open-source-software">Use Open Source Software<a href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/#use-open-source-software" class="hash-link" aria-label="Direct link to Use Open Source Software" title="Direct link to Use Open Source Software">​</a></h2>
<p>Scouring the internet for a project to submit a one-off Pull Request (PR) to decreases your connection to the project and your desire to see it be successful. In <a href="https://youtu.be/tCEy-HZJckQ?t=2656" target="_blank" rel="noopener noreferrer">a recent Open Source Friday Stream with @ladykerr and @bdougieyo</a>, <a href="https://app.opensauced.pizza/user/Ainali?range=360" target="_blank" rel="noopener noreferrer">Jan Ainali</a> pointed out that it's "much better [is] to contribute to something you use and where you would like to see an improvement."</p>
<p>When you are invested in a project, you’re more likely to navigate challenges, ask meaningful questions, and to grow and progress. <em>The more you use a product, the better contributor you’ll be, because you have a depth of understanding that helps you identify what’s useful for a project and its community.</em> Using open source software gives you access to opportunities to create bug reports or ask for new features because you understand the project and the user's expectations for the project. <em>Giving feedback is a valuable contribution.</em></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="find-an-open-source-community">Find an Open Source Community<a href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/#find-an-open-source-community" class="hash-link" aria-label="Direct link to Find an Open Source Community" title="Direct link to Find an Open Source Community">​</a></h3>
<p>When you're part of a community, you get access to insider information about the project. Listening in those communities, allows you to engage with the creators of the open source project. This is your opportunity to learn, understand, and grow. You can hear Kelsey Hightower talk about community <a href="https://youtube.com/clip/UgkxFDg6UROC0QWZ0JTiEzgytNSEkVm1pKUW?si=PcCHFjKAgkBE3Wjy" target="_blank" rel="noopener noreferrer">here</a>. Being involved in the community also gives you the context you need to create meaningful contributions, decreases the barrier to entry, and allows you to understand the type of project and support that you’ll be offered if you contribute to their projects.</p>
<p>When you are involved in a community, you are more likely to be driven by a genuine need to improve the software, which leads to more useful contributions. This mindset shift from self-improvement to community improvement not only benefits the open source project but also helps to create a more collaborative and supportive open source community.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="talk-to-other-open-source-contributors">Talk to Other Open Source Contributors<a href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/#talk-to-other-open-source-contributors" class="hash-link" aria-label="Direct link to Talk to Other Open Source Contributors" title="Direct link to Talk to Other Open Source Contributors">​</a></h3>
<p>Connecting with other contributors can be an important step in becoming an informed and effective community member. When you engage with them in their communities, follow them on social media, or interact with their content (reading and commenting on their blog posts, watching or commenting on their videos, listening to their podcasts, etc.), you can gain valuable insights into the open source ecosystem and the specific needs of the project. Understanding the pain points and how contributors discuss and address the issues helps you to avoid adding more work for the maintainers and instead becoming a positive force in the project.</p>
<p>Being well-informed about the community dynamics and project challenges means that your contributions are more likely to be meaningful and well-received. It also means you'll be better equipped to offer solutions that align with the project's goals and the community's expectations.</p>
<p>Additionally, tools like <a href="https://oss.fyi/use-star-search" target="_blank" rel="noopener noreferrer">StarSearch</a> can help you identify key contributors to projects you're interested in. By finding those with overlapping experience or expertise, you can connect with the right people and build <em>meaningful</em> relationships.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="look-for-project-tags-and-labels">Look for Project Tags and Labels<a href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/#look-for-project-tags-and-labels" class="hash-link" aria-label="Direct link to Look for Project Tags and Labels" title="Direct link to Look for Project Tags and Labels">​</a></h3>
<p>Once you've created your own projects, used and learned about the project you're interested in contributing to, and joined and participated in the community, you can start looking at the issues to see if they're a good fit for your first contribution. Many open source projects use tags and labels like "good first issue" to indicate tasks that are suitable for beginners. These tags make it easier to find issues that match your skill level and provide a clear entry point for contributing.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="write-your-own-issue">Write Your Own Issue<a href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/#write-your-own-issue" class="hash-link" aria-label="Direct link to Write Your Own Issue" title="Direct link to Write Your Own Issue">​</a></h3>
<p>Remember, <a href="https://opensauced.pizza/blog/good-first-issues-dont-exist" target="_blank" rel="noopener noreferrer">good first issues don’t exist</a>; the best issue for you  is probably the one that you write yourself.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="takeaways">Takeaways<a href="https://docs.opensauced.pizza/community-resources/how-to-find-open-source-projects-to-contribute-to/#takeaways" class="hash-link" aria-label="Direct link to Takeaways" title="Direct link to Takeaways">​</a></h2>
<p>Contributing to open source shouldn't be about checking the box of things to do if you're an early career developer. It should be about making a meaningful contribution to a project that improves the project for all users. This will also go a long way towards making valuable and recognized contributions.</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to Assess Your Skill Level Before Contributing to Open Source]]></title>
        <id>https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/</id>
        <link href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/"/>
        <updated>2024-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how to assess your programming skill level before contributing to open source projects. This guide helps you identify your strengths, choose the right tasks, and find your path to learning and growth.]]></summary>
        <content type="html"><![CDATA[<p>Recently, I was in a group that was talking about personal projects and growing your developer skills. <a href="https://app.opensauced.pizza/user/nickytonline" target="_blank" rel="noopener noreferrer">Nick</a> made a good point when he said that you wouldn’t expect to be an expert at the guitar when you picked it up for the first time. It takes time, practice, and understanding. And when we’re giving people advice, it can be hard to tell them where to start or how to find the “perfect issue” - although <a href="https://opensauced.pizza/blog/good-first-issues-dont-exist" target="_blank" rel="noopener noreferrer">good first issues don’t exist</a> - because everyone starts at different levels. For example, a person who’s learning the guitar but also plays the piano will likely have an easier time learning the instrument than someone who has never tried to play an instrument before. This is why understanding your own skill level can be incredibly important to find an open-source project and issue to work on.</p>
<p>Understanding your skill level will help you choose the right tasks, decrease frustration, and guide your open-source journey. In this blog post, we'll explore why assessing your skill level is important and provide a personal inventory to help you evaluate your abilities.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-its-important-to-assess-your-skill-level">Why It's Important to Assess Your Skill Level<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#why-its-important-to-assess-your-skill-level" class="hash-link" aria-label="Direct link to Why It's Important to Assess Your Skill Level" title="Direct link to Why It's Important to Assess Your Skill Level">​</a></h3>
<p>Understanding your strengths and weaknesses allows you to be more efficient, set realistic goals, and find the right open-source project to contribute to. Additionally, accurately identifying your skill level will allow you to match issues to your abilities, creating an experience that leads to confidence and productivity and prevents you from feeling overwhelmed.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="defining-skill-levels">Defining Skill Levels<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#defining-skill-levels" class="hash-link" aria-label="Direct link to Defining Skill Levels" title="Direct link to Defining Skill Levels">​</a></h3>
<p>Before we go into the questions, let’s define different skill levels to help you as we inventory.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="beginner">Beginner<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#beginner" class="hash-link" aria-label="Direct link to Beginner" title="Direct link to Beginner">​</a></h4>
<p>Beginners have a basic understanding of a programming language or technology but don’t have practical experience. You might have used the language in tutorials or simple exercises but haven't implemented it in a real project.</p>
<ul>
<li><strong>Example</strong>: You know the syntax of Python and can write basic scripts, but you haven't built a complete application yet.</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="intermediate">Intermediate<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#intermediate" class="hash-link" aria-label="Direct link to Intermediate" title="Direct link to Intermediate">​</a></h4>
<p>Intermediate developers have practical experience and can work on projects independently. You understand core concepts and have implemented them in real-world scenarios, but you might need guidance for more complex tasks.</p>
<ul>
<li><strong>Example</strong>: You have built web applications using JavaScript and a framework like React, but you still look up advanced features or best practices.</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="advanced">Advanced<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#advanced" class="hash-link" aria-label="Direct link to Advanced" title="Direct link to Advanced">​</a></h4>
<p>Advanced developers have deep expertise and can handle complex tasks with confidence. You have extensive experience, contribute to architectural decisions, and often mentor others.</p>
<ul>
<li><strong>Example</strong>: You have several years of experience with Java, have built and maintained large-scale applications, and are comfortable with advanced topics like concurrency and optimization.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="personal-inventory-general-questions">Personal Inventory: General Questions<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#personal-inventory-general-questions" class="hash-link" aria-label="Direct link to Personal Inventory: General Questions" title="Direct link to Personal Inventory: General Questions">​</a></h3>
<p>Understanding your general experience helps lay the foundation for assessing your skill level. This section focuses on your overall exposure to software development, helping you gauge your position in the broader landscape.</p>
<ol>
<li>What programming languages are you most comfortable with?</li>
<li>How many years of experience do you have with software development?</li>
<li>Have you ever contributed to any open source projects before? If yes, which ones and what types of issues have you contributed to?</li>
<li>How frequently do you code (daily, weekly, monthly)?</li>
<li>What types of projects have you worked on in the past (web development, data science, mobile apps, etc.)?</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="technical-skills">Technical Skills<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#technical-skills" class="hash-link" aria-label="Direct link to Technical Skills" title="Direct link to Technical Skills">​</a></h3>
<p>Evaluating your technical skills provides a clearer picture of your capabilities in specific languages and tools. These questions help you pinpoint your strengths and identify areas for improvement, to help you find tasks that align with your expertise level.</p>
<ol>
<li>How would you rate your proficiency in your most-used languages/technologies (Beginner, Intermediate, Advanced)?</li>
<li>Which development tools and environments are you familiar with (Git, Docker, VS Code, etc.)?</li>
<li>Are you familiar with version control systems like Git? If yes, how proficient are you?</li>
<li>How comfortable are you with debugging and troubleshooting code?</li>
<li>Have you worked with any frameworks or libraries? If yes, which ones (e.g., React, Angular, Django, Flask) and how would you rate yourself (Beginner, Intermediate, Experienced)?</li>
<li>Are you familiar with the process of contributing to open source projects (reading contributing guidelines, taking issues, branching, writing meaningful commit messages)?</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="core-skills-and-collaboration">Core Skills and Collaboration<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#core-skills-and-collaboration" class="hash-link" aria-label="Direct link to Core Skills and Collaboration" title="Direct link to Core Skills and Collaboration">​</a></h3>
<p>Because so much of open-source work is asynchronous, good core skills are important for effective collaboration and communication within open-source communities. The questions below assess your ability to work with others, understand code written by different developers, and contribute positively to the team.</p>
<ol>
<li>How comfortable are you with reading and understanding other people's code?</li>
<li>Have you ever participated in code reviews? If yes, how often?</li>
<li>How do you typically approach problem-solving in your projects?</li>
<li>How comfortable are you with writing documentation for your code?</li>
<li>Have you ever mentored or taught others in programming or related subjects?</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="project-management-and-organization">Project Management and Organization<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#project-management-and-organization" class="hash-link" aria-label="Direct link to Project Management and Organization" title="Direct link to Project Management and Organization">​</a></h3>
<p>Effective project management skills help you stay organized and productive. Understanding how to prioritize tasks, manage time, and use project management tools (like GitHub projects) is helpful when contributing to open source projects, especially because of multiple contributors.</p>
<ol>
<li>Have you ever managed or led a software project? If yes, what was your role?</li>
<li>How do you prioritize tasks and manage your time when working on projects?</li>
<li>Are you familiar with any project management tools? If yes, which ones?</li>
<li>How do you track and stay updated with the latest developments in tech?</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="learning-and-development">Learning and Development<a href="https://docs.opensauced.pizza/community-resources/how-to-assess-your-skill-level-before-contributing-to-open-source/#learning-and-development" class="hash-link" aria-label="Direct link to Learning and Development" title="Direct link to Learning and Development">​</a></h3>
<p>Continuous learning is an important part of being in tech because it allows you to stay relevant and improve your skills. These questions should help you reflect on your learning habits and identify opportunities for growth.</p>
<ol>
<li>How do you usually learn new programming languages or technologies (online courses, books, tutorials)?</li>
<li>Have you ever completed any online courses? If yes, which ones?</li>
<li>How comfortable are you with learning new technologies and adapting to changes?</li>
<li>What are your current learning goals or areas you want to improve in?</li>
<li>Where do you first turn when you want to learn something new (documentation, looking at other projects, etc.)?</li>
</ol>
<p>Now that you’ve taken the inventory, you can more strategically approach open source contributions. Here’s how you can use this self-assessment to shape your approach practically:</p>
<ul>
<li><strong>Set Realistic Goals</strong>: Based on your skill level, set achievable goals. If you’re a beginner, start with smaller tasks labeled “good first issue.” You also might find that you’re not ready to contribute to open source. That’s ok. Work on the skills you need to make your first contributions. This includes things like reading directions, paying close attention to your work, knowing how to ask questions when you’re stuck, etc. If you’re intermediate or advanced, look for more challenging tasks that help you build your network, solve a problem, or grow your skills.</li>
<li><strong>Choose the Right Projects</strong>: Use your assessment to select projects that align with your interests and expertise. Beginners might start with projects that have clear documentation and active communities - our <a href="https://opensauced.pizza/learn/" target="_blank" rel="noopener noreferrer">Intro to Contributing Course</a> is a good place to start if you’re ready to begin contributing. More experienced contributors can find complex projects that require deeper technical knowledge.</li>
<li><strong>Focus on Learning and Development</strong>: Identify the areas where you need improvement and seek out resources to fill those gaps. This could be online courses, tutorials, or even mentorship within the open-source community. For example, if you’re not familiar with git, you should find resources to help you learn before committing to an open-source issue.</li>
<li><strong>Engage with the Community</strong>: Understanding your collaboration skills can help you better engage with the open-source community. Participate in discussions, attend community events, and contribute to code reviews. You’ll be able to improve your skills and build valuable connections.</li>
<li><strong>Improve Project Management Skills</strong>: Use project management tools to organize your contributions effectively. Prioritize your tasks, set deadlines, and track your progress. This will help you manage your time better and contribute more efficiently.</li>
<li><strong>Seek Feedback and Iterate</strong>: Use your self-assessment as you seek feedback from project maintainers and other contributors so you can continuously improve and adapt your approach to contributions.</li>
</ul>
<p>These practical steps can help you to leverage your self-assessment to make meaningful contributions to open-source projects and to create a positive impact on the open-source community. Happy contributing!</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Creating Open Source Connections]]></title>
        <id>https://docs.opensauced.pizza/community-resources/creating-open-source-connections/</id>
        <link href="https://docs.opensauced.pizza/community-resources/creating-open-source-connections/"/>
        <updated>2024-05-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Explore how StarSearch revolutionizes open source collaboration by connecting projects with top talent using AI-driven insights into GitHub events and contributor activities.]]></summary>
        <content type="html"><![CDATA[<p>As it stands today, the open source ecosystem can feel disconnected. Theoretically, we know that there are maintainers, contributors, and projects out there that are incredibly talented and innovative, but finding them can feel like searching for stars in a cloudy night sky. Sometimes you need to have that information – and fast – to be able to maintain your own projects.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-challenge-of-open-source-connections">The Challenge of Open Source Connections<a href="https://docs.opensauced.pizza/community-resources/creating-open-source-connections/#the-challenge-of-open-source-connections" class="hash-link" aria-label="Direct link to The Challenge of Open Source Connections" title="Direct link to The Challenge of Open Source Connections">​</a></h2>
<p>Imagine you're at a tech company using cutting-edge technology. You need to upstream some important changes to ensure future compatibility but you find yourself hitting a wall. Who exactly should you reach out to? Who are the key contributors with the right expertise? Traditionally, this process would involve a lot of guesswork and detective work, looking through commit histories or issue discussions. Enter <a href="https://app.opensauced.pizza/star-search" target="_blank" rel="noopener noreferrer">StarSearch</a>, designed to change how we discover and connect with others in the open-source universe. With StarSearch, in just a few clicks, you’re able to identify key contributors skilled in that technology and maintainers who may have the answers you need. StarSearch isn’t just a tool; it’s your entry point into a more intimate, interconnected open-source community.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introducing-starsearch">Introducing StarSearch<a href="https://docs.opensauced.pizza/community-resources/creating-open-source-connections/#introducing-starsearch" class="hash-link" aria-label="Direct link to Introducing StarSearch" title="Direct link to Introducing StarSearch">​</a></h2>
<p>StarSearch leverages advanced analytics and AI, all fueled by real-time data from GitHub Events. StarSearch isn’t just about identifying who committed what; it’s about understanding the dynamics and interactions within the open source community.</p>
<blockquote>
<p><strong>We’re live on <a href="https://www.producthunt.com/products/opensauced" target="_blank" rel="noopener noreferrer">Product Hunt</a>! Join the conversation and share your thoughts.</strong></p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="connecting-with-starsearch">Connecting with StarSearch<a href="https://docs.opensauced.pizza/community-resources/creating-open-source-connections/#connecting-with-starsearch" class="hash-link" aria-label="Direct link to Connecting with StarSearch" title="Direct link to Connecting with StarSearch">​</a></h3>
<p>Here’s how StarSearch addresses some of the common queries and needs within the community:</p>
<ul>
<li>What type of pull requests has <code>{username}</code> worked on?</li>
<li>Who are the best developers that know <code>{technology}</code> and are interested in <code>{technology}</code>?</li>
<li>Who are the most prevalent contributors to the <code>{technology}</code> ecosystem?</li>
<li>Show me the lottery factor for contributors in the <code>{repository}</code> project?</li>
</ul>
<p>These questions can be the starting point for building stronger projects and communities, allowing us to find people with passion and expertise that we may have never connected with before.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="learn-more-about-starsearch">Learn More About StarSearch<a href="https://docs.opensauced.pizza/community-resources/creating-open-source-connections/#learn-more-about-starsearch" class="hash-link" aria-label="Direct link to Learn More About StarSearch" title="Direct link to Learn More About StarSearch">​</a></h2>
<p>You can check out more about our approach and process, as well as the resources:</p>
<ul>
<li><a href="https://www.timescale.com/blog/how-opensauced-is-building-a-copilot-for-git-history-with-pgvector-and-timescale/" target="_blank" rel="noopener noreferrer">Building a Copilot for Git History with pgvector and Timescale</a></li>
<li><a href="https://opensauced.pizza/blog/how-we-saved-thousands-of-dollars-deploying-low-cost-open-source-ai-technologies" target="_blank" rel="noopener noreferrer">How We Saved Thousands with Open Source AI Technologies</a></li>
<li><a href="https://opensauced.pizza/blog/meet-starsearch" target="_blank" rel="noopener noreferrer">Meet StarSearch: Your New Open Source Navigator</a></li>
<li><a href="https://opensauced.pizza/docs/features/star-search/" target="_blank" rel="noopener noreferrer">StarSearch Docs</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="watch-our-what-is-starsearch-video">Watch our "What is StarSearch" Video<a href="https://docs.opensauced.pizza/community-resources/creating-open-source-connections/#watch-our-what-is-starsearch-video" class="hash-link" aria-label="Direct link to Watch our &quot;What is StarSearch&quot; Video" title="Direct link to Watch our &quot;What is StarSearch&quot; Video">​</a></h3>
<p><a href="https://www.youtube.com/watch?v=I3cS-u_gmDE" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/4e056c9d8482c034f03615093788099611ee8757-256x141.png?w=450" alt="what is starsearch" class="img_ev3q"></a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-future-of-starsearch">The Future of StarSearch<a href="https://docs.opensauced.pizza/community-resources/creating-open-source-connections/#the-future-of-starsearch" class="hash-link" aria-label="Direct link to The Future of StarSearch" title="Direct link to The Future of StarSearch">​</a></h2>
<p>StarSearch provides a nuanced view of the open-source landscape. It’s more than a tool; it’s a new way to navigate the open-source ecosystem, bringing clarity, connections, and community to our tooling and making the open source ecosystem feel more like a tightly knit community where everyone knows your name – and your code. And we're just getting started. We have big plans for the future of StarSearch.</p>
<p>If you’re ready to find a new way to connect, <a href="https://app.opensauced.pizza/" target="_blank" rel="noopener noreferrer">sign up for OpenSauced</a> and be among the first to explore the future of open-source collaboration with StarSearch today.</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Pour One Out for create-react-app: What's Next?]]></title>
        <id>https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/</id>
        <link href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/"/>
        <updated>2024-05-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Explore the lifecycle of Facebook's Create React App (CRA) and understand the significance of open-source insights into issues and pull requests.]]></summary>
        <content type="html"><![CDATA[<p>Many open-source projects, like <a href="https://app.opensauced.pizza/s/facebook/create-react-app" target="_blank" rel="noopener noreferrer">Facebook's Create React App (CRA)</a>, experience a familiar arc – a rapid rise followed by a perceived decline. In the last thirty days, CRA hasn’t had any merged pull requests. This begs the question: what happened to CRA?</p>
<p><a href="https://x.com/bdougieYO/status/1790796316773335135" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/8b6ba3109f6a8d048e0ee9ac66a7ea93d2db79ca-590x411.png?w=450" alt="pour one out for CRA" class="img_ev3q"></a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="do-we-need-open-source-insights-into-issues-and-pull-requests">Do we need Open Source Insights into Issues and Pull Requests?<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#do-we-need-open-source-insights-into-issues-and-pull-requests" class="hash-link" aria-label="Direct link to Do we need Open Source Insights into Issues and Pull Requests?" title="Direct link to Do we need Open Source Insights into Issues and Pull Requests?">​</a></h2>
<p>While GitHub provides a wealth of data on issues and PRs (pull requests), a high-level overview can give us a better understanding of what’s happening. Let’s take a closer look at what’s been happening at CRA.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="understanding-issues">Understanding Issues<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#understanding-issues" class="hash-link" aria-label="Direct link to Understanding Issues" title="Direct link to Understanding Issues">​</a></h3>
<p>With a high-level overview of the recent issues, we can get a better idea of how to triage and prioritize. Let’s take CRA, for example.</p>
<p><a href="https://oss.fyi/LVeBSCV" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/89d84b97c63cb39fe8e17dcbf2103473ac0cf4b4-1011x904.png?w=450" alt="PR Table" class="img_ev3q"></a></p>
<p><em>A couple of things stand out:</em></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="variety-and-volume-of-issues">Variety and Volume of Issues<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#variety-and-volume-of-issues" class="hash-link" aria-label="Direct link to Variety and Volume of Issues" title="Direct link to Variety and Volume of Issues">​</a></h4>
<p>The issues within CRA range from security vulnerabilities to user experience complaints. The recent security issues identified (tagged with CVE identifiers) point to a critical need for security updates, with user experience issues like configuration problems that might be solved by improved documentation.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="frequency-of-issues">Frequency of Issues<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#frequency-of-issues" class="hash-link" aria-label="Direct link to Frequency of Issues" title="Direct link to Frequency of Issues">​</a></h4>
<p>A high frequency of new issues can be a double-edged sword—it might show an active and thriving community, or it could indicate problems with user experience and documentation. Likewise, a low frequency of issues could indicate a stable project or a dying project. In the last 30 days, CRA has had a total of 9 open issues and 10 closed issues.</p>
<p><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/9cc14b87769ffe7fd0a294b9df73b6084673d971-430x157.png?w=450" alt="issues" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="community-interaction">Community Interaction<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#community-interaction" class="hash-link" aria-label="Direct link to Community Interaction" title="Direct link to Community Interaction">​</a></h4>
<p>The level of interaction within issue discussions can reveal a lot about the community’s health and the project's transparency. Sure, stars and forks can help us understand the activity level of the project, but they’re not always the most telling.</p>
<p><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/9c946dde5b64f9aa6288d8088e131c3d8ec08eb1-407x138.png?w=450" alt="engagement" class="img_ev3q"></p>
<p>How are contributors interacting with the maintainers, and how are maintainers communicating to them? Sometimes the most revealing issues are the ones asking if a project is still supported, like this one from almost a year ago.</p>
<p><a href="https://app.opensauced.pizza/workspaces/1cb08c8f-1744-4a9a-8078-633fd588a6e0/issues?page=4&amp;limit=50&amp;range=360" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/b1bb4b3d4e091ed582cf51494d8625890369d4b4-980x90.png?w=450" alt="image" class="img_ev3q"></a></p>
<p>Taking a closer look at the variety and volume of issues, how often they pop up, and how everyone's talking things through really tells us what needs immediate attention and what can wait. This overview can help maintainers figure out the best steps forward—whether it’s jumping on a hot issue, scheduling something for a later fix, or just keeping the lines of communication open with the community on the status of your project.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="understanding-pull-requests">Understanding Pull Requests<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#understanding-pull-requests" class="hash-link" aria-label="Direct link to Understanding Pull Requests" title="Direct link to Understanding Pull Requests">​</a></h3>
<p>Issues don’t tell the whole story though. PRs help us to understand the vision of the project, the maintainers priorities, and the time that’s being put into the project.</p>
<p><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/b4d2637cc2d2c23f0e08e0efd33bc98db225d6e1-999x754.png?w=450" alt="PR Table" class="img_ev3q"></p>
<p>Here are some of the things we learn about CRA:</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="look-at-the-state">Look at the State<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#look-at-the-state" class="hash-link" aria-label="Direct link to Look at the State" title="Direct link to Look at the State">​</a></h4>
<p>Over the last year, there have been 113 opened PRs and 2 merged.  In fact, to find when the last PR was merged, we have to go back to almost a year ago, with all other PRs "Open" or "Closed" (without merge).</p>
<p><a href="https://app.opensauced.pizza/workspaces/1cb08c8f-1744-4a9a-8078-633fd588a6e0?range=360" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/87956af014ca226d593eaddf5dd72ee6b86507d2-310x105.png?w=450" alt="PRs" class="img_ev3q"></a></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="size-and-scope">Size and Scope<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#size-and-scope" class="hash-link" aria-label="Direct link to Size and Scope" title="Direct link to Size and Scope">​</a></h4>
<p>Pay attention to the number of changed files and the number of lines added/deleted. In healthy open-source projects, large PRs likely introduce new features or substantial changes, while smaller PRs might be bug fixes or documentation updates. Ideally, you’ll have a mix of sizes and give you a sense of the project's priorities and development lifecycle. Recently, with CRA, we see mostly very small fixes with under ten changes. In other words, there’s low activity on the repository when looking at PRs.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="freshness">Freshness<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#freshness" class="hash-link" aria-label="Direct link to Freshness" title="Direct link to Freshness">​</a></h4>
<p>Another indicator of project health is how recently PRs were updated, created or closed. For a hugely popular project like CRA ( 102k stars, 26.6k forks, 1.9k watching), we’d expect a lot of activity, but, instead, we’re seeing little to no changes, even with simple fixes like updating a broken link.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="leveraging-open-source-insights-for-strategic-decisions">Leveraging Open Source Insights for Strategic Decisions<a href="https://docs.opensauced.pizza/community-resources/pour-one-out-for-create-react-app-whats-next/#leveraging-open-source-insights-for-strategic-decisions" class="hash-link" aria-label="Direct link to Leveraging Open Source Insights for Strategic Decisions" title="Direct link to Leveraging Open Source Insights for Strategic Decisions">​</a></h3>
<p>The real power in these insights is that it allows us to be more strategic about our decisions, ultimately increasing our productivity, allowing us to:</p>
<ul>
<li>Allocate resources more efficiently, prioritizing high-impact tasks.</li>
<li>Enhance the community’s involvement by addressing the most pressing concerns promptly.</li>
<li>Predict potential bottlenecks and prepare solutions in advance.</li>
</ul>
<p>We've explored how PRs and Issues can unlock a deeper understanding of Create React App. But maybe the real question is: Can this approach be applied to predict future trends in the React ecosystem itself? Think about it. By analyzing the types of feature requests and bug fixes, can we get a glimpse into the challenges and pain points that developers are facing? Can we use what we see in our own projects and compare that to the ecosystem to get a better understanding of how we can succeed? There's no answer yet, but the future is there.</p>
<p><a href="https://app.opensauced.pizza/workspaces/1cb08c8f-1744-4a9a-8078-633fd588a6e0?range=180" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://cdn.sanity.io/images/r7m53vrk/production/0c323088fe3663d37e01c3a6ec06bf6d7c0f2589-1002x468.png?w=450" alt="CRA - 6 months" class="img_ev3q"></a></p>
<p>I think it’s safe to say we can pour one out for Create React App, but what’s next, then?</p>
<p>Like most things in tech, I think the answer is <em>it depends</em>. The closest replacement might be using Vite with a React Template, but there are more options to consider <a href="https://oss.fyi/CRA-Alts" target="_blank" rel="noopener noreferrer">on this list</a>. None are an exact replacement for CRA, but they are options that can get you up and running for simple single page apps to more complex full-stack projects.</p>
<p>What would you add to this list? Laravel, maybe 😉</p>
<p>If you are interested in better metrics for measuring open-source success, consider creating <a href="http://app.opensauced.pizza/start" target="_blank" rel="noopener noreferrer">a workspace</a> or explore the <a href="https://oss.fyi/LVeBSCV" target="_blank" rel="noopener noreferrer">CRA Workspace</a> I used to write this post.</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Nurturing the Future Maintainers of Open Source]]></title>
        <id>https://docs.opensauced.pizza/community-resources/nurturing-the-future-of-open-source-maintainers/</id>
        <link href="https://docs.opensauced.pizza/community-resources/nurturing-the-future-of-open-source-maintainers/"/>
        <updated>2024-05-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Feeling overwhelmed as a new open-source maintainer? Learn the skills and gain the support you need to succeed with our "Becoming a Maintainer" Course.]]></summary>
        <content type="html"><![CDATA[<p>The world runs on open source, but we know the <a href="https://opensauced.pizza/blog/stop-burning-out-maintainers:-an-empathetic-guide-for-contributors" target="_blank" rel="noopener noreferrer">challenges of burnout</a>, the <a href="https://opensauced.pizza/blog/enhancing-support-for-open-source-maintainers" target="_blank" rel="noopener noreferrer">need for support</a>, and <a href="https://opensauced.pizza/blog/the-lonely-journey-of-open-source-maintainers" target="_blank" rel="noopener noreferrer">loneliness</a>. Despite all those challenges, new open source projects are appearing every day. We need to support new maintainers as they learn to maintain in the fast-paced open source ecosystem experienced maintainers are accustomed to. If we want growth, innovation, and solutions to our problems, we’ll need to have a supportive environment for new maintainers. And this is why we need to educate and support new maintainers.</p>
<blockquote>
<p>If you want to learn more about becoming an open source maintainer, best practices, and tips and tricks for enhanced productivity and community collaboration, check out our new <a href="https://oss.fyi/new-maintainer" target="_blank" rel="noopener noreferrer">“Becoming a Maintainer” Course</a></p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-maintainer-learning-curve">The Maintainer Learning Curve<a href="https://docs.opensauced.pizza/community-resources/nurturing-the-future-of-open-source-maintainers/#the-maintainer-learning-curve" class="hash-link" aria-label="Direct link to The Maintainer Learning Curve" title="Direct link to The Maintainer Learning Curve">​</a></h2>
<p>When I started maintaining my first project, it wasn’t super popular, but I had enough contributors to feel overwhelmed. I didn’t have all the answers, my issues weren’t perfect, and I wasn’t sure what direction the project was going. Don’t get me wrong, it was a great experience and I formed bonds that I couldn’t have otherwise, but I could have been better prepared. I could’ve thought about how I would showcase the roadmap that was in my head. I could have written clearer issues. And I’m sure I could have made things easier on myself as I supported a lot of brand new contributors to a React Native repository.</p>
<p>This isn’t a unique story. There are many new open source projects popping up every day. Some maintainers have prepared for that launch, others are just trying something new, and others suddenly find their personal project gaining interest beyond what they ever imagined. But if you’re not prepared, you can feel overwhelmed by the responsibilities really quickly especially with a lack of structure support and without mentorship. The good news is that it’s ok, and you can still succeed. Take <a href="https://app.opensauced.pizza/user/liyasthomas" target="_blank" rel="noopener noreferrer">Liyas Thomas</a>, the founder of <a href="https://app.opensauced.pizza/s/hoppscotch/hoppscotch" target="_blank" rel="noopener noreferrer">Hoppscotch</a> who started the project as a way to solve a problem he was facing and to enhance his resume. Not only is his project still going, but he’s now the CEO of that passion project.</p>
<p>We don’t want you to feel alone. We want you to have a success story too and to make sure new maintainers feel supported and understand the nuances of being a maintainer. This is why we created our <a href="https://oss.fyi/new-maintainer" target="_blank" rel="noopener noreferrer">“Becoming a Maintainer” Course</a> and have Category in our <a href="https://github.com/orgs/open-sauced/discussions/1" target="_blank" rel="noopener noreferrer">Community</a> for folks who have taken our courses. We want you to be supported and to be able to network with contributors. We want to make sure if you have questions, we can find you answers.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="growing-as-a-new-maintainer">Growing as a New Maintainer<a href="https://docs.opensauced.pizza/community-resources/nurturing-the-future-of-open-source-maintainers/#growing-as-a-new-maintainer" class="hash-link" aria-label="Direct link to Growing as a New Maintainer" title="Direct link to Growing as a New Maintainer">​</a></h2>
<p>It can feel like a big leap from contributor to maintainer, but it doesn’t have to be. One of the top challenges is realizing that as a maintainer, your role is utility player: you’re often writing code, creating issues, managing projects, engaging with your growing community, and leading a whole project. In essence, you’re nurturing a project, ensuring the code and quality, supporting the community, and providing direction.</p>
<p>There’s a difference between becoming a maintainer for an existing project, and becoming a maintainer for a new project. You’re more likely to have support, mentorship, and some sort of strategy or map if you’re coming into an existing project. But when you’re coming into or starting a new project, you’re developing your own map, finding the tools that you’ll need for the journey, and navigating through unknown terrain. But you don’t have to be on that journey alone.</p>
<p>Utilize the resources available to you, reach out to other maintainers, and find seasoned contributors who are willing to provide you with feedback. You’re never alone in the open source ecosystem. Understanding what it takes to manage the technical and social aspects of open source projects can help you be more successful. Learning the tools and tricks whether from resources or other maintainers can decrease the barrier to entry, help you to create a stable project, and help you to create momentum.</p>
<p>By cultivating your own community and having a growth mindset when it comes to your project will help you to avoid loneliness that can come with maintaining a project. It will also help you to have a good understanding of how to support your potentially growing community. You’ll learn how to establish clear paths of communication and to create a welcoming environment. You’ll learn how to interact with and support external contributors. You’ll learn how to cultivate a community that maintains high standards of code quality and documentation. What I’m trying to say is, you’ll learn a lot through this experience. You might even find your project growing. And when that happens, you’ll learn new things too.</p>
<p>You’ll learn how to identify potential contributors and team members who can help to drive your project forward within the goals and community needs you've set. You’ll understand how to identify potential contributors who bring value to the project, mentor them as collaborations, and you may even find that they become maintainers themselves.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-power-of-positivity-and-maybe-a-cat-video-break">The Power of Positivity (and Maybe a Cat Video Break)<a href="https://docs.opensauced.pizza/community-resources/nurturing-the-future-of-open-source-maintainers/#the-power-of-positivity-and-maybe-a-cat-video-break" class="hash-link" aria-label="Direct link to The Power of Positivity (and Maybe a Cat Video Break)" title="Direct link to The Power of Positivity (and Maybe a Cat Video Break)">​</a></h3>
<p>Maintaining a project can also require a healthy dose of optimism and resilience. There will be days that test your patience, but remember, with each roadblock you overcome, you're making the project stronger and more reliable. And hey, when things get tough, don't underestimate the power of a well-timed cat video break.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="becoming-a-thought-leader-share-your-wisdom">Becoming a Thought Leader: Share Your Wisdom<a href="https://docs.opensauced.pizza/community-resources/nurturing-the-future-of-open-source-maintainers/#becoming-a-thought-leader-share-your-wisdom" class="hash-link" aria-label="Direct link to Becoming a Thought Leader: Share Your Wisdom" title="Direct link to Becoming a Thought Leader: Share Your Wisdom">​</a></h3>
<p>As you gain experience and insight into open source maintenance, share your knowledge with others. Write blog posts, create tutorials, or answer questions on forums. Not only will you be helping others, but you'll also be solidifying your own understanding and enhancing your credibility in open source.</p>
<p>Becoming a maintainer is a challenging but incredibly rewarding journey. Embrace the learning, connect with other maintainers, and remember, a positive attitude (and maybe a cat video stash) can go a long way.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ready-to-level-up-your-maintainer-skills">Ready to Level Up Your Maintainer Skills?<a href="https://docs.opensauced.pizza/community-resources/nurturing-the-future-of-open-source-maintainers/#ready-to-level-up-your-maintainer-skills" class="hash-link" aria-label="Direct link to Ready to Level Up Your Maintainer Skills?" title="Direct link to Ready to Level Up Your Maintainer Skills?">​</a></h2>
<p>Are you interested in starting your open source project but want more support? We've got you covered! Check out our comprehensive <a href="https://oss.fyi/new-maintainer" target="_blank" rel="noopener noreferrer">Becoming a Maintainer Course</a>, packed with expert tips, tricks, and best practices to support you on your journey. Plus, once you've completed the course, head over to the maintainer guestbook and add your project so we can amplify the hard work you’ve done and connect you to more of the open source community!</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Maintainer Monday]]></title>
        <id>https://docs.opensauced.pizza/community-resources/maintainer-monday/</id>
        <link href="https://docs.opensauced.pizza/community-resources/maintainer-monday/"/>
        <updated>2024-05-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[It's maintainer month and we're celebrating some of our favorite maintainers!]]></summary>
        <content type="html"><![CDATA[<p>Last week, we kicked off Maintainer Month with <a href="https://opensauced.pizza/blog/enhancing-support-for-open-source-maintainers" target="_blank" rel="noopener noreferrer">Enhancing Support for Open Source Maintainers</a>. Now, we're continuing our love of maintainers with our Maintainer Monday post, shouting out some of our favorite maintainers and their projects.</p>
<p>This week, I'm choosing another two maintainers from the X Spaces I've been doing for OpenSauced. Thank you, Amy Dutton and Nate Wienert for being guests and supporting the open source community.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="amy-dutton"><a href="https://oss.fyi/amydutton" target="_blank" rel="noopener noreferrer">Amy Dutton</a><a href="https://docs.opensauced.pizza/community-resources/maintainer-monday/#amy-dutton" class="hash-link" aria-label="Direct link to amy-dutton" title="Direct link to amy-dutton">​</a></h2>
<p>Amy is a multi-talented Lead Maintainer on the RedwoodJS Core Team. She's kind, knowledgeable, and well-spoken, and a fantastic leader in the community. During our conversation, Amy shared the new <a href="https://redwoodjs.com/blog/rsc-now-in-redwoodjs" target="_blank" rel="noopener noreferrer">RedwoodJS Release that includes React Server Components</a>. She gave her insights on the importance of good developer experience and getting feedback from your users. She also talked about creating demos and projects as part of her work as a way to showcase what you can do with RedwoodJS.</p>
<ul>
<li>You can still listen to the space <a href="https://x.com/saucedopen/status/1772653649551921624?s=46" target="_blank" rel="noopener noreferrer">here</a>.</li>
<li>You can learn more about Redwood, <a href="https://oss.fyi/zMzSyFm" target="_blank" rel="noopener noreferrer">here</a>.</li>
</ul>
<p><a href="https://oss.fyi/zMzSyFm" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rnsaajx3mtavdekhpqj2.png" alt="Redwood stars, forks, PRs, and issues over 30 days" class="img_ev3q"></a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="nate-wienert"><a href="https://oss.fyi/natew" target="_blank" rel="noopener noreferrer">Nate Wienert</a><a href="https://docs.opensauced.pizza/community-resources/maintainer-monday/#nate-wienert" class="hash-link" aria-label="Direct link to nate-wienert" title="Direct link to nate-wienert">​</a></h2>
<p>Nate is the creative force behind Tamagui, a fun and innovative UI kit. He combines his technical skills with a playful approach to design, making Tamagui a delightful experience for users and developers alike. In our chat, Nate discussed the challenges and joys of building and maintaining Tamagui, including finding sponsors for his project. He shared the importance of building something useful, being consistent, and the sharing the interesting things you learn along the way.</p>
<ul>
<li>You can still listen to the space <a href="https://twitter.com/i/spaces/1ynJOyvNNykKR" target="_blank" rel="noopener noreferrer">here</a>.</li>
<li>You can learn more about Tamagui <a href="https://app.opensauced.pizza/s/tamagui/tamagui" target="_blank" rel="noopener noreferrer">here</a></li>
<li>You can check out the site for Tamagui <a href="https://tamagui.dev/" target="_blank" rel="noopener noreferrer">here</a>.</li>
</ul>
<p><a href="https://app.opensauced.pizza/s/tamagui/tamagui?range=90" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/805hdb0hi1xoz149ecxm.png" alt="Tamagui stars, forks, PRs, and issues over 30 days" class="img_ev3q"></a></p>
<p>Thank you Amy and Nate for your support of the open source community!</p>
<p><strong>Let us know who your favorite maintainers are so we can feature them this month!</strong></p>
<p>We have some big events coming up next week with OpenSauced, including a Product Hunt Launch for <a href="https://oss.fyi/starsearch-waitlist" target="_blank" rel="noopener noreferrer">StarSearch</a>. Stay tuned for an exciting Maintainer month!</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Streamline Your Contributions: Mastering Issue Forms and PR Templates]]></title>
        <id>https://docs.opensauced.pizza/community-resources/mastering-issue-forms-and-pr-templates/</id>
        <link href="https://docs.opensauced.pizza/community-resources/mastering-issue-forms-and-pr-templates/"/>
        <updated>2024-05-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn about how to fill issue forms and pull request templates.]]></summary>
        <content type="html"><![CDATA[<p>As an open source maintainer, one of my daily tasks is reminding contributors to complete their pull request (PR) templates or asking them to provide missing information on their issues. Although the <a href="https://docs.github.com/en/get-started/writing-on-github/working-with-saved-replies/about-saved-replies" target="_blank" rel="noopener noreferrer">saved replies</a> feature on GitHub helps me a lot, it still takes me time to personalize replies based on the case. This is a challenge not only for me but also for most maintainers.</p>
<p>It is very important to take the time to fill out these forms and templates completely and accurately. This not only&nbsp;makes the process smoother and faster for everyone involved&nbsp;but also&nbsp;ensures that your contribution is given the attention and consideration it deserves, benefiting both you as a contributor and us as maintainers.</p>
<p>So, in this blog post, I will explain why completing them is crucial and how you can do it effectively.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-issue-forms-and-pr-templates-and-why-are-they-important">What are Issue Forms and PR Templates, and Why are They Important?<a href="https://docs.opensauced.pizza/community-resources/mastering-issue-forms-and-pr-templates/#what-are-issue-forms-and-pr-templates-and-why-are-they-important" class="hash-link" aria-label="Direct link to What are Issue Forms and PR Templates, and Why are They Important?" title="Direct link to What are Issue Forms and PR Templates, and Why are They Important?">​</a></h2>
<p>Issue forms and PR templates are&nbsp;structured questions or guidelines you encounter when creating a new issue or PR in a repository. They serve as a roadmap, guiding you through filling in information and ensuring all details reviewers need are provided.</p>
<p>These forms and templates are essential for several reasons:</p>
<ol>
<li><strong>Clear Communication:</strong> They ensure you provide all the necessary information for reviewers to understand your changes.&nbsp;This&nbsp;reduces back-and-forth communication and prevents misunderstandings.</li>
<li><strong>Efficient Review Process:</strong> By providing structured information, maintainers can more easily review the contribution and provide feedback.&nbsp;This&nbsp;speeds up the review process, benefiting both contributors and the project.</li>
<li><strong>Consistency:</strong> Using the same forms and templates for all contributions creates consistency across issues and PRs.&nbsp;This&nbsp;makes&nbsp;searching, sorting, and managing contributions easier, ensuring no missing information.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="filling-in-the-forms-and-templates">Filling In the Forms and Templates<a href="https://docs.opensauced.pizza/community-resources/mastering-issue-forms-and-pr-templates/#filling-in-the-forms-and-templates" class="hash-link" aria-label="Direct link to Filling In the Forms and Templates" title="Direct link to Filling In the Forms and Templates">​</a></h2>
<p>When filling in these forms and templates, you should keep these in mind:</p>
<ul>
<li>
<p><strong>Follow the Instructions:</strong> Read them carefully, pay attention to the instructions, and fill in all sections that don't say "optional" or "for the staff or core members to fill." If there are specific instructions,&nbsp;make sure to&nbsp;follow them.</p>
</li>
<li>
<p><strong>Be as Detailed as Possible:</strong> Provide a short and clear title and detailed description of your changes or proposal. Include specific examples and steps to reproduce issues or explain the reasons behind your PR.</p>
</li>
<li>
<p><strong>Don't Delete Anything:</strong>&nbsp;Even if&nbsp;you think a section doesn't apply to your contribution, don't delete it. Instead, leave a comment explaining why it's not relevant or provide a brief "N/A" response.&nbsp;If you're unsure what to fill in, you can look at previous issues and PRs. See how other contributors have done that.</p>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="filling-in-issue-forms">Filling In Issue Forms<a href="https://docs.opensauced.pizza/community-resources/mastering-issue-forms-and-pr-templates/#filling-in-issue-forms" class="hash-link" aria-label="Direct link to Filling In Issue Forms" title="Direct link to Filling In Issue Forms">​</a></h3>
<p>Various issue forms can be provided in a project for different purposes, such as bug reports and feature requests. Issue forms are easier to navigate and fill out. Instructions in these forms are usually written right below the input label, as shown in the red boxes below, or as a placeholder.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ob4ibqvbr1w5mjigxrrc.png" alt="Issue form on GitHub" class="img_ev3q"></p>
<p>Fill in all input with as detailed information as possible. If you, for example, request a new feature, convince the maintainers why they want to add this feature to the project in the description. If you're reporting a bug, describe the bug in detail, such as what you encountered, the expected behavior, and steps to reproduce the bug. Provide visual aids such as screenshots or screen recordings if the bug is a UI-related problem.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="filling-in-pr-templates">Filling In PR Templates<a href="https://docs.opensauced.pizza/community-resources/mastering-issue-forms-and-pr-templates/#filling-in-pr-templates" class="hash-link" aria-label="Direct link to Filling In PR Templates" title="Direct link to Filling In PR Templates">​</a></h3>
<p>PR templates are trickier than issues because they are shown and must be filled out in Markdown.</p>
<p>But I have some tips that I hope can help you when filling in PR templates:</p>
<ul>
<li><strong>Preview mode:</strong> Click the "Preview" tab to see the sections you must fill in before you do so. It will be easier for you to notice them in this mode, but note that you cannot edit in the preview mode.
<img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h4ifvzf7w8gb10hii082.png" alt="Preview mode GitHub issue form" class="img_ev3q"></li>
<li><strong>Headings</strong>: Now that you're back in writing mode, pay attention to the headings with <code>#</code> symbols. You need to provide information right under these headings. <strong>Don't skip any heading</strong>.</li>
<li><strong>Comments</strong>: The instructions on what information you must provide are usually written in the comments under each heading. Read and follow all instructions thoroughly.</li>
</ul>
<p>Here is an example of a PR template in Markdown at OpenSauced:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Description</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!--</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">Please do not leave this blank</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">This PR [adds/removes/fixes/replaces] the [feature/bug/etc].</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">--&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Related Tickets &amp; Documents</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!--</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">Please use this format link issue numbers: Fixes #123</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">https://docs.github.com/en/free-pro-team@latest/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">--&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Mobile &amp; Desktop Screenshots/Recordings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Visual changes require screenshots --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Steps to QA</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!--</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">Please provide some steps for the reviewer to test your change. If you have wrote tests, you can mention that here instead.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"></span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">1. Click a link</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">2. Do this thing</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">3. Validate you see the thing working</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">--&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Tier (staff will fill in)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Tier 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Tier 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Tier 3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] Tier 4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> [optional] What gif best describes this PR or how it makes you feel?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- note: PRs with deleted sections will be marked invalid --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!--</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  For Work In Progress Pull Requests, please use the Draft PR feature,</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  see https://github.blog/2019-02-14-introducing-draft-pull-requests/ for further details.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"></span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  For a timely review/response, please avoid force-pushing additional</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  commits if your PR already received reviews or comments.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"></span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  Before submitting a Pull Request, please ensure you've done the following:</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  - 📖 Read the Open Sauced Contributing Guide: https://github.com/open-sauced/.github/blob/main/CONTRIBUTING.md.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  - 📖 Read the Open Sauced Code of Conduct: https://github.com/open-sauced/.github/blob/main/CODE_OF_CONDUCT.md.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  - 👷‍♀️ Create small PRs. In most cases, this will be possible.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  - ✅ Provide tests for your changes.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  - 📝 Use descriptive commit messages.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  - 📗 Update any related documentation and include any relevant screenshots.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">--&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<p>Here is a mini challenge for you. After looking at the PR template above, try to answer the questions below. You can also share your answers in the comments.</p>
<ol>
<li>How many sections are there in the template that you must fill in?</li>
<li>What is the format to link a related issue?</li>
<li>An important note is included in this template. If you don't follow it, your PR might not be accepted. What does this note say?</li>
</ol>
<hr>
<p>Now, let's continue where we left off. When filling in the PR template, you must ensure you provide the following:</p>
<ul>
<li>
<p><strong>Short and clear title</strong>. Your title needs to describe the change that you make. For example, "fix: broken link to the About page".</p>
</li>
<li>
<p><strong>Detailed description</strong>. Explain your changes in as much detail as possible. What did you fix? How did you fix it? Did you add a new function or modify a function? Consider using bullet points if there are several changes and link the resources you use to back up your changes. Here is <a href="https://github.com/open-sauced/app/pull/2534" target="_blank" rel="noopener noreferrer">an example</a>: <br></p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Description</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">This PR fixes the long repos' names that are partially stacked at the back of another name in the search input of the Explore tab.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The changes made here:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Add Tailwind className:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token url" style="color:#36acaa">[</span><span class="token url content code-snippet code keyword" style="color:#00009f">`truncate`</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">https://tailwindcss.com/docs/text-overflow#truncate</span><span class="token url" style="color:#36acaa">)</span><span class="token plain"> to truncate overflowing text.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token url" style="color:#36acaa">[</span><span class="token url content code-snippet code keyword" style="color:#00009f">`tracking-tighter`</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">https://tailwindcss.com/docs/letter-spacing</span><span class="token url" style="color:#36acaa">)</span><span class="token plain"> to reduce letter spacing for better space.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00009f">`inline-block`</span><span class="token plain"> to the </span><span class="token code-snippet code keyword" style="color:#00009f">`&lt;span&gt;`</span><span class="token plain"> .</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Remove Tailwind classNames:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00009f">`overflow-hidden`</span><span class="token plain"> as it's </span><span class="token url" style="color:#36acaa">[</span><span class="token url content" style="color:#36acaa">included in the </span><span class="token url content code-snippet code keyword" style="color:#00009f">`truncate`</span><span class="token url" style="color:#36acaa">](</span><span class="token url" style="color:#36acaa">https://tailwindcss.com/docs/text-overflow</span><span class="token url" style="color:#36acaa">)</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00009f">`break-all`</span><span class="token plain"> as we don't want to add line breaks.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
</ul>
<br>
<ul>
<li>
<p><strong>Related issue(s):</strong> Most open source projects don't receive unsolicited PRs (PRs that are not accompanied by an issue). One reason is to avoid spam PRs that might introduce irrelevant, low-quality, or harmful changes to the project's codebase.</p>
<p>So, when you create a PR, you want to include the number of the related issue. Add a keyword of "Closes", "Fixes", or "Resolves" in front of the issue number, like "Closes #123". <a href="https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue" target="_blank" rel="noopener noreferrer">Linking a pull request to an issue</a> will automatically close the issue once the PR gets merged. You can find the issue number right after the issue's title.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ech5d96dzjnlibowks3c.png" alt="GitHub issue number" class="img_ev3q"></p>
</li>
<li>
<p><strong>Screenshots or screen recordings:</strong> If your changes relate to UI improvement, consider adding screenshots or screen recordings to show the before-and-after changes.</p>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://docs.opensauced.pizza/community-resources/mastering-issue-forms-and-pr-templates/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Taking the time to fill out issue forms and PR templates thoroughly demonstrates respect for the project and its maintainers. It also ensures that your contributions are well-received, efficiently reviewed, and more likely to be merged. Remember, every project is unique, so always refer to the&nbsp;guidelines and templates the maintainers provide.</p>
<p>If you don't know, May is <a href="https://dev.to/opensauced/maintainer-month-enhancing-support-for-open-source-maintainers-36km" target="_blank" rel="noopener noreferrer">Maintainer Month</a>. You can show your love and appreciation to open source maintainers in many ways, including completing those forms.</p>]]></content>
        <author>
            <name>Ayu Adiati</name>
        </author>
        <category label="open source" term="open source"/>
        <category label="issue forms" term="issue forms"/>
        <category label="pull request templates" term="pull request templates"/>
        <category label="issue" term="issue"/>
        <category label="open source issue" term="open source issue"/>
        <category label="pull request" term="pull request"/>
        <category label="open source pull request" term="open source pull request"/>
        <category label="open source for beginners" term="open source for beginners"/>
        <category label="tutorial" term="tutorial"/>
        <category label="open source tutorial" term="open source tutorial"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Maintainer Monday: Community Care]]></title>
        <id>https://docs.opensauced.pizza/community-resources/maintainer-monday-community-care/</id>
        <link href="https://docs.opensauced.pizza/community-resources/maintainer-monday-community-care/"/>
        <updated>2024-05-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[It's maintainer month and we're celebrating some of our favorite maintainers!]]></summary>
        <content type="html"><![CDATA[<p>Last week, we kicked off Maintainer Month with <a href="https://opensauced.pizza/blog/enhancing-support-for-open-source-maintainers" target="_blank" rel="noopener noreferrer">Enhancing Support for Open Source Maintainers</a>. Now, we're continuing our love of maintainers with our Maintainer Monday post, shouting out some of our favorite maintainers and their projects.</p>
<p>This week, I'm choosing two maintainers from the X Spaces I've been doing for OpenSauced. I really learn a lot from my conversations with maintainers, but in both of these conversations I've returned to the wisdom they shared over and over again. Thank you, @danielroe and @bholmesdev for being guests and supporting the open source community.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="daniel-roe"><a href="https://oss.fyi/danielroe" target="_blank" rel="noopener noreferrer">Daniel Roe</a><a href="https://docs.opensauced.pizza/community-resources/maintainer-monday-community-care/#daniel-roe" class="hash-link" aria-label="Direct link to daniel-roe" title="Direct link to daniel-roe">​</a></h2>
<p>Daniel brings his experience as a maintainer to Nuxt.js as leader of the core team. When we chatted, I really appreciated his focus on equipping other people to be able to grow and to support the project in different ways. Another part of the conversation that stood out to me was his desire to empower contributors. As part of that, he even offers time for contributors to book a call with him!</p>
<ul>
<li>You can still listen to the space <a href="https://x.com/saucedopen/status/1724448595158474836?s=46" target="_blank" rel="noopener noreferrer">here</a>.</li>
<li>You can learn more about Nuxt, <a href="https://oss.fyi/Nuxt" target="_blank" rel="noopener noreferrer">here</a></li>
</ul>
<p><a href="https://oss.fyi/Nuxt" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3rmbfy7fbcni0t6kjqc5.png" alt="Nuxt stars, forks, PRs, and issues over 30 days" class="img_ev3q"></a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ben-holmes"><a href="https://oss.fyi/benholmes" target="_blank" rel="noopener noreferrer">Ben Holmes</a><a href="https://docs.opensauced.pizza/community-resources/maintainer-monday-community-care/#ben-holmes" class="hash-link" aria-label="Direct link to ben-holmes" title="Direct link to ben-holmes">​</a></h2>
<p>Ben talked about being a Core maintainer for Astro and how he found that role. He shared a lot about how he sees the community and the importance of leaving a positive impact on the open source ecosystem. He shared his experience of shipping your personal open source projects without waiting for perfection.</p>
<ul>
<li>You can still listen to the space <a href="https://x.com/saucedopen/status/1704140208663355765?s=46" target="_blank" rel="noopener noreferrer">here</a></li>
<li>You can learn more about Astro <a href="https://oss.fyi/astro" target="_blank" rel="noopener noreferrer">here</a></li>
</ul>
<p><a href="https://oss.fyi/astro" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w15hbse3xpoewp999ee7.png" alt="Astro stars, forks, PRs, and issues over 30 days" class="img_ev3q"></a></p>
<p><strong>Let us know who your favorite maintainers are so we can feature them this month!</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="sneak-peek---watching">Sneak Peek - Watching:<a href="https://docs.opensauced.pizza/community-resources/maintainer-monday-community-care/#sneak-peek---watching" class="hash-link" aria-label="Direct link to Sneak Peek - Watching:" title="Direct link to Sneak Peek - Watching:">​</a></h2>
<p>We're about to launch a new feature called StarSearch - your copilot for git history - and you can see what it said about Daniel Roe in  the teaser below or view the full gif <a href="https://www.canva.com/design/DAGEG_vtojg/sHHNjMcKQEqrT4hLlcmWLw/edit?utm_content=DAGEG_vtojg&amp;utm_campaign=designshare&amp;utm_medium=link2&amp;utm_source=sharebutton" target="_blank" rel="noopener noreferrer">here</a>, and if you're interesting in beta testing, you can <a href="https://oss.fyi/starsearch-waitlist" target="_blank" rel="noopener noreferrer">sign up for the waiting list</a> and share with your friends.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v5s98rh5izq7nwbrvbyy.gif" alt="gif of StarSearch reporting on Daniel Roe" class="img_ev3q"></p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[We Made a Copilot Tool for you to Unlock the Power of Git History]]></title>
        <id>https://docs.opensauced.pizza/community-resources/introducing-starsearch-unlock-the-copilot-for-git-history/</id>
        <link href="https://docs.opensauced.pizza/community-resources/introducing-starsearch-unlock-the-copilot-for-git-history/"/>
        <updated>2024-05-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Copilot but for git history]]></summary>
        <content type="html"><![CDATA[<p>At OpenSauced, we are thrilled to announce our latest feature: <strong>StarSearch</strong>. It's not just about the commits; it's about the community, the contributions, and the connections in the open source ecosystem - and you can <a href="https://app.opensauced.pizza/star-search/waitlist" target="_blank" rel="noopener noreferrer">join the waitlist now</a>!</p>
<p><a href="https://app.opensauced.pizza/star-search/waitlist" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9kie77pwx0q4b4rulg1p.png" alt="starsearch" class="img_ev3q"></a></p>
<p><strong>StarSearch</strong> is our AI-powered feature that provides in-depth insights into contributor history and activities, bringing transparency and a new depth of knowledge about open source projects.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-can-you-discover-with-starsearch">What Can You Discover with StarSearch?<a href="https://docs.opensauced.pizza/community-resources/introducing-starsearch-unlock-the-copilot-for-git-history/#what-can-you-discover-with-starsearch" class="hash-link" aria-label="Direct link to What Can You Discover with StarSearch?" title="Direct link to What Can You Discover with StarSearch?">​</a></h2>
<ul>
<li>Contributor Activities: Learn the details of contributions and contributors.</li>
<li>Key Contributors: Identify the key contributors to projects and ecosystems.</li>
<li>Work-Based Connections: Find potential collaborators based on their contributions to specific projects</li>
<li>Hidden Experts: Discover untapped talent in the ecosystem.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="a-solution-to-sourcing-talent">A Solution to Sourcing Talent<a href="https://docs.opensauced.pizza/community-resources/introducing-starsearch-unlock-the-copilot-for-git-history/#a-solution-to-sourcing-talent" class="hash-link" aria-label="Direct link to A Solution to Sourcing Talent" title="Direct link to A Solution to Sourcing Talent">​</a></h3>
<p>Recently, Adam Wathan of Tailwind CSS expressed a challenge: attracting applicants well-versed in a niche combination (Rust and Tailwind) despite offering competitive salaries.</p>
<p>Inspired by this challenge, we asked ourselves, "Wouldn't it be cool if we built something to find this persona?" StarSearch allows you to get answers to your questions even when you don't have the context. The context for this question: most of the developers on the list work on front-end focused teams with an interest in developer performance.
We’re not just another tool; we're here to redefine the meaning of open source.</p>
<p>Let's uncover the stories behind the code together - <a href="https://oss.fyi/starsearch-waitlist" target="_blank" rel="noopener noreferrer">Join the Waitlist Today</a> and share with your friends.</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Building Bridges, Not Walls: The Importance of Documentation in Open Source Projects]]></title>
        <id>https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/</id>
        <link href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/"/>
        <updated>2024-04-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn about the importance of documentation in open source.]]></summary>
        <content type="html"><![CDATA[<p>Have you ever been excited to use open source software or contribute to the codebase only to hit a brick wall of confusion because the instructions are unclear? It's frustrating, right?</p>
<p>But what if there was a way to tear down those walls and build bridges of understanding instead? That's where the <strong>documentation</strong> comes in.</p>
<p>In this post, we will explore why clear and comprehensive documentation is the key to a thriving open source community.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-exactly-is-documentation-docs">What Exactly is Documentation (Docs)?<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#what-exactly-is-documentation-docs" class="hash-link" aria-label="Direct link to What Exactly is Documentation (Docs)?" title="Direct link to What Exactly is Documentation (Docs)?">​</a></h2>
<p>Open source documentation, often shortened to "docs", is essentially written guides that explain everything you need to know about an open-source project. Think of it as a friendly guide that welcomes newcomers and empowers experienced users. It explains how things work, how to get started, and how to contribute to a project.</p>
<p>And good documentation is like a bridge connecting the code and the people who will use it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-three-pillars-of-open-source-documentation">The Three Pillars of Open Source Documentation<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#the-three-pillars-of-open-source-documentation" class="hash-link" aria-label="Direct link to The Three Pillars of Open Source Documentation" title="Direct link to The Three Pillars of Open Source Documentation">​</a></h2>
<p>Open source projects have three main types of documentation, each serving a specific purpose:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-technical-documentation">1. Technical Documentation<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#1-technical-documentation" class="hash-link" aria-label="Direct link to 1. Technical Documentation" title="Direct link to 1. Technical Documentation">​</a></h3>
<p>This is the developers' documentation. It delves into the codebase, explains APIs, and provides instructions for setting up development environments. README and API&nbsp;documentation&nbsp;are examples of technical&nbsp;documentation.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-product-documentation">2. Product Documentation<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#2-product-documentation" class="hash-link" aria-label="Direct link to 2. Product Documentation" title="Direct link to 2. Product Documentation">​</a></h3>
<p>This type of documentation is meant for general users. Think user manuals that guide them through using the project and its features, such as installation guides, tutorials, troubleshooting guides, and FAQs.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-guidelines">3. Guidelines<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#3-guidelines" class="hash-link" aria-label="Direct link to 3. Guidelines" title="Direct link to 3. Guidelines">​</a></h3>
<p>These are the rules and roadmap for new contributors. Common types of guidelines in an open source project are:</p>
<ul>
<li><strong>Contribution Guidelines:</strong> They usually explain how to submit code and bug reports and how to participate in the project, such as the contribution process and communication etiquette.</li>
<li><strong>Style Guides:</strong> They mainly guide contributors in maintaining coding and documentation consistency and quality.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-does-documentation-matter-lets-break-it-down">Why Does Documentation Matter? Let's Break it Down!<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#why-does-documentation-matter-lets-break-it-down" class="hash-link" aria-label="Direct link to Why Does Documentation Matter? Let's Break it Down!" title="Direct link to Why Does Documentation Matter? Let's Break it Down!">​</a></h2>
<p>So, why exactly is good documentation so crucial? It benefits everyone involved in the open source ecosystem:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="for-users">For Users<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#for-users" class="hash-link" aria-label="Direct link to For Users" title="Direct link to For Users">​</a></h3>
<p>Clear documentation empowers users to quickly grasp the project's functionality and unlock its full potential. It reduces frustration by providing solutions to common problems and guiding users through advanced configurations that they can do independently and efficiently. Overall, it can improve user experience and increase the possibility of your software to attract and gain new users.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="for-contributors">For Contributors<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#for-contributors" class="hash-link" aria-label="Direct link to For Contributors" title="Direct link to For Contributors">​</a></h3>
<p>Clear documentation attracts new contributors by streamlining collaboration. Everyone can understand the expectations and contribute effectively. With detailed instructions, code reviews become faster, and PRs merge quickly. And that can make contributors happy! Happy contributors are most likely coming back for more contributions. The more contributors a project has, the faster it grows and innovates.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="for-maintainers">For Maintainers<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#for-maintainers" class="hash-link" aria-label="Direct link to For Maintainers" title="Direct link to For Maintainers">​</a></h3>
<p>Comprehensive documentation makes maintaining the project much smoother. It reduces the number of repetitive questions from users and allows maintainers to focus on improving the project.</p>
<p>Good documentation attracts new users and contributors who are excited to explore a project with a welcoming guide, which leads to a sustainable project that thrives in a vibrant community.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="keys-to-clear-and-accessible-documentation-reaching-a-global-audience">Keys to Clear and Accessible Documentation: Reaching a Global Audience<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#keys-to-clear-and-accessible-documentation-reaching-a-global-audience" class="hash-link" aria-label="Direct link to Keys to Clear and Accessible Documentation: Reaching a Global Audience" title="Direct link to Keys to Clear and Accessible Documentation: Reaching a Global Audience">​</a></h2>
<p>Open source projects are inherently open and global, attracting users and contributors from all corners of the world. To ensure everyone benefits from your documentation, consider these tips:</p>
<ul>
<li>
<p><strong>Simple and Clear Language:</strong> Avoid overly technical jargon and complex sentence structures. You also want to break down complex concepts into bite-sized pieces. Write it like you're explaining things to a friend who's not a developer. Think of people with different language and cultural backgrounds. They should be able to understand the documentation as well.</p>
</li>
<li>
<p><strong>Structure and Organization:</strong> Your documentation needs to be structured logically for better flow and understanding. Remember to make it easy to navigate, for example, by providing a clear table of contents.</p>
</li>
<li>
<p><strong>Visual Aids:</strong> When possible, complement text with screenshots, screen recordings, diagrams, and code examples. Visuals can break down complex concepts and make the documentation more engaging for all readers.</p>
</li>
<li>
<p><strong>Consistency:</strong> A clear and consistent formatting and style throughout the documentation creates a professional and easy-to-navigate experience.</p>
</li>
<li>
<p><strong>Multiple Languages:</strong> If possible, consider translating your documentation into various languages. This opens the door for a broader audience to contribute and benefit from the project.</p>
</li>
<li>
<p><strong>Active Maintenance:</strong> Treat your documentation as a living document. Encourage user feedback and keep it up-to-date with the latest project developments.</p>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-call-to-action-be-a-documentation-champion">The Call to Action: Be a Documentation Champion<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#the-call-to-action-be-a-documentation-champion" class="hash-link" aria-label="Direct link to The Call to Action: Be a Documentation Champion" title="Direct link to The Call to Action: Be a Documentation Champion">​</a></h2>
<p>Whether you're a seasoned developer or just starting your open source journey, you can contribute to making documentation in open source projects accessible and welcoming. Here's what you can do:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="contribute-to-existing-projects">Contribute to Existing Projects<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#contribute-to-existing-projects" class="hash-link" aria-label="Direct link to Contribute to Existing Projects" title="Direct link to Contribute to Existing Projects">​</a></h3>
<p>Many open source projects rely on community members to improve their documentation. Let's start small by contributing to the existing docs of a project you care about.</p>
<p>Look for contribution opportunities, such as creating issues to report typos, missing steps in instructions, or anything else you can find. You can also search for a documentation-related issue that needs help and make a pull request. Another way is to write tutorials on their docs or as a blog post. Or, if you're proficient in other languages, you can help translate their existing content.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="start-documenting-your-projects">Start Documenting Your Projects<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#start-documenting-your-projects" class="hash-link" aria-label="Direct link to Start Documenting Your Projects" title="Direct link to Start Documenting Your Projects">​</a></h3>
<p>If you have a project, start documenting it. You never know if you will make it open source in the future. But even if you don't, you'll have a well-documented project. Who knows, you can help others understand your project and inspire others to document theirs, too!</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="advocate-for-clear-documentation">Advocate for Clear Documentation<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#advocate-for-clear-documentation" class="hash-link" aria-label="Direct link to Advocate for Clear Documentation" title="Direct link to Advocate for Clear Documentation">​</a></h3>
<p>Share your knowledge and help others succeed! To support others in the community, you can create content such as blog posts and tutorial videos about a project, do live streaming, or share valuable resources—like this blog post if you find it informative.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://docs.opensauced.pizza/community-resources/the-importance-of-documentation-in-open-source-projects/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Documentation is the unsung hero that keeps open source projects and its community thriving. Clear and accessible documentation can empower users, attract contributors, and strengthen the foundation for maintainers. By investing in documentation, we build bridges of understanding, opening doors to a world of collaboration and limitless possibilities.</p>
<p>Remember, contributing to open source projects is not always about code. Sometimes, the most powerful tool is a well-written explanation! So, let's unlock the full potential of open source, together, one well-written document at a time!</p>
<hr>
<p><strong>Author note:</strong> I recently gave <a href="https://www.youtube.com/live/pzLXQYZpOPU?si=-0Ra6az6qKxBPn67&amp;t=5368" target="_blank" rel="noopener noreferrer">a lightning talk</a> about the same topic in the Virtual Coffee community. If you prefer a video over a blog post, feel free to check it out!</p>]]></content>
        <author>
            <name>Ayu Adiati</name>
        </author>
        <category label="open source" term="open source"/>
        <category label="documentation" term="documentation"/>
        <category label="open source documentation" term="open source documentation"/>
        <category label="open source for beginners" term="open source for beginners"/>
        <category label="open source contributions" term="open source contributions"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Secret Recipe to Getting Your Pull Requests Reviewed (and Merged) Faster]]></title>
        <id>https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/</id>
        <link href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/"/>
        <updated>2024-04-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tips for open source contributors to get their pull requests reviewed and merged faster.]]></summary>
        <content type="html"><![CDATA[<p>One of the most satisfying moments as an open source project contributor is having your pull request (PR) merged into the <code>main</code> branch. This contribution showcases your skills, passion, and dedication to the project. However, the road to a successful PR can sometimes be bumpy and full of pitfalls.</p>
<p>Have you ever experienced the frustration of your PR being rejected or stuck in a never-ending review process? It can be demotivating and time-consuming, especially when you're eager to see your changes integrated into the project.</p>
<p>I want to share my perspective as a maintainer so you understand what it looks like from this side. Rejecting pull requests, especially because of things that can be prevented, has always been heartbreaking. Communicating back and forth with contributors because information is missing in PR forms or because they need to follow the existing guidelines can be frustrating. As a maintainer, I lose my time and productivity and sometimes find myself on the edge of burnout.</p>
<p>But here is the good news: There are secret recipes for getting your pull requests reviewed and merged faster, which also help maintainers save time and avoid burnout. I'll share them with you in this blog post.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-magic-of-issues-ensure-your-pr-has-a-companion">The Magic of Issues: Ensure Your PR Has a Companion<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#the-magic-of-issues-ensure-your-pr-has-a-companion" class="hash-link" aria-label="Direct link to The Magic of Issues: Ensure Your PR Has a Companion" title="Direct link to The Magic of Issues: Ensure Your PR Has a Companion">​</a></h2>
<p>Here's the golden rule: <strong>Always have an issue accompanying your PR</strong>.</p>
<p>Before working on any changes, ensure your PR is related to an issue or create one if none exists. This step is crucial because it provides context and a clear purpose for your PR. Think of an issue as a compass that guides your PR in the right direction. It ensures that your code changes align with the project's needs and helps reviewers understand the "why" behind your work.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="proposing-a-feature-or-reporting-a-bug">Proposing a Feature or Reporting a Bug<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#proposing-a-feature-or-reporting-a-bug" class="hash-link" aria-label="Direct link to Proposing a Feature or Reporting a Bug" title="Direct link to Proposing a Feature or Reporting a Bug">​</a></h3>
<p>Let's say you have a brilliant idea for a new feature or stumbled upon a bug. The first step is to create an issue. Propose your idea, describe the bug, and seek initial feedback from the project maintainers.</p>
<p>Wait for them to triage your issue before making any changes. They will let you know if it's a go or unnecessary for the project. It's always better to have that confirmation to avoid any potential misunderstandings or wasted effort.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="following-requirements-for-existing-open-issues">Following Requirements for Existing Open Issues<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#following-requirements-for-existing-open-issues" class="hash-link" aria-label="Direct link to Following Requirements for Existing Open Issues" title="Direct link to Following Requirements for Existing Open Issues">​</a></h3>
<p>If you're working on an existing open issue, make sure you follow the requirements and instructions provided in the issue. <strong>Following and sticking to them increases the chances of your PR being accepted and streamlines the review process.</strong></p>
<p>Remember, just because you have an idea for an improvement outside what is required in the issue doesn't mean it's automatically the right solution. The project maintainers have a broader perspective on the project's vision and roadmap. Discussing your ideas first shows respect for their expertise and ensures your PR is well-received.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="unlocking-the-secrets-reading-the-project-documentation">Unlocking the Secrets: Reading the Project Documentation<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#unlocking-the-secrets-reading-the-project-documentation" class="hash-link" aria-label="Direct link to Unlocking the Secrets: Reading the Project Documentation" title="Direct link to Unlocking the Secrets: Reading the Project Documentation">​</a></h2>
<p>It might seem tempting to jump straight into the code, but taking the time to read the project documentation, such as the README and the contributing guidelines, will save you and the reviewers valuable time and avoid headaches in the long run.</p>
<p>One of the reasons I have rejected PRs is that the contributor didn't follow the contributing guidelines or the instructions to run the project, which caused the project rendering or building not to work correctly.</p>
<p>Project documentation is like a treasure map, guiding you through the project's structure, design decisions, and contribution guidelines. It holds the secrets to understanding the project itself and the do's and don'ts of contributing.</p>
<p>Every project is unique, and contributing to open source requires understanding and respecting the project's specific guidelines. Some projects might have strict coding style guidelines, while others may have particular requirements for commit messages or PR descriptions.</p>
<p>So, before you start coding, invest some time in reading the docs. It's an investment that will pay off in the form of smoother PR reviews and a deeper understanding of the project as a whole.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="branching-out-creating-a-new-branch-for-changes">Branching Out: Creating a New Branch for Changes<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#branching-out-creating-a-new-branch-for-changes" class="hash-link" aria-label="Direct link to Branching Out: Creating a New Branch for Changes" title="Direct link to Branching Out: Creating a New Branch for Changes">​</a></h2>
<p>Always create a new branch before making any changes. This may seem like an obvious step, but it's worth emphasizing. Working directly on the default branch (usually the <code>main</code> branch) can lead to chaos and version control nightmares, especially in larger projects with multiple contributors.</p>
<p>Imagine working on a painting. You wouldn't want to experiment with new colors directly on the finished piece, would you? Creating a new branch ensures that your changes are isolated from the main codebase until they are ready for merging. It allows you to experiment, make mistakes, and refine your code without affecting others.</p>
<p>When creating your branch, give it a descriptive name that reflects your changes. For example, "fix-login-bug" or "feat/add-submit-button" clearly communicate the scope of your work.</p>
<p>You must know that PRs with changes made directly on the default branch often get rejected. So, always create a new branch as a safe space to work on your changes. It's a simple yet crucial step towards a smoother PR process.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-peek-into-the-past-learning-from-merged-and-closed-prs">A Peek into the Past: Learning from Merged and Closed PRs<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#a-peek-into-the-past-learning-from-merged-and-closed-prs" class="hash-link" aria-label="Direct link to A Peek into the Past: Learning from Merged and Closed PRs" title="Direct link to A Peek into the Past: Learning from Merged and Closed PRs">​</a></h2>
<p>Take some time to browse through previously merged and closed PRs.</p>
<p>Study the merged PRs. See how other contributors have structured their pull requests, the level of detail they provide, and how they respond to feedback. This can be a great way to understand what reviewers look for and ensure your PR is clear and detailed.</p>
<p>Even more importantly, analyze closed PRs. Look for common reasons for rejection, such as missing information, incomplete tests, code that doesn't align with the project's style or vision, etc. By doing so, you can avoid making the same mistakes in your PR.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="fill-in-the-blanks-complete-the-pr-form-with-detail">Fill in the Blanks: Complete the PR Form with Detail<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#fill-in-the-blanks-complete-the-pr-form-with-detail" class="hash-link" aria-label="Direct link to Fill in the Blanks: Complete the PR Form with Detail" title="Direct link to Fill in the Blanks: Complete the PR Form with Detail">​</a></h2>
<p>Many projects have a PR template. Don't treat these as "just" formalities; don't remove any part of the template just because you think it is unnecessary or would make your PR look clean.</p>
<p>The PR template guides you in giving all the information the maintainers need to review your PR. You must fill it out thoroughly, clearly describing your changes and the problem you're solving.</p>
<p>Typically, here is what to include:</p>
<ul>
<li>
<p><strong>Descriptive Title</strong></p>
<p>Keep it short, informative, and directly related to your changes. For example, "Fix: Broken links on the navbar".</p>
</li>
<li>
<p><strong>Detailed Description</strong></p>
<p>Walk reviewers through your code, highlighting your changes' "what" and "why." Be generous with examples and explanations. Think of it as a user guide for your changes. If your PR contains several changes, as in <a href="https://github.com/open-sauced/intro/pull/138" target="_blank" rel="noopener noreferrer">this example</a>, consider using bullet points or checklists. <strong>Bottom line</strong>: The PR description should give reviewers an immediate understanding of your changes.</p>
</li>
<li>
<p><strong>Testing Steps</strong></p>
<p>Provide clear instructions on how to test your changes. This helps reviewers verify that your contribution works as intended.</p>
</li>
<li>
<p><strong>Visual Aids</strong></p>
<p>Screenshots or screen recordings can be beneficial in illustrating your changes, especially for user interface modifications. Include before-and-after screenshots or a short demo video showcasing the impact of your work.</p>
</li>
<li>
<p><strong>Link to an Issue</strong></p>
<p>Include a reference to the issue your PR addresses, such as "Fixes #123" or "Closes #456". This will help the reviewer know that there is an issue related to your PR. Linking your PR to the related issue will also automatically close the issue once the PR is merged.</p>
</li>
</ul>
<p>You can write the PR form from scratch with the above details if no template is provided.</p>
<p>Submitting an incomplete or carelessly written PR can lead to back-and-forth communication, delays, or even rejection. Take the time to fill out the form thoroughly, addressing each section with care.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stay-active-keep-your-branch-up-to-date">Stay Active: Keep Your Branch Up-to-Date<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#stay-active-keep-your-branch-up-to-date" class="hash-link" aria-label="Direct link to Stay Active: Keep Your Branch Up-to-Date" title="Direct link to Stay Active: Keep Your Branch Up-to-Date">​</a></h2>
<p>The review process can take some time. While waiting for your PR to be reviewed and merged, don't forget to keep your branch up-to-date with the <code>main</code> branch.</p>
<p>Periodically update your branch by pulling in the latest changes from the <code>main</code> branch. This way, you can quickly catch any potential conflicts and resolve them before they become a roadblock to your PR's acceptance.</p>
<p>If you need help resolving merge conflicts, read <a href="https://docs.opensauced.pizza/community-resources/keeping-your-branch-up-to-date-and-handling-merge-conflicts-while-waiting-for-pr-reviews/">this blog post</a> by <a href="https://docs.opensauced.pizza/community-resources/authors/bekah-hw/">Bekah Hawrot Weigel</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="final-words">Final Words<a href="https://docs.opensauced.pizza/community-resources/getting-pull-requests-reviewed-and-merged-faster/#final-words" class="hash-link" aria-label="Direct link to Final Words" title="Direct link to Final Words">​</a></h2>
<p>Getting your pull requests reviewed and merged faster is not just about following a set of recipes; it's also about sharpening your communication skills and seizing networking opportunities.</p>
<p>Clear and concise communication is key to a smooth PR process. By effectively communicating your changes and addressing reviewer feedback, you demonstrate your commitment to the project and make the reviewer's job easier.</p>
<p>Additionally, engaging with the project maintainers and the community provides valuable networking opportunities. It shows your enthusiasm and willingness to collaborate and learn, increasing the chances of your PR being accepted and opening doors for future contributions or even job searching.</p>
<p>So, as you apply these secret recipes, remember that they are about more than technical proficiency. They are also about building relationships and effective communication.</p>]]></content>
        <author>
            <name>Ayu Adiati</name>
        </author>
        <category label="open source" term="open source"/>
        <category label="pull request" term="pull request"/>
        <category label="open source pull request" term="open source pull request"/>
        <category label="open source contributors" term="open source contributors"/>
        <category label="open source for beginners" term="open source for beginners"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Missing Piece: Why Your Project Needs a Maintainer Onboarding Process]]></title>
        <id>https://docs.opensauced.pizza/community-resources/open-source-maintainer-onboarding-process/</id>
        <link href="https://docs.opensauced.pizza/community-resources/open-source-maintainer-onboarding-process/"/>
        <updated>2024-04-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn about the importance of onboarding open source maintainers.]]></summary>
        <content type="html"><![CDATA[<p>In the open source community, we often focus on contributor onboarding. We ensure a clear README, contributing guidelines, and a welcoming community to guide new contributors and help them get started. But what about maintainers?</p>
<p>Maintainers are the backbone of any open source project. They review code, merge pull requests, triage issues, and keep the project moving forward. Just like contributors, maintainers also come and go. They may have other commitments outside the project or experience burnout due to the role's demands.</p>
<p>When I joined a maintainers team, we all started doing what we thought best. However, without a clear standard or guidelines, it quickly became chaotic. We each had our way of doing things, and there was little consistency in handling tasks.</p>
<p>This lack of standardization made it confusing for new maintainers like me. I often felt unsure of the "right" way to do things and had to rely on asking my team for guidance, which wasn't always efficient. It made me wonder, "Why don't we have clear guidelines for maintainers, just like we do for contributors?" From there, these <a href="https://docs.opensauced.pizza/contributing/opensauced-maintainers-guide/community-maintainers-guide/" target="_blank" rel="noopener noreferrer">maintainer guidelines</a> were born.</p>
<p>Based on this experience, I will share with you the importance of having maintainers' guidelines and how to create one in this article.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="from-confusion-to-clarity-why-onboarding-guidelines-matter">From Confusion to Clarity: Why Onboarding Guidelines Matter<a href="https://docs.opensauced.pizza/community-resources/open-source-maintainer-onboarding-process/#from-confusion-to-clarity-why-onboarding-guidelines-matter" class="hash-link" aria-label="Direct link to From Confusion to Clarity: Why Onboarding Guidelines Matter" title="Direct link to From Confusion to Clarity: Why Onboarding Guidelines Matter">​</a></h2>
<p>Maintainer onboarding guidelines are crucial for several reasons.</p>
<ul>
<li><strong>Clear role and responsibilities</strong>: Onboarding guidelines provide a clear understanding of the role and its responsibilities. Each project is unique, and maintainers need to know what is expected of them specifically within that project.</li>
<li><strong>Standardization and Consistency</strong>: Guidelines ensure consistency in handling tasks. Without them, each maintainer may have their own way of doing things, leading to confusion and inefficiency. Standardized processes make it easier for maintainers to collaborate and ensure the project runs smoothly.</li>
<li><strong>Knowledge Transfer</strong>: Onboarding documentation serves as a valuable resource for future maintainers. It captures the collective knowledge of the existing team, ensuring a smooth transition even when members move on. This continuity is crucial for the long-term health of the project.</li>
<li><strong>Reduces Burnout</strong>: Clear onboarding processes can help prevent maintainer burnout. They prevent new maintainers from feeling overwhelmed and reduce the need for constant hand-holding from existing members, leading to a more fulfilling and sustainable experience.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="documenting-the-journey-from-pain-points-to-guidelines">Documenting the Journey: From Pain Points to Guidelines<a href="https://docs.opensauced.pizza/community-resources/open-source-maintainer-onboarding-process/#documenting-the-journey-from-pain-points-to-guidelines" class="hash-link" aria-label="Direct link to Documenting the Journey: From Pain Points to Guidelines" title="Direct link to Documenting the Journey: From Pain Points to Guidelines">​</a></h2>
<p>Every project is different, and understanding the challenges in your project will help you create tailored guidelines.</p>
<p>You can start by acknowledging the pain points you've experienced or witnessed within the project. Here are some examples:</p>
<ul>
<li>When should we close a PR?</li>
<li>What method should we use to merge PRs?</li>
<li>If changes in a PR are requested and the contributor has resolved them, can we dismiss the review and merge it without waiting for approval from the person who requested the changes?</li>
<li>How long do we keep stale PRs open before closing them?</li>
<li>What criteria do we use to reject an issue?</li>
<li>May a contributor take multiple issues at the same time? If so, how many?</li>
<li>How do we handle code reviews and merge conflicts?</li>
<li>What are the communication protocols within the team and with contributors? Are there any preferred communication channels, response times, and expectations for tone and language?</li>
</ul>
<p>And the list can go on.</p>
<p>Once you have a list of your pain points, discuss them openly with the team. Ask them questions such as what their current pain points are. What processes are working well, and what needs improvement? Brainstorm solutions collaboratively and translate them into actionable guidelines.</p>
<p>By asking these questions and documenting the answers, you can start drafting clear guidelines that address the specific needs of your project and maintainer team.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="beyond-onboarding-a-graceful-offboarding-process">Beyond Onboarding: A Graceful Offboarding Process<a href="https://docs.opensauced.pizza/community-resources/open-source-maintainer-onboarding-process/#beyond-onboarding-a-graceful-offboarding-process" class="hash-link" aria-label="Direct link to Beyond Onboarding: A Graceful Offboarding Process" title="Direct link to Beyond Onboarding: A Graceful Offboarding Process">​</a></h2>
<p>While onboarding is crucial, it's also important to consider the offboarding process for maintainers. This ensures that the transition is smooth and respectful for all involved when a maintainer needs to move on and leave the team.</p>
<p>You can consider the following when drafting your offboarding process:</p>
<ul>
<li><strong>Circumstances for letting a maintainer go</strong>: Define the criteria for removing a maintainer from the team, such as prolonged inactivity, lack of engagement, or failure to meet the project's code of conduct.</li>
<li><strong>Inactivity notice</strong>: Set a timeframe for inactivity before reaching out to gently remind them of their commitment. If inactivity persists, further action can be taken.</li>
<li><strong>Retirement process</strong>: What happens when a maintainer decides to step down? You might need a procedure for revoking access and ensuring a secure handover of responsibilities.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="collaboration-is-key-building-consensus-with-the-team">Collaboration is Key: Building Consensus with the Team<a href="https://docs.opensauced.pizza/community-resources/open-source-maintainer-onboarding-process/#collaboration-is-key-building-consensus-with-the-team" class="hash-link" aria-label="Direct link to Collaboration is Key: Building Consensus with the Team" title="Direct link to Collaboration is Key: Building Consensus with the Team">​</a></h2>
<p>Once you've drafted the guidelines, it's time to seek final input from the team. Share your work, solicit feedback, and discuss potential revisions.</p>
<p>This collaborative approach provides valuable insights from diverse perspectives and ensures everyone feels invested in the process and is on the same page. Open discussions can further strengthen the guidelines and promote a culture of transparency within the project.</p>
<p>It's important to remember that these guidelines are living documents. They should evolve as the project grows and adapts to changing circumstances. You need to regularly review and update them to ensure they remain relevant and helpful.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="final-words">Final Words<a href="https://docs.opensauced.pizza/community-resources/open-source-maintainer-onboarding-process/#final-words" class="hash-link" aria-label="Direct link to Final Words" title="Direct link to Final Words">​</a></h2>
<p>Investing time crafting clear onboarding documentation for maintainers is more than just good practice; it's a strategic move that strengthens your entire project.</p>
<p>By creating a comprehensive onboarding process for maintainers, you are not just welcoming new team members but setting them up for success. New maintainers are welcomed with a clear roadmap, existing maintainers benefit from a standardized workflow, and the project flourishes with a knowledgeable and empowered team.</p>
<p>So, let's give our maintainers the same warm welcome and clear direction that we offer our contributors!</p>]]></content>
        <author>
            <name>Ayu Adiati</name>
        </author>
        <category label="open source" term="open source"/>
        <category label="open source maintainers" term="open source maintainers"/>
        <category label="open source maintainers onboarding" term="open source maintainers onboarding"/>
        <category label="onboarding process" term="onboarding process"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Creating an OG image using React and Netlify Edge Functions]]></title>
        <id>https://docs.opensauced.pizza/community-resources/creating-an-og-image-using-react-and-netlify-edge-functions/</id>
        <link href="https://docs.opensauced.pizza/community-resources/creating-an-og-image-using-react-and-netlify-edge-functions/"/>
        <updated>2024-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Open Graph (OG) images are a must if you're sharing content on the Internet. From sites like...]]></summary>
        <content type="html"><![CDATA[<p><a href="https://ogp.me/" target="_blank" rel="noopener noreferrer">Open Graph</a> (OG) images are a must if you're sharing content on the Internet. From sites like X/Twitter, to Slack or Discord, a great OG image makes your link share pop.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="examples">Examples<a href="https://docs.opensauced.pizza/community-resources/creating-an-og-image-using-react-and-netlify-edge-functions/#examples" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples">​</a></h2>
<p>I recently built out a couple of OG images for Open Sauced for a couple of features we've rolled out over the past couple of months, <a href="https://opensauced.pizza/docs/features/workspaces/" target="_blank" rel="noopener noreferrer">Workspaces</a> and <a href="https://opensauced.pizza/docs/features/repo-pages/" target="_blank" rel="noopener noreferrer">Repository pages</a>. They're great features that I encourage you to check out, and I encourage you to share them on socials so our beautiful OG images pop.</p>
<p>For example, here's an OG image for a <a href="https://app.opensauced.pizza/workspaces/760ea8ea-ebd3-4f9a-91ab-780384e3c102" target="_blank" rel="noopener noreferrer">workspace for jsr</a>. <a href="https://jsr.io/" target="_blank" rel="noopener noreferrer">JSR</a> is the new JavaScript registry from the folks from Deno.</p>
<p><a href="https://app.opensauced.pizza/workspaces/760ea8ea-ebd3-4f9a-91ab-780384e3c102" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9v3aq0eu0lsoxni8b3z.png" alt="OG image for the OpenSauced workspace for jsr" class="img_ev3q"></a></p>
<p>And here's the OG image for a repository page for <a href="https://app.opensauced.pizza/s/huggingface/transformers" target="_blank" rel="noopener noreferrer">huggingface/transformers</a>.</p>
<p><a href="https://app.opensauced.pizza/s/huggingface/transformers" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7wrvyq2qqjwefpeklraf.png" alt="OG image for the huggingface/transformers repository" class="img_ev3q"></a></p>
<p>Looking at the image for the jsr workspace, there is a template for the image, but there are several dynamic portions to the image.</p>
<p>All the sections denoted by green outlined squares are dynamic.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/32npdvf35s50hjl9r9iv.png" alt="OG image for the OpenSauced workspace for jsr with sections outline in green squares denoting dynamic portions of the image" class="img_ev3q"></p>
<p>This dynamic info gets pulled in for the most part from the OpenSauced API.</p>
<p>Other parts are pulled in from the URL, like <code>30</code> for the day range, and the description comes from the query string in the OG image URL.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f059m9we4gkmb8ixx39v.png" alt="browser dev tools view of the metadata section of the head with OG image URLs outlined by green squares" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="react-to-generate-an-image">React to generate an image<a href="https://docs.opensauced.pizza/community-resources/creating-an-og-image-using-react-and-netlify-edge-functions/#react-to-generate-an-image" class="hash-link" aria-label="Direct link to React to generate an image" title="Direct link to React to generate an image">​</a></h2>
<p>So, how do we use React to generate an image?</p>
<p>We're using og_edge from my old co-worker Matt Kane (@ascorbic), but og_edge is a direct port of <a href="https://vercel.com/blog/introducing-vercel-og-image-generation-fast-dynamic-social-card-images" target="_blank" rel="noopener noreferrer">@vercel/og</a> that works on Deno and Netlify Edge Functions which run on Deno.</p>
<a href="https://github.com/ascorbic/og-edge"></a><a href="https://github.com/ascorbic/og-edge" target="_blank" rel="noopener noreferrer">https://github.com/ascorbic/og-edge</a>
<p>Under the hood, og_edge and @vercel/og use the Satori library.</p>
<blockquote>
<p>Satori: Enlightened library to convert HTML and CSS to SVG.</p>
</blockquote>
<a href="https://github.com/vercel/satori"></a><a href="https://github.com/vercel/satori" target="_blank" rel="noopener noreferrer">https://github.com/vercel/satori</a>
<p>The API for the <code>og_edge</code> module is pretty straightforward. It exposes an <code>ImageResponse</code> constructor with the following options and that's it.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">%</span><span class="token plain"> raw </span><span class="token operator" style="color:#393A34">%</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ImageResponse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  element</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ReactElement</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  options</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    width</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1200</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    height</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">630</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    emoji</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'twemoji'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'blobmoji'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'noto'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'openmoji'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fluent'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fluentFlat'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'twemoji'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    fonts</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      data</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ArrayBuffer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      weight</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      style</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'normal'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'italic'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    debug</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">boolean</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Options that will be passed to the HTTP response</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    statusText</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    headers</span><span class="token operator" style="color:#393A34">?</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Record</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">%</span><span class="token plain"> endraw </span><span class="token operator" style="color:#393A34">%</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><em>Code snippet above care of the official <a href="https://github.com/ascorbic/og-edge#api-reference" target="_blank" rel="noopener noreferrer">og_edge API reference</a>.</em></p>
<p>To build out these OG images, we have a background image, some icons, like a star and fork icon, and we also pull in the repository organization or user's avatar. With a bit of vanilla CSS, we can position things just right. We also pull in the <a href="https://fonts.google.com/specimen/Inter" target="_blank" rel="noopener noreferrer">Inter font</a> as that's what we use at OpenSauced.</p>
<p>As far as I know, <code>og_edge</code> does not support Tailwind like <code>@vercel/og</code> does. Not a dealbreaker at all, but just something to be mindful of.</p>
<p>One other thing we do is set cache headers as these are dynamic images where the data changes over time. Having said that, some social networks cache OG images very aggressively.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">%</span><span class="token plain"> raw </span><span class="token operator" style="color:#393A34">%</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// cache for 2 hours</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">"cache-control"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"public, s-maxage=7200"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-property property" style="color:#36acaa">"content-type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"image/png"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">%</span><span class="token plain"> endraw </span><span class="token operator" style="color:#393A34">%</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="show-me-the-code">Show me the code<a href="https://docs.opensauced.pizza/community-resources/creating-an-og-image-using-react-and-netlify-edge-functions/#show-me-the-code" class="hash-link" aria-label="Direct link to Show me the code" title="Direct link to Show me the code">​</a></h2>
<p>Here's the pull requests for the initial work on these two OG images.</p>
<a href="https://github.com/open-sauced/app/pull/2939"></a><a href="https://github.com/open-sauced/app/pull/2939" target="_blank" rel="noopener noreferrer">https://github.com/open-sauced/app/pull/2939</a>
<a href="https://github.com/open-sauced/app/pull/3117"></a><a href="https://github.com/open-sauced/app/pull/3117" target="_blank" rel="noopener noreferrer">https://github.com/open-sauced/app/pull/3117</a>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="wrapping-up">Wrapping up<a href="https://docs.opensauced.pizza/community-resources/creating-an-og-image-using-react-and-netlify-edge-functions/#wrapping-up" class="hash-link" aria-label="Direct link to Wrapping up" title="Direct link to Wrapping up">​</a></h2>
<p>Beautiful and dynamic OG images are a must if you're looking to stand out when sharing links on socials, and <code>og_edge</code> and <code>@vercel/og</code> are great options if you also want to leverage your existing React skill set.</p>
<p>Now go out and build your own OG images! 🖼️</p>
<p>Stay saucy peeps!</p>
<p>If you would like to know more about my work in open source, <a href="https://oss.fyi/nickytonline" target="_blank" rel="noopener noreferrer">follow me on OpenSauced</a>.</p>]]></content>
        <author>
            <name>Nick Taylor</name>
            <email>nick@opensauced.pizza</email>
        </author>
        <category label="netlify" term="netlify"/>
        <category label="typescript" term="typescript"/>
        <category label="react" term="react"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Meet the New AI Engineers]]></title>
        <id>https://docs.opensauced.pizza/community-resources/is-the-future-of-coding-in-ais-hands-discovering-devin-devika-and-opendevin/</id>
        <link href="https://docs.opensauced.pizza/community-resources/is-the-future-of-coding-in-ais-hands-discovering-devin-devika-and-opendevin/"/>
        <updated>2024-04-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Is the Future of Coding in AI's Hands?  With projects like Devika & OpenDevin,  new open source projects are popping up to (maybe) answer that question.  If you want to know more about them and AI software engineers, check out our latest newsletter.]]></summary>
        <content type="html"><![CDATA[<p>Chances are, you've heard of Devin, the AI software engineer that's "going to take your job." No one will argue that AI is changing the way things are happening in tech. But now it's a little different. Now, AI isn't just helping software engineers, it's becoming an engineer - doing things that only humans used to be able to do. So has it already grown beyond a tool? Is it now a partner in the engineering process? We're seeing examples of this with Devin, Devika, and OpenDevin –  all AIs claiming to be really good at software engineering. Here's the big question: can AI actually write secure code all by itself? Is the future of coding in the hands of AI?</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1jl6ryuiuyk02aldm0eb.gif" alt="Terminator gif" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="discover-ai-engineers">Discover AI Engineers<a href="https://docs.opensauced.pizza/community-resources/is-the-future-of-coding-in-ais-hands-discovering-devin-devika-and-opendevin/#discover-ai-engineers" class="hash-link" aria-label="Direct link to Discover AI Engineers" title="Direct link to Discover AI Engineers">​</a></h2>
<p>I first heard about Devin on X from the Cognition Labs announcement.</p>
<p>But browsing the OpenSauced API endpoints for repositories with the most new stars in the last 24 hours <a href="https://oss.fyi/new-stars" target="_blank" rel="noopener noreferrer">https://api.opensauced.pizza/v2/histogram/top/stars/new</a> and for the top forks <a href="https://oss.fyi/top-forks" target="_blank" rel="noopener noreferrer">https://api.opensauced.pizza/v2/histogram/top/forks</a> led me to a couple of open source AI software engineer projects with potential.</p>
<p>Both of these projects have consistent momentum from about the same time, Devika (March 21) and OpenDevin (March 12), which corresponds to Cognition Labs announcement. You can look at my <a href="https://oss.fyi/RxIqVkc?ref=news.opensauced.pizza" target="_blank" rel="noopener noreferrer">Open Source AI Engineers Workspace</a> below to see how quickly these open source projects have grown and found contributors. It's kind of mind blowing how quickly they've progressed.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/773ue368wv3tz8dto275.png" alt="Devika and OpenDevin dashboard" class="img_ev3q"></p>
<p>But how do these AI Engineer projects differ and what are they all about? Let's find out.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="devin-the-change-maker-of-ai-engineering">Devin: The Change-Maker of AI Engineering<a href="https://docs.opensauced.pizza/community-resources/is-the-future-of-coding-in-ais-hands-discovering-devin-devika-and-opendevin/#devin-the-change-maker-of-ai-engineering" class="hash-link" aria-label="Direct link to Devin: The Change-Maker of AI Engineering" title="Direct link to Devin: The Change-Maker of AI Engineering">​</a></h2>
<p>Introduced by Cognition, "an applied AI lab focused on reasoning," Devin isn't just an AI tool. It's a fully autonomous software engineer. How does this differ from things we've seen before? Devin can plan and execute complex software projects, creating a new scenario where AI can take on engineering roles. Devin doesn't just code, it also works on bug fixes, app deployment, and even training AI models. Its performance on SWE-bench, a challenging benchmark for AI in software engineering, exemplifies its revolutionary impact, and its efficiency.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="opendevin-the-collaborative-vision"><a href="https://github.com/OpenDevin/OpenDevin?ref=news.opensauced.pizza" target="_blank" rel="noopener noreferrer">OpenDevin</a>: The Collaborative Vision<a href="https://docs.opensauced.pizza/community-resources/is-the-future-of-coding-in-ais-hands-discovering-devin-devika-and-opendevin/#opendevin-the-collaborative-vision" class="hash-link" aria-label="Direct link to opendevin-the-collaborative-vision" title="Direct link to opendevin-the-collaborative-vision">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zbvsah5iyzn8fflhkbwb.png" alt="OpenDevin Stars/forks chart" class="img_ev3q"></p>
<p>OpenDevin is a replication of Devin, with the goal of sharing the power with the open-source community. Through community contributions and a commitment to open standards, OpenDevin wants to refine and expand the features of AI-assisted software engineering.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="devika-the-open-source-prodigy"><a href="https://github.com/stitionai/devika" target="_blank" rel="noopener noreferrer">Devika</a>: The Open-Source Prodigy<a href="https://docs.opensauced.pizza/community-resources/is-the-future-of-coding-in-ais-hands-discovering-devin-devika-and-opendevin/#devika-the-open-source-prodigy" class="hash-link" aria-label="Direct link to devika-the-open-source-prodigy" title="Direct link to devika-the-open-source-prodigy">​</a></h2>
<p>Devika is an AI Software Engineer that can understand high-level human instructions, break them down into steps, research relevant information, and write code to achieve the given objective. Devika aims to be a competitive open-source alternative to Devin by Cognition AI.
Devika is an Agentic AI Software Engineer that can understand high-level human instructions, break them down into steps, research relevant information, and write code to achieve the given objective.</p>
<p>Inspired by Devin's pioneering work, Devika was created as an open-source project. Started by Mufeed VH from Kerala, Devika aims to democratize AI's capabilities in software engineering. Leveraging Claude 3's power, Devika offers a blend of advanced AI planning and coding in a package that's both open and community-driven. As an open source project, it isn't just about technology, it's an invitation to open source contributors to define innovation in AI.</p>
<blockquote>
<p>“My intention was to simply make Devika as a help that can automate the mundane tasks for engineers, probably like an intern. You can offload a lot of work to her, but she cannot be a replacement for engineers,” Mufeed VH.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="will-ai-replace-software-engineers">Will AI Replace Software Engineers<a href="https://docs.opensauced.pizza/community-resources/is-the-future-of-coding-in-ais-hands-discovering-devin-devika-and-opendevin/#will-ai-replace-software-engineers" class="hash-link" aria-label="Direct link to Will AI Replace Software Engineers" title="Direct link to Will AI Replace Software Engineers">​</a></h2>
<p>Based on the developments of AI software engineers like Devin, Devika, and OpenDevin, we know that AI can indeed write code. These AIs have shown they can plan, execute complex engineering tasks, find and fix bugs, and even handle entire development projects from inception to deployment. But it's not that simple, especially if you have complex existing codebases and you want them to write secure code.</p>
<p>Security in coding isn't just about writing error-free code. It's about understanding the broader context, potential vulnerabilities, and  the latest in security research and best practices. While AI can be trained on security best practices, human oversight is still necessary.</p>
<p>AI's role will continue to be an important tool that can be used across industries - not just limited to tech - to take on repetitive or time-consuming tasks, and sometimes take on complex problems efficiently. Together, we'll see faster development cycles, more efficient problem-solving, and higher-quality software.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="final-thoughts">Final Thoughts<a href="https://docs.opensauced.pizza/community-resources/is-the-future-of-coding-in-ais-hands-discovering-devin-devika-and-opendevin/#final-thoughts" class="hash-link" aria-label="Direct link to Final Thoughts" title="Direct link to Final Thoughts">​</a></h2>
<p>We're not to the point that AI can replace software engineers, but we are at the point that AI is changing the tech landscape and the future. With tech changing more quickly than ever with AI innovation, Devin, Devika, and OpenDevin bring up an interesting question: what is the relationship between humans and AI? And it brings up the question thoughtfully developed by Ethan Mollick in "<a href="https://www.oneusefulthing.org/p/on-the-necessity-of-a-sin" target="_blank" rel="noopener noreferrer">On the Necessity of Sin</a>," should we treat AI like humans? Are we moving towards a future where humans work with AI to push the boundaries of software engineering, or will it eventually supersede human roles? The answer might just depend on our vision for future and whether we adopt an open source approach of transparency, openness, and collaboration.</p>
<p>If you like this post and want more like this, <a href="https://app.dub.co/open-sauced" target="_blank" rel="noopener noreferrer">sign up for our newsletter</a>.</p>]]></content>
        <author>
            <name>Bekah Hawrot Weigel</name>
            <email>Bekah@opensauced.pizza</email>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Form and Function: How I Lost My Submit Button & Got It Back]]></title>
        <id>https://docs.opensauced.pizza/community-resources/form-and-function-how-i-lost-my-submit-button-got-it-back/</id>
        <link href="https://docs.opensauced.pizza/community-resources/form-and-function-how-i-lost-my-submit-button-got-it-back/"/>
        <updated>2024-04-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[As web developers, we know that most of the create, read update, and delete (CRUD) actions we perform...]]></summary>
        <content type="html"><![CDATA[<p>As web developers, we know that most of the create, read, update, and delete (CRUD) actions we perform on the web are typically (hopefully?) done using an <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form" target="_blank" rel="noopener noreferrer">HTML form</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="html-forms">HTML Forms<a href="https://docs.opensauced.pizza/community-resources/form-and-function-how-i-lost-my-submit-button-got-it-back/#html-forms" class="hash-link" aria-label="Direct link to HTML Forms" title="Direct link to HTML Forms">​</a></h2>
<p>HTML Forms are cool because they have plenty of built-in features.</p>
<p>For example, they have native form validation and access to all the inputs in a form, and at some point, because you need to submit the form, there is a mechanism to do that as well. You can use a <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button" target="_blank" rel="noopener noreferrer">button</a>, <code>&lt;button&gt;submit&lt;/button&gt;</code> or an <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/submit" target="_blank" rel="noopener noreferrer">input of type submit</a>, <code>&lt;input type="submit" /&gt;</code>, although the latter isn't used as much these days in new sites, from what I've seen.</p>
<p>Here is a simple form to exhibit this.</p>
<a href="https://codepen.io/nickytonline/pen/JjVOarX"></a><a href="https://codepen.io/nickytonline/pen/JjVOarX" target="_blank" rel="noopener noreferrer">https://codepen.io/nickytonline/pen/JjVOarX</a>
<p>If you fill out the form and click submit, the form will submit and add a paragraph with dark green text client-side that says, "Form submitted".</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rbpoz901yk9s8kewx806.gif" alt="Submitting the simple form" class="img_ev3q"></p>
<p>There are other things in the simple form, like form validation via the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/required" target="_blank" rel="noopener noreferrer">required</a> attribute on inputs, but that's not what we're here to discuss.</p>
<p>What we want to touch on is that the form was able to handle the submit event because it had a submit button associated with it, which was defined in HTML within the form element.</p>
<p><em>Note: you can press enter in fields to submit a form, but again, not what we're here to discuss.</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-i-broke-my-form">How I Broke My Form<a href="https://docs.opensauced.pizza/community-resources/form-and-function-how-i-lost-my-submit-button-got-it-back/#how-i-broke-my-form" class="hash-link" aria-label="Direct link to How I Broke My Form" title="Direct link to How I Broke My Form">​</a></h2>
<p>This brings us to a new feature that I was working on for OpenSauced for a few months, <a href="https://opensauced.pizza/docs/features/workspaces/" target="_blank" rel="noopener noreferrer">workspaces</a>. I encourage you to create your own, but for now, let's get back to the business of forms.</p>
<p>Here's our beautiful workspaces settings page that I implemented.</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bq93z0w7duinhgew6azp.png" alt="an OpenSauced workspace settings page" class="img_ev3q"></p>
<p>Recently, there were styling changes, which is what you see above.</p>
<a href="https://github.com/open-sauced/app/pull/2982"></a><a href="https://github.com/open-sauced/app/pull/2982" target="_blank" rel="noopener noreferrer">https://github.com/open-sauced/app/pull/2982</a>
<p>Everything looked great, and I had tested it.</p>
<p><em>Narrator: he thought he had tested it, and we shipped things to production.</em></p>
<p>Once things went live, I decided to do some smoke tests, which I usually do. I went over to the beautiful workspace settings I had worked on, made some changes in the settings, and then clicked <kbd>Update Workspace</kbd> button. Hmm, no toast message saying the settings were updated. I checked the browser dev tools to see if there were any JavaScript errors. Nothing related to the updates. <em>And then it dawned on me</em>. The submit button was outside the form, and I just broke some key functionality in the app.</p>
<p><img decoding="async" loading="lazy" src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExY2xxdGVubmtuam5rMzM1N2RxNjY4dTJkOTh1cW03NnN4d3FkNDgzayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1luXLMeNxsaNFMUuOe/giphy.gif" alt="Michael Scott telling everybody not to panic." class="img_ev3q"></p>
<p>Side note, but luckily thanks to Netlify's deployment rollback feature, I was able to revert to the previous production deployment within about a minute of the workspace settings page being broken 😅</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-i-fixed-my-form">How I Fixed My Form<a href="https://docs.opensauced.pizza/community-resources/form-and-function-how-i-lost-my-submit-button-got-it-back/#how-i-fixed-my-form" class="hash-link" aria-label="Direct link to How I Fixed My Form" title="Direct link to How I Fixed My Form">​</a></h2>
<p>So how did I fix it? We needed this new styling to fix several other issues related to <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/z-index" target="_blank" rel="noopener noreferrer">z-indexes</a> and layout.</p>
<p>For some context, the OpenSauced application is a Next.js site, so React, but I decided to put on my old school HTML hat and remembered that form elements can be associated to a form via a <code>form</code> attribute. What you need to do is give the form an <code>id</code> attribute, and the form element that you want to associate the form to needs to have a <code>form</code> attribute whose value is the value of the <code>id</code> attribute for the form.</p>
<p>Here's another simple form demonstrating a simplified version of my fix.</p>
<a href="https://codepen.io/nickytonline/pen/XWQzPOX"></a><a href="https://codepen.io/nickytonline/pen/XWQzPOX" target="_blank" rel="noopener noreferrer">https://codepen.io/nickytonline/pen/XWQzPOX</a>
<p>I encourage you to remove the <code>form</code> attribute from the button in the above CodePen to see the issue I caused.</p>
<p>Here's the fix I rolled out to production.</p>
<a href="https://github.com/open-sauced/app/pull/3003"></a><a href="https://github.com/open-sauced/app/pull/3003" target="_blank" rel="noopener noreferrer">https://github.com/open-sauced/app/pull/3003</a>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="wrapping-up">Wrapping Up<a href="https://docs.opensauced.pizza/community-resources/form-and-function-how-i-lost-my-submit-button-got-it-back/#wrapping-up" class="hash-link" aria-label="Direct link to Wrapping Up" title="Direct link to Wrapping Up">​</a></h2>
<p>Learning a framework is great, and I'm a big proponent of just building something, but as you continue on in your career, it's great to start getting some fundamentals into the mix.</p>
<p>Also, this is a perfect example of why <em>using <a href="https://developer.mozilla.org/en-US/curriculum/core/semantic-html/" target="_blank" rel="noopener noreferrer">semantic HTML</a> is important!</em> It definitely helped me get out of jam! 😅</p>
<p>Stay saucy peeps!</p>
<p>If you would like to know more about my work in open source, <a href="https://oss.fyi/nickytonline" target="_blank" rel="noopener noreferrer">follow me on OpenSauced</a>.</p>]]></content>
        <author>
            <name>Nick Taylor</name>
            <email>nick@opensauced.pizza</email>
        </author>
        <category label="html" term="html"/>
        <category label="webdev" term="webdev"/>
        <category label="beginners" term="beginners"/>
    </entry>
</feed>