<?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: Jacob Henning</title>
    <description>The latest articles on DEV Community by Jacob Henning (@jacobhenning).</description>
    <link>https://dev.to/jacobhenning</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%2F107256%2Fd07dc9f6-b5da-4bc3-bb54-5a4e1eb69920.jpg</url>
      <title>DEV Community: Jacob Henning</title>
      <link>https://dev.to/jacobhenning</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jacobhenning"/>
    <language>en</language>
    <item>
      <title>Redis RPG - An AI Generated Game</title>
      <dc:creator>Jacob Henning</dc:creator>
      <pubDate>Mon, 11 Aug 2025 06:27:31 +0000</pubDate>
      <link>https://dev.to/jacobhenning/redis-rpg-43fp</link>
      <guid>https://dev.to/jacobhenning/redis-rpg-43fp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/redis-2025-07-23"&gt;Redis AI Challenge&lt;/a&gt;: Real-Time AI Innovators&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Redis RPG ⚔️ is a multiplayer storytelling game where players can type anything 🤯 they want, and AI responds like an intelligent narrator in real-time. Instead of clicking preset options, players can type ⌨️ 'I try to negotiate with the alien' or 'I use my coffee cup as a megaphone 📢 ☕️' - and the AI decides what happens next based on creativity and logic. But unlike other AI story apps, in this game, there are irreversible consequences for your actions 🧨🙀.&lt;/p&gt;

&lt;p&gt;But this is really about a broader paradigm 🌎 with three core components: First, AI preprocessing that constrains responses to relevant context 👮🏻‍♂️ - in this game, you can only use the equipment you have and interact with the current environment. Second, AI generates contextual responses to any natural language input 🧠. Third, semantic caching stores and reuses similar responses to improve speed ⚡️ and reduce costs 💰.&lt;/p&gt;

&lt;p&gt;This same system could power customer service chatbots 🤖, educational platforms 📚 where students can ask questions in their own words, or sales teams/manufacturers communicating details about products and warranties 🚗. It can work anywhere you need AI to respond intelligently and topically to human input while maintaining consistency and efficiency 😎.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;A couple of things you need to know before playing...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I only put $10 on my Open AI account, so it might run out😭.&lt;/li&gt;
&lt;li&gt;The AI is controlling my code. I've tested it many times, and I've been very specific with the AI, but every now and then the AI decides to throw a wrench in the works🦾🔧.&lt;/li&gt;
&lt;li&gt;Its pretty fun 🙂.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://rpg.jacobhenning.com/" rel="noopener noreferrer"&gt;https://rpg.jacobhenning.com/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://youtu.be/LdaTUGWCo4E" rel="noopener noreferrer"&gt;https://youtu.be/LdaTUGWCo4E&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/jacobshenning/redis-ai-hackathon" rel="noopener noreferrer"&gt;https://github.com/jacobshenning/redis-ai-hackathon&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1km9j45adv2rxbbksnnc.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1km9j45adv2rxbbksnnc.png" alt="Redis RPG Start Page" width="800" height="402"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf6iqo3im5nlmzy1frcr.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf6iqo3im5nlmzy1frcr.png" alt="Redis RPG Weapon Selection" width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdhotqm2esdnro6t8k57.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdhotqm2esdnro6t8k57.png" alt="Redis RPG Prompt Entering" width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fem0o2edjmj52d2b0k5ob.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fem0o2edjmj52d2b0k5ob.png" alt="Redis RPG Story Event" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Redis 8
&lt;/h2&gt;

&lt;p&gt;I used Pub/Sub, Cache, Redis as my primary database💽, and I also setup a redis search engine🔎 (without RediSearch) and a semantic cache using vectors.&lt;/p&gt;

&lt;p&gt;The overall impact Redis has on a website with live websockets, constant AI generated data, and a need to access data quickly is huge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pub/Sub
&lt;/h3&gt;

&lt;p&gt;I used Pub/Sub to send events over to the WebSocket server 📢. My app is live, and the WebSockets are a huge part of how it works, so this was very important for my app. It made things much quicker 🚀.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Streaming
&lt;/h3&gt;

&lt;p&gt;I couldn't figure out how to store my game logs because they came from all over the place (my event system is robust, each event generates text for the player, so it got crazy). And then I found this feature. I didn't even know Redis had this 😂. Its fast and worked perfectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redis as Primary Database
&lt;/h3&gt;

