<?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: Brian</title>
    <description>The latest articles on DEV Community by Brian (@kingbri).</description>
    <link>https://dev.to/kingbri</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%2F390651%2Fe254ba00-e766-4649-aac9-0b20b121ee31.png</url>
      <title>DEV Community: Brian</title>
      <link>https://dev.to/kingbri</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kingbri"/>
    <language>en</language>
    <item>
      <title>Why I made TabbyAPI</title>
      <dc:creator>Brian</dc:creator>
      <pubDate>Sat, 13 Jul 2024 01:19:04 +0000</pubDate>
      <link>https://dev.to/kingbri/why-i-made-tabbyapi-385f</link>
      <guid>https://dev.to/kingbri/why-i-made-tabbyapi-385f</guid>
      <description>&lt;p&gt;&lt;em&gt;Cover Photo by Jason Leung on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the first in probably many “why I made” posts which explains my reasoning for making a piece of software and diving deeper into future improvements.&lt;/p&gt;

&lt;p&gt;Today, I’m going to focus on my most popular project, &lt;a href="https://github.com/theroyallab/tabbyAPI" rel="noopener noreferrer"&gt;TabbyAPI&lt;/a&gt;. TabbyAPI is a python based FastAPI server that allows users to interact with Large Language Models (or LLMs) using the &lt;a href="https://github.com/turboderp/exllamav2" rel="noopener noreferrer"&gt;ExllamaV2&lt;/a&gt; library and adheres to the OpenAI API specification.&lt;/p&gt;

&lt;p&gt;If you’re not sure what any of those words mean, you’re not in the AI space. But, that’s okay! This article is meant to explain my experiences without throwing the entire kitchen sink of AI terms at you.&lt;/p&gt;

&lt;h3&gt;
  
  
  The start
&lt;/h3&gt;

&lt;p&gt;Let me go back to the time of November 2023. AI was booming, companies were releasing models left and right, and the hype train seemed to have no end. It seems like I’m talking about a time period that was in ancient times, but back then, every day felt like a whole month of innovation.&lt;/p&gt;

&lt;p&gt;In the onslaught of these new technologies, I was focused on running them with my paltry 3090ti. Yes, paltry is the correct word to use since 24GB of VRAM in a graphics card is entry level for running most AI models. At this time, running quantized versions of models was the norm. Quantization is analogous to compression which allows users to run these massive models on consumer GPUs.&lt;/p&gt;

&lt;p&gt;The format that I’ve grown to love was exl2, a format that focused on speed, optimization, and getting as much as possible onto a graphics card. and tokens were generating at the speed of sound. So this format is great! What’s the issue?&lt;/p&gt;

&lt;p&gt;The issue is running the model. Exl2 is part of the ExllamaV2 library, but to run a model, a user needs an API server. The only option out there was using &lt;a href="https://github.com/oobabooga/text-generation-webui" rel="noopener noreferrer"&gt;text-generation-webui (TGW)&lt;/a&gt;, a program that bundled every loader out there into a Gradio webui. &lt;a href="https://gradio.app" rel="noopener noreferrer"&gt;Gradio&lt;/a&gt; is a common “building-block” UI framework for python development and is often used for AI applications. This setup was good for a while, until it wasn’t.&lt;/p&gt;

&lt;p&gt;Essentially, the main reason for creating Tabby was annoyance. I got tired at the amount of work involved to load one model. Not to mention the overhead from Gradio and the sheer amount of dependencies from TGW. I respect the developer, but while TGW is good for many people who want an all-in-one solution, it was not good for me.&lt;/p&gt;

&lt;h3&gt;
  
  
  The plan…
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AN3JdnjeD2WQvLq39" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AN3JdnjeD2WQvLq39" alt="Image" width="800" height="532"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Glenn Carstens-Peters on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;is simple. Create an API server that can sit on my computer and doesn’t require a ton of bloat to run. That sounds easy, but could I actually do it? I don’t have much experience in AI model theory, but I have a lot of experience creating backend servers and understanding API design.&lt;/p&gt;

