<?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>Forem: Maksudul Haque</title>
    <description>The latest articles on Forem by Maksudul Haque (@saadmk11).</description>
    <link>https://forem.com/saadmk11</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%2F451265%2Fe2aef773-9a87-4168-b841-ba9ee68266eb.jpeg</url>
      <title>Forem: Maksudul Haque</title>
      <link>https://forem.com/saadmk11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/saadmk11"/>
    <language>en</language>
    <item>
      <title>Auto Index and Search Django Model Instances with RediSearch (using redis-search-django)</title>
      <dc:creator>Maksudul Haque</dc:creator>
      <pubDate>Sun, 21 Aug 2022 14:52:00 +0000</pubDate>
      <link>https://forem.com/saadmk11/auto-index-and-search-django-model-instances-with-redisearch-using-redis-search-django-4add</link>
      <guid>https://forem.com/saadmk11/auto-index-and-search-django-model-instances-with-redisearch-using-redis-search-django-4add</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;I built an &lt;strong&gt;Installable Django Package&lt;/strong&gt; called &lt;strong&gt;&lt;a href="https://github.com/saadmk11/redis-search-django" rel="noopener noreferrer"&gt;&lt;code&gt;redis-search-django&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; as a part of Redis Hackathon on DEV. &lt;code&gt;redis-search-django&lt;/code&gt; is a Django package that provides &lt;strong&gt;auto indexing&lt;/strong&gt; and &lt;strong&gt;searching&lt;/strong&gt; capabilities for &lt;strong&gt;Django Model instances&lt;/strong&gt; using &lt;strong&gt;&lt;a href="https://redis.io/docs/stack/search/" rel="noopener noreferrer"&gt;RediSearch&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;redis-search-django&lt;/code&gt; internally uses &lt;a href="https://github.com/redis/redis-om-python" rel="noopener noreferrer"&gt;redis-om-python&lt;/a&gt; and &lt;a href="https://github.com/redis/redis-py" rel="noopener noreferrer"&gt;redis-py&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;redis-search-django&lt;/code&gt; is Available on Python Package Index (&lt;strong&gt;PyPI&lt;/strong&gt;): &lt;a href="https://pypi.org/project/redis-search-django/" rel="noopener noreferrer"&gt;https://pypi.org/project/redis-search-django/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can install it by running: &lt;code&gt;pip install redis-search-django&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Management Command to create, update and populate the RediSearch Index.&lt;/li&gt;
