<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
<title>Free Tutorials</title>
<meta name="title" content="The Pragmatic Studio">
<meta name="description" content="Premium video courses for software developers. Real apps. Real code. Really good stuff!">
<meta name="keywords" content="learn ruby, learn rails, learn ruby on rails, learn liveview, ruby course, rails course, elixir course, liveview course, hotwire course">
<meta name="robots" content="all">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="google-site-verification" content="08gafQzvJGhcv6YC2U6_3Ik9yZ5QX7UM6j8zfUhy1nc">

<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://pragmaticstudio.com/">
<meta property="og:title" content="The Pragmatic Studio">
<meta property="og:description" content="Premium video courses for software developers. Real apps. Real code. Really good stuff!">
<meta property="og:image" content="/open-graph-image.jpg">

<!-- Twitter -->
<meta property="twitter:card" content="summary">
<meta property="twitter:url" content="https://pragmaticstudio.com/">
<meta property="twitter:title" content="The Pragmatic Studio">
<meta property="twitter:description" content="Premium video courses for software developers. Real apps. Real code. Really good stuff!">
<meta property="twitter:image" content="/open-graph-image.jpg">

<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<meta name="msapplication-TileColor" content="#247824">
<meta name="theme-color" content="#ffffff">
<link type="text/plain" rel="author" href="/humans.txt">

<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="pjYW3BJSGn7b7ph5pslnEJg-2ljK6aHgLlRrN6AjmCDVmORpOTY3qnktUO0Tg0OnMcZQbR-93NUNTZELPdTpCA" />


<link rel="stylesheet" href="/assets/images-fonts-4f578f9fb979da21a6bef6eb285a5f009e2752d94f3bf69e9f2c268a9b9558b5.css" data-turbo-track="reload" />
<link rel="stylesheet" href="/assets/tailwind-cdffc5bd91b2b4a3e01ebdff8b5178f9ef579ad549e276b5fa473219b4925d58.css" data-turbo-track="reload" />
<link rel="stylesheet" href="/assets/inter-font-8c3e82affb176f4bca9616b838d906343d1251adc8408efe02cf2b1e4fcf2bc4.css" data-turbo-track="reload" />