&lt;p&gt;Redis manages all of the game data 📊. Weapons🗡️, characters🤺, locations🏠, etc are all generated by AI and then saved in Redis. The only thing I don't save in Redis is my users table, and its because I want users to persist when the server is off, and I know I can make Redis data persist when the server is off, but I don't actually want the game data to persist when the server is off - So I'm not keeping users in MySQL because Redis can't persist when the server is off, I'm doing it because I want to lose my game data when the server is off. I didn't have a lot of time to build this so I needed to do it this way 😂&lt;/p&gt;

&lt;p&gt;(ps I have setup Redis as the primary database for Laravel before and it works great. Super fast).&lt;/p&gt;

&lt;h3&gt;
  
  
  Semantic Caching
&lt;/h3&gt;

&lt;p&gt;I built a class for saving and managing semantic caches💾. Unfortunately, I wasn't able to build it in such a way it would be used. This is because my app's content is hugely generated by AI 🤖. It creates a vast selection of content. So $5🪙 server will probably crash💥 before that cache gets hit. There is another way I might use it but it takes a while to explain, but is awesome and brilliant 🧠.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redis Search Engine
&lt;/h3&gt;

&lt;p&gt;I was going to setup a semantic search engine🕵🏼‍♂️ (sounded cool) but then I realized my content was a little to granular for semantic searching ⏳. So then I build a manual indexing tool that could fuzzy search strings. And then I ended up not using it... It probably doesn't count for the hackathon if you don't use it in your app, but I just want you to know I built it 💪.&lt;/p&gt;

&lt;h2&gt;
  
  
  About this paradigm (Bonus Section🤩)
&lt;/h2&gt;

&lt;p&gt;You thought I was done huh?🤔&lt;/p&gt;

&lt;h3&gt;
  
  
  Go to Market Strategy
&lt;/h3&gt;

&lt;p&gt;Every time I build something, I always have scalability in the back of my mind. The problem with Redis RPG⚔️ is that it uses a lot of AI bandwidth, and to scale would require a heft investment 💳. The solution to this is to reuse a portion of our AI generated content. If users get 50% AI generated content, and 50% recycled content ⚖️, its still a fairly dynamic experience. But here is the problem with that. My app isn't just generated a "Character" and a "Location" - Locations and characters are unique to the world they're created in 🤯. My AI prompting and seed 🌱 combinations generate characters with traits that they would acquire from that land. My AI tools won't generate a location on the beach if the game is occurring in the mountains. So I can't get just pull a previously generated location out of my database and expect it to work with the current game's region. But guess what I could do?🤔 Seriously, try to guess🧠, scroll down and comment your guess and then come back.&lt;/p&gt;

&lt;p&gt;I can implement Semantic Caching using vectors🤓. What this lets me do is pull previously generated content that matches the game appropriately. So if we're a region of snowy☃️ 🌲 forests, we won't pull a location called "🏝️Oasis" - no we'll pull a "Snow Lodge🏂" out of that database and hit the steam🧖🏻‍♂️ room. Then I can decide what threshold of new content I want to generate (so long as I have some old content to pull out). App too expensive? Only generate half the content. &lt;/p&gt;

&lt;p&gt;Eventually, the semantic cache will fill up enough to start catching similar prompts, and reusing them. When this happens, if you want, you could start replacing old caches with content created by an improved AI.&lt;/p&gt;

&lt;p&gt;I'm not sure if this particular app will ever "go to market" in any serious sense but I have to think about it as I build. (ps, if you want me keep building this (or even want to help), say something in the comments).&lt;/p&gt;

</description>
      <category>redischallenge</category>
      <category>devchallenge</category>
      <category>database</category>
      <category>ai</category>
    </item>
    <item>
      <title>Redis RPG - An AI Generated Game</title>
      <dc:creator>Jacob Henning</dc:creator>
      <pubDate>Mon, 11 Aug 2025 06:27:14 +0000</pubDate>
      <link>https://dev.to/jacobhenning/redis-rpg-4p8h</link>
      <guid>https://dev.to/jacobhenning/redis-rpg-4p8h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/redis-2025-07-23"&gt;Redis AI Challenge&lt;/a&gt;: Beyond the Cache&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Redis RPG ⚔️ is a multiplayer storytelling game where players can type anything 🤯 they want, and AI responds like an intelligent narrator in real-time. Instead of clicking preset options, players can type ⌨️ 'I try to negotiate with the alien' or 'I use my coffee cup as a megaphone 📢 ☕️' - and the AI decides what happens next based on creativity and logic. But unlike other AI story apps, in this game, there are irreversible consequences for your actions 🧨🙀.&lt;/p&gt;