&lt;p&gt;Therefore, I needed someone to help, but who? Enter turboderp, the person behind ExllamaV2. He pretty much knows everything behind how models work since he made the library, which is a great pairing to my API knowledge. In addition, another interested person named Splice joined due to his experience with Python. Together, the three of us started TabbyAPI.&lt;/p&gt;

&lt;p&gt;But was the plan really that simple? Well, kind of. While I had the people for the job, my knowledge in Python and API servers was basically 0. I ended up using a webserver framework called &lt;a href="https://fastapi.tiangolo.com" rel="noopener noreferrer"&gt;FastAPI&lt;/a&gt; which made my life much easier. It’s also very popular in the python community and well documented.&lt;/p&gt;

&lt;p&gt;After using FastAPI for a few days, I was hooked on writing python webserver code. The documentation is very good, there are many examples online, and the developers are receptive to feedback. Overall, the community is welcoming and I’d love to use python for networking more often.&lt;/p&gt;

&lt;p&gt;After a few weeks, I felt that everything was ready for a public deploy and decided to release everything in the best way I know. YOLO and push everything to GitHub.&lt;/p&gt;
&lt;h3&gt;
  
  
  Issues and more issues
&lt;/h3&gt;

&lt;p&gt;When releasing an open source project to the world, expect issues… A &lt;em&gt;lot&lt;/em&gt; of issues. People always have use cases that the utility does not fit into. Since Tabby is a backend server, many of those cases popped up. For this post, I’ll only mention a few things that were difficult for me to deal with at first.&lt;/p&gt;

&lt;p&gt;A large pain point was that I released Tabby in the middle of the RAG hype cycle. RAG stands for “Retrieval Augmented Generation”, or using external documents in addition to the LLM’s knowledge when getting a response. The problem was that these new techniques (such as function calling) need completely different API endpoints and ways to accomplish tasks.&lt;/p&gt;

&lt;p&gt;On top of that, there is little to no documentation on how these features actually work on the backend. To this day, I haven’t implemented OpenAI’s tool calling since I have no idea how it works. The lack of documentation is sadly common in the AI world and it stifles the ability for developers to implement code in their projects without a lot of information gathering beforehand.&lt;/p&gt;

&lt;p&gt;Another issue that lasted for several months was multi-user generation. It turns out that handling distributed queries on a server isn’t an easy topic for a developer to work with. FastAPI provides support for this type of workload, but Tabby was written with synchronous code. This meant that I had to learn asynchronous programming in Python (which is not easy by a long shot).&lt;/p&gt;

&lt;p&gt;The worst part is that AI developers do not like asynchronous python while networking servers embrace it. What this means is that I had to learn how to communicate between asynchronous and synchronous libraries in the form of threading. This is an even deeper dive into understanding Python’s threading issues and why the asynchronous model exists in the first place. I’ll go over all of this in another blogpost, but hopefully this explains the amount of learning that I had to do in the span of 2–3 months while battling these issues.&lt;/p&gt;

&lt;p&gt;Eventually, turbo and I worked together to create a better generator in the ExllamaV2 library which stripped away all multi-user woes and weird bugs from threading libraries. After 9 months, it’s safe to say that Tabby is finally a stable program to run models with.&lt;/p&gt;
&lt;h3&gt;
  
  
  Burnout
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AHv_wSa8ZzSF3JYSX" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F0%2AHv_wSa8ZzSF3JYSX" alt="Image" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Annie Spratt on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;During my entire time of developing software, I’ve never had a burnout period. That’s hard to believe since burnout is a common thing within the software world, but I’ve always wanted to code something for the past 6 years. Coding is my favorite pastime and helps me escape the stresses of the day.&lt;/p&gt;

&lt;p&gt;However, Tabby and the AI community in general changed things. At the start, I made a lot of friends and people who shared common interests in exploring the booming field of AI. My community used to engage in voice calls pretty much every day and focused on sharing projects and ideas about what’s new in the space. It made development fun and enjoyable since I got to hang out with like-minded people and share new ideas.&lt;/p&gt;