&lt;li&gt;Auto Index on Model object Create, Update and Delete.&lt;/li&gt;
&lt;li&gt;Auto Index on Related Model object Add, Update, Remove and Delete.&lt;/li&gt;
&lt;li&gt;Easy to create Document classes (Uses Django Model Form Class like structure).&lt;/li&gt;
&lt;li&gt;Index nested models (e.g: &lt;code&gt;OneToOneField&lt;/code&gt;, &lt;code&gt;ForeignKey&lt;/code&gt; and &lt;code&gt;ManyToManyField&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Search documents using &lt;code&gt;redis-om&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Search Result Pagination.&lt;/li&gt;
&lt;li&gt;Search Result Sorting.&lt;/li&gt;
&lt;li&gt;RediSearch Result to Django QuerySet.&lt;/li&gt;
&lt;li&gt;Faceted Search.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Wacky Wildcards Or, Microservice Mavens&lt;br&gt;
(Because a Django Package does not fit into other Categories)&lt;/p&gt;
&lt;h3&gt;
  
  
  Language Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Django Package Repository:&lt;/strong&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/saadmk11" rel="noopener noreferrer"&gt;
        saadmk11
      &lt;/a&gt; / &lt;a href="https://github.com/saadmk11/redis-search-django" rel="noopener noreferrer"&gt;
        redis-search-django
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Django package that provides auto indexing and searching capabilities for Django model instances using RediSearch.
    &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;redis-search-django&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://pypi.org/project/redis-search-django/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3b6f842afbc2b3ed174cd85116f9702159d57401efebbf6d6da09ed0c2b3b0c5/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f72656469732d7365617263682d646a616e676f2e7376673f7374796c653d666c61742d737175617265" alt="Pypi Version"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/redis-search-django/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/916594292ab1517582e24bf81b537de1927b29abe9d28a392c00a31b924cc086/68747470733a2f2f696d672e736869656c64732e696f2f707970692f707976657273696f6e732f72656469732d7365617263682d646a616e676f3f7374796c653d666c61742d737175617265" alt="Supported Python Versions"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/redis-search-django/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f4e81294e007c86b579d609860d0a34f3079d9b966807ef9fb27341751a00a45/68747470733a2f2f696d672e736869656c64732e696f2f707970692f6672616d65776f726b76657273696f6e732f646a616e676f2f72656469732d7365617263682d646a616e676f3f636f6c6f723d6461726b677265656e267374796c653d666c61742d737175617265" alt="Supported Django Versions"&gt;&lt;/a&gt;
&lt;a href="https://github.com/saadmk11/redis-search-django/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b3750e6a598f5c7f93593e4921a46b5732172078cefb414b43a621109016905e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f736161646d6b31312f72656469732d7365617263682d646a616e676f3f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8d0476ba7dee804c740f562f2e3d379004f5be19b75cbe86a503bdca22c9d65f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f736161646d6b31312f72656469732d7365617263682d646a616e676f2f746573742e796d6c3f3f6c6162656c3d54657374267374796c653d666c61742d737175617265266272616e63683d6d61696e"&gt;&lt;img src="https://camo.githubusercontent.com/8d0476ba7dee804c740f562f2e3d379004f5be19b75cbe86a503bdca22c9d65f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f736161646d6b31312f72656469732d7365617263682d646a616e676f2f746573742e796d6c3f3f6c6162656c3d54657374267374796c653d666c61742d737175617265266272616e63683d6d61696e" alt="Django Tests"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/da5ebaa0eb894a7e93b9035b5a996851795412d95e7c385a68842681623ce994/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f736161646d6b31312f72656469732d7365617263682d646a616e676f3f7374796c653d666c61742d73717561726526746f6b656e3d75676a485862454b6962"&gt;&lt;img src="https://camo.githubusercontent.com/da5ebaa0eb894a7e93b9035b5a996851795412d95e7c385a68842681623ce994/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f736161646d6b31312f72656469732d7365617263682d646a616e676f3f7374796c653d666c61742d73717561726526746f6b656e3d75676a485862454b6962" alt="Codecov"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/39c02ea4d28e17721781dd1829e8f96dfe54922eedb49ee0d9dcff24036076ee/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7072652d2d636f6d6d69742e63692d656e61626c65642d627269676874677265656e3f6c6f676f3d7072652d636f6d6d6974266c6f676f436f6c6f723d7768697465267374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/39c02ea4d28e17721781dd1829e8f96dfe54922eedb49ee0d9dcff24036076ee/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7072652d2d636f6d6d69742e63692d656e61626c65642d627269676874677265656e3f6c6f676f3d7072652d636f6d6d6974266c6f676f436f6c6f723d7768697465267374796c653d666c61742d737175617265" alt="pre-commit.ci"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f0b0319ddd693d649060d9b5152052895dd7d00ce5fbb1e78683ae7b63dab09f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f736161646d6b31312f72656469732d7365617263682d646a616e676f2f6368616e67656c6f672d63692e79616d6c3f3f6c6162656c3d4368616e67656c6f672d4349267374796c653d666c61742d737175617265266272616e63683d6d61696e"&gt;&lt;img src="https://camo.githubusercontent.com/f0b0319ddd693d649060d9b5152052895dd7d00ce5fbb1e78683ae7b63dab09f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f736161646d6b31312f72656469732d7365617263682d646a616e676f2f6368616e67656c6f672d63692e79616d6c3f3f6c6162656c3d4368616e67656c6f672d4349267374796c653d666c61742d737175617265266272616e63683d6d61696e" alt="Changelog-CI"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8d3382964079a5ccb0a5f75512cdac39e85813981e5db67e295687e4c1f3e0c3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f64652532305374796c652d426c61636b2d626c61636b3f7374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/8d3382964079a5ccb0a5f75512cdac39e85813981e5db67e295687e4c1f3e0c3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f64652532305374796c652d426c61636b2d626c61636b3f7374796c653d666c61742d737175617265" alt="Code Style"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;About&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A Django package that provides &lt;strong&gt;auto indexing&lt;/strong&gt; and &lt;strong&gt;searching&lt;/strong&gt; capabilities for Django model instances using &lt;strong&gt;&lt;a href="https://redis.io/docs/stack/search/" rel="nofollow noopener noreferrer"&gt;RediSearch&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Features&lt;/h1&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Management Command to create, update and populate the RediSearch Index.&lt;/li&gt;
&lt;li&gt;Auto Index on Model object Create, Update and Delete.&lt;/li&gt;
&lt;li&gt;Auto Index on Related Model object Add, Update, Remove and Delete.&lt;/li&gt;
&lt;li&gt;Easy to create Document classes (Uses Django Model Form Class like structure).&lt;/li&gt;
&lt;li&gt;Index nested models (e.g: &lt;code&gt;OneToOneField&lt;/code&gt;, &lt;code&gt;ForeignKey&lt;/code&gt; and &lt;code&gt;ManyToManyField&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Search documents using &lt;code&gt;redis-om&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Search Result Pagination.&lt;/li&gt;
&lt;li&gt;Search Result Sorting.&lt;/li&gt;
&lt;li&gt;RediSearch Result to Django QuerySet.&lt;/li&gt;
&lt;li&gt;Faceted Search.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Requirements&lt;/h1&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Python: 3.7, 3.8, 3.9, 3.10&lt;/li&gt;
&lt;li&gt;Django: 3.2, 4.0, 4.1&lt;/li&gt;
&lt;li&gt;redis-om: &amp;gt;= 0.0.27&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Redis&lt;/h1&gt;

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

&lt;/div&gt;
&lt;p&gt;The latest version of Redis is available from &lt;a href="https://redis.io/" rel="nofollow noopener noreferrer"&gt;Redis.io&lt;/a&gt;. You can also install Redis with your operating system's package manager.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;RediSearch and RedisJSON&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;redis-search-django&lt;/code&gt; relies on the &lt;a href="https://redis.io/docs/stack/search/" rel="nofollow noopener noreferrer"&gt;RediSearch&lt;/a&gt; and &lt;a href="https://redis.io/docs/stack/json/" rel="nofollow noopener noreferrer"&gt;RedisJSON&lt;/a&gt; Redis modules to support rich queries and embedded models
You need these Redis…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/saadmk11/redis-search-django" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Demo App Repository:&lt;/strong&gt;&lt;br&gt;
(&lt;strong&gt;README&lt;/strong&gt; file contains the details as per &lt;strong&gt;Hackathon Requirements&lt;/strong&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/saadmk11" rel="noopener noreferrer"&gt;
        saadmk11
      &lt;/a&gt; / &lt;a href="https://github.com/saadmk11/try-redis-search-django" rel="noopener noreferrer"&gt;
        try-redis-search-django
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;Auto Index and Search Django Model Instances with RediSearch (using &lt;code&gt;redis-search-django&lt;/code&gt;)&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Description&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;I built an &lt;strong&gt;Installable Django Package&lt;/strong&gt; called &lt;strong&gt;&lt;a href="https://github.com/saadmk11/redis-search-django" rel="noopener noreferrer"&gt;&lt;code&gt;redis-search-django&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; as a part of &lt;strong&gt;&lt;a href="https://dev.to/devteam/announcing-the-redis-hackathon-on-dev-3248" rel="nofollow"&gt;Redis Hackathon on DEV&lt;/a&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;code&gt;redis-search-django&lt;/code&gt;&lt;/strong&gt; is a package that provides &lt;strong&gt;auto indexing&lt;/strong&gt; and &lt;strong&gt;searching&lt;/strong&gt; capabilities for Django model instances using &lt;strong&gt;&lt;a href="https://redis.io/docs/stack/search/" rel="nofollow noopener noreferrer"&gt;RediSearch&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is a Demo App that uses &lt;code&gt;redis-search-django&lt;/code&gt; package to Showcase a Product Search Engine with &lt;strong&gt;auto indexing&lt;/strong&gt; and &lt;strong&gt;searching&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;redis-search-django Documentation:&lt;/strong&gt; &lt;a href="https://github.com/saadmk11/redis-search-django" rel="noopener noreferrer"&gt;https://github.com/saadmk11/redis-search-django&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Features&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Management Command to create, update and populate the RediSearch Index.&lt;/li&gt;
&lt;li&gt;Auto Index on Model object Create, Update and Delete.&lt;/li&gt;
&lt;li&gt;Auto Index on Related Model object Add, Update, Remove and Delete.&lt;/li&gt;
&lt;li&gt;Easy to create Document classes (Uses Django Model Form Class like structure).&lt;/li&gt;
&lt;li&gt;Index nested models (e.g: &lt;code&gt;OneToOneField&lt;/code&gt;, &lt;code&gt;ForeignKey&lt;/code&gt; and &lt;code&gt;ManyToManyField&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Search documents using &lt;code&gt;redis-om&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Search Result Pagination.&lt;/li&gt;
&lt;li&gt;Search Result Sorting.&lt;/li&gt;
&lt;li&gt;RediSearch Result to Django QuerySet.&lt;/li&gt;
&lt;li&gt;Faceted Search.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;App Architecture Diagram&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/24854406/185867964-f03898af-fc63-45bc-836a-26a9b7ad694a.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F24854406%2F185867964-f03898af-fc63-45bc-836a-26a9b7ad694a.png" alt="Group 3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;App Screenshot&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/24854406/185760945-18bacae6-af2e-48bd-a412-d6fac878fd0c.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F24854406%2F185760945-18bacae6-af2e-48bd-a412-d6fac878fd0c.png" alt="RediSearch Django"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it&lt;/h2&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/saadmk11/try-redis-search-django" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;h4&gt;
  
  
  Architecture Diagram
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.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%2F6kkttmcx1qkc1vx2rb4p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F6kkttmcx1qkc1vx2rb4p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How to use it
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Create Search Document from Django Model. (Using &lt;code&gt;redis-search-django&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. For Django Model:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# models.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Category&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SlugField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. You can create a document class like this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# documents.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;redis_search_django.documents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;JsonDocument&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Category&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CategoryDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JsonDocument&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Django&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Category&lt;/span&gt;
        &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;slug&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Run Django Management Command &lt;code&gt;Index&lt;/code&gt; to create the index on Redis (Only need to run once to generate Index Schema on Redis):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This will also populate the index with existing data from the database&lt;/p&gt;

&lt;p&gt;Now &lt;strong&gt;category objects&lt;/strong&gt; will be indexed &lt;strong&gt;automatically&lt;/strong&gt; using &lt;strong&gt;Redis&lt;/strong&gt; on &lt;strong&gt;create/update/delete&lt;/strong&gt; events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More Complex Examples Can be found here:&lt;/strong&gt; &lt;a href="https://github.com/saadmk11/redis-search-django" rel="noopener noreferrer"&gt;https://github.com/saadmk11/redis-search-django&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Screenshot of the Demo App:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fgcw5inn3h3ejc8lij71n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fgcw5inn3h3ejc8lij71n.png" alt="Image description"&gt;&lt;/a&gt;&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" rel="noopener noreferrer"&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" rel="noopener noreferrer"&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" rel="noopener noreferrer"&gt;free Redis database&lt;/a&gt;.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>redishackathon</category>
      <category>python</category>
      <category>redis</category>
      <category>django</category>
    </item>
    <item>
      <title>Visually Review HTML file changes introduced on a Pull Request with Comment Webpage Screenshot GitHub Action</title>
      <dc:creator>Maksudul Haque</dc:creator>
      <pubDate>Sun, 21 Nov 2021 14:22:56 +0000</pubDate>
      <link>https://forem.com/saadmk11/visually-review-html-file-changes-introduced-on-a-pull-request-with-comment-webpage-screenshot-github-action-43gd</link>
      <guid>https://forem.com/saadmk11/visually-review-html-file-changes-introduced-on-a-pull-request-with-comment-webpage-screenshot-github-action-43gd</guid>
      <description>&lt;h2&gt;
  
  
  My Workflow
&lt;/h2&gt;

&lt;p&gt;Comment Webpage Screenshot is a GitHub Action that &lt;strong&gt;captures screenshots of webpages&lt;/strong&gt; and &lt;strong&gt;HTML files&lt;/strong&gt; located in the repository, uploads them to an Image Upload Service and &lt;strong&gt;comments the screenshots&lt;/strong&gt; on the &lt;strong&gt;pull request&lt;/strong&gt; that triggered the action.&lt;/p&gt;

&lt;p&gt;This action helps maintainers &lt;strong&gt;visually review&lt;/strong&gt; HTML file changes introduced on a Pull Request by adding comments with the screenshots of the latest HTML file changes on the Pull Request&lt;/p&gt;

&lt;h2&gt;
  
  
  Submission Category:
&lt;/h2&gt;

&lt;p&gt;Maintainer Must-Haves&lt;/p&gt;

&lt;h2&gt;
  
  
  Yaml File or Link to Code
&lt;/h2&gt;

&lt;p&gt;Here are the links for Comment Webpage Screenshot&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/saadmk11" rel="noopener noreferrer"&gt;
        saadmk11
      &lt;/a&gt; / &lt;a href="https://github.com/saadmk11/comment-webpage-screenshot" rel="noopener noreferrer"&gt;
        comment-webpage-screenshot
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A GitHub Action that Helps to Visually Review HTML file changes on a Pull Request by adding comments with the screenshots of the HTML file changes on the PR
    &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;Comment Webpage Screenshot&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Comment Webpage Screenshot is a GitHub Action that &lt;strong&gt;captures screenshots&lt;/strong&gt; of
&lt;strong&gt;web pages&lt;/strong&gt; and &lt;strong&gt;HTML files&lt;/strong&gt; located in the repository
uploads them to an &lt;a href="https://github.com/saadmk11/comment-webpage-screenshot#available-image-upload-services" rel="noopener noreferrer"&gt;Image Upload Service&lt;/a&gt; and
&lt;strong&gt;comments&lt;/strong&gt; the screenshots on the &lt;strong&gt;pull request&lt;/strong&gt; that &lt;strong&gt;triggered&lt;/strong&gt; the action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This Action Only Works on Pull Requests.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Workflow inputs&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;These are the inputs that can be provided on the workflow.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;upload_to&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Image Upload Service Name (Options are: &lt;code&gt;github_branch&lt;/code&gt;, &lt;code&gt;imgur&lt;/code&gt;) &lt;strong&gt;&lt;a href="https://github.com/saadmk11/comment-webpage-screenshot#available-image-upload-services" rel="noopener noreferrer"&gt;More Details&lt;/a&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github_branch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;capture_changed_html_files&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Enable or Disable Screenshot Capture for Changed HTML Files on the Pull Request (Options are: &lt;code&gt;yes&lt;/code&gt;, &lt;code&gt;no&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yes&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;capture_html_file_paths&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Comma Seperated paths to the HTML files to be captured (Example: &lt;code&gt;/pages/index.html, about.html&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;capture_urls&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Comma Seperated URLs to be captured (Example: &lt;code&gt;https://dev.example.com, https://dev.example.com/about.html&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github_token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;GITHUB_TOKEN&lt;/code&gt; provided by the workflow run or Personal Access Token (PAT)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github.token&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Example Workflow&lt;/h2&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/saadmk11/comment-webpage-screenshot" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Marketplace:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/marketplace/actions/comment-webpage-screenshot" rel="noopener noreferrer"&gt;https://github.com/marketplace/actions/comment-webpage-screenshot&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Additional Resources / Info
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Example: Capture Screenshots for Static HTML Pages built with TailwindCSS
&lt;/h3&gt;

&lt;p&gt;If your repository contains &lt;strong&gt;only static files&lt;/strong&gt; and does &lt;strong&gt;not require a server&lt;/strong&gt;. You can just put the &lt;strong&gt;file path&lt;/strong&gt; of the &lt;strong&gt;HTML files&lt;/strong&gt; you want to capture screenshot of.&lt;/p&gt;

&lt;p&gt;In this Example I'll show you how I used &lt;code&gt;saadmk11/comment-website-screenshot&lt;/code&gt; GitHub Action to Visually Review Static file Changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WorkFlow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Capture Webpage Screenshot&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;opened&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;synchronize&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Capture Webpage Screenshot&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;saadmk11/comment-website-screenshot@v0.5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;upload_to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github_branch&lt;/span&gt;
          &lt;span class="c1"&gt;# Capture Screenshots of Changed HTML Files&lt;/span&gt;
          &lt;span class="na"&gt;capture_changed_html_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
          &lt;span class="c1"&gt;# Comma separated paths to any other HTML File&lt;/span&gt;
          &lt;span class="na"&gt;capture_html_file_paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index.html"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Output Screenshot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ff0hm2wu92ionitnrv0va.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ff0hm2wu92ionitnrv0va.png" alt="comment-webpage-screenshot Example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The HTML Template Shown in this Example was Taken from Tailwind UI&lt;/strong&gt;&lt;br&gt;
Tailwind UI Provides Awesome Pre-Built TailwindCSS Components. Check them out here: &lt;a href="https://tailwindui.com/" rel="noopener noreferrer"&gt;https://tailwindui.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Pull Request:&lt;/strong&gt; &lt;a href="https://github.com/saadmk11/static-page-screenshot-demo/pull/2" rel="noopener noreferrer"&gt;https://github.com/saadmk11/static-page-screenshot-demo/pull/2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo Repository:&lt;/strong&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/saadmk11" rel="noopener noreferrer"&gt;
        saadmk11
      &lt;/a&gt; / &lt;a href="https://github.com/saadmk11/static-page-screenshot-demo" rel="noopener noreferrer"&gt;
        static-page-screenshot-demo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;static-page-screenshot-demo&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;Templates Collected from Tailwind UI.&lt;/p&gt;

&lt;p&gt;Check it out here: &lt;a href="https://tailwindui.com/" rel="nofollow noopener noreferrer"&gt;https://tailwindui.com/&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/saadmk11/static-page-screenshot-demo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h3&gt;
  
  
  Note
&lt;/h3&gt;

&lt;p&gt;You can also use this for Dynamic Web Applications. See the &lt;a href="https://github.com/saadmk11/comment-webpage-screenshot" rel="noopener noreferrer"&gt;saadmk11/comment-webpage-screenshot&lt;/a&gt; documentation for more examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I think this action will be really helpful for Open Source Maintainers to provide quick reviews on UI changes. If anyone is interested please try &lt;a href="https://github.com/saadmk11/comment-webpage-screenshot" rel="noopener noreferrer"&gt;saadmk11/comment-webpage-screenshot&lt;/a&gt; out and leave some feedback :)&lt;/p&gt;

</description>
      <category>actionshackathon21</category>
      <category>github</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>GitHub Actions Version Updater, Similar to GitHub's Dependabot, but for GitHub Actions</title>
      <dc:creator>Maksudul Haque</dc:creator>
      <pubDate>Thu, 08 Apr 2021 16:42:06 +0000</pubDate>
      <link>https://forem.com/saadmk11/github-actions-version-updater-similar-to-github-s-dependabot-but-for-github-actions-2g2i</link>
      <guid>https://forem.com/saadmk11/github-actions-version-updater-similar-to-github-s-dependabot-but-for-github-actions-2g2i</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/marketplace/actions/github-actions-version-updater" rel="noopener noreferrer"&gt;GitHub Actions Version Updater&lt;/a&gt;&lt;/strong&gt; is GitHub Action that &lt;strong&gt;Updates Other GitHub Actions&lt;/strong&gt; in a Repository and creates a &lt;strong&gt;pull request&lt;/strong&gt; with those updates. It is an automated dependency updater similar to GitHub's &lt;strong&gt;Dependabot&lt;/strong&gt;, but for GitHub Actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Does It Work:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;GitHub Actions Version Updater first goes through all the &lt;strong&gt;workflows&lt;/strong&gt;&lt;br&gt;
in a repository and &lt;strong&gt;checks for updates&lt;/strong&gt; for each of the actions used in those workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If an update is found and if that action is &lt;strong&gt;not ignored&lt;/strong&gt; then the workflows are updated&lt;br&gt;
with the &lt;strong&gt;latest release&lt;/strong&gt; of the action being used.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If at least one workflow file is updated then a new branch is created with the changes and pushed to GitHub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, a pull request is created with the newly created branch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/saadmk11" rel="noopener noreferrer"&gt;
        saadmk11
      &lt;/a&gt; / &lt;a href="https://github.com/saadmk11/github-actions-version-updater" rel="noopener noreferrer"&gt;
        github-actions-version-updater
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A GitHub Action that Updates All GitHub Actions in a Repository and Creates a Pull Request with the Updates
    &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;h2 class="heading-element"&gt;GitHub Actions Version Updater&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/saadmk11/github-actions-version-updater/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/454e73b3f29678524d2cdb2d9cd991992edf1442f1d7deac69d4573f93374683/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f736161646d6b31312f6769746875622d616374696f6e732d76657273696f6e2d757064617465723f7374796c653d666c61742d737175617265" alt="GitHub release (latest by date)"&gt;&lt;/a&gt;
&lt;a href="https://github.com/saadmk11/github-actions-version-updater/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/470602153ca909fbd7b2f944f0aaba702d42b6805fe1bc7cc9253244efe5891e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f736161646d6b31312f6769746875622d616374696f6e732d76657273696f6e2d757064617465723f7374796c653d666c61742d737175617265" alt="GitHub"&gt;&lt;/a&gt;
&lt;a href="https://github.com/marketplace/actions/github-actions-version-updater" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/81bed125734618c4200deaf4665b2187f2bbe839925dd1c7c78a447420eeadad/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f47657425323049742d6f6e2532304d61726b6574706c6163652d6f72616e67653f7374796c653d666c61742d737175617265" alt="GitHub Marketplace"&gt;&lt;/a&gt;
&lt;a href="https://github.com/saadmk11/github-actions-version-updater/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/35c0cddddea0f15e2522e2695f6f6727ad5ad33f4603e06df3e8133c44043ded/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f736161646d6b31312f6769746875622d616374696f6e732d76657273696f6e2d757064617465723f636f6c6f723d73756363657373267374796c653d666c61742d737175617265" alt="GitHub stars"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/94e093672680e5b400fdeb1128766108ef036981c08249b27669d9076b36be90/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f736161646d6b31312f6769746875622d616374696f6e732d76657273696f6e2d757064617465722f6368616e67656c6f672d63692e79616d6c3f6c6162656c3d4368616e67656c6f672532304349267374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/94e093672680e5b400fdeb1128766108ef036981c08249b27669d9076b36be90/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f736161646d6b31312f6769746875622d616374696f6e732d76657273696f6e2d757064617465722f6368616e67656c6f672d63692e79616d6c3f6c6162656c3d4368616e67656c6f672532304349267374796c653d666c61742d737175617265" alt="GitHub Workflow Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Actions Version Updater&lt;/strong&gt; is a GitHub Action that is used to &lt;strong&gt;Update All GitHub Actions&lt;/strong&gt; in a Repository
and create a &lt;strong&gt;pull request&lt;/strong&gt; with the updates (if enabled)
It is an automated dependency updater similar to GitHub's &lt;strong&gt;Dependabot&lt;/strong&gt; but for GitHub Actions.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;How Does It Work?&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitHub Actions Version Updater first goes through all the &lt;strong&gt;workflows&lt;/strong&gt;
in a repository and &lt;strong&gt;checks for updates&lt;/strong&gt; for each of the action used in those workflows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If an update is found and if that action is &lt;strong&gt;not ignored&lt;/strong&gt; then the workflows are updated
with the &lt;strong&gt;new version&lt;/strong&gt; of the action being used.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If at least one workflow file is updated then a new branch is created with the changes and pushed to GitHub. (If enabled)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, a pull request is created with the newly created branch. (If enabled)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Supported Version Fetch Sources&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;release-tag&lt;/code&gt; (default):&lt;/strong&gt; Uses &lt;strong&gt;specific release tag&lt;/strong&gt; from…&lt;/p&gt;
&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/saadmk11/github-actions-version-updater" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Marketplace:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/marketplace/actions/github-actions-version-updater" rel="noopener noreferrer"&gt;https://github.com/marketplace/actions/github-actions-version-updater&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage:
&lt;/h3&gt;

&lt;p&gt;We recommend running this action on a &lt;a href="https://docs.github.com/en/actions/reference/events-that-trigger-workflows#schedule" rel="noopener noreferrer"&gt;&lt;code&gt;schedule&lt;/code&gt;&lt;/a&gt; event or a &lt;a href="https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch" rel="noopener noreferrer"&gt;&lt;code&gt;workflow_dispatch&lt;/code&gt;&lt;/a&gt; event.&lt;/p&gt;

&lt;p&gt;To integrate &lt;code&gt;GitHub Actions Version Updater&lt;/code&gt; on your repository, create a &lt;code&gt;YAML&lt;/code&gt;  file inside &lt;code&gt;.github/workflows/&lt;/code&gt; directory (&lt;code&gt;.github/workflows/updater.yaml&lt;/code&gt;) add the following into the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GitHub Actions Version Updater&lt;/span&gt;

&lt;span class="c1"&gt;# Controls when the action will run. &lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# can be used to run workflow manually&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Automatically run on every Sunday&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# Access token with `workflow` scope is required&lt;/span&gt;
          &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.WORKFLOW_SECRET }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run GitHub Actions Version Updater&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;saadmk11/github-actions-version-updater@v0.5.6&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# Access token with `workflow` scope is required&lt;/span&gt;
          &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.WORKFLOW_SECRET }}&lt;/span&gt;
          &lt;span class="c1"&gt;# Do not update these actions (Optional)&lt;/span&gt;
          &lt;span class="c1"&gt;# You need to add JSON array inside a string&lt;/span&gt;
          &lt;span class="c1"&gt;# because GitHub Actions does not yet allow `Lists` as input&lt;/span&gt;
          &lt;span class="na"&gt;ignore&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;["actions/checkout@v2",&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"actions/cache@v2"]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Important Note:
&lt;/h3&gt;

&lt;p&gt;GitHub does not allow updating workflow files inside a workflow run. The token generated by GitHub in every workflow (&lt;code&gt;${{secrets.GITHUB_TOKEN}}&lt;/code&gt;) does not have permission to update a workflow. That's why you need to create a &lt;a href="https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token" rel="noopener noreferrer"&gt;Personal Access Token&lt;/a&gt;&lt;br&gt;
with &lt;strong&gt;repo&lt;/strong&gt; and &lt;strong&gt;workflow&lt;/strong&gt; scope and pass it to the action.&lt;/p&gt;

&lt;p&gt;To know more about how to pass a secret to GitHub actions you can &lt;a href="https://docs.github.com/en/actions/reference/encrypted-secrets" rel="noopener noreferrer"&gt;Read GitHub Docs&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Actions Version Updater in Action:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fp4v5y5it0mf42zoihoba.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fp4v5y5it0mf42zoihoba.gif" alt="GitHub Actions Version Updater Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pull Request Created by GitHub Actions Version Updater:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fnfprvxbinzhy6sgzttm3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnfprvxbinzhy6sgzttm3.png" alt="GitHub Actions Version Updater Pull Request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pull Request File Changes:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ffh7ah8lxxirj14bzqj99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ffh7ah8lxxirj14bzqj99.png" alt="GitHub Actions Version Updater Pull Request Changes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I think this will be really helpful for Open Source Maintainers to manage GitHub actions dependencies. If anyone is interested please try &lt;a href="https://github.com/marketplace/actions/github-actions-version-updater" rel="noopener noreferrer"&gt;GitHub Actions Version Updater&lt;/a&gt; out and leave some feedback :)&lt;/p&gt;

&lt;p&gt;If you have any questions you can reach out to me on Twitter &lt;a href="https://twitter.com/saad_mk11" rel="noopener noreferrer"&gt;@saad_mk11&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>python</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Changelog CI (Commit and/or Comment Auto-generated Changelog to PR using Actions)</title>
      <dc:creator>Maksudul Haque</dc:creator>
      <pubDate>Thu, 03 Sep 2020 06:40:33 +0000</pubDate>
      <link>https://forem.com/saadmk11/github-actions-changelog-ci-4ojh</link>
      <guid>https://forem.com/saadmk11/github-actions-changelog-ci-4ojh</guid>
      <description>&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;I have created my first Open Source GitHub Action called &lt;a href="https://github.com/marketplace/actions/changelog-ci" rel="noopener noreferrer"&gt;Changelog CI&lt;/a&gt;.&lt;br&gt;
This is a GitHub Action that generates changelog, prepends it to &lt;code&gt;CHANGELOG.md&lt;/code&gt; file, and &lt;strong&gt;commits&lt;/strong&gt; and/or &lt;strong&gt;comments&lt;/strong&gt; it to the release pull request.&lt;/p&gt;

&lt;p&gt;Live Example: &lt;a href="https://github.com/saadmk11/changelog-ci/blob/master/CHANGELOG.md" rel="noopener noreferrer"&gt;Changelog CI's Changelog&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Maintainer Must-Haves&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Yaml File or Link to Code
&lt;/h3&gt;

&lt;p&gt;Here are the links for &lt;code&gt;Changelog CI&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/saadmk11" rel="noopener noreferrer"&gt;
        saadmk11
      &lt;/a&gt; / &lt;a href="https://github.com/saadmk11/changelog-ci" rel="noopener noreferrer"&gt;
        changelog-ci
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Changelog CI is a GitHub Action that enables a project to automatically generate changelogs
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1ec73ef762a0c68c8eb5a77d21d178663dae6595dcdefb82792953cbdf21f2e1/68747470733a2f2f692e696d6775722e636f6d2f37326c78506a732e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/1ec73ef762a0c68c8eb5a77d21d178663dae6595dcdefb82792953cbdf21f2e1/68747470733a2f2f692e696d6775722e636f6d2f37326c78506a732e706e67" alt="Changelog CI Banner"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/saadmk11/changelog-ci/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1d363a745a02f215529acf80168a36ce9c5f243d870741efa56cf0eeee0b4af6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f736161646d6b31312f6368616e67656c6f672d63693f7374796c653d666c61742d737175617265" alt="GitHub release (latest by date)"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b0ad34198a39dcea6b6e87c80808e1945e99bdb33e7f370053a088b418ea04f3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f736161646d6b31312f6368616e67656c6f672d63692f4368616e67656c6f6725323043493f6c6162656c3d4368616e67656c6f672532304349267374796c653d666c61742d737175617265"&gt;&lt;img src="https://camo.githubusercontent.com/b0ad34198a39dcea6b6e87c80808e1945e99bdb33e7f370053a088b418ea04f3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f736161646d6b31312f6368616e67656c6f672d63692f4368616e67656c6f6725323043493f6c6162656c3d4368616e67656c6f672532304349267374796c653d666c61742d737175617265" alt="GitHub Workflow Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/saadmk11/changelog-ci/blob/master/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d7e0528e29662644c5ac66e2981bf0e9dd2785436d6dee39696578f82d523b82/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f736161646d6b31312f6368616e67656c6f672d63693f7374796c653d666c61742d737175617265" alt="GitHub"&gt;&lt;/a&gt;
&lt;a href="https://github.com/marketplace/actions/changelog-ci" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/81bed125734618c4200deaf4665b2187f2bbe839925dd1c7c78a447420eeadad/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f47657425323049742d6f6e2532304d61726b6574706c6163652d6f72616e67653f7374796c653d666c61742d737175617265" alt="GitHub Marketplace"&gt;&lt;/a&gt;
&lt;a href="https://github.com/saadmk11/changelog-ci/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/17b17754a7ba8288b872692456a8e0f7990a7474cad71295e91b5e09c6cf1ed1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f736161646d6b31312f6368616e67656c6f672d63693f636f6c6f723d73756363657373267374796c653d666c61742d737175617265" alt="GitHub stars"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is Changelog CI?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Changelog CI is a GitHub Action that enables a project to automatically generate changelogs.&lt;/p&gt;
&lt;p&gt;Changelog CI can be triggered on &lt;code&gt;pull_request&lt;/code&gt;, &lt;code&gt;workflow_dispatch&lt;/code&gt; and any other events that can provide the required inputs
Learn more about &lt;a href="https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows" rel="noopener noreferrer"&gt;events that trigger workflows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The workflow can be configured to perform &lt;strong&gt;any (or all)&lt;/strong&gt; of the following actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For &lt;code&gt;pull_request&lt;/code&gt; event:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generates&lt;/strong&gt; changelog using &lt;strong&gt;Pull Request Titles&lt;/strong&gt; or &lt;strong&gt;Commit Messages&lt;/strong&gt; made after the last release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepends&lt;/strong&gt; the generated changelog to the &lt;code&gt;CHANGELOG.md&lt;/code&gt;/&lt;code&gt;CHANGELOG.rst&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Then &lt;strong&gt;Commits&lt;/strong&gt; the modified &lt;code&gt;CHANGELOG.md&lt;/code&gt;/&lt;code&gt;CHANGELOG.rst&lt;/code&gt; file to the release pull request branch.&lt;/li&gt;
&lt;li&gt;Adds a &lt;strong&gt;Comment&lt;/strong&gt; on the release pull request with the generated changelog.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For other events:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generate&lt;/strong&gt; changelog using &lt;strong&gt;Pull Request Title&lt;/strong&gt; or &lt;strong&gt;Commit Messages&lt;/strong&gt; made after the last release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepends&lt;/strong&gt; the generated changelog to the &lt;code&gt;CHANGELOG.md&lt;/code&gt;/&lt;code&gt;CHANGELOG.rst&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Then Creates a &lt;strong&gt;Pull Request&lt;/strong&gt; with the &lt;code&gt;CHANGELOG.md&lt;/code&gt;/&lt;code&gt;CHANGELOG.rst&lt;/code&gt; file changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/saadmk11/changelog-ci" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Marketplace:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/marketplace/actions/changelog-ci" rel="noopener noreferrer"&gt;https://github.com/marketplace/actions/changelog-ci&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/marketplace/actions/changelog-ci" rel="noopener noreferrer"&gt;Changelog CI&lt;/a&gt; is a new open-source action, as of now, my open-source projects use it.&lt;/p&gt;

&lt;p&gt;For example, &lt;a href="https://github.com/saadmk11/django-newsfeed" rel="noopener noreferrer"&gt;django-newsfeed&lt;/a&gt; and &lt;a href="https://github.com/saadmk11/banking-system" rel="noopener noreferrer"&gt;banking-system&lt;/a&gt; uses it.&lt;br&gt;
This output was created using &lt;code&gt;changelog-ci&lt;/code&gt; &lt;a href="https://github.com/saadmk11/banking-system/blob/master/CHANGELOG.md" rel="noopener noreferrer"&gt;CHANGELOG.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Changelog CI itself uses this Action to generate &lt;a href="https://github.com/saadmk11/changelog-ci/blob/master/CHANGELOG.md" rel="noopener noreferrer"&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Does It Work:
&lt;/h2&gt;

&lt;p&gt;Changelog CI uses &lt;code&gt;python&lt;/code&gt; and &lt;code&gt;GitHub API&lt;/code&gt; to generate a changelog for a repository.&lt;br&gt;
First, it tries to get the &lt;code&gt;latest release&lt;/code&gt; from the repository (If available).&lt;br&gt;
Then, it checks all the pull requests merged after the last release using the GitHub API. After that, it parses the data and generates the &lt;code&gt;changelog&lt;/code&gt;. Finally, It writes the generated changelog at the beginning of the &lt;code&gt;CHANGELOG.md&lt;/code&gt; (or user-provided filename) file. In addition to that, if a user provides a config (JSON file), Changelog CI parses the user-provided config file and renders the changelog according to users config. Then the changes are &lt;strong&gt;committed&lt;/strong&gt; and/or &lt;strong&gt;commented&lt;/strong&gt; on the release Pull request.&lt;/p&gt;
&lt;h2&gt;
  
  
  Usage:
&lt;/h2&gt;

&lt;p&gt;To use this Action The pull &lt;strong&gt;request title&lt;/strong&gt; must match with the default &lt;code&gt;regex&lt;/code&gt; or the user-provided &lt;code&gt;regex&lt;/code&gt; from the config file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default title regex:&lt;/strong&gt; &lt;code&gt;^(?i)release&lt;/code&gt; (title must start with the word "release" (case insensitive))&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default version number regex:&lt;/strong&gt; This follows &lt;a href="https://regex101.com/r/Ly7O1x/3/" rel="noopener noreferrer"&gt;&lt;code&gt;SemVer&lt;/code&gt;&lt;/a&gt; (Semantic Versioning) pattern. e.g. &lt;code&gt;1.0.0&lt;/code&gt;, &lt;code&gt;1.0&lt;/code&gt;, &lt;code&gt;v1.0.1&lt;/code&gt; etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For more details on Semantic Versioning pattern go to this link:&lt;/strong&gt; &lt;a href="https://regex101.com/r/Ly7O1x/3/" rel="noopener noreferrer"&gt;https://regex101.com/r/Ly7O1x/3/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href="https://github.com/saadmk11/changelog-ci#config-file-usage-optional" rel="noopener noreferrer"&gt;you can provide your own regex through the config file&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Example Workflow Using Changelog CI
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Changelog CI&lt;/span&gt;

&lt;span class="c1"&gt;# Controls when the action will run. Triggers the workflow on pull request&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;opened&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;reopened&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Checks-out your repository&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Changelog CI&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;saadmk11/changelog-ci@v0.5.0&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# Optional, you can provide any name for your changelog file.&lt;/span&gt;
          &lt;span class="c1"&gt;# defaults to ``CHANGELOG.md`` if not provided.&lt;/span&gt;
          &lt;span class="na"&gt;changelog_filename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CHANGELOG.md&lt;/span&gt;
          &lt;span class="c1"&gt;# Optional, only required when you want more customization&lt;/span&gt;
          &lt;span class="na"&gt;config_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;changelog-ci-config.json&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# Optional, Only required for ``private`` repositories&lt;/span&gt;
          &lt;span class="c1"&gt;# and required if the changelog comment &lt;/span&gt;
          &lt;span class="c1"&gt;# option is turned on through the config file&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{secrets.GITHUB_TOKEN}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Changelog CI Badge:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/saadmk11/changelog-ci/workflows/Changelog%20CI/badge.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://github.com/saadmk11/changelog-ci/workflows/Changelog%20CI/badge.svg" alt="Changelog CI Status"&gt;&lt;/a&gt;&lt;br&gt;
Add this to your README to display the badge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Changelog CI Status&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://github.com/&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;username&amp;gt;&lt;/span&gt;/&lt;span class="nt"&gt;&amp;lt;repo_name&amp;gt;&lt;/span&gt;/workflows/Changelog%20CI/badge.svg)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example Changelog Output using config file:
&lt;/h2&gt;

&lt;p&gt;Learn more about config file for Changelog CI&lt;br&gt;
from the &lt;a href="https://github.com/saadmk11/changelog-ci#config-file-usage-optional" rel="noopener noreferrer"&gt;README.md&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Version: 0.0.2
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Bug Fixes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/57" rel="noopener noreferrer"&gt;#53&lt;/a&gt;: Keep updating the readme&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/56" rel="noopener noreferrer"&gt;#54&lt;/a&gt;: Again updating the Same Readme file :(&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  New Features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/68" rel="noopener noreferrer"&gt;#68&lt;/a&gt;: Update README.md&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Documentation Updates
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/66" rel="noopener noreferrer"&gt;#66&lt;/a&gt;: Docs update&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Version: 0.0.1
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Bug Fixes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/57" rel="noopener noreferrer"&gt;#53&lt;/a&gt;: Keep updating the readme&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/56" rel="noopener noreferrer"&gt;#54&lt;/a&gt;: Again updating the Same Readme file :(&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Documentation Updates
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/66" rel="noopener noreferrer"&gt;#66&lt;/a&gt;: Docs update&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example Changelog Output without using config file:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Version: 0.0.2
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/57" rel="noopener noreferrer"&gt;#53&lt;/a&gt;: Keep updating the readme&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/56" rel="noopener noreferrer"&gt;#54&lt;/a&gt;: Again updating the Same Readme file :(&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/55" rel="noopener noreferrer"&gt;#55&lt;/a&gt;: README update&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Version: 0.0.1
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/43" rel="noopener noreferrer"&gt;#43&lt;/a&gt;: It feels like testing never ends :(&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/35" rel="noopener noreferrer"&gt;#35&lt;/a&gt;: Testing again and again&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/44" rel="noopener noreferrer"&gt;#44&lt;/a&gt;: This is again another test, getting tired&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/test/test/pull/37" rel="noopener noreferrer"&gt;#37&lt;/a&gt;: This is again another test&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Changelog CI in Action (Comment &amp;amp; Commit)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/J5SWNI4JNdzUy4ap5e/source.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/J5SWNI4JNdzUy4ap5e/source.gif" alt="Changelog CI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I think this will be really helpful for Open Source Maintainers. If anyone is interested please try &lt;a href="https://github.com/marketplace/actions/changelog-ci" rel="noopener noreferrer"&gt;Changelog CI&lt;/a&gt; out and leave feedback :)&lt;/p&gt;

</description>
      <category>actionshackathon</category>
      <category>github</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>Create a News-Curator and News Subscription App using Django</title>
      <dc:creator>Maksudul Haque</dc:creator>
      <pubDate>Wed, 26 Aug 2020 17:31:50 +0000</pubDate>
      <link>https://forem.com/saadmk11/create-a-news-curator-and-news-subscription-app-using-django-1ghj</link>
      <guid>https://forem.com/saadmk11/create-a-news-curator-and-news-subscription-app-using-django-1ghj</guid>
      <description>&lt;p&gt;I have recently released a django package named &lt;a href="https://github.com/saadmk11/django-newsfeed" rel="noopener noreferrer"&gt;django-newsfeed&lt;/a&gt;.&lt;br&gt;
This makes it really easy to build a news curator and newsletter subscription website.&lt;/p&gt;

&lt;p&gt;Today I'm going to show you how to easily create a news curator website or&lt;br&gt;
add a newsfeed subscription service to your existing website. &lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Django &amp;gt;= 2.2&lt;/li&gt;
&lt;li&gt;django-newsfeed&lt;/li&gt;
&lt;li&gt;celery&lt;/li&gt;
&lt;li&gt;celery-beat&lt;/li&gt;
&lt;li&gt;redis&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup Project:
&lt;/h3&gt;

&lt;p&gt;Lets get started&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Virtualenv and install requirements:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mkvirtualenv example-newsfeed     &lt;span class="c"&gt;# you can use virtualenv instead of virtualenvwrapper&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;django-newsfeed
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;django-newsfeed/

&lt;span class="nv"&gt;$ &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;celery Django django-celery-beat django-newsfeed redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** You need to have redis installed in your system. Here is a &lt;a href="https://redis.io/topics/quickstart" rel="noopener noreferrer"&gt;guide&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup django:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;django-admin.py startproject example_newsfeed &lt;span class="nb"&gt;.&lt;/span&gt;    &lt;span class="c"&gt;# dot (.) is added to create project on current directory&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Now add &lt;code&gt;newsfeed&lt;/code&gt; and &lt;code&gt;celery-beat&lt;/code&gt; to installed apps.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django_celery_beat&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;newsfeed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add &lt;code&gt;django-newsfeed&lt;/code&gt; urls to project &lt;code&gt;urls.py&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;newsfeed/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;newsfeed.urls&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;newsfeed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create superuser and Run Django Development Server
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python manage.py createsuperuser
&lt;span class="nv"&gt;$ &lt;/span&gt;python manage.py runserver       &lt;span class="c"&gt;# http://127.0.0.1:8000/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Go to Django Admin Page, login and create Posts, Issues and Newsletters.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now You can navigate to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;latest_issue:&lt;/strong&gt; &lt;code&gt;newsfeed/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;issue_list:&lt;/strong&gt; &lt;code&gt;newsfeed/issues/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;issue_detail:&lt;/strong&gt; &lt;code&gt;newsfeed/issues/&amp;lt;slug:issue_number&amp;gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;newsletter_subscribe:&lt;/strong&gt; &lt;code&gt;newsfeed/subscribe/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;newsletter_subscription_confirm:&lt;/strong&gt; &lt;code&gt;newsfeed/subscribe/confirm/&amp;lt;uuid:token&amp;gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;newsletter_unsubscribe:&lt;/strong&gt; &lt;code&gt;newsfeed/unsubscribe/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Override Templates to your liking. To learn more about it &lt;a href="https://github.com/saadmk11/django-newsfeed/blob/master/README.rst#usage" rel="noopener noreferrer"&gt;click here&lt;/a&gt;
Here is the &lt;a href="https://github.com/saadmk11/test-django-newsfeed" rel="noopener noreferrer"&gt;code for this tutorial&lt;/a&gt;.
You can see the overridden templates here. It uses bootstrap to style the templates.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Setup Sending Newsletters:
&lt;/h3&gt;

&lt;p&gt;Now that the project is set up we can create celery task to send newsletters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Celery&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Setup &lt;a href="https://docs.celeryproject.org/en/stable/django/first-steps-with-django.html" rel="noopener noreferrer"&gt;celery from here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add celery settings for redis to &lt;code&gt;settings.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Celery Settings
&lt;/span&gt;&lt;span class="n"&gt;CELERY_BROKER_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;redis://localhost:6379&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;CELERY_RESULT_BACKEND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;redis://localhost:6379&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;CELERY_ACCEPT_CONTENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;CELERY_TASK_SERIALIZER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;CELERY_RESULT_SERIALIZER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;CELERY_TIMEZONE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TIME_ZONE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add Email settings to &lt;code&gt;settings.py&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Email Settings
&lt;/span&gt;&lt;span class="n"&gt;EMAIL_HOST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test_host&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_HOST_USER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test_user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_HOST_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test_password&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;587&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_USE_TLS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_BACKEND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;django.core.mail.backends.console.EmailBackend&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** Change this for production server &lt;a href="https://docs.djangoproject.com/en/2.2/ref/settings/#email-host" rel="noopener noreferrer"&gt;django reference&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a django app named &lt;code&gt;core&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python manage.py startapp core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Now add &lt;code&gt;core&lt;/code&gt; to installed apps.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;core&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;tasks.py&lt;/code&gt; file in the &lt;code&gt;core&lt;/code&gt; app directory. Paste this code in the file.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;celery.decorators&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;newsfeed.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Newsletter&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;newsfeed.utils.send_newsletters&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;send_email_newsletter&lt;/span&gt;


&lt;span class="nd"&gt;@task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send_email_newsletter_task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_email_newsletter_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newsletters_ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;respect_schedule&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;newsletters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;newsletters_ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;newsletters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Newsletter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;id__in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;newsletters_ids&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;send_email_newsletter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;newsletters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;newsletters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;respect_schedule&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;respect_schedule&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** This will enable you to call the &lt;code&gt;EmailNewsletterSender&lt;/code&gt; provided by &lt;code&gt;django-newsletter&lt;/code&gt;&lt;br&gt;
in a celery task.&lt;/p&gt;

&lt;p&gt;Now you can send newsletters from the django admin page.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add this code to the &lt;code&gt;celery.py&lt;/code&gt; file on your project directory.
(&lt;code&gt;celery.py&lt;/code&gt; file should be created following the step 3)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beat_schedule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;send_email_newsletter&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;task&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;send_email_newsletter_task&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;# http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
&lt;/span&gt;        &lt;span class="c1"&gt;# run this task every hour
&lt;/span&gt;        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;schedule&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;crontab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minute&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** This will schedule sending newsletters every hour.&lt;br&gt;
Now you can send scheduled newsletters to all the subscribers autometically using this scheduled task.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add this code to the &lt;code&gt;admin.py&lt;/code&gt; file on the &lt;code&gt;core&lt;/code&gt; app directory.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.contrib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;newsfeed.admin&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;NewsletterAdmin&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;newsfeed.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Newsletter&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.tasks&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;send_email_newsletter_task&lt;/span&gt;

&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unregister&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Newsletter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@admin.register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Newsletter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NewsletterAdmin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NewsletterAdmin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_newsletters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queryset&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;newsletter_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queryset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="n"&gt;send_email_newsletter_task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;newsletters_ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;newsletter_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;respect_schedule&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SUCCESS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Sending selected newsletters(s) to the subscribers&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;** This will override the admin action for sending newsletters to use celery task.&lt;/p&gt;

&lt;h4&gt;
  
  
  Source Code for this tutorial here: &lt;a href="https://github.com/saadmk11/test-django-newsfeed" rel="noopener noreferrer"&gt;https://github.com/saadmk11/test-django-newsfeed&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Video Demo:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://youtu.be/xTLwQHOrY00" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FvupGREz.png" alt="A Example News Curator and News Subscription website using django package dnajgo-newsfeed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  More:
&lt;/h4&gt;

&lt;p&gt;You can learn more about all the configuration for &lt;code&gt;django-newsfeed&lt;/code&gt; on github.&lt;/p&gt;

&lt;p&gt;Checkout the package from here: &lt;a href="https://github.com/saadmk11/django-newsfeed" rel="noopener noreferrer"&gt;django-newsfeed&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion:
&lt;/h4&gt;

&lt;p&gt;If you use this package please feel free to provide some feedback on &lt;a href="https://twitter.com/saad_mk11" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;&lt;br&gt;
or on the comment section.&lt;br&gt;
If you have any suggestion or want to contribute to this package&lt;br&gt;
please create an &lt;a href="https://github.com/saadmk11/django-newsfeed/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt;&lt;br&gt;
and read the &lt;a href="https://github.com/saadmk11/django-newsfeed/blob/master/CONTRIBUTING.rst" rel="noopener noreferrer"&gt;contribution guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feedback and Contribution is always welcome.&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Use GitHub Actions to Keep My Resume Up to date Using Scheduled Events</title>
      <dc:creator>Maksudul Haque</dc:creator>
      <pubDate>Wed, 12 Aug 2020 12:36:31 +0000</pubDate>
      <link>https://forem.com/saadmk11/how-i-use-github-actions-to-keep-my-resume-up-to-date-using-scheduled-events-21j2</link>
      <guid>https://forem.com/saadmk11/how-i-use-github-actions-to-keep-my-resume-up-to-date-using-scheduled-events-21j2</guid>
      <description>&lt;h3&gt;
  
  
  GitHub Actions (Scheduled Events)
&lt;/h3&gt;

&lt;p&gt;GitHub Actions lets you run your workflows on a schedule.&lt;br&gt;
If you add the example code below in your GitHub Workflow you will see that your workflow will run every 15 minutes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# * is a special character in YAML so you have to quote this string&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;*/15&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;i.e:&lt;/em&gt;&lt;/strong&gt; The shortest interval you can run scheduled workflows is once every 5 minutes.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;more details on scheduled events here:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://docs.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events"&gt;https://docs.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Setup GitHub Actions:
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;.yaml&lt;/code&gt; file here &lt;code&gt;&amp;lt;project_dir&amp;gt;/.github/workflows/update_resume.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;paste this code in the created file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Update My Resume&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*/15&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Python Environment&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3.7&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Requirements&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install -r requirements.txt&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Execute Python script&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;python scripts/update.py&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup git config&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git config user.name ${{ secrets.USERNAME }}&lt;/span&gt;
          &lt;span class="s"&gt;git config user.email ${{ secrets.EMAIL }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;commit changes&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;chmod +x ./scripts/commit.sh&lt;/span&gt;
          &lt;span class="s"&gt;./scripts/commit.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here the workflow will run on &lt;code&gt;push&lt;/code&gt; events and also run automatically in every 15 minutes.&lt;/p&gt;

&lt;p&gt;We are running the workflow on &lt;code&gt;ubuntu-latest&lt;/code&gt; image.&lt;/p&gt;

&lt;p&gt;In the first step github will checkout the code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Code&lt;/span&gt;
   &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the second step github will setup python 3.7&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Python Environment&lt;/span&gt;
   &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v2&lt;/span&gt;
   &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;python-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3.7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the third step github will install the requirements using &lt;code&gt;pip&lt;/code&gt;&lt;br&gt;
I'm using the &lt;code&gt;requests&lt;/code&gt; package on send request to the GitHub API.&lt;br&gt;
If you don't need any external packages you can skip this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Requirements&lt;/span&gt;
   &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install -r requirements.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In this step github will execute &lt;code&gt;scripts/update.py&lt;/code&gt;.&lt;br&gt;
Don't worry we haven't created the python script yet. More on this later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Execute Python script&lt;/span&gt;
   &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
     &lt;span class="s"&gt;python scripts/update.py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In this step github will setup the git config. you can go to &lt;code&gt;https://github.com/&amp;lt;your_username&amp;gt;/&amp;lt;your_repository_name&amp;gt;/settings/secrets/new&lt;/code&gt; to create secrets (&lt;code&gt;USERNAME&lt;/code&gt;, &lt;code&gt;EMAIL&lt;/code&gt;). &lt;br&gt;
This username and email will be used on the git commit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;setup git config&lt;/span&gt;
   &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
     &lt;span class="s"&gt;git config user.name ${{ secrets.USERNAME }}&lt;/span&gt;
     &lt;span class="s"&gt;git config user.email ${{ secrets.EMAIL }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In this step github will commit the changes to your repository.&lt;br&gt;
We will create the &lt;code&gt;/scripts/commit.sh&lt;/code&gt; file in the next step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;commit changes&lt;/span&gt;
   &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
     &lt;span class="s"&gt;chmod +x ./scripts/commit.sh&lt;/span&gt;
     &lt;span class="s"&gt;./scripts/commit.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Commit Script:
&lt;/h3&gt;

&lt;p&gt;Create a file here &lt;code&gt;&amp;lt;project_dir&amp;gt;/scripts/commit.sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;paste this code in the created file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

git add &lt;span class="nb"&gt;.&lt;/span&gt; 
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Updated Repository data"&lt;/span&gt;
git push origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is just a shell script which will push a new commit to your repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Json File:
&lt;/h3&gt;

&lt;p&gt;this Json file will be updated using the &lt;code&gt;update.py&lt;/code&gt; file that we will create later.&lt;/p&gt;

&lt;p&gt;Create a file here &lt;code&gt;&amp;lt;project_dir&amp;gt;/repo_data.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;paste this code in the created file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"full_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readthedocs/readthedocs.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/readthedocs/readthedocs.org"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"full_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"saadmk11/banking-system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/saadmk11/banking-system"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here I adding the open source projects that I have contributed to. We will update this file to &lt;br&gt;
to show the correct number of starts, forks, watchers for each repository and update the description of the repository.&lt;/p&gt;
&lt;h3&gt;
  
  
  Create Python Script:
&lt;/h3&gt;

&lt;p&gt;Create a file here &lt;code&gt;&amp;lt;project_dir&amp;gt;/scripts/update.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;paste this code in the created file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_repositories_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;new_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="n"&gt;repo_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'full_name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;f'https://api.github.com/repos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;response_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="s"&gt;"short_description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s"&gt;"stars"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'stargazers_count'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s"&gt;"forks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'forks_count'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s"&gt;"watchers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'watchers_count'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;new_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_data&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_json_file&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'repo_data.json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'r'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;json_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;updated_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_repositories_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'repo_data.json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;json_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;json_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;updated_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'__main__'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;update_json_file&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This script will send &lt;code&gt;GET&lt;/code&gt; request to the GitHub API and get the latest updates of the repositories that I listed in the Json file and update the &lt;code&gt;repo_data.json&lt;/code&gt; file to show the current number of starts, watchers and forks and update the description.&lt;/p&gt;

&lt;p&gt;Create the &lt;code&gt;requirements.txt&lt;/code&gt; file here &lt;code&gt;&amp;lt;project_dir&amp;gt;/requirements.txt&lt;/code&gt; and add &lt;code&gt;requests==2.24.0&lt;/code&gt; in it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create &lt;code&gt;HTML&lt;/code&gt; and &lt;code&gt;JS&lt;/code&gt; File to Load The JSON Data:
&lt;/h3&gt;

&lt;p&gt;Create a file here &lt;code&gt;&amp;lt;project_dir&amp;gt;/index.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add this code in the created file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My Resume&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"openSourceRepos"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"main.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;** This is just to show the example you can style and design your resume any way you like.&lt;/p&gt;

&lt;p&gt;Create a file here &lt;code&gt;&amp;lt;project_dir&amp;gt;/main.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add this code in the created file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callbackFunction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;xmlhttp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;xmlhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onreadystatechange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xmlhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyState&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;xmlhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;responseData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xmlhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responseText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nx"&gt;callbackFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;responseData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nx"&gt;xmlhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;xmlhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DOMContentLoaded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openSourceRepos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;getJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;repo_data.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
                &amp;lt;div&amp;gt;
                  &amp;lt;h2&amp;gt;
                      &amp;lt;a href='&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;full_name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/a&amp;gt;
                  &amp;lt;/h2&amp;gt;
                   &amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;short_description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/p&amp;gt;
                   &amp;lt;ul&amp;gt;
                       &amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stars&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/li&amp;gt;
                       &amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forks&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/li&amp;gt;
                       &amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;watchers&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/li&amp;gt;
                   &amp;lt;/ul&amp;gt;
                &amp;lt;/div&amp;gt;
            `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;insertAdjacentHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;beforeend&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This JavaScript File will load the repository data from the Json file and display it on the html. Here I have used &lt;code&gt;XMLHttpRequest&lt;/code&gt; but you can use &lt;code&gt;Fetch API&lt;/code&gt; or &lt;code&gt;JQuery&lt;/code&gt; to load the Json File.&lt;/p&gt;

&lt;p&gt;After all the steps are done your project repository tree should look like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project_dir
│   index.html
│   main.js
│   requirements.txt
│   repo_data.json    
│
└───scripts
│   │   commit.sh
│   │   update.py
│   
└───.github
|    |
│    └───workflows
|        |   update_resume.yaml
|
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Setup GitHub Pages:
&lt;/h3&gt;

&lt;p&gt;I use GitHub Pages to host my Resume.&lt;br&gt;
&lt;a href="https://pages.github.com/"&gt;You can learn more about How to setup GitHub Pages Here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After your setup is Done. GitHub will run your workflow every 15 minutes and if there is any change in the &lt;br&gt;
repositories listed in the json file the python script will update it and the changed file will be committed&lt;br&gt;
to your repository. So, the repositories you have listed in your resume will always be up to date.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I showed a small thing you can do with &lt;code&gt;schedules&lt;/code&gt; on GitHub Actions.&lt;br&gt;
But you can do a lot of more complex things using this.&lt;br&gt;
You can automate many things on your website.&lt;br&gt;
If you read this post and make something using it please feel free to share&lt;br&gt;
with me on &lt;a href="https://twitter.com/saad_mk11"&gt;twitter&lt;/a&gt; or in the comments.&lt;/p&gt;

&lt;p&gt;This is my first post! :)&lt;/p&gt;

</description>
      <category>python</category>
      <category>github</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