&lt;p&gt;But this is really about a broader paradigm 🌎 with three core components: First, AI preprocessing that constrains responses to relevant context 👮🏻‍♂️ - in this game, you can only use the equipment you have and interact with the current environment. Second, AI generates contextual responses to any natural language input 🧠. Third, semantic caching stores and reuses similar responses to improve speed ⚡️ and reduce costs 💰.&lt;/p&gt;

&lt;p&gt;This same system could power customer service chatbots 🤖, educational platforms 📚 where students can ask questions in their own words, or sales teams/manufacturers communicating details about products and warranties 🚗. It can work anywhere you need AI to respond intelligently and topically to human input while maintaining consistency and efficiency 😎.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;A couple of things you need to know before playing...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I only put $10 on my Open AI account, so it might run out😭.&lt;/li&gt;
&lt;li&gt;The AI is controlling my code. I've tested it many times, and I've been very specific with the AI, but every now and then the AI decides to throw a wrench in the works🦾🔧.&lt;/li&gt;
&lt;li&gt;Its pretty fun 🙂.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://rpg.jacobhenning.com/" rel="noopener noreferrer"&gt;https://rpg.jacobhenning.com/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://youtu.be/LdaTUGWCo4E" rel="noopener noreferrer"&gt;https://youtu.be/LdaTUGWCo4E&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/jacobshenning/redis-ai-hackathon" rel="noopener noreferrer"&gt;https://github.com/jacobshenning/redis-ai-hackathon&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1km9j45adv2rxbbksnnc.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1km9j45adv2rxbbksnnc.png" alt="Redis RPG Start Page" width="800" height="402"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf6iqo3im5nlmzy1frcr.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf6iqo3im5nlmzy1frcr.png" alt="Redis RPG Weapon Selection" width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdhotqm2esdnro6t8k57.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdhotqm2esdnro6t8k57.png" alt="Redis RPG Prompt Entering" width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fem0o2edjmj52d2b0k5ob.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fem0o2edjmj52d2b0k5ob.png" alt="Redis RPG Story Event" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Redis 8
&lt;/h2&gt;

&lt;p&gt;I used Pub/Sub, Cache, Redis as my primary database💽, and I also setup a redis search engine🔎 (without RediSearch) and a semantic cache using vectors.&lt;/p&gt;

&lt;p&gt;The overall impact Redis has on a website with live websockets, constant AI generated data, and a need to access data quickly is huge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pub/Sub
&lt;/h3&gt;

&lt;p&gt;I used Pub/Sub to send events over to the WebSocket server 📢. My app is live, and the WebSockets are a huge part of how it works, so this was very important for my app. It made things much quicker 🚀.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Streaming
&lt;/h3&gt;

&lt;p&gt;I couldn't figure out how to store my game logs because they came from all over the place (my event system is robust, each event generates text for the player, so it got crazy). And then I found this feature. I didn't even know Redis had this 😂. Its fast and worked perfectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redis as Primary Database
&lt;/h3&gt;

&lt;p&gt;Redis manages all of the game data 📊. Weapons🗡️, characters🤺, locations🏠, etc are all generated by AI and then saved in Redis. The only thing I don't save in Redis is my users table, and its because I want users to persist when the server is off, and I know I can make Redis data persist when the server is off, but I don't actually want the game data to persist when the server is off - So I'm not keeping users in MySQL because Redis can't persist when the server is off, I'm doing it because I want to lose my game data when the server is off. I didn't have a lot of time to build this so I needed to do it this way 😂&lt;/p&gt;

&lt;p&gt;(ps I have setup Redis as the primary database for Laravel before and it works great. Super fast).&lt;/p&gt;

&lt;h3&gt;
  
  
  Semantic Caching
&lt;/h3&gt;