&lt;p&gt;Unfortunately, those voice calls started having less people and happened less often. I was also under a lot of stress due to finishing up my first year of medical school. In the online world, this was a huge period of loneliness for me and developing Tabby felt like a burden on top of my med student life. Eventually, these events culminated in a large ball of frustration and tiredness. To solve it, I decided to take an indefinite break from AI.&lt;/p&gt;

&lt;p&gt;During my break, I spent time away from Tabby and spent more time enjoying my summer vacation. I actually worked on some older iOS app projects and spent time with my family. Nowadays, I’m getting back into developing Tabby again. Those voice calls I used to partake in probably won’t happen for a long while due to the fading of AI hype. It’s a tough pill to swallow, but I’ve found different motivations for continuing development.&lt;/p&gt;
&lt;h3&gt;
  
  
  Lessons I learned
&lt;/h3&gt;

&lt;p&gt;Tabby was the first LLM project I’ve ever made. It somehow became a popular name within the community and I was thrown into the deep end of management. Knowing that, here’s a few thoughts that I learned from this experience.&lt;/p&gt;

&lt;p&gt;Know who you want to cater to: Anyone can use an open source project. For Tabby, I prioritize features that will benefit the project’s ease of use, my friends, and myself. By keeping this philosophy in check, I can manage my schedule and I’ll know what features to work on.&lt;/p&gt;

&lt;p&gt;Understand your limits: Burnout isn’t fun. Don’t do what I did and run yourself down because a user has an issue for the umpteenth time. If the feelings of frustration, anger, or boredom ever show up, take a break. It’s good to relax once in a while.&lt;/p&gt;

&lt;p&gt;Don’t bend over backwards for everyone: An idea may look good when it’s first presented, but people don’t understand that the developer needs to maintain this feature afterwards. If it’s a pain and not used much, the feature isn’t going to be maintained and will become tech debt. Remember that random strangers on the internet always have ideas. It’s up to you or your team to decide which ones to commit brainpower to.&lt;/p&gt;

&lt;p&gt;Create something you love and enjoy: Developers often lose enjoyment on a project because maintaining can be troublesome and take a long time. This is especially true if the developer no longer actively uses the project. Figure out what your motivation is, and if it changes, that’s okay.&lt;/p&gt;

&lt;p&gt;I’ll probably elaborate on these in another article since this can be its own topic, but I feel that working on Tabby has given me more insights to how I want my projects to work. In addition, my knowledge of the open source community has been expanded.&lt;/p&gt;
&lt;h3&gt;
  
  
  What the future holds
&lt;/h3&gt;

&lt;p&gt;I’m thankful to all the people that contribute and give suggestions daily to improve both TabbyAPI and ExllamaV2. Everyone helps refine and improve the programs to work better for general use. I’m one person and helping out takes a lot off of my plate.&lt;/p&gt;

&lt;p&gt;For the foreseeable future, I’m going to cut back on how much I’m working on Tabby. The project is still going strong and many are committing to improving it, but my mental health is more important and taking breaks will help with that.&lt;/p&gt;

&lt;p&gt;Thanks for reading this retrospective. If you want to learn more about me and what I do, please visit &lt;a href="https://kingbri.dev" rel="noopener noreferrer"&gt;kingbri.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kingbri.dev/work" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Brian Dashore's personal website&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/theroyallab" rel="noopener noreferrer"&gt;
        theroyallab
      &lt;/a&gt; / &lt;a href="https://github.com/theroyallab/tabbyAPI" rel="noopener noreferrer"&gt;
        tabbyAPI
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An OAI compatible exllamav2 API that's both lightweight and fast
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;TabbyAPI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fcb1eb0d0eee8961042c738a8ff210c629519731813393474814ba5f0e3908ba/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302532307c253230332e31312532307c253230332e31322d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/fcb1eb0d0eee8961042c738a8ff210c629519731813393474814ba5f0e3908ba/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302532307c253230332e31312532307c253230332e31322d626c7565" alt="Python 3.10, 3.11, and 3.12"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/theroyallab/tabbyAPI/LICENSE" rel="noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/4bfdc8635c2505183ed1a60db13c85b4254b4e062e4f9c2282c95a23bf967070/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4147504c76332d626c75652e737667" alt="License: AGPL v3"&gt;
    &lt;/a&gt;
    &lt;a href="https://discord.gg/sYQxnuD7Fj" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/b21b3761775d15fba5301212555c80638ed526a81fa6e178661e218f51a0f4c4/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3534353734303634333234373435363236372e7376673f6c6f676f3d646973636f726426636f6c6f723d626c7565" alt="Discord Server"&gt;
    &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://theroyallab.github.io/tabbyAPI" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/54582236945d28c207a21c102ec57e296cf2c1239ca0dd5597d4058a16a1fae4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f63756d656e746174696f6e2d4150492d6f72616e6765" alt="Developer facing API documentation"&gt;
    &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://ko-fi.com/I2I3BDTSW" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/9da7282ae41dc5b5f9d7c9d66aa6420872e9fbf72b6794d1774fc8e509a2652d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f537570706f72745f6f6e5f4b6f2d2d66692d4646354535423f6c6f676f3d6b6f2d6669267374796c653d666f722d7468652d6261646765266c6f676f436f6c6f723d7768697465" alt="Support on Ko-Fi"&gt;
    &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-alert markdown-alert-important"&gt;