<script type="importmap" data-turbo-track="reload">{
  "imports": {
    "application": "/assets/application-41e70a375d9c25069955eeff05547ddba698a0b239192e9c011b1eaf9a98237a.js",
    "@hotwired/turbo-rails": "/assets/turbo.min-c74be0932cb32c32e67be87ed26ae1eae819736c1055a6a4056c773f2b044211.js",
    "@hotwired/stimulus": "/assets/stimulus.min-dd364f16ec9504dfb72672295637a1c8838773b01c0b441bd41008124c407894.js",
    "@hotwired/stimulus-loading": "/assets/stimulus-loading-3576ce92b149ad5d6959438c6f291e2426c86df3b874c525b30faad51b0d96b3.js",
    "braintree-web-drop-in": "https://js.braintreegateway.com/web/dropin/1.45.1/js/dropin.js",
    "controllers/application": "/assets/controllers/application-c6d589ac623de36a476d6273165ef9739ee4ae4bfad82471c6fa11473d7e1abe.js",
    "controllers/braintree_controller": "/assets/controllers/braintree_controller-d440d62fd3910ebbabc87e1f24649089ac67c5f1171c5ebc78e1eb5bb42e57c5.js",
    "controllers/countdown_controller": "/assets/controllers/countdown_controller-77aa04eb5593d1945ba4100625858aeab35aa87a26a917100aeae00a25c74f93.js",
    "controllers": "/assets/controllers/index-31a9bee606cbc5cdb1593881f388bbf4c345bf693ea24e124f84b6d5c98ab648.js",
    "controllers/ppp_controller": "/assets/controllers/ppp_controller-e273be877a35a863012ab02b681b3a0d24677e90bafcdfde4280f55acdbf1808.js",
    "custom/smooth_scrolling": "/assets/custom/smooth_scrolling-85b6b1e6cbe1d5b71a82d90264904a2cfb57b0178fde031f95f2f0a49a42b632.js",
    "custom/toggles": "/assets/custom/toggles-bb8819e77e80893523c9a6290ee259269ef4cb0c0007e0f44aa4e6664b3b236d.js"
  }
}</script>
<link rel="modulepreload" href="/assets/application-41e70a375d9c25069955eeff05547ddba698a0b239192e9c011b1eaf9a98237a.js">
<link rel="modulepreload" href="/assets/turbo.min-c74be0932cb32c32e67be87ed26ae1eae819736c1055a6a4056c773f2b044211.js">
<link rel="modulepreload" href="/assets/stimulus.min-dd364f16ec9504dfb72672295637a1c8838773b01c0b441bd41008124c407894.js">
<link rel="modulepreload" href="/assets/stimulus-loading-3576ce92b149ad5d6959438c6f291e2426c86df3b874c525b30faad51b0d96b3.js">
<link rel="modulepreload" href="https://js.braintreegateway.com/web/dropin/1.45.1/js/dropin.js">
<link rel="modulepreload" href="/assets/controllers/application-c6d589ac623de36a476d6273165ef9739ee4ae4bfad82471c6fa11473d7e1abe.js">
<link rel="modulepreload" href="/assets/controllers/braintree_controller-d440d62fd3910ebbabc87e1f24649089ac67c5f1171c5ebc78e1eb5bb42e57c5.js">
<link rel="modulepreload" href="/assets/controllers/countdown_controller-77aa04eb5593d1945ba4100625858aeab35aa87a26a917100aeae00a25c74f93.js">
<link rel="modulepreload" href="/assets/controllers/index-31a9bee606cbc5cdb1593881f388bbf4c345bf693ea24e124f84b6d5c98ab648.js">
<link rel="modulepreload" href="/assets/controllers/ppp_controller-e273be877a35a863012ab02b681b3a0d24677e90bafcdfde4280f55acdbf1808.js">
<link rel="modulepreload" href="/assets/custom/smooth_scrolling-85b6b1e6cbe1d5b71a82d90264904a2cfb57b0178fde031f95f2f0a49a42b632.js">
<link rel="modulepreload" href="/assets/custom/toggles-bb8819e77e80893523c9a6290ee259269ef4cb0c0007e0f44aa4e6664b3b236d.js">
<script type="module">import "application"</script>


<link rel="alternate" type="application/atom+xml" title="Blog"
      href="https://feeds.feedburner.com/PragmaticStudio">


      <script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-280358-3', 'auto');
  ga('set', 'anonymizeIp', 'true');
  ga('send', 'pageview');
</script>

  </head>
  <body id="app" class="antialiased tutorials-page">
    <div id="page">
      <header class="flex flex-wrap items-center justify-between py-4 px-6 bg-gray-200 md:bg-white">
  <div>
    <a title="The Pragmatic Studio" href="/">
      <img alt="The Pragmatic Studio" title="The Pragmatic Studio" width="206" height="75" src="/assets/logo-grayscale-mn-20b9db03fce4919053506df87d08bd271ab835e796019ca239f46554288387a9.png" />
</a>  </div>

  <div class="md:hidden">
    <label for="menu-toggle"
         class="block text-gray-900 focus:outline hover:text-gray-500 focus:text-gray-500 cursor-pointer ">
      
      <svg fill="currentColor" class="w-6 h-6 fill-current " viewBox="0 0 20 20"><path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z"></path>
    </svg>
    
    </label>
  </div>

  <input class="hidden" type="checkbox" id="menu-toggle" />

  <div id="menu" class="hidden w-full md:block md:w-auto">
    <nav>
      <ul class="mt-10 mb-4 md:my-0 space-y-6 md:space-y-0 md:flex md:items-center md:justify-between md:space-x-6">
        <li><a class="inline-block text-gray-900 text-base font-semibold uppercase tracking-wider no-underline border-b-2 hover:border-green-700 border-transparent" href="/">Video Courses</a></li><li><a class="inline-block text-gray-900 text-base font-semibold uppercase tracking-wider no-underline border-b-2 hover:border-green-700 border-green-700" href="/tutorials">Free Tutorials</a></li><li><a class="inline-block text-gray-900 text-base font-semibold uppercase tracking-wider no-underline border-b-2 hover:border-green-700 border-transparent" href="/blog">Blog</a></li><li><a class="inline-block text-gray-900 text-base font-semibold uppercase tracking-wider no-underline border-b-2 hover:border-green-700 border-transparent" href="/signin">Sign In</a></li>
      </ul>
    </nav>
  </div>