&lt;p&gt;I built a class for saving and managing semantic caches💾. Unfortunately, I wasn't able to build it in such a way it would be used. This is because my app's content is hugely generated by AI 🤖. It creates a vast selection of content. So $5🪙 server will probably crash💥 before that cache gets hit. There is another way I might use it but it takes a while to explain, but is awesome and brilliant 🧠.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redis Search Engine
&lt;/h3&gt;

&lt;p&gt;I was going to setup a semantic search engine🕵🏼‍♂️ (sounded cool) but then I realized my content was a little to granular for semantic searching ⏳. So then I build a manual indexing tool that could fuzzy search strings. And then I ended up not using it... It probably doesn't count for the hackathon if you don't use it in your app, but I just want you to know I built it 💪.&lt;/p&gt;

&lt;h2&gt;
  
  
  About this paradigm (Bonus Section🤩)
&lt;/h2&gt;

&lt;p&gt;You thought I was done huh?🤔&lt;/p&gt;

&lt;h3&gt;
  
  
  Go to Market Strategy
&lt;/h3&gt;

&lt;p&gt;Every time I build something, I always have scalability in the back of my mind. The problem with Redis RPG⚔️ is that it uses a lot of AI bandwidth, and to scale would require a heft investment 💳. The solution to this is to reuse a portion of our AI generated content. If users get 50% AI generated content, and 50% recycled content ⚖️, its still a fairly dynamic experience. But here is the problem with that. My app isn't just generated a "Character" and a "Location" - Locations and characters are unique to the world they're created in 🤯. My AI prompting and seed 🌱 combinations generate characters with traits that they would acquire from that land. My AI tools won't generate a location on the beach if the game is occurring in the mountains. So I can't get just pull a previously generated location out of my database and expect it to work with the current game's region. But guess what I could do?🤔 Seriously, try to guess🧠, scroll down and comment your guess and then come back.&lt;/p&gt;

&lt;p&gt;I can implement Semantic Caching using vectors🤓. What this lets me do is pull previously generated content that matches the game appropriately. So if we're a region of snowy☃️ 🌲 forests, we won't pull a location called "🏝️Oasis" - no we'll pull a "Snow Lodge🏂" out of that database and hit the steam🧖🏻‍♂️ room. Then I can decide what threshold of new content I want to generate (so long as I have some old content to pull out). App too expensive? Only generate half the content. &lt;/p&gt;

&lt;p&gt;Eventually, the semantic cache will fill up enough to start catching similar prompts, and reusing them. When this happens, if you want, you could start replacing old caches with content created by an improved AI.&lt;/p&gt;

&lt;p&gt;I'm not sure if this particular app will ever "go to market" in any serious sense but I have to think about it as I build. (ps, if you want me keep building this (or even want to help), say something in the comments).&lt;/p&gt;

</description>
      <category>redischallenge</category>
      <category>devchallenge</category>
      <category>database</category>
      <category>ai</category>
    </item>
    <item>
      <title>NoSQL Databases and My Adventure with Redis</title>
      <dc:creator>Jacob Henning</dc:creator>
      <pubDate>Thu, 13 Apr 2023 21:10:16 +0000</pubDate>
      <link>https://dev.to/jacobhenning/nosql-databases-and-my-adventure-with-redis-50mj</link>
      <guid>https://dev.to/jacobhenning/nosql-databases-and-my-adventure-with-redis-50mj</guid>
      <description>&lt;p&gt;Last year I built a Laravel app with Redis as the primary database. It was for a hackathon, the goal was to use Redis as much as possible, and I practically used Redis for everything. Cache, Queue, Event System, and the primary database. The only thing I didn’t use it for was error logging.&lt;/p&gt;

&lt;p&gt;For my fellow Laravel developers, you might be wondering (or already know) how I used a NoSQL database alongside the Laravel framework (even though it’s built to use MySQL.) It was super easy due to the awesome way Laravel is set up. I updated two classes. One is for providing the user to the framework. The other is for accessing key fields for authorization to the framework. All I had to do was design how we get the user from Redis (rather easy). Everything else slid right into place.&lt;/p&gt;

&lt;p&gt;Using Redis as your primary database is pretty awesome. You can add any field you want to the user at any time. No migrations. It’s very fast. The way I set it up, I was able to access the user via token, email, and id. But any key can be set up for our user. You don’t have to set up relationships but you can if you would like to. I ended up having a lot of fun with this project.&lt;/p&gt;