&lt;p class="markdown-alert-title"&gt;Important&lt;/p&gt;
&lt;p&gt;In addition to the README, please read the &lt;a href="https://github.com/theroyallab/tabbyAPI/wiki/1.-Getting-Started" rel="noopener noreferrer"&gt;Wiki&lt;/a&gt; page for information about getting started!&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-alert markdown-alert-note"&gt;
&lt;p class="markdown-alert-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Need help? Join the &lt;a href="https://discord.gg/sYQxnuD7Fj" rel="nofollow noopener noreferrer"&gt;Discord Server&lt;/a&gt; and get the &lt;code&gt;Tabby&lt;/code&gt; role. Please be nice when asking questions.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A FastAPI based application that allows for generating text using an LLM (large language model) using the &lt;a href="https://github.com/turboderp/exllamav2" rel="noopener noreferrer"&gt;Exllamav2 backend&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TabbyAPI is also the official API backend server for ExllamaV2.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Disclaimer&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;This project is marked as rolling release. There may be bugs and changes down the line. Please be aware that you might need to reinstall dependencies if needed.&lt;/p&gt;

&lt;p&gt;TabbyAPI is a hobby project made for a small amount of users. It is not meant to run on production servers. For that, please look at other solutions that support those workloads.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-alert markdown-alert-important"&gt;
&lt;p class="markdown-alert-title"&gt;Important&lt;/p&gt;
&lt;p&gt;This README does not have instructions for setting up. Please read the Wiki.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Read the &lt;a href="https://github.com/theroyallab/tabbyAPI/wiki/1.-Getting-Started" rel="noopener noreferrer"&gt;Wiki&lt;/a&gt; for more information. It contains user-facing…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/theroyallab/tabbyAPI" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>opensource</category>
      <category>developmentandgrowth</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>2020 was a Crazy Year.</title>
      <dc:creator>Brian</dc:creator>
      <pubDate>Wed, 20 May 2020 13:06:47 +0000</pubDate>
      <link>https://dev.to/kingbri/2020-was-a-crazy-year-2dbp</link>
      <guid>https://dev.to/kingbri/2020-was-a-crazy-year-2dbp</guid>
      <description>&lt;h2&gt;
  
  
  My Final Project
&lt;/h2&gt;

&lt;p&gt;I always felt that discord bots never had too much &lt;em&gt;variety&lt;/em&gt;. There are so many to choose from, but most of them seem like an all-in-one clone of MEE6, Dyno, etc. I started to get irritated through the constant server outages or the poor admin commands. This is where RoyalGuard was born.&lt;/p&gt;

&lt;p&gt;RoyalGuard is a bot made for administration and has unique features such as timed mutes, customizable welcome/leave messages, and welcome roles given on a new user event.&lt;/p&gt;