</header>

      <div id="content">
      <div id="heading" class="container max-w-2xl mx-auto">
          <h1 class="black">Free Tutorials</h1>
  <h2>To help you stay on top of your game!</h2>

      </div>
    

<div class="container">
  <div class="mt-16 mx-auto max-w-3xl space-y-12">
      <div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/using-tailwind-css-in-phoenix"><img width="300" height="168" class="mx-auto shadow-lg" alt="Using Tailwind Css In Phoenix" src="/assets/tutorials/using-tailwind-css-in-phoenix-large-2e4096efd5cb41b4ba3501ed6f7e6cddcb8f8f79332e5af4bec35dc070651e7b.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/using-tailwind-css-in-phoenix">Using Tailwind CSS in Phoenix 1.7</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      A step-by-step tutorial for using Tailwind CSS in a Phoenix 1.7 app.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/formatting-heex-templates-in-vscode"><img width="300" height="168" class="mx-auto shadow-lg" alt="Formatting Heex Templates In Vscode" src="/assets/tutorials/formatting-heex-templates-in-vscode-large-b7b29d680a14654ac37e048343d063d23bb606f3e0a4d6dc82bf9175f140ae57.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/formatting-heex-templates-in-vscode">Formatting Phoenix HEEx Templates in VS Code</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      A modern, straightforward way to auto-format HEEx templates in VS Code.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/adding-tailwind-css-to-phoenix"><img width="300" height="168" class="mx-auto shadow-lg" alt="Adding Tailwind Css To Phoenix" src="/assets/tutorials/adding-tailwind-css-to-phoenix-large-614ded2264864bb4f925ec865186ff1cc70e9a0810a974f323e3b6e34df221e5.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/adding-tailwind-css-to-phoenix">Adding Tailwind CSS to Phoenix 1.6</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      A step-by-step tutorial for adding Tailwind CSS to a Phoenix 1.6 app.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/what-is-hotwire"><img width="300" height="168" class="mx-auto shadow-lg" alt="What Is Hotwire" src="/assets/tutorials/what-is-hotwire-large-080c9fa098877243a040544ea52d5ae4124e2db3875023298019a3a561057d7e.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/what-is-hotwire">What Is Hotwire?</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Hotwire gives us a practical alternative to the complexity of SPAs without sacrificing speed or functionality.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/adding-tailwind-css-to-phoenix-using-node"><img width="300" height="168" class="mx-auto shadow-lg" alt="Adding Tailwind Css To Phoenix Using Node" src="/assets/tutorials/adding-tailwind-css-to-phoenix-using-node-large-614ded2264864bb4f925ec865186ff1cc70e9a0810a974f323e3b6e34df221e5.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/adding-tailwind-css-to-phoenix-using-node">Adding Tailwind CSS to Phoenix 1.6 with Node</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      A step-by-step tutorial for adding Tailwind CSS to a Phoenix 1.6 app with Node and PostCSS.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/the-life-cycle-of-a-phoenix-liveview"><img width="300" height="168" class="mx-auto shadow-lg" alt="The Life Cycle Of A Phoenix Liveview" src="/assets/tutorials/the-life-cycle-of-a-phoenix-liveview-large-da7f5da8162bce7e5c3a0e423ccc451838915da0a9b9deb5d7f780d17b86b3f1.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/the-life-cycle-of-a-phoenix-liveview">The Lifecycle of a Phoenix LiveView</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      In this video we walk through and explain the lifecycle of a LiveView, as well as explore what's on the wire. Good stuff!
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/getting-started-with-phoenix-liveview"><img width="300" height="168" class="mx-auto shadow-lg" alt="Getting Started With Phoenix Liveview" src="/assets/tutorials/getting-started-with-phoenix-liveview-large-3070f7512033b1b0a9c3fbc1bf31fca41195c2750fe5051890b6d1dc50ffc5f4.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/getting-started-with-phoenix-liveview">Getting Started with Phoenix LiveView</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      In this video we build a basic Phoenix LiveView step-by-step from scratch.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/what-is-phoenix-liveview"><img width="300" height="168" class="mx-auto shadow-lg" alt="What Is Phoenix Liveview" src="/assets/tutorials/what-is-phoenix-liveview-large-68f6c5b1974e1b01ee335608cd2a4306f9785bdb8ea99a1db344940c76f41a63.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/what-is-phoenix-liveview">What Is Phoenix LiveView?</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      LiveView brings the heat without any of the burn, enabling you to build Phoenix apps with interactive, real-time user experiences without writing custom JavaScript.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/using-active-storage-in-rails"><img width="300" height="168" class="mx-auto shadow-lg" alt="Using Active Storage In Rails" src="/assets/tutorials/using-active-storage-in-rails-large-030c50c791257fa2034e460e0705e9ffd0d3dc6141e5eadc3e4f34b2a6cab08e.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/using-active-storage-in-rails">Using Active Storage in Rails 7</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Gone are the days when you have to use external gems to handle file uploads in Rails. Active Storage is now built into Rails, and we walk you through how to set it up and use it for file uploads.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/adding-tailwind-css-to-phoenix-1-4-and-1-5"><img width="300" height="168" class="mx-auto shadow-lg" alt="Adding Tailwind Css To Phoenix 1 4 And 1 5" src="/assets/tutorials/adding-tailwind-css-to-phoenix-1-4-and-1-5-large-d90823d464e3e91e145371cd9c0797d8ed37dd5c09553679dbdfbb7c936c963d.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/adding-tailwind-css-to-phoenix-1-4-and-1-5">Adding Tailwind CSS to Phoenix 1.4 and 1.5</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      We walk step-by-step through how to add Tailwind CSS to Phoenix 1.4 and 1.5 apps.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/how-to-setup-graphql-in-a-phoenix-app"><img width="300" height="168" class="mx-auto shadow-lg" alt="How To Setup Graphql In A Phoenix App" src="/assets/tutorials/how-to-setup-graphql-in-a-phoenix-app-large-46441b6ee798bb7bf57414d3bf900589071b0a2c612d7897ca277f5dde14381b.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/how-to-setup-graphql-in-a-phoenix-app">How To Setup GraphQL in a Phoenix Application</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Starting with a newly-generated Phoenix 1.4 app, we walk step-by-step through how to add a GraphQL API layer using Absinthe atop an Ecto data model.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/what-is-absinthe"><img width="300" height="168" class="mx-auto shadow-lg" alt="What Is Absinthe" src="/assets/tutorials/what-is-absinthe-large-dae5b5b2a596477ed2941899eb691d3e20215808a73e06c811af79cfdbd8ffd3.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/what-is-absinthe">What Is Absinthe?</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Absinthe is a world-class GraphQL implementation in Elixir. Combine that with the super-fast Phoenix framework, and you've got yourself a robust, high-performance GraphQL API!
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/what-does-a-graphql-api-know"><img width="300" height="168" class="mx-auto shadow-lg" alt="What Does A Graphql Api Know" src="/assets/tutorials/what-does-a-graphql-api-know-large-50994b9b4ef41781254a13ffdbcddbe61aa8f7d73b957b7032a08ec82eff36e1.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/what-does-a-graphql-api-know">What Does A GraphQL API Know?</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      A GraphQL API is defined by a schema that describes everything that's possible. And GraphQL clients can introspect that schema. In this 6-minute video, you'll see how!
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/what-can-graphql-do"><img width="300" height="168" class="mx-auto shadow-lg" alt="What Can Graphql Do" src="/assets/tutorials/what-can-graphql-do-large-6caa8add32d76b461706b010dd87566513226a23895cf970f8fca7714075c1a6.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/what-can-graphql-do">What Can GraphQL Do?</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      GraphQL lets you query your data, but there's so much more. In this 5-minute video, you'll see GraphQL queries, mutations, and subscriptions in action!
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/what-is-graphql"><img width="300" height="168" class="mx-auto shadow-lg" alt="What Is Graphql" src="/assets/tutorials/what-is-graphql-large-1e3e8f035fc5e0548a993b19ba38a3fed945a7c0f11ecb7d52674acb0b2f1577.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/what-is-graphql">What Is GraphQL?</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      It's an expressive query language for your API that blah, blah, blah... Indeed, our eyes glazed over every time we tried to write a definition for you. So we decided to take a different approach! In this short animation, you'll see what GraphQL is!
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/vue-cli"><img width="300" height="168" class="mx-auto shadow-lg" alt="Vue Cli" src="/assets/tutorials/vue-cli-large-9b047ee391bd332c76369159c63045a6da0a1e7d4415b90846181181a015095e.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/vue-cli">Create, Build, and Serve Apps with the Vue CLI</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Learn how to rapidly create, build, and serve Vue.js apps in development and production environments using the Vue CLI.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/rails-session-cookies-for-api-authentication"><img width="300" height="168" class="mx-auto shadow-lg" alt="Rails Session Cookies For Api Authentication" src="/assets/tutorials/rails-session-cookies-for-api-authentication-large-9354dbddc724e219f515b8c2b6d9a3f1662691c067babf833ae9101efe3f8797.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/rails-session-cookies-for-api-authentication">Using Rails Session Cookies for API Authentication</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Avoid the security perils of storing an API access token in localStorage by using session cookies to authenticate users of a Rails 5 API.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/elm-with-rails"><img width="300" height="168" class="mx-auto shadow-lg" alt="Elm With Rails" src="/assets/tutorials/elm-with-rails-large-4f9d829ec286945002ba1aaf1bd79a9ca4f1f93617cee3b7cc45d1bb011d1c4c.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/elm-with-rails">Integrate Elm with Rails</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Rails 5 makes it easy to sprinkle bits of Elm into your app, or even to go all-in with Elm!
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/create-elixir-mix-project-and-run-code"><img width="300" height="168" class="mx-auto shadow-lg" alt="Create Elixir Mix Project And Run Code" src="/assets/tutorials/create-elixir-mix-project-and-run-code-large-4062e91ab701145db7eb66593ea7d53f7ac53642e77531d8291f3f37decf2139.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/create-elixir-mix-project-and-run-code">Create a Mix Project and Run Elixir Code</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Creating an Elixir project and running code is straightforward thanks to good conventions and solid tooling.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/debug-elm-apps"><img width="300" height="168" class="mx-auto shadow-lg" alt="Debug Elm Apps" src="/assets/tutorials/debug-elm-apps-large-26eee1e78cb77b0c49c245ae6dcca4a46ae4e0c9e0c0643d863fc3e7d8656cb3.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/debug-elm-apps">Debug Elm Apps</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      The Elm debugger is a game-changer, and a <em>conversation</em> changer.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/what-is-elm"><img width="300" height="168" class="mx-auto shadow-lg" alt="What Is Elm" src="/assets/tutorials/what-is-elm-large-fd04421f24b5eb206b60613284e1d281a514cc9ea7a6f7b901699f580bf2f106.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/what-is-elm">What Is Elm? Essentials of the Elm Language</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Elm is getting a lot of attention these days, and you might be wondering what all the fuss is about. 
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/ruby-macros"><img width="300" height="168" class="mx-auto shadow-lg" alt="Ruby Macros" src="/assets/tutorials/ruby-macros-large-f9d2d9485e48f42c6ce792ed021b2be72ed9a6290ab4d3b20e573bdbbb740018.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/ruby-macros">Write Macros in Ruby</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      By recreating a simplified version of the <tt>has_many</tt> Rails declaration from scratch, you'll be able to apply this same powerful technique in your own Ruby code!
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/ruby-partition-map-reduce"><img width="300" height="168" class="mx-auto shadow-lg" alt="Ruby Partition Map Reduce" src="/assets/tutorials/ruby-partition-map-reduce-large-6c758d12a8939a642244f7169be50017168c6f5423fe7cfc662d13469ead02b2.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/ruby-partition-map-reduce">Map, Reduce, and Partition with Ruby</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Ruby's <tt>Enumerable</tt> module is jam-packed with powerful methods. Knowing how to use them will instantly make you a more efficient Ruby programmer.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/ruby-block-syntax"><img width="300" height="168" class="mx-auto shadow-lg" alt="Ruby Block Syntax" src="/assets/tutorials/ruby-block-syntax-large-abab5da652bae65413746d951f50ff630467d0f0112f8bd5f32b21abf835c3ad.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/ruby-block-syntax">Master Ruby Block Syntax</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      To be an effective Ruby programmer, you'll need to master one of the language's most powerful features: blocks.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/rails-console-shortcuts-tips-tricks"><img width="300" height="168" class="mx-auto shadow-lg" alt="Rails Console Shortcuts Tips Tricks" src="/assets/tutorials/rails-console-shortcuts-tips-tricks-large-cd27671097f9124c840ea74cc92d3b47fb5a20a876aca9ef64c31dbaf573440e.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/rails-console-shortcuts-tips-tricks">Rails Console Shortcuts, Tips, and Tricks</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      A handy collection of shortcuts, tips, and tricks to help you get the most out of your time in the Rails console.
    </p>
  </div>