&lt;p&gt;I use Redis in all my projects… But I’ve never used it as the primary database since this hackathon challenge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But why not?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I told you Redis was fast, fun, and easy to set up. Why wouldn’t I keep using it as my primary database? Because it cannot do what I want my database to do in the long run. Since when did queries become a hassle instead of a feature? I like being able to query large amounts of data and produce specific metrics quickly. I like to know what my data model is going to look like when I’m accessing it. Using MySQL lets me request data in a structured way and then cache it using Redis. I guess what I’m trying to say is that I think MySQL is easier to use than NoSQL so long as you know how to use it.&lt;/p&gt;

&lt;p&gt;I can only speak from my experience as a developer. Maybe I’m not using NoSQL databases correctly and there is a far better process I could implement. Please let me know. I’m open-minded on the subject and would love to hear from people who use NoSQL databases and scale them up. I’ve never seen this happen before and would love to learn what NoSQL databases can do.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Alpine JS, Why its awesome, and how to apply it awesomeness.</title>
      <dc:creator>Jacob Henning</dc:creator>
      <pubDate>Thu, 06 Apr 2023 18:02:02 +0000</pubDate>
      <link>https://dev.to/jacobhenning/alpine-js-why-its-awesome-and-how-to-apply-it-awesomeness-4760</link>
      <guid>https://dev.to/jacobhenning/alpine-js-why-its-awesome-and-how-to-apply-it-awesomeness-4760</guid>
      <description>&lt;p&gt;AlpineJS is a minimalist javascript library with a goal of being simple, lightweight, and powerful. Built with only 15 attributes, 6 properties, and 2 methods, it definitely lives up the minimal lightweight approach. The ability to rapidly build out components on the fly, refactor and reuse components, and install plugins for additional functionality does make an argument for how powerful this small library really is.&lt;/p&gt;

&lt;p&gt;AlpineJS isn’t a heavy-weight hitter. It’s a minimalist library. It isn’t going to be best for every use case, but it is best for situations you probably face in your own development projects from time to time. I’ve always found that AlpineJS excels in two things; rapid development and refactoring for performance. This is always something I need done when working through landing pages, light weight dashboards, and form validation. Simply put, AlpineJS is best used when the performance challenge is often less about how your render the DOM and more about when you load your assets.&lt;/p&gt;

&lt;p&gt;AlpineJS’s minimal nature does have one drawback; the inlining bloat. Similar to tailwindcss, AlpineJS lets you code entirely inline, which can lead to bloat and performance issues. This is why I defined a clear process for how I work with AlpineJS to work fast and stay performant. Fortunately, it’s really easy to follow, and only involves two steps. First, rapidly develop your scripts. Get it working and tested. Second, extract your components. AlpineJS allows you to inline all of your scripts but also allows you to extract them into reusable components. This not only reduces the inline bloat but remove repeated code. This process as a whole is excellent because it lets me rapidly get the page working as intended and then easily increase the performance.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Henning Party - A Laravel &amp; Redis</title>
      <dc:creator>Jacob Henning</dc:creator>
      <pubDate>Tue, 30 Aug 2022 06:20:09 +0000</pubDate>
      <link>https://dev.to/jacobhenning/henning-party-a-laravel-redis-5b67</link>
      <guid>https://dev.to/jacobhenning/henning-party-a-laravel-redis-5b67</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;Henning.party is an interactive web app for hosting game night parties in your living room. All you need is a laptop, and a few friends with their mobile device, and together you can play games.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category: Wacky Wildcards
&lt;/h3&gt;

&lt;h3&gt;
  
  
  [Optional: Video Explainer of My Project]
&lt;/h3&gt;