&lt;p&gt;The plan is to deploy this across many servers, so that they can have better administration overall because RoyalGuard is meant for nothing but server administration. There will never be any extra "fun" commands, that is all for another bot of mine that I will work on in Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo Link (Bot invite link)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://discord.com/api/oauth2/authorize?client_id=698554777981681754&amp;amp;permissions=268827894&amp;amp;scope=bot" rel="noopener noreferrer"&gt;https://discord.com/api/oauth2/authorize?client_id=698554777981681754&amp;amp;permissions=268827894&amp;amp;scope=bot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bdashore3" rel="noopener noreferrer"&gt;
        bdashore3
      &lt;/a&gt; / &lt;a href="https://github.com/bdashore3/RoyalGuard" rel="noopener noreferrer"&gt;
        RoyalGuard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Administration bot for The King's Castle. Can be used in other server instances.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;RoyalGuard&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Invite Link&lt;/strong&gt;: &lt;a href="https://discord.com/oauth2/authorize?client_id=698554777981681754&amp;amp;permissions=268827894&amp;amp;scope=bot" rel="nofollow noopener noreferrer"&gt;https://discord.com/oauth2/authorize?client_id=698554777981681754&amp;amp;permissions=268827894&amp;amp;scope=bot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support Server&lt;/strong&gt;: Since top.gg is re-adding most bots (due to discord limitations), here's the support server link if you have an error/weird issue
&lt;a href="https://discord.gg/pswt7by" rel="nofollow noopener noreferrer"&gt;https://discord.gg/pswt7by&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a discord bot focused on one thing, Administration. Bots such as MEE6 or Dyno provide an all-in-one experience, but tend to lack on the administrative side of things. I decided to make my own bot that allows server administration as minimal and swift as possible.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Feature List&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;All commands are within &lt;code&gt;Modules&lt;/code&gt;, but here is a list of the features if you're too lazy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ping: Prints "Pong!". Quick and easy way to see if the bot's online.&lt;/li&gt;
&lt;li&gt;Bans: Used for banning and unbanning a user. Unbans can either be done by Discord user ID or by mention.&lt;/li&gt;
&lt;li&gt;Warnings: Formally warns a user in the server. Is considered the lesser form of a ban. After three warnings, the…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bdashore3/RoyalGuard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I built it (what's the stack? did I run into issues or discover something new along the way?)
&lt;/h2&gt;

&lt;p&gt;I had little-to no knowledge about the C# library for Discord known as DSharpPlus. However, since I programmed my own twitch bot (KingBot, also located in my &lt;a href="https://github.com/bdashore3/KingBot" rel="noopener noreferrer"&gt;Github&lt;/a&gt;), I was able to have a base for my C# code that uses DI and EF Core.&lt;/p&gt;

&lt;p&gt;I quickly realized that RoyalGuard needed more robust code which made me ask more questions in the C# and DSharpPlus discord servers (Those guys are amazing). From there, I learned about reducing static overuse, hosted services for timers, and the efficiency of an I/O cache for prefixes rather than using EF Core's first-level caching for all queries. &lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Thoughts / Feelings / Stories
&lt;/h2&gt;

&lt;p&gt;Since the pandemic occurred, it took me a total of three weeks to complete v1.0 which is now pending approval on the Discord Bot List. If I was to have school, the project would have taken two months for v1.0.&lt;/p&gt;

&lt;p&gt;C# has a steep learning curve especially when coming from JavaScript. I have grown to love the language since it's really intuitive and there are so many tools at the dev's disposal. I'm starting to find more languages that are more intuitive and have great communities that encourage learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Notes
&lt;/h2&gt;

&lt;p&gt;I'm going into the medical field as a career starting next year when I attend college and med-school for seven years. However, just because one wants to become a doctor, artist, actor, writer, or anything in between doesn't mean that people cannot have a hobby. I always have the passion to learn something new and apply it to the real world.&lt;/p&gt;

&lt;p&gt;Hard work and dedication will get you anywhere.&lt;/p&gt;

&lt;p&gt;Thanks to DigitalOcean and the Github student dev pack for giving me the ability to host my bots via a VPS!&lt;/p&gt;

</description>
      <category>githubsdp</category>
      <category>devgrad2020</category>
      <category>octograd2020</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