</div>
<div class="sm:flex sm:items-start sm:space-x-8">
  <div class="flex-none sm:w-1/4">
    <a href="https://pragmaticstudio.com/tutorials/view-source-ruby-methods"><img width="300" height="168" class="mx-auto shadow-lg" alt="View Source Ruby Methods" src="/assets/tutorials/view-source-ruby-methods-large-ed1e14694f79b99be2225cfde617c4f1a3b462df42682b1a589d2ec9274a5961.png" /></a>
  </div>
  <div class="mt-6 sm:mt-0 text-center sm:text-left">
    <h3 class="text-xl font-semibold">
      <a href="/tutorials/view-source-ruby-methods">View Source On Ruby Methods</a>
    </h3>
    <p class="text-lg text-gray-600 mt-2">
      Go directly to the source of any Ruby method and pop it open in your editor!
    </p>
  </div>
</div>

  </div>
</div>

  </div>
  <footer class="border-t-8 border-green-700 bg-studio-charcoal text-studio-medium-gray py-8">
  <div class="container">
    <div class="row items-center">
      <div class="column column-1/3">
        <a title="The Pragmatic Studio" href="/">
          <img alt="The Pragmatic Studio" title="The Pragmatic Studio" width="400" height="178" src="/assets/logo-white-green-lg-531368dd8e3e6097de619d60b224e519f9e0b77b0d56b0378017e6695a5201ff.png" />
