<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: georgetoloraia</title>
    <description>The latest articles on DEV Community by georgetoloraia (@georgetoloraia).</description>
    <link>https://dev.to/georgetoloraia</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3674428%2F809a80e5-7e14-43ad-b571-ce6694a5cf3e.jpeg</url>
      <title>DEV Community: georgetoloraia</title>
      <link>https://dev.to/georgetoloraia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/georgetoloraia"/>
    <language>en</language>
    <item>
      <title>What I Learned Trying to Write Better GitHub Issues for Open-Source Contributors</title>
      <dc:creator>georgetoloraia</dc:creator>
      <pubDate>Tue, 30 Dec 2025 15:03:27 +0000</pubDate>
      <link>https://dev.to/georgetoloraia/what-i-learned-trying-to-write-better-github-issues-for-open-source-contributors-47d8</link>
      <guid>https://dev.to/georgetoloraia/what-i-learned-trying-to-write-better-github-issues-for-open-source-contributors-47d8</guid>
      <description>&lt;p&gt;Maintaining an open-source project taught me something I didn’t expect:&lt;br&gt;
&lt;strong&gt;&lt;em&gt;writing good GitHub issues is a skill of its own.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Early on, I assumed that if an issue made sense to me, it would make sense to contributors. In practice, that’s rarely true. Contributors see issues with fresh eyes, limited context, and very little patience for ambiguity.&lt;/p&gt;

&lt;p&gt;Recently, I started deliberately improving how I write issues and asking myself a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If I were a contributor seeing this issue for the first time, would I know where to start?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are a few lessons that helped me improve issue clarity and make them more contributor-friendly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Why issue quality matters more than you think&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From a contributor’s perspective, an issue is often evaluated in under a minute.&lt;/p&gt;

&lt;p&gt;They scan for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the problem clearly stated?&lt;/li&gt;
&lt;li&gt;Is the scope reasonable?&lt;/li&gt;
&lt;li&gt;Is it obvious what “done” means?&lt;/li&gt;
&lt;li&gt;Can I tell which part of the codebase this touches?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of those are unclear, many contributors simply move on — even if they like the project.&lt;/p&gt;

&lt;p&gt;From the maintainer side, unclear issues lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;long comment threads clarifying intent&lt;/li&gt;
&lt;li&gt;mismatched expectations&lt;/li&gt;
&lt;li&gt;abandoned PRs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clear issues save time on &lt;strong&gt;&lt;em&gt;both sides&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What I changed in how I write issues&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;1. Separate context from task&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I now structure issues so contributors can quickly find the actionable part.&lt;/p&gt;

&lt;p&gt;A typical flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Problem / Current State&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Why this matters&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;What needs to change&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Acceptance criteria&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This lets readers skim intelligently instead of reading a wall of text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;2. Make “done” explicit&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the biggest improvements was spelling out acceptance criteria.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Clean up the payout pipeline”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I aim for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;legacy paths removed&lt;/li&gt;
&lt;li&gt;one canonical flow remains&lt;/li&gt;
&lt;li&gt;tests updated&lt;/li&gt;
&lt;li&gt;no behavior regression&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributors shouldn’t have to guess when the task is complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;3. Avoid assuming codebase familiarity&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even experienced developers are new to your code.&lt;/p&gt;

&lt;p&gt;Helpful additions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;naming the relevant modules&lt;/li&gt;
&lt;li&gt;mentioning entry points&lt;/li&gt;
&lt;li&gt;pointing to existing commands or tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This lowers the mental cost of starting.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete example
&lt;/h2&gt;

&lt;p&gt;Here’s one issue I wrote after applying these ideas:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/georgetoloraia/selflink-backend/issues/20" rel="noopener noreferrer"&gt;https://github.com/georgetoloraia/selflink-backend/issues/20&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m not sharing this as a request for fixes — just as a real example of how I try to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;describe the current state&lt;/li&gt;
&lt;li&gt;explain the goal&lt;/li&gt;
&lt;li&gt;define acceptance criteria&lt;/li&gt;
&lt;li&gt;reduce ambiguity for contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain OSS projects, you’ve probably seen (or written) issues that could benefit from this kind of structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;I’m still learning how to do this well, but being more intentional about issue writing has already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;made it easier for contributors to engage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain open-source projects, I’d be curious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;What makes a GitHub issue feel actionable to you?&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;And what’s the most common mistake you see maintainers make?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>programming</category>
      <category>help</category>
    </item>
    <item>
      <title>I’m working on an open-source backend built with Django, ASGI (WebSockets), PostgreSQL, and a small containerized setup.</title>
      <dc:creator>georgetoloraia</dc:creator>
      <pubDate>Tue, 23 Dec 2025 04:21:13 +0000</pubDate>
      <link>https://dev.to/georgetoloraia/im-working-on-an-open-source-backend-built-with-django-asgi-websockets-postgresql-and-a-small-23pp</link>
      <guid>https://dev.to/georgetoloraia/im-working-on-an-open-source-backend-built-with-django-asgi-websockets-postgresql-and-a-small-23pp</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Keep HTTP and real-time separate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Django is excellent for HTTP APIs. ASGI is great for WebSockets. Mixing them too early adds unnecessary complexity.&lt;/p&gt;

&lt;p&gt;What worked well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;WSGI (gunicorn) for standard API endpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ASGI (uvicorn) only for real-time features&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clear boundaries between sync and async code&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made debugging and scaling much easier.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don’t rely on runserver&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using Django’s dev server behind proxies or tunnels caused connection resets and unpredictable behavior.&lt;/p&gt;

&lt;p&gt;Switching early to gunicorn + uvicorn stabilized everything. Even for early-stage projects, using production servers early is worth it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Media handling should be isolated&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once users upload files, media quickly becomes an infrastructure concern.&lt;/p&gt;

&lt;p&gt;Separating media into a dedicated service (nginx or object storage) reduced app load and removed an entire class of bugs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add PgBouncer before you “need” it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With API, ASGI, and workers running, PostgreSQL connections grow fast.&lt;/p&gt;

&lt;p&gt;PgBouncer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Prevented connection exhaustion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Made traffic spikes predictable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simplified debugging&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transaction pooling with short-lived connections worked best.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open source needs clarity more than polish&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Clear README, honest tradeoffs, and a few beginner-friendly issues attracted more meaningful contributions than perfect code.&lt;/p&gt;

&lt;p&gt;Final thought: keep the backend boring, isolate complexity, and optimize for contributors early.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>discuss</category>
      <category>api</category>
    </item>
  </channel>
</rss>