&lt;p&gt;[&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KpGJb_Vo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.loom.com/sessions/thumbnails/bba207dc2d7b4ce4b2943c0255b85f98-with-play.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KpGJb_Vo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.loom.com/sessions/thumbnails/bba207dc2d7b4ce4b2943c0255b85f98-with-play.gif" alt="Embed your YouTube video" width="640" height="360"&gt;&lt;/a&gt;]&lt;a href="https://www.loom.com/share/bba207dc2d7b4ce4b2943c0255b85f98"&gt;https://www.loom.com/share/bba207dc2d7b4ce4b2943c0255b85f98&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Language Used
&lt;/h3&gt;

&lt;p&gt;PHP&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;{% embed https://github.com/jacobshenning/henning-party/tree/master %}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;This was a fun project where I setup a Laravel project using nothing but PHP and Redis. While there were a lot of challenges, in the end, the overall app became simpler. It actually became easy to use because all I needed to work with was Redis and PHP.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Check out &lt;a href="https://redis.io/docs/stack/get-started/clients/#high-level-client-libraries"&gt;Redis OM&lt;/a&gt;, client libraries for working with Redis as a multi-model database.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Use &lt;a href="https://redis.info/redisinsight"&gt;RedisInsight&lt;/a&gt; to visualize your data in Redis.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Sign up for a &lt;a href="https://redis.info/try-free-dev-to"&gt;free Redis database&lt;/a&gt;.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>redishackathon</category>
      <category>redis</category>
      <category>laravel</category>
    </item>
    <item>
      <title>State Bind - A One Way Binding Chat App</title>
      <dc:creator>Jacob Henning</dc:creator>
      <pubDate>Fri, 01 May 2020 06:11:47 +0000</pubDate>
      <link>https://dev.to/jacobhenning/state-bind-a-one-way-binding-chat-app-33ga</link>
      <guid>https://dev.to/jacobhenning/state-bind-a-one-way-binding-chat-app-33ga</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l9eg2KUJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gc853cltb6npd78i8aji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l9eg2KUJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gc853cltb6npd78i8aji.png" alt="Brand"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rosUUBu5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vsimwz3lqavllycqsla0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rosUUBu5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vsimwz3lqavllycqsla0.png" alt="Demo Picture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I used the programmable chat API from Twilio to code what I call a "one-way data binding chat." It demonstrates one-way data binding in a fun and engaging chat app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://state-bind.jacobhenning.com/"&gt;Demo Link&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/jacobshenning/state-bind"&gt;Link to Code&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;I built it using Laravel and I deployed it on my forge server. The stack is as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu/Nginx&lt;/li&gt;
&lt;li&gt;PHP/Laravel&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Javascript/React&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notable integrations: The Twilio Programmable Chat&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;This is my first time using React as Laravel frontend. It's my first time using Twilio. It was kind of hard to get Twilio to agree with my React app at times, but I got it worked out.&lt;/p&gt;

</description>
      <category>twiliohackathon</category>
    </item>
    <item>
      <title>Comparing React to Vue on a Laravel API</title>
      <dc:creator>Jacob Henning</dc:creator>
      <pubDate>Mon, 24 Feb 2020 00:17:13 +0000</pubDate>
      <link>https://dev.to/jacobhenning/comparing-react-to-vue-on-a-laravel-api-2inf</link>
      <guid>https://dev.to/jacobhenning/comparing-react-to-vue-on-a-laravel-api-2inf</guid>
      <description>&lt;h1&gt;
  
  
  Initial Review
&lt;/h1&gt;

&lt;p&gt;Being familiar with React and Vue, I set out to resolve the rivalry. Not for anyone here, it was mainly for myself, but I figured I'd write and post a blog about it anyways. I also was going to strike a different style for each website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vue Style&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For Vue I used the component template format. I also used two-way binding for the state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React Style&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For React I used the render function and of course I had to use one-way binding as React doesn't support two-way binding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared Style&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both of these apps were built on identical Laravel backends with identical bootstrap themes. They both initiated with a render function. The entire app was rendered as one component. This component held most of the state.&lt;/p&gt;

&lt;h1&gt;
  
  
  Comparison
&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://react.jacobhenning.com"&gt;react&lt;/a&gt; and &lt;a href="https://vue.jacobhenning.com"&gt;vue&lt;/a&gt; sites both worked seamlessly. However, I did find that Vue was easier to design, and React was easier to program. This was likely due to a the template vs render function approach. I also noticed that the Vue site loaded slightly quicker. This was due to the size of each library. There wasn't a significant difference in the end.&lt;/p&gt;

&lt;h1&gt;
  
  
  Who won?
&lt;/h1&gt;

&lt;p&gt;Well, I'm not entirely sure which website I prefer. They both work fairly well. I could code both of them again. If anything, this experiment simply proved that react and vue are nearly identical on small scale SPAs. I suppose I'll have to build a second experiment to really get to the bottom of this. Feel free to check my progress on &lt;a href="https://www.jacobhenning.com"&gt;my website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>vue</category>
      <category>laravel</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