</a>      </div>
      <div class="column">
        <p class="leading-normal text-studio-medium-gray">
          <span class="font-bold">The Pragmatic Studio</span> is where software developers have come since 2005 to learn, practice, and improve their craft. In our acclaimed video courses, you get the most up-to-date and approachable developer training around!
          <span class="font-bold"><a class="text-medium-gray" href="/about">Learn more &#8594;</a></span>
        </p>
      </div>
    </div>
    <div class="row">
      <div class="column column-2/12">
        <h5 class="text-sm font-semibold studio-dark-gray tracking-wider uppercase">
          Company
        </h5>
        <ul class="mt-4 space-y-2">
          <li>
            <a class="whitespace-nowrap text-base studio-medium-gray hover:text-white no-underline" href="/about">About Us</a>
          </li>
          <li>
            <a class="whitespace-nowrap text-base studio-medium-gray hover:text-white no-underline" href="/contact">Contact Us</a>
          </li>
          <li>
            <a class="text-base studio-medium-gray hover:text-white no-underline" href="/blog">Blog</a>
          </li>
        </ul>
      </div>
      <div class="column column-2/12">
        <h5 class="text-sm font-semibold studio-dark-gray tracking-wider uppercase">
          Learn
        </h5>
        <ul class="mt-4 space-y-2">
          <li>
            <a class="text-base studio-medium-gray hover:text-white no-underline" href="/">Courses</a>
          </li>
          <li>
            <a class="text-base studio-medium-gray hover:text-white no-underline" href="/tutorials">Tutorials</a>
          </li>
          <li>
            <a href="https://pragprog.com" target="_blank" rel="noopener" class="text-base studio-medium-gray hover:text-white no-underline">Books</a>
          </li>
        </ul>
      </div>
      <div class="column column-2/12">
        <h5 class="text-sm font-semibold studio-dark-gray tracking-wider uppercase">
          Fine Print
        </h5>
        <ul class="mt-4 space-y-2">
          <li>
            <a class="text-base studio-medium-gray hover:text-white no-underline" href="/privacy">Privacy</a>
          </li>
          <li>
            <a class="text-base studio-medium-gray hover:text-white no-underline" href="/terms-of-use">Terms</a>
          </li>
        </ul>
      </div>
      <div class="column">
        <h5 class="text-sm font-semibold studio-dark-gray tracking-wider uppercase">
          What's Up In The Studio?
        </h5>
        <p class="mt-2 text-base studio-medium-gray">
          Subscribe to our newsletter to find out!
        </p>
        <form class="js-cm-form mt-4 sm:flex sm:max-w-sm" id="subForm" action="https://www.createsend.com/t/subscribeerror?description=" method="post" data-id="191722FC90141D02184CB1B62AB3DC263A6C513413D2E63DB2E029CAD075CBF4D617B75147BE7B409D4CE6E601D35D59D71DF0A0BBE801708B124645064D2F19">
          <input autocomplete="Email" aria-label="Email" class="js-cm-email-input qa-input-email shadow-sm rounded-lg relative block border-gray-400 text-gray-900 focus:outline-none focus:ring-1 focus:ring-green-500 focus:border-green-500 focus:z-10 w-full" id="fieldEmail2" maxlength="200" name="cm-athvl-athvl" required="" type="email"
          placeholder="Your Email...">
          <input id="cm-privacy-email-hidden" name="cm-privacy-email-hidden" type="hidden" value="true">
          <button type="submit" class="mt-3 sm:mt-0 sm:ml-3 w-full sm:w-auto text-white bg-green-700 hover:bg-green-600 active:bg-green-700 focus:ring-green-500 text-sm text-center font-medium uppercase tracking-wider px-4 py-2  rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-offset-2 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none no-underline">Subscribe</button>
        </form>
        <script type="text/javascript" src="https://js.createsend1.com/javascript/copypastesubscribeformlogic.js"></script>
        <div class="mt-4 flex items-center space-x-4">
          <a href="https://twitter.com/pragmaticstudio"
             target="_blank" rel="noopener"
             class="studio-dark-gray hover:text-gray-500">
            
      <svg viewBox="0 0 24 24" class="w-6 h-6 fill-current "><path d="M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z"/></svg>
    
          </a>
          <a href="https://www.youtube.com/channel/UCHC0-jLpQQxlav1kqpzDIvw"
             target="_blank" rel="noopener"
             class="studio-dark-gray hover:text-gray-500">
            
      <svg width="24" height="24" fill="currentColor" class="w-6 h-6 fill-current ">
      <clipPath id="clip0"><path d="M0 0h24v24H0z"></path></clipPath>
      <path d="M12.04 3.5c.59 0 7.54.02 9.34.5a3.02 3.02 0 012.12 2.15C24 8.05 24 12 24 12v.04c0 .43-.03 4.03-.5 5.8A3.02 3.02 0 0121.38 20c-1.76.48-8.45.5-9.3.51h-.17c-.85 0-7.54-.03-9.29-.5A3.02 3.02 0 01.5 17.84c-.42-1.61-.49-4.7-.5-5.6v-.5c.01-.9.08-3.99.5-5.6A3.02 3.02 0 012.62 4c1.8-.49 8.75-.51 9.34-.51l.08.01zm-2.5 4.9v7.18L15.82 12 9.54 8.41V8.4z"></path></svg>
    
          </a>
          <a href="mailto:hello@pragmaticstudio.com"
             class="studio-dark-gray hover:text-gray-500">
            
      <svg viewBox="0 0 20 20" class="w-6 h-6 fill-current " fill="currentColor">
        <path d="M2.003 5.884L10 9.882l7.997-3.998A2 2 0 0016 4H4a2 2 0 00-1.997 1.884z" />
        <path d="M18 8.118l-8 4-8-4V14a2 2 0 002 2h12a2 2 0 002-2V8.118z" />
      </svg>
    
          </a>
        </div>
      </div>
    </div>
    <div class="mt-6 flex items-center space-x-8 justify-between">
      <p class="text-base studio-dark-gray">
        Copyright &copy; 2005&#8211;2026, The Pragmatic Studio. All Rights Reserved.
      </p>
    </div>
  </div>
</footer>

</div>
</body>
</html>
