<?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: SemTiOne</title>
    <description>The latest articles on DEV Community by SemTiOne (@semtione_aad5031f15784da5).</description>
    <link>https://dev.to/semtione_aad5031f15784da5</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%2F3743907%2F4d2cbb8c-c491-401b-85cc-66d691f0fc96.png</url>
      <title>DEV Community: SemTiOne</title>
      <link>https://dev.to/semtione_aad5031f15784da5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/semtione_aad5031f15784da5"/>
    <language>en</language>
    <item>
      <title>Heatmap Bot v1.2.0 - Automating Ko-fi Payments with Webhooks</title>
      <dc:creator>SemTiOne</dc:creator>
      <pubDate>Fri, 20 Mar 2026 03:02:32 +0000</pubDate>
      <link>https://dev.to/semtione_aad5031f15784da5/heatmap-bot-v120-automating-ko-fi-payments-with-webhooks-ibh</link>
      <guid>https://dev.to/semtione_aad5031f15784da5/heatmap-bot-v120-automating-ko-fi-payments-with-webhooks-ibh</guid>
      <description>&lt;p&gt;Quick update on Heatmap Bot - just shipped v1.2.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  The main change: automated Ko-fi activation
&lt;/h2&gt;

&lt;p&gt;Previously the payment flow was painful:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer pays on Ko-fi&lt;/li&gt;
&lt;li&gt;I get an email notification&lt;/li&gt;
&lt;li&gt;I manually run /grant in Discord&lt;/li&gt;
&lt;li&gt;Customer waits&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer pays on Ko-fi, includes their Discord Server ID in message&lt;/li&gt;
&lt;li&gt;Ko-fi webhook fires&lt;/li&gt;
&lt;li&gt;Bot parses the Server ID from the message&lt;/li&gt;
&lt;li&gt;Paid tier activates instantly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The activation code system handles edge cases where they forget their Server ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other changes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;/announce command — lets me broadcast updates to subscribed servers&lt;/li&gt;
&lt;li&gt;Feedback reference IDs (#A3F92B1C) for support tracking
&lt;/li&gt;
&lt;li&gt;Brute force protection on /activate — max 5 attempts/hour&lt;/li&gt;
&lt;li&gt;HMAC verification on Ko-fi webhooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full bot: &lt;a href="https://ko-fi.com/semtione" rel="noopener noreferrer"&gt;https://ko-fi.com/semtione&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Invite Link: &lt;a href="https://discord.com/oauth2/authorize?client_id=1482225606761386085&amp;amp;permissions=2147601408&amp;amp;integration_type=0&amp;amp;scope=bot+applications.commands" rel="noopener noreferrer"&gt;https://discord.com/oauth2/authorize?client_id=1482225606761386085&amp;amp;permissions=2147601408&amp;amp;integration_type=0&amp;amp;scope=bot+applications.commands&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>security</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>How I Added Paid Tiers to My Discord Bot Without Stripe or Any Payment API</title>
      <dc:creator>SemTiOne</dc:creator>
      <pubDate>Tue, 17 Mar 2026 07:46:18 +0000</pubDate>
      <link>https://dev.to/semtione_aad5031f15784da5/how-i-added-paid-tiers-to-my-discord-bot-without-stripe-or-any-payment-api-4mf9</link>
      <guid>https://dev.to/semtione_aad5031f15784da5/how-i-added-paid-tiers-to-my-discord-bot-without-stripe-or-any-payment-api-4mf9</guid>
      <description>&lt;p&gt;Most tutorials for monetizing a Discord bot assume you'll integrate Stripe or LemonSqueezy directly into the bot.&lt;/p&gt;

&lt;p&gt;I went a different route, manual grants via Ko-fi. Here's why and how.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The problem with payment APIs in bots&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For a new bot with low volume, integrating a full payment API means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Webhook endpoints to maintain&lt;/li&gt;
&lt;li&gt;Subscription management logic&lt;/li&gt;
&lt;li&gt;Refund handling&lt;/li&gt;
&lt;li&gt;Failed payment handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a lot of complexity for a bot that might have 10 paying customers at launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Ko-fi manual grant approach&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Instead, I set up Ko-fi as the payment page and handle grants manually:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer buys on Ko-fi&lt;/li&gt;
&lt;li&gt;I get a notification&lt;/li&gt;
&lt;li&gt;I run /grant guild_id:123456 days:30 in my admin server&lt;/li&gt;
&lt;li&gt;Bot updates the database and unlocks paid features
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="nd"&gt;@app_commands.command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;grant_paid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guild_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;is_bot_owner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interaction&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="n"&gt;expires_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;upsert_subscription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;guild_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;guild_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                               &lt;span class="n"&gt;tier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expires_at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;expires_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;When to upgrade to automated payments&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once you hit ~20-30 paying customers, the manual process gets tedious. That's when it makes sense to add Ko-fi webhooks (requires Ko-fi Gold) or switch to Stripe.&lt;/p&gt;

&lt;p&gt;For now, manual is fine, and it means I talk to every single customer personally.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The result&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Clean, simple, zero ongoing maintenance cost. Works well for early stage.&lt;/p&gt;

&lt;p&gt;Invite Link: &lt;a href="https://discord.com/oauth2/authorize?client_id=1482225606761386085&amp;amp;permissions=2147601472&amp;amp;integration_type=0&amp;amp;scope=bot+applications.commands" rel="noopener noreferrer"&gt;https://discord.com/oauth2/authorize?client_id=1482225606761386085&amp;amp;permissions=2147601472&amp;amp;integration_type=0&amp;amp;scope=bot+applications.commands&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full bot: &lt;a href="https://ko-fi.com/semtione" rel="noopener noreferrer"&gt;https://ko-fi.com/semtione&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>discord</category>
      <category>indiehacker</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Built a Discord Activity Heatmap Bot with Python and discord.py</title>
      <dc:creator>SemTiOne</dc:creator>
      <pubDate>Tue, 17 Mar 2026 07:40:35 +0000</pubDate>
      <link>https://dev.to/semtione_aad5031f15784da5/how-i-built-a-discord-activity-heatmap-bot-jm0</link>
      <guid>https://dev.to/semtione_aad5031f15784da5/how-i-built-a-discord-activity-heatmap-bot-jm0</guid>
      <description>&lt;p&gt;I've been running a Discord server for a while and always wondered: "when is my community actually online?"&lt;/p&gt;

&lt;p&gt;Discord doesn't show you this. You can see who's online right now, but there's no way to see patterns over time, no weekly view, no hourly breakdown, nothing.&lt;/p&gt;

&lt;p&gt;So I built Heatmap Bot.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What it does&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Heatmap Bot tracks your server's activity and turns it into a heatmap, a 7×24 grid showing activity by day and hour for the past week. It also supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily bar chart view&lt;/li&gt;
&lt;li&gt;Monthly trend chart&lt;/li&gt;
&lt;li&gt;Channel breakdown&lt;/li&gt;
&lt;li&gt;Member leaderboard&lt;/li&gt;
&lt;li&gt;Week-over-week comparison&lt;/li&gt;
&lt;li&gt;Weekly auto-reports&lt;/li&gt;
&lt;li&gt;Peak activity alerts&lt;/li&gt;
&lt;li&gt;CSV data export&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Tech stack&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.13 with discord.py 2.x&lt;/li&gt;
&lt;li&gt;SQLite with aiosqlite for async DB access&lt;/li&gt;
&lt;li&gt;matplotlib + numpy for heatmap rendering&lt;/li&gt;
&lt;li&gt;aiohttp for the webhook server&lt;/li&gt;
&lt;li&gt;Railway for hosting&lt;/li&gt;
&lt;li&gt;Ko-fi for payments (manual grant flow)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The interesting part, rendering heatmaps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The heatmap is a 7×24 numpy array. Each cell is the count of events at that day/hour combination, converted from UTC to the server's local timezone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pythondef&lt;/span&gt; &lt;span class="nf"&gt;aggregate_to_heatmap_grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromtimestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tz&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;()][&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rendering uses matplotlib with a custom blurple→pink gradient to match Discord's aesthetic.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The hard part - Railway + Discord rate limits&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The trickiest issue was Discord's Cloudflare rate limiting. Too many reconnects from the same IP gets you a 1015 error, temporarily banned. The fix was switching Railway regions to get a new IP.&lt;/p&gt;

&lt;p&gt;If you're deploying a Discord bot, make sure your restart policy doesn't cause rapid reconnect loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Free vs paid tier&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; 7 days history, messages only, watermark&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid ($4.99/month):&lt;/strong&gt; 90 days, all event types, no watermark, leaderboard, CSV export&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Try it&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Add Heatmap Bot to your server: &lt;a href="https://discord.com/oauth2/authorize?client_id=1482225606761386085&amp;amp;permissions=2147601472&amp;amp;integration_type=0&amp;amp;scope=bot+applications.commands" rel="noopener noreferrer"&gt;https://discord.com/oauth2/authorize?client_id=1482225606761386085&amp;amp;permissions=2147601472&amp;amp;integration_type=0&amp;amp;scope=bot+applications.commands&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ko-fi: &lt;a href="https://ko-fi.com/semtione" rel="noopener noreferrer"&gt;https://ko-fi.com/semtione&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer questions about the implementation in the comments!&lt;/p&gt;

</description>
      <category>python</category>
      <category>discord</category>
      <category>showdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>StandupBot – Generate daily standups from git history using Ollama or Groq</title>
      <dc:creator>SemTiOne</dc:creator>
      <pubDate>Thu, 12 Mar 2026 08:11:32 +0000</pubDate>
      <link>https://dev.to/semtione_aad5031f15784da5/standupbot-generate-daily-standups-from-git-history-using-ollama-or-groq-2pfj</link>
      <guid>https://dev.to/semtione_aad5031f15784da5/standupbot-generate-daily-standups-from-git-history-using-ollama-or-groq-2pfj</guid>
      <description>&lt;p&gt;Tired of trying to remember what you did yesterday for standup? &lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;StandupBot&lt;/strong&gt;, a CLI tool that reads your git history and generates a clean standup summary using a local or free cloud LLM. No paid APIs required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Private with Ollama (runs locally)&lt;/li&gt;
&lt;li&gt;Free cloud option via Groq&lt;/li&gt;
&lt;li&gt;One command: &lt;code&gt;standup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy to clipboard: &lt;code&gt;standup --copy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Health check: &lt;code&gt;standup doctor&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;Install Ollama from &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;https://ollama.com&lt;/a&gt;, then:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama pull llama3
pip install -e .
standup --setup
standup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Example Output
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Yesterday:** Fixed authentication bug and refactored token validation.
**Today:** Working on the new /users endpoint.
**Blockers:** None
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/SemTiOne/standup-bot" rel="noopener noreferrer"&gt;https://github.com/SemTiOne/standup-bot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback welcome!&lt;/p&gt;

</description>
      <category>python</category>
      <category>cli</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
