<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Javid Mougamadou</title>
    <description>The latest articles on DEV Community by Javid Mougamadou (@javidjms).</description>
    <link>https://dev.to/javidjms</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%2F534549%2F6e4ac97f-393a-40bb-a490-7f6dafd63d63.jpeg</url>
      <title>DEV Community: Javid Mougamadou</title>
      <link>https://dev.to/javidjms</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/javidjms"/>
    <language>en</language>
    <item>
      <title>☁️💻 My recap of AWS services</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Wed, 30 Nov 2022 15:01:43 +0000</pubDate>
      <link>https://dev.to/javidjms/my-recap-of-aws-services-1232</link>
      <guid>https://dev.to/javidjms/my-recap-of-aws-services-1232</guid>
      <description>&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;p&gt;Here is my personal recap of AWS services.&lt;/p&gt;

&lt;h2&gt;
  
  
  List of Services
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Most used services
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;EC2&lt;/li&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RDS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CloudFront&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SNS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elastic Cache&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compute
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;EC2 -&amp;gt; virtual machine&lt;/li&gt;
&lt;li&gt;Fargate -&amp;gt; serveless / Container as a Service&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lambda -&amp;gt; serveless / Function as a Service &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elastic Beanstalk -&amp;gt; EC2 orchestration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS App Runner -&amp;gt; Devops&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Container
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ECR -&amp;gt; container registry&lt;/li&gt;
&lt;li&gt;ECS -&amp;gt; container manager&lt;/li&gt;
&lt;li&gt;EKS -&amp;gt; managed kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Storage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;S3 -&amp;gt; object storage / bucket&lt;/li&gt;
&lt;li&gt;EBS -&amp;gt; block storage volume (for EC2)&lt;/li&gt;
&lt;li&gt;EFS -&amp;gt; file storage volume (for EC2, container, etc ...)&lt;/li&gt;
&lt;li&gt;S3 Glacier -&amp;gt; S3 for archives, vault, etc ...&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Network
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;VPC -&amp;gt; virtual private cloud&lt;/li&gt;
&lt;li&gt;ELB -&amp;gt; load balancer&lt;/li&gt;
&lt;li&gt;Route 53 -&amp;gt; DNS dynamic service&lt;/li&gt;
&lt;li&gt;CloudFront -&amp;gt; CDN&lt;/li&gt;
&lt;li&gt;Direct Connect&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security / Identity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;IAM -&amp;gt; roles, permissions, etc ...&lt;/li&gt;
&lt;li&gt;Inspector -&amp;gt; vulnerabilities management&lt;/li&gt;
&lt;li&gt;Shield -&amp;gt; DDOS protection service&lt;/li&gt;
&lt;li&gt;Firewall Manager -&amp;gt; fireware rules&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Aurora -&amp;gt; managed SQL (Mysql/Postgresql compatible)&lt;/li&gt;
&lt;li&gt;RDS -&amp;gt; advanced managed SQL (multiple SQL db)&lt;/li&gt;
&lt;li&gt;DocumentDB -&amp;gt; managed noSQL document&lt;/li&gt;
&lt;li&gt;DynamoDB -&amp;gt; managed noSQL key/value&lt;/li&gt;
&lt;li&gt;Elasticache -&amp;gt; In memory cache&lt;/li&gt;
&lt;li&gt;Neptune -&amp;gt; Graph&lt;/li&gt;
&lt;li&gt;Timestream -&amp;gt; Timeseries&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Athena -&amp;gt; query engine&lt;/li&gt;
&lt;li&gt;Redshift -&amp;gt; data warehouse&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kinesis -&amp;gt; streaming data system (like Kafka)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;EMR -&amp;gt; managed big data platform (like Hadoop)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DataPipeline -&amp;gt; ETL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Glue -&amp;gt; ETL&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Governance / Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CloudWatch -&amp;gt; monitor alertes on AWS services&lt;/li&gt;
&lt;li&gt;CloudFormation -&amp;gt; provision AWS resources (like Terraform)&lt;/li&gt;
&lt;li&gt;CloudTrail -&amp;gt; log / audit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;DMS -&amp;gt; migrate sql, nosql&lt;/li&gt;
&lt;li&gt;Snowball -&amp;gt; Petabyte scale data transport&lt;/li&gt;
&lt;li&gt;Datasync -&amp;gt; copy data service (like NFS)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Machine Learning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sagemaker -&amp;gt; ML service (like Jupyterlab)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Developer Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CodeCommit -&amp;gt; version control service&lt;/li&gt;
&lt;li&gt;CodeDeploy -&amp;gt; code Deployment service&lt;/li&gt;
&lt;li&gt;CodePipeline -&amp;gt; a continuous delivery service&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mobile
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MobileHub -&amp;gt; mobile app deployment and configuration&lt;/li&gt;
&lt;li&gt;Cognito -&amp;gt; authentication to your mobile and web apps.&lt;/li&gt;
&lt;li&gt;Device Farm -&amp;gt; mobile testing&lt;/li&gt;
&lt;li&gt;SNS -&amp;gt; managed messaging service (notification)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  App Services
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API Gateway &lt;/li&gt;
&lt;li&gt;CloudSearch -&amp;gt; search solution (like ElasticSearch)&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elastic Transcoder -&amp;gt; media transcoding service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SES -&amp;gt; email service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SQS -&amp;gt; queue service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SWF -&amp;gt; workflow service&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Business Applications
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Chime -&amp;gt; video conference (like Skype, Teams)&lt;/li&gt;
&lt;li&gt;Honeycode -&amp;gt; quickly build mobile and web apps for teams—without programming&lt;/li&gt;
&lt;li&gt;WorkDocs -&amp;gt; (like Google Docs)&lt;/li&gt;
&lt;li&gt;WorkMail -&amp;gt; (like Gmail)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  End User Computing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Workspaces -&amp;gt; fully managed desktop &lt;/li&gt;
&lt;li&gt;AppStream -&amp;gt; fully managed application streaming service&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Front User
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Amplify -&amp;gt; fully managed web hosting service&lt;/li&gt;
&lt;li&gt;AppSync -&amp;gt; managed GraphQL&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Amazon Location Service -&amp;gt; geolocation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pinpoint -&amp;gt; CRM&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Other
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS BlockChain&lt;/li&gt;
&lt;li&gt;AWS Ground Station -&amp;gt; satellite&lt;/li&gt;
&lt;li&gt;GameLift -&amp;gt; game server hosting&lt;/li&gt;
&lt;li&gt;Braket -&amp;gt; quantum computing &lt;/li&gt;
&lt;li&gt;KMS -&amp;gt; cryptographic keys&lt;/li&gt;
&lt;li&gt;Robomaker -&amp;gt; robotics &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/"&gt;https://docs.aws.amazon.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>💻 Code-server : Awesome VS Code container on browser (Useful for Fast Cloud Deploy - Fix Corporate Issues)</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Fri, 30 Sep 2022 19:53:50 +0000</pubDate>
      <link>https://dev.to/javidjms/code-server-awesome-vs-code-container-on-browser-useful-for-fast-cloud-deploy-fix-corporate-issues-1om6</link>
      <guid>https://dev.to/javidjms/code-server-awesome-vs-code-container-on-browser-useful-for-fast-cloud-deploy-fix-corporate-issues-1om6</guid>
      <description>&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;p&gt;I will introduce the concept of code-server.&lt;/p&gt;

&lt;p&gt;I am neither the creator nor the developer of the code-server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Genesis
&lt;/h2&gt;

&lt;p&gt;I ran into corporate network issues due to some limitation (proxy, firewall, powerless machine, mastered OS) since I found the opensource code-server repositories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concept
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Coder release
&lt;/h3&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/coder" rel="noopener noreferrer"&gt;
        coder
      &lt;/a&gt; / &lt;a href="https://github.com/coder/code-server" rel="noopener noreferrer"&gt;
        code-server
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      VS Code in the browser
    &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;code-server&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/coder/code-server/discussions" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/30f4d3a87c758daa0e009abaca1225e6de0d02ff0d26658c88a064568ecc396d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f2532304769744875622d25323044697363757373696f6e732d677261792e7376673f6c6f6e6743616368653d74727565266c6f676f3d67697468756226636f6c6f72423d707572706c65" alt='"GitHub Discussions"'&gt;&lt;/a&gt; &lt;a href="https://coder.com/community" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7204a179a57e7ce4cec9620c9060a9f0c24069aaa3676c070adc2c577c8c652a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6a6f696e2d75732532306f6e253230736c61636b2d677261792e7376673f6c6f6e6743616368653d74727565266c6f676f3d736c61636b26636f6c6f72423d627269676874677265656e" alt='"Join us on Slack"'&gt;&lt;/a&gt; &lt;a href="https://twitter.com/coderhq" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/04ffc6959b39b7b2356210093bd2498d5a822be4858a596148e9e98f1a5699dd/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f436f64657248513f6c6162656c3d253430436f6465724851267374796c653d736f6369616c" alt="Twitter Follow"&gt;&lt;/a&gt; &lt;a href="https://codecov.io/gh/coder/code-server" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/09333db35ab0ce0d517af626d4558da7fce015b201263d9a25bddf52b346f56e/68747470733a2f2f636f6465636f762e696f2f67682f636f6465722f636f64652d7365727665722f6272616e63682f6d61696e2f67726170682f62616467652e7376673f746f6b656e3d35694d396661726a6e43" alt="codecov"&gt;&lt;/a&gt; &lt;a href="https://coder.com/docs/code-server/latest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d3f2deb23c5ced4be5dae69238c01441001db17ac63f535c9f4fc2832c5b5450/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d446f6373266d6573736167653d7365652532306c617465737426636f6c6f723d626c7565" alt="See latest"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Run &lt;a href="https://github.com/Microsoft/vscode" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt; on any machine anywhere and
access it in the browser.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/coder/code-server./assets/screenshot-1.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcoder%2Fcode-server.%2Fassets%2Fscreenshot-1.png" alt="Screenshot"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/coder/code-server./assets/screenshot-2.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcoder%2Fcode-server.%2Fassets%2Fscreenshot-2.png" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Highlights&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Code on any device with a consistent development environment&lt;/li&gt;
&lt;li&gt;Use cloud servers to speed up tests, compilations, downloads, and more&lt;/li&gt;
&lt;li&gt;Preserve battery life when you're on the go; all intensive tasks run on your
server&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Requirements&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;See &lt;a href="https://coder.com/docs/code-server/latest/requirements" rel="nofollow noopener noreferrer"&gt;requirements&lt;/a&gt; for minimum specs, as well as instructions
on how to set up a Google VM on which you can install code-server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Linux machine with WebSockets enabled, 1 GB RAM, and 2 vCPUs&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting started&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;There are four ways to get started:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the &lt;a href="https://github.com/coder/code-server/blob/main/install.sh" rel="noopener noreferrer"&gt;install
script&lt;/a&gt;, which
automates most of the process. The script uses the system package manager if
possible.&lt;/li&gt;
&lt;li&gt;Manually &lt;a href="https://coder.com/docs/code-server/latest/install" rel="nofollow noopener noreferrer"&gt;installing
code-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Deploy code-server to your team with &lt;a href="https://cdr.co/coder-github" rel="nofollow noopener noreferrer"&gt;coder/coder&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Using our one-click buttons and guides to &lt;a href="https://github.com/coder/deploy-code-server" rel="noopener noreferrer"&gt;deploy code-server to a cloud
provider&lt;/a&gt; ⚡&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you use the install script, you can preview what occurs…&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/coder/code-server" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Actually, &lt;a href="https://github.com/coder/code-server" rel="noopener noreferrer"&gt;Code-server&lt;/a&gt; is VS Code running on a remote server, accessible through the browser.&lt;/p&gt;

&lt;p&gt;Here are the main advantages :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Access through Web UI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code on any device with a consistent development environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All intensive computation runs on your server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Preserve battery life when you're on the go.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You're no longer running excess instances of Chrome.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy collaboration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can take a tour to the coder website which offers a free version and an enterprise extended version with 24/7h support and provides cloud server auto-deployment (&lt;a href="https://coder.com/#pricing" rel="noopener noreferrer"&gt;Coder&lt;/a&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%2Fraw.githubusercontent.com%2Fcoder%2Fcode-server%2Fmain%2Fdocs%2Fassets%2Fscreenshot.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%2Fraw.githubusercontent.com%2Fcoder%2Fcode-server%2Fmain%2Fdocs%2Fassets%2Fscreenshot.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Linuxserver release
&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%2Fopengraph.githubassets.com%2F65c6c0e80e58a1365721250c0a9767849f73f7c3cb5fed4f036d9a354be3347a%2Flinuxserver%2Fdocker-code-server" 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%2Fopengraph.githubassets.com%2F65c6c0e80e58a1365721250c0a9767849f73f7c3cb5fed4f036d9a354be3347a%2Flinuxserver%2Fdocker-code-server" alt="Image"&gt;&lt;/a&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/linuxserver" rel="noopener noreferrer"&gt;
        linuxserver
      &lt;/a&gt; / &lt;a href="https://github.com/linuxserver/docker-code-server" rel="noopener noreferrer"&gt;
        docker-code-server
      &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;p&gt;&lt;a href="https://linuxserver.io" rel="nofollow 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%2Fraw.githubusercontent.com%2Flinuxserver%2Fdocker-templates%2Fmaster%2Flinuxserver.io%2Fimg%2Flinuxserver_medium.png" alt="linuxserver.io"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.linuxserver.io" title="all the things you can do with our containers including How-To guides, opinions and much more!" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/21fa2422bf0e66e7d4ecefb6b3077d7b17c0a417eba76be3ae1ea60e9ebaff28/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76312e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d6c696e75787365727665722e696f266d6573736167653d426c6f67" alt="Blog"&gt;&lt;/a&gt;
&lt;a href="https://discord.gg/YWrKVTn" title="realtime support / chat with the community and the team." rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e195fdfb1b45ecf2d8eae50e2d58f4ef2474b2b62a7f6b7b253d9a5ec383f5aa/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3335343937343931323631333434393733302e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d446973636f7264266c6f676f3d646973636f7264" alt="Discord"&gt;&lt;/a&gt;
&lt;a href="https://discourse.linuxserver.io" title="post on our community forum." rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/611c8e0c8170badbbf4100df147b03684a5765c721b0e961611b52887ff8d5c4/68747470733a2f2f696d672e736869656c64732e696f2f646973636f757273652f68747470732f646973636f757273652e6c696e75787365727665722e696f2f746f706963732e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6f676f3d646973636f75727365" alt="Discourse"&gt;&lt;/a&gt;
&lt;a href="https://fleet.linuxserver.io" title="an online web interface which displays all of our maintained images." rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/99029864efbd0d5f4b0bf3ed149a60b9f7eb6ac933b85e0d88c0339af580b08a/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76312e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d6c696e75787365727665722e696f266d6573736167653d466c656574" alt="Fleet"&gt;&lt;/a&gt;
&lt;a href="https://github.com/linuxserver" title="view the source for all of our repositories." rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/21653ad746081dfa6c704bc566de0eabca06e005cabf347a17a4caf5b3fa562d/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76312e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d6c696e75787365727665722e696f266d6573736167653d476974487562266c6f676f3d676974687562" alt="GitHub"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/linuxserver" title="please consider helping us by either donating or contributing to our budget" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2cda5a201ab8adab3231e4ea4909e32fa96672f52febb975631a1b6a57d150be/68747470733a2f2f696d672e736869656c64732e696f2f6f70656e636f6c6c6563746976652f616c6c2f6c696e75787365727665722e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d537570706f7274657273266c6f676f3d6f70656e253230636f6c6c656374697665" alt="Open Collective"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://linuxserver.io" rel="nofollow noopener noreferrer"&gt;LinuxServer.io&lt;/a&gt; team brings you another container release featuring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;regular and timely application updates&lt;/li&gt;
&lt;li&gt;easy user mappings (PGID, PUID)&lt;/li&gt;
&lt;li&gt;custom base image with s6 overlay&lt;/li&gt;
&lt;li&gt;weekly base OS updates with common layers across the entire LinuxServer.io ecosystem to minimise space usage, down time and bandwidth&lt;/li&gt;
&lt;li&gt;regular security updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find us at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://blog.linuxserver.io" rel="nofollow noopener noreferrer"&gt;Blog&lt;/a&gt; - all the things you can do with our containers including How-To guides, opinions and much more!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://discord.gg/YWrKVTn" rel="nofollow noopener noreferrer"&gt;Discord&lt;/a&gt; - realtime support / chat with the community and the team.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://discourse.linuxserver.io" rel="nofollow noopener noreferrer"&gt;Discourse&lt;/a&gt; - post on our community forum.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fleet.linuxserver.io" rel="nofollow noopener noreferrer"&gt;Fleet&lt;/a&gt; - an online web interface which displays all of our maintained images.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/linuxserver" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; - view the source for all of our repositories.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://opencollective.com/linuxserver" rel="nofollow noopener noreferrer"&gt;Open Collective&lt;/a&gt; - please consider helping us by either donating or contributing to our budget&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com/linuxserver/docker-code-server" rel="noopener noreferrer"&gt;linuxserver/code-server&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://scarf.sh" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/445b223c1c6686c4a15b1302b29af8f57e7868f11660a0c3fa170945a099fcfb/68747470733a2f2f73636172662e73682f696e7374616c6c732d62616467652f6c696e75787365727665722d63692f6c696e7578736572766572253246636f64652d7365727665723f636f6c6f723d393433393864266c6162656c2d636f6c6f723d353535353535266c6f676f2d636f6c6f723d666666666666267374796c653d666f722d7468652d6261646765267061636b6167652d747970653d646f636b6572" alt="Scarf.io pulls"&gt;&lt;/a&gt;
&lt;a href="https://github.com/linuxserver/docker-code-server" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a7d0e19ba7370dee9fb54aca0e868896b7c846a7f26320895696dc1fdda27932/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6c696e75787365727665722f646f636b65722d636f64652d7365727665722e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6f676f3d676974687562" alt="GitHub Stars"&gt;&lt;/a&gt;
&lt;a href="https://github.com/linuxserver/docker-code-server/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0d3f6e9fb5d2d645d4bdbec8c4fcd7849056e24296131a8333d4c6758780c4c7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f6c696e75787365727665722f646f636b65722d636f64652d7365727665722e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6f676f3d676974687562" alt="GitHub Release"&gt;&lt;/a&gt;
&lt;a href="https://github.com/linuxserver/docker-code-server/packages" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1f594eaaf805a9428ee37c12cd49218b52ac74e83618e4b7b6c004860cdaf96a/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76312e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d6c696e75787365727665722e696f266d6573736167653d4769744875622532305061636b616765266c6f676f3d676974687562" alt="GitHub Package Repository"&gt;&lt;/a&gt;
&lt;a href="https://gitlab.com/linuxserver.io/docker-code-server/container_registry" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/61016415992881b024fb77c00e202727e0e5c1d7ff26bb0b002d2359947bba01/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76312e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d6c696e75787365727665722e696f266d6573736167653d4769744c61622532305265676973747279266c6f676f3d6769746c6162" alt="GitLab Container Registry"&gt;&lt;/a&gt;
&lt;a href="https://quay.io/repository/linuxserver.io/code-server" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b170dc305ac9bf57bed4299dfb6a4b7b49dce97620f9daa7ad705801d1fa639c/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76312e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d6c696e75787365727665722e696f266d6573736167653d517561792e696f" alt="Quay.io"&gt;&lt;/a&gt;
&lt;a href="https://hub.docker.com/r/linuxserver/code-server" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a897d5cc6e7fe27ecdcd60375326603dee33b1876776b44618e27ffdb49a6381/68747470733a2f2f696d672e736869656c64732e696f2f646f636b65722f70756c6c732f6c696e75787365727665722f636f64652d7365727665722e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d70756c6c73266c6f676f3d646f636b6572" alt="Docker Pulls"&gt;&lt;/a&gt;
&lt;a href="https://hub.docker.com/r/linuxserver/code-server" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/011c26ed23f7702284bc6d0ca8de49e90195c96261cbc7bc6be84715b345ec29/68747470733a2f2f696d672e736869656c64732e696f2f646f636b65722f73746172732f6c696e75787365727665722f636f64652d7365727665722e7376673f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d7374617273266c6f676f3d646f636b6572" alt="Docker Stars"&gt;&lt;/a&gt;
&lt;a href="https://ci.linuxserver.io/job/Docker-Pipeline-Builders/job/docker-code-server/job/master/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/28b3bccd31f451bd6eb9c0c8c1a2145af2b19833fe55f9c2b11d808a13893245/68747470733a2f2f696d672e736869656c64732e696f2f6a656e6b696e732f6275696c643f6c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266a6f6255726c3d687474707325334125324625324663692e6c696e75787365727665722e696f2532466a6f62253246446f636b65722d506970656c696e652d4275696c646572732532466a6f62253246646f636b65722d636f64652d7365727665722532466a6f622532466d6173746572253246266c6f676f3d6a656e6b696e73" alt="Jenkins Build"&gt;&lt;/a&gt;
&lt;a href="https://ci-tests.linuxserver.io/linuxserver/code-server/latest/index.html" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/97e11d978556cf5b9310be2475b0ff50f98c361d81c552cbc9436597fd6bd3aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f79616d6c3f636f6c6f723d393433393864266c6162656c436f6c6f723d353535353535266c6f676f436f6c6f723d666666666666267374796c653d666f722d7468652d6261646765266c6162656c3d43492671756572793d43492675726c3d687474707325334125324625324663692d74657374732e6c696e75787365727665722e696f2532466c696e7578736572766572253246636f64652d7365727665722532466c617465737425324663692d7374617475732e796d6c" alt="LSIO CI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://coder.com" rel="nofollow noopener noreferrer"&gt;Code-server&lt;/a&gt; is VS Code running on a remote server, accessible through the browser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code on your Chromebook, tablet, and laptop with a consistent…&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/linuxserver/docker-code-server" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The LinuxServer.io team brings a container release &lt;a href="https://github.com/linuxserver/docker-code-server" rel="noopener noreferrer"&gt;linuxserver/code-server&lt;/a&gt;. It offers more flexibility and customization than the coder release. It embeds a VS code with some layers (Docker, Python, NodeJS, Java, PHP, etc ... -&amp;gt; &lt;a href="https://github.com/linuxserver/docker-mods" rel="noopener noreferrer"&gt;docker-mods&lt;/a&gt;) and some default packages.&lt;/p&gt;

&lt;p&gt;Here are the main features :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Custom base docker image with S6 overlay (for more details : &lt;a href="https://github.com/just-containers/s6-overlay" rel="noopener noreferrer"&gt;just-containers/s6-overlay&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Full customisation and docker layer mods integration (&lt;a href="https://github.com/linuxserver/docker-mods" rel="noopener noreferrer"&gt;linuxserver/docker-mods&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Weekly base OS updates and regular security updates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy authentication setup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Domain proxying&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;etc ...&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the list of layers : &lt;a href="https://mods.linuxserver.io/?mod=code-server" rel="noopener noreferrer"&gt;https://mods.linuxserver.io/?mod=code-server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is also other version/repository of the code-server.&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%2Fraw.githubusercontent.com%2Flinuxserver%2Fdocker-templates%2Fmaster%2Flinuxserver.io%2Fimg%2Fcode-server-banner.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%2Fraw.githubusercontent.com%2Flinuxserver%2Fdocker-templates%2Fmaster%2Flinuxserver.io%2Fimg%2Fcode-server-banner.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements (for linuxserver/code-server)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;1 GB of RAM minimum (2 or 4 GB of RAM is better)&lt;/li&gt;
&lt;li&gt;2 CPU cores minimum&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See for more details : &lt;a href="https://github.com/coder/code-server/blob/main/docs/requirements.md" rel="noopener noreferrer"&gt;https://github.com/coder/code-server/blob/main/docs/requirements.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation (for linuxserver/code-server)
&lt;/h2&gt;

&lt;p&gt;Here is a sample of the docker-compose.yml then you get started creating the container.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2.1"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;code-server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;linuxserver/code-server:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code-server&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PUID=1000&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PGID=1000&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;TZ=Europe/London&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PASSWORD=password&lt;/span&gt; &lt;span class="c1"&gt;#optional&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;HASHED_PASSWORD=&lt;/span&gt; &lt;span class="c1"&gt;#optional&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SUDO_PASSWORD=password&lt;/span&gt; &lt;span class="c1"&gt;#optional&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SUDO_PASSWORD_HASH=&lt;/span&gt; &lt;span class="c1"&gt;#optional&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PROXY_DOMAIN=code-server.my.domain&lt;/span&gt; &lt;span class="c1"&gt;#optional&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DEFAULT_WORKSPACE=/config/workspace&lt;/span&gt; &lt;span class="c1"&gt;#optional&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DOCKER_MODS=linuxserver/mods:python&lt;/span&gt; &lt;span class="c1"&gt;#example&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/path/to/appdata/config:/config&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;8443:8443&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p 8443&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;web gui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e PUID=1000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;for UserID - see below for explanation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e PGID=1000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;for GroupID - see below for explanation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e TZ=Europe/London&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Specify a timezone to use EG Europe/London&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e PASSWORD=password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional web gui password, if &lt;code&gt;PASSWORD&lt;/code&gt; or &lt;code&gt;HASHED_PASSWORD&lt;/code&gt; is not provided, there will be no auth.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e HASHED_PASSWORD=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional web gui password, overrides &lt;code&gt;PASSWORD&lt;/code&gt;, instructions on how to create it is below.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e SUDO_PASSWORD=password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this optional variable is set, user will have sudo access in the code-server terminal with the specified password.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e SUDO_PASSWORD_HASH=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optionally set sudo password via hash (takes priority over &lt;code&gt;SUDO_PASSWORD&lt;/code&gt; var). Format is &lt;code&gt;$type$salt$hashed&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e PROXY_DOMAIN=code-server.my.domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this optional variable is set, this domain will be proxied for subdomain proxying. See &lt;a href="https://github.com/cdr/code-server/blob/master/docs/FAQ.md#sub-domains" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e DEFAULT_WORKSPACE=/config/workspace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this optional variable is set, code-server will open this directory by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v /config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Contains all relevant configuration files.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;See for more details :  &lt;a href="https://github.com/linuxserver/docker-code-server#parameters" rel="noopener noreferrer"&gt;https://github.com/linuxserver/docker-code-server#parameters&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (for linuxserver/code-server)
&lt;/h2&gt;

&lt;p&gt;You just have to run the container, open your browser and go to the url &lt;a href="http://localhost:8443" rel="noopener noreferrer"&gt;http://localhost:8443&lt;/a&gt; .&lt;/p&gt;

&lt;h2&gt;
  
  
  My use case
&lt;/h2&gt;

&lt;p&gt;I implemented a system which allows to create, edit, restart, delete a code-server instance through a WEB UI with a tiny interface and some buttons. I prepared an instance with default packages and default configuration in order to be usable in the internal corporate network.&lt;/p&gt;

&lt;p&gt;I added a feature that allows to save, restore, duplicate and share the entire instance with extensions, code and packages through the &lt;em&gt;docker commit&lt;/em&gt; command (ex: code-server templates). I also added custom mods which are custom docker images (like Jupyter, Django, React, etc ...).&lt;/p&gt;

&lt;p&gt;I used the combination of &lt;strong&gt;Django + Ansible + Nginx + Docker&lt;/strong&gt; for the implementation of the system (code-server generator). Thanks to Nginx with an overlay attachable docker swarm network, I can reach all instances through one route/endpoint. If you are interested, I can give more details about the entire stack. &lt;/p&gt;

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

&lt;p&gt;This concept allows to get a readymade developer container with VS Code and desired layers/packages improving the developer experience.&lt;/p&gt;

&lt;p&gt;For corporate usage, it allows to deploy a custom instance, which works inside the corporate network (proxy, firewall, etc ...). In my case, I deployed 100 instances in one powerful worker allowing us to reduce the cost of the single machines vs the worker. It also permits to solve most common problem and improving the time spent for the installation and the development of an application directly with the code-server instance.&lt;/p&gt;

&lt;p&gt;For personal usage, it could be deployed locally or remotely and be used to have a single container with dotfiles and needed layers. But in fact, it is more relevant if multiple instances are used.&lt;/p&gt;

&lt;p&gt;There are other use cases :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a fast deploy (for saving installation time)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a temporary usage (for an intern)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;an event (ex: Hackaton - generate multiple code-server)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;improve the developer environment &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;testing the code-server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you, what do you think about this solution ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Dev.to Posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/babak/how-to-run-vs-code-on-the-server-3c7h"&gt;https://dev.to/babak/how-to-run-vs-code-on-the-server-3c7h&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/mikenikles/why-i-use-a-cloud-based-development-environment-and-how-you-can-too-4l8a"&gt;https://dev.to/mikenikles/why-i-use-a-cloud-based-development-environment-and-how-you-can-too-4l8a&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/ivanmoreno/how-to-setup-a-remote-development-environment-with-code-server-and-nextcloud-2a1g"&gt;https://dev.to/ivanmoreno/how-to-setup-a-remote-development-environment-with-code-server-and-nextcloud-2a1g&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://coder.com/" rel="noopener noreferrer"&gt;https://coder.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/coder/coder" rel="noopener noreferrer"&gt;https://github.com/coder/coder&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/coder/code-server" rel="noopener noreferrer"&gt;https://github.com/coder/code-server&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/linuxserver/docker-code-server" rel="noopener noreferrer"&gt;https://github.com/linuxserver/docker-code-server&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/just-containers/s6-overlay" rel="noopener noreferrer"&gt;https://github.com/just-containers/s6-overlay&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/linuxserver/docker-mods" rel="noopener noreferrer"&gt;https://github.com/linuxserver/docker-mods&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/remote/vscode-server" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/remote/vscode-server&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>vscode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>💬 Chatwoot : Nice open-source customer support tool, chatbot  (Alternative to Intercom)</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Fri, 23 Apr 2021 16:46:31 +0000</pubDate>
      <link>https://dev.to/javidjms/chatwoot-nice-open-source-customer-support-tool-chatbot-alternative-to-intercom-4pon</link>
      <guid>https://dev.to/javidjms/chatwoot-nice-open-source-customer-support-tool-chatbot-alternative-to-intercom-4pon</guid>
      <description>&lt;h2&gt;
  
  
  Concepts
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/5b6ffa0b767ae3ca18eb4c910e7ffe4f6bd1d24b04207b423f7f28d9586604fc/68747470733a2f2f73332e75732d776573742d322e616d617a6f6e6177732e636f6d2f67682d6173736574732e63686174776f6f742e636f6d2f63686174776f6f742d64617368626f6172642d6173736574732e706e67" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/5b6ffa0b767ae3ca18eb4c910e7ffe4f6bd1d24b04207b423f7f28d9586604fc/68747470733a2f2f73332e75732d776573742d322e616d617a6f6e6177732e636f6d2f67682d6173736574732e63686174776f6f742e636f6d2f63686174776f6f742d64617368626f6172642d6173736574732e706e67" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chatwoot is an open-source customer communication platform that helps companies engage their customers on their website, Facebook page, Twitter, Whatsapp, SMS, email, etc. It is an open-source alternative to Intercom, Zendesk, Salesforce Service Cloud etc. Connect your customer conversation channels and converse with your customers from a single place.&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%2Fmarketplace.whmcs.com%2Fproduct%2F5530%2Fimages%2Fscreenshots%2F16568-892-2aa54410738288d1a9d695f641291745.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%2Fmarketplace.whmcs.com%2Fproduct%2F5530%2Fimages%2Fscreenshots%2F16568-892-2aa54410738288d1a9d695f641291745.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Chatwoot gives an integrated view of conversations happening in different communication channels.&lt;/p&gt;

&lt;p&gt;It supports the following conversation channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Website&lt;/strong&gt;: Talk to your customers using our live chat widget and make use of our SDK to identify a user and provide contextual support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facebook&lt;/strong&gt;: Connect your Facebook pages and start replying to the direct messages to your page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter&lt;/strong&gt;: Connect your Twitter profiles and reply to direct messages or the tweets where you are mentioned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whatsapp&lt;/strong&gt;: Connect your Whatsapp business account and manage the conversation in Chatwoot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMS&lt;/strong&gt;: Connect your Twilio SMS account and reply to the SMS queries in Chatwoot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Channel&lt;/strong&gt;: Build custom communication channels using our API channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email (beta)&lt;/strong&gt;: Forward all your email queries to Chatwoot and view it in our integrated dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-brand inboxes&lt;/strong&gt;: Manage multiple brands or pages using a single dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private notes&lt;/strong&gt;: Inter team communication is possible using private notes in a conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canned responses (Saved replies)&lt;/strong&gt;: Improve the response rate by adding saved replies for frequently asked questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversation Labels&lt;/strong&gt;: Use conversation labelling to create custom workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto assignment&lt;/strong&gt;: Chatwoot intelligently assigns a ticket to the agents who have access to the inbox depending on their availability and load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversation continuity&lt;/strong&gt;: If the user has provided an email address through the chat widget, Chatwoot would send an email to the customer under the agent name so that the user can continue the conversation over the email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-lingual support&lt;/strong&gt;: Chatwoot supports 10+ languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powerful API &amp;amp; Webhooks&lt;/strong&gt;: Extend the capability of the software using Chatwoot’s webhooks and APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrations&lt;/strong&gt;: Chatwoot natively integrates with Slack right now. Manage your conversations in Slack without logging into the dashboard.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;p&gt;Detailed documentation is available at &lt;a href="https://www.chatwoot.com/help-center" rel="noopener noreferrer"&gt;www.chatwoot.com/help-center&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation with docker-compose
&lt;/h2&gt;

&lt;p&gt;Here is the guide : &lt;a href="https://www.chatwoot.com/docs/deployment/deploy-chatwoot-with-docker/" rel="noopener noreferrer"&gt;Installation with Docker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can install it with docker-compose and change the environment variables.&lt;/p&gt;

&lt;p&gt;Here is the docker-compose.yml and the .env .&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;amp;base&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;chatwoot/chatwoot:develop&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt; &lt;span class="c1"&gt;## Change this file for customized env variables&lt;/span&gt;
    &lt;span class="na"&gt;stdin_open&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# docker run -i&lt;/span&gt;
    &lt;span class="na"&gt;tty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;        &lt;span class="c1"&gt;# docker run -t&lt;/span&gt;

  &lt;span class="na"&gt;rails&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*base&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;3000:3000&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NODE_ENV=production&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;RAILS_ENV=production&lt;/span&gt;
    &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker/entrypoints/rails.sh&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bundle'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;exec'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rails'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-p'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3000'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-b'&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.0.0.0'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="na"&gt;sidekiq&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*base&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NODE_ENV=production&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;RAILS_ENV=production&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bundle'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;exec'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sidekiq'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-C'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config/sidekiq.yml'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:12&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;5432:5432'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/data/postgres:/var/lib/postgresql/data&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=chatwoot&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=postgres&lt;/span&gt;
      &lt;span class="c1"&gt;# Please provide your own password.&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=chatwoot&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:alpine&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sh"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-c"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redis-server&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--requirepass&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;$REDIS_PASSWORD&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt; &lt;span class="c1"&gt;## Change this file for customized env variables&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/data/redis:/data&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;6379:6379'&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="c1"&gt;# .env&lt;/span&gt;
&lt;span class="c1"&gt;# Used to verify the integrity of signed cookies. so ensure a secure value is set&lt;/span&gt;
&lt;span class="s"&gt;SECRET_KEY_BASE=replace_with_lengthy_secure_hex&lt;/span&gt;

&lt;span class="c1"&gt;# Replace with the URL you are planning to use for your app&lt;/span&gt;
&lt;span class="s"&gt;FRONTEND_URL=http://0.0.0.0:3000&lt;/span&gt;

&lt;span class="c1"&gt;# If the variable is set, all non-authenticated pages would fallback to the default locale.&lt;/span&gt;
&lt;span class="c1"&gt;# Whenever a new account is created, the default language will be DEFAULT_LOCALE instead of en&lt;/span&gt;
&lt;span class="c1"&gt;# DEFAULT_LOCALE=en&lt;/span&gt;

&lt;span class="c1"&gt;# If you plan to use CDN for your assets, set Asset CDN Host&lt;/span&gt;
&lt;span class="s"&gt;ASSET_CDN_HOST=&lt;/span&gt;

&lt;span class="c1"&gt;# Force all access to the app over SSL, default is set to false&lt;/span&gt;
&lt;span class="s"&gt;FORCE_SSL=false&lt;/span&gt;

&lt;span class="c1"&gt;# This lets you control new sign ups on your chatwoot installation&lt;/span&gt;
&lt;span class="c1"&gt;# true : default option, allows sign ups&lt;/span&gt;
&lt;span class="c1"&gt;# false : disables all the end points related to sign ups&lt;/span&gt;
&lt;span class="c1"&gt;# api_only: disables the UI for signup, but you can create sign ups via the account apis&lt;/span&gt;
&lt;span class="s"&gt;ENABLE_ACCOUNT_SIGNUP=false&lt;/span&gt;

&lt;span class="c1"&gt;# Redis config&lt;/span&gt;
&lt;span class="s"&gt;REDIS_URL=redis://redis:6379&lt;/span&gt;
&lt;span class="c1"&gt;# If you are using docker-compose, set this variable's value to be any string,&lt;/span&gt;
&lt;span class="c1"&gt;# which will be the password for the redis service running inside the docker-compose&lt;/span&gt;
&lt;span class="c1"&gt;# to make it secure&lt;/span&gt;
&lt;span class="s"&gt;REDIS_PASSWORD=chatwoot&lt;/span&gt;
&lt;span class="c1"&gt;# Redis Sentinel can be used by passing list of sentinel host and ports e,g. sentinel_host1:port1,sentinel_host2:port2&lt;/span&gt;
&lt;span class="s"&gt;REDIS_SENTINELS=&lt;/span&gt;
&lt;span class="c1"&gt;# Redis sentinel master name is required when using sentinel, default value is "mymaster".&lt;/span&gt;
&lt;span class="c1"&gt;# You can find list of master using "SENTINEL masters" command&lt;/span&gt;
&lt;span class="s"&gt;REDIS_SENTINEL_MASTER_NAME=&lt;/span&gt;

&lt;span class="c1"&gt;# Postgres Database config variables&lt;/span&gt;
&lt;span class="s"&gt;POSTGRES_HOST=postgres&lt;/span&gt;
&lt;span class="s"&gt;POSTGRES_USERNAME=postgres&lt;/span&gt;
&lt;span class="s"&gt;POSTGRES_PASSWORD=chatwoot&lt;/span&gt;
&lt;span class="s"&gt;RAILS_ENV=development&lt;/span&gt;
&lt;span class="s"&gt;RAILS_MAX_THREADS=5&lt;/span&gt;

&lt;span class="c1"&gt;# The email from which all outgoing emails are sent&lt;/span&gt;
&lt;span class="c1"&gt;# could user either  `email@yourdomain.com` or `BrandName &amp;lt;email@yourdomain.com&amp;gt;`&lt;/span&gt;
&lt;span class="s"&gt;MAILER_SENDER_EMAIL=Chatwoot &amp;lt;accounts@chatwoot.com&amp;gt;&lt;/span&gt;


&lt;span class="c1"&gt;#SMTP domain key is set up for HELO checking&lt;/span&gt;
&lt;span class="s"&gt;SMTP_DOMAIN=chatwoot.com&lt;/span&gt;
&lt;span class="c1"&gt;# the default value is set "mailhog" and is used by docker-compose for development environments,&lt;/span&gt;
&lt;span class="c1"&gt;# Set the value as "localhost" or your SMTP address in other environments&lt;/span&gt;
&lt;span class="s"&gt;SMTP_ADDRESS=mailhog&lt;/span&gt;
&lt;span class="s"&gt;SMTP_PORT=1025&lt;/span&gt;
&lt;span class="s"&gt;SMTP_USERNAME=&lt;/span&gt;
&lt;span class="s"&gt;SMTP_PASSWORD=&lt;/span&gt;
&lt;span class="c1"&gt;# plain,login,cram_md5&lt;/span&gt;
&lt;span class="s"&gt;SMTP_AUTHENTICATION=&lt;/span&gt;
&lt;span class="s"&gt;SMTP_ENABLE_STARTTLS_AUTO=true&lt;/span&gt;
&lt;span class="c1"&gt;# Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert', see http://api.rubyonrails.org/classes/ActionMailer/Base.html&lt;/span&gt;
&lt;span class="s"&gt;SMTP_OPENSSL_VERIFY_MODE=peer&lt;/span&gt;

&lt;span class="c1"&gt;# Mail Incoming&lt;/span&gt;
&lt;span class="c1"&gt;# This is the domain set for the reply emails when conversation continuity is enabled&lt;/span&gt;
&lt;span class="s"&gt;MAILER_INBOUND_EMAIL_DOMAIN=&lt;/span&gt;
&lt;span class="c1"&gt;# Set this to appropriate ingress channel with regards to incoming emails&lt;/span&gt;
&lt;span class="c1"&gt;# Possible values are :&lt;/span&gt;
&lt;span class="c1"&gt;# relay for Exim, Postfix, Qmail&lt;/span&gt;
&lt;span class="c1"&gt;# mailgun for Mailgun&lt;/span&gt;
&lt;span class="c1"&gt;# mandrill for Mandrill&lt;/span&gt;
&lt;span class="c1"&gt;# postmark for Postmark&lt;/span&gt;
&lt;span class="c1"&gt;# sendgrid for Sendgrid&lt;/span&gt;
&lt;span class="s"&gt;RAILS_INBOUND_EMAIL_SERVICE=&lt;/span&gt;
&lt;span class="c1"&gt;# Use one of the following based on the email ingress service&lt;/span&gt;
&lt;span class="c1"&gt;# Ref: https://edgeguides.rubyonrails.org/action_mailbox_basics.html&lt;/span&gt;
&lt;span class="s"&gt;RAILS_INBOUND_EMAIL_PASSWORD=&lt;/span&gt;
&lt;span class="s"&gt;MAILGUN_INGRESS_SIGNING_KEY=&lt;/span&gt;
&lt;span class="s"&gt;MANDRILL_INGRESS_API_KEY=&lt;/span&gt;

&lt;span class="c1"&gt;# Storage&lt;/span&gt;
&lt;span class="s"&gt;ACTIVE_STORAGE_SERVICE=local&lt;/span&gt;

&lt;span class="c1"&gt;# Amazon S3&lt;/span&gt;
&lt;span class="c1"&gt;# documentation: https://www.chatwoot.com/docs/configuring-s3-bucket-as-cloud-storage&lt;/span&gt;
&lt;span class="s"&gt;S3_BUCKET_NAME=&lt;/span&gt;
&lt;span class="s"&gt;AWS_ACCESS_KEY_ID=&lt;/span&gt;
&lt;span class="s"&gt;AWS_SECRET_ACCESS_KEY=&lt;/span&gt;
&lt;span class="s"&gt;AWS_REGION=&lt;/span&gt;

&lt;span class="c1"&gt;# Sentry&lt;/span&gt;
&lt;span class="s"&gt;SENTRY_DSN=&lt;/span&gt;

&lt;span class="c1"&gt;# Log settings&lt;/span&gt;
&lt;span class="c1"&gt;# Disable if you want to write logs to a file&lt;/span&gt;
&lt;span class="s"&gt;RAILS_LOG_TO_STDOUT=true&lt;/span&gt;
&lt;span class="s"&gt;LOG_LEVEL=info&lt;/span&gt;
&lt;span class="s"&gt;LOG_SIZE=500&lt;/span&gt;

&lt;span class="c1"&gt;### This environment variables are only required if you are setting up social media channels&lt;/span&gt;

&lt;span class="c1"&gt;# Facebook&lt;/span&gt;
&lt;span class="c1"&gt;# documentation: https://www.chatwoot.com/docs/facebook-setup&lt;/span&gt;
&lt;span class="s"&gt;FB_VERIFY_TOKEN=&lt;/span&gt;
&lt;span class="s"&gt;FB_APP_SECRET=&lt;/span&gt;
&lt;span class="s"&gt;FB_APP_ID=&lt;/span&gt;

&lt;span class="c1"&gt;# Twitter&lt;/span&gt;
&lt;span class="c1"&gt;# documentation: https://www.chatwoot.com/docs/twitter-app-setup&lt;/span&gt;
&lt;span class="s"&gt;TWITTER_APP_ID=&lt;/span&gt;
&lt;span class="s"&gt;TWITTER_CONSUMER_KEY=&lt;/span&gt;
&lt;span class="s"&gt;TWITTER_CONSUMER_SECRET=&lt;/span&gt;
&lt;span class="s"&gt;TWITTER_ENVIRONMENT=&lt;/span&gt;

&lt;span class="c1"&gt;#slack integration&lt;/span&gt;
&lt;span class="s"&gt;SLACK_CLIENT_ID=&lt;/span&gt;
&lt;span class="s"&gt;SLACK_CLIENT_SECRET=&lt;/span&gt;

&lt;span class="c1"&gt;### Change this env variable only if you are using a custom build mobile app&lt;/span&gt;
&lt;span class="c1"&gt;## Mobile app env variables&lt;/span&gt;
&lt;span class="s"&gt;IOS_APP_ID=6C953F3RX2.com.chatwoot.app&lt;/span&gt;


&lt;span class="c1"&gt;### Smart App Banner&lt;/span&gt;
&lt;span class="c1"&gt;# https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html&lt;/span&gt;
&lt;span class="c1"&gt;# You can find your app-id in https://itunesconnect.apple.com&lt;/span&gt;
&lt;span class="c1"&gt;#IOS_APP_IDENTIFIER=1495796682&lt;/span&gt;

&lt;span class="c1"&gt;## Push Notification&lt;/span&gt;
&lt;span class="c1"&gt;## generate a new key value here : https://d3v.one/vapid-key-generator/&lt;/span&gt;
&lt;span class="c1"&gt;# VAPID_PUBLIC_KEY=&lt;/span&gt;
&lt;span class="c1"&gt;# VAPID_PRIVATE_KEY=&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# for mobile apps&lt;/span&gt;
&lt;span class="c1"&gt;# FCM_SERVER_KEY=&lt;/span&gt;

&lt;span class="c1"&gt;## Bot Customizations&lt;/span&gt;
&lt;span class="s"&gt;USE_INBOX_AVATAR_FOR_BOT=true&lt;/span&gt;



&lt;span class="c1"&gt;## IP look up configuration&lt;/span&gt;
&lt;span class="c1"&gt;## ref https://github.com/alexreisner/geocoder/blob/master/README_API_GUIDE.md&lt;/span&gt;
&lt;span class="c1"&gt;## works only on accounts with ip look up feature enabled&lt;/span&gt;
&lt;span class="c1"&gt;# IP_LOOKUP_SERVICE=geoip2&lt;/span&gt;
&lt;span class="c1"&gt;# maxmindb api key to use geoip2 service&lt;/span&gt;
&lt;span class="c1"&gt;# IP_LOOKUP_API_KEY=&lt;/span&gt;

&lt;span class="c1"&gt;## Development Only Config&lt;/span&gt;
&lt;span class="c1"&gt;# if you want to use letter_opener for local emails&lt;/span&gt;
&lt;span class="c1"&gt;# LETTER_OPENER=true&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Prepare the database by running the migrations.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

docker-compose run &lt;span class="nt"&gt;--rm&lt;/span&gt; rails bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rails db:chatwoot_prepare


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Get the service up and running.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Your Chatwoot installation should be accessible with &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.chatwoot.com/" rel="noopener noreferrer"&gt;https://www.chatwoot.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/chatwoot/chatwoot" rel="noopener noreferrer"&gt;https://github.com/chatwoot/chatwoot&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fuser-images.githubusercontent.com%2F73185%2F107608463-129ff600-6c62-11eb-84f4-1dc1ebdbf1de.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%2Fuser-images.githubusercontent.com%2F73185%2F107608463-129ff600-6c62-11eb-84f4-1dc1ebdbf1de.gif" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🔨 [git]: Write better commits with Gitmoji</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Sun, 18 Apr 2021 13:07:39 +0000</pubDate>
      <link>https://dev.to/javidjms/git-write-better-commits-with-gitmoji-3193</link>
      <guid>https://dev.to/javidjms/git-write-better-commits-with-gitmoji-3193</guid>
      <description>&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%2Fwww.bram.us%2Fwordpress%2Fwp-content%2Fuploads%2F2017%2F09%2Fgitmoji-560x410.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%2Fwww.bram.us%2Fwordpress%2Fwp-content%2Fuploads%2F2017%2F09%2Fgitmoji-560x410.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 Notes
&lt;/h2&gt;

&lt;p&gt;Gitmoji is an initiative to standardize and explain the use of emojis on GitHub commit messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 Intro : How to Write a Git Commit Message
&lt;/h2&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%2Fchris.beams.io%2Fcontent%2Fimages%2Fsize%2Fw2000%2F2021%2F01%2Fgit_commit_2x.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%2Fchris.beams.io%2Fcontent%2Fimages%2Fsize%2Fw2000%2F2021%2F01%2Fgit_commit_2x.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my case, I only read commits when i would like to track commit changes or to dig commit explanation. Otherwise, I directly read the source code.&lt;/p&gt;

&lt;p&gt;Here is an example of good git commit message semantic will look like (according to &lt;a href="https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716" rel="noopener noreferrer"&gt;Gist Semantic Commit Messages&lt;/a&gt;)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&amp;lt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;scope]: &lt;span class="s2"&gt;"Message"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;type&lt;/strong&gt; must be one of the following mentioned below :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;lt;build&amp;gt;: Build related changes (eg: npm related/ adding external dependencies)&lt;/li&gt;
&lt;li&gt;&amp;lt;chore&amp;gt;: A code change that external user won't see (eg: change to .gitignore)&lt;/li&gt;
&lt;li&gt;&amp;lt;docs&amp;gt;: Documentation related changes&lt;/li&gt;
&lt;li&gt;&amp;lt;feat&amp;gt;: Introduction of a new feature&lt;/li&gt;
&lt;li&gt;&amp;lt;fix&amp;gt;: Resolve an issue directly linked to development (bugfixes)&lt;/li&gt;
&lt;li&gt;&amp;lt;hotfix&amp;gt;: Resolve an issue directly linked to production (patches)&lt;/li&gt;
&lt;li&gt;&amp;lt;test&amp;gt;: Add/Update test cases&lt;/li&gt;
&lt;li&gt;&amp;lt;performance&amp;gt;: Add code that improves performance&lt;/li&gt;
&lt;li&gt;&amp;lt;refactor&amp;gt;: Update for code for maintainability (clean code)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;scope&lt;/strong&gt; is optional and must be a noun that represents the section of the codebase&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Message&lt;/strong&gt; should be imperative and should describe the commit with a clear message/keywords.&lt;/p&gt;

&lt;p&gt;Example of commits :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

feat&lt;span class="o"&gt;(&lt;/span&gt;home, components&lt;span class="o"&gt;)&lt;/span&gt;: Add login button
feat&lt;span class="o"&gt;(&lt;/span&gt;home, components&lt;span class="o"&gt;)&lt;/span&gt;: Add login modal
fix&lt;span class="o"&gt;(&lt;/span&gt;home, components&lt;span class="o"&gt;)&lt;/span&gt;: Resolve issue with modal collapses
chore&lt;span class="o"&gt;(&lt;/span&gt;home&lt;span class="o"&gt;)&lt;/span&gt;: Move icons folder
feat&lt;span class="o"&gt;(&lt;/span&gt;newsletter&lt;span class="o"&gt;)&lt;/span&gt;: Add Newsletter component
feat&lt;span class="o"&gt;(&lt;/span&gt;navbar&lt;span class="o"&gt;)&lt;/span&gt;: Add navbar container


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  🚀 Gitmoji
&lt;/h2&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%2Fuser-images.githubusercontent.com%2F31794680%2F84195052-3a6d0780-aa9e-11ea-87ed-b39133f40829.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%2Fuser-images.githubusercontent.com%2F31794680%2F84195052-3a6d0780-aa9e-11ea-87ed-b39133f40829.gif" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using emojis on commit messages provides an easy way of identifying the purpose or intention of a commit with only looking at the emojis used. As there are a lot of different emojis I found the need of creating a guide that can help to use emojis easier.&lt;/p&gt;

&lt;p&gt;Now we can replace the &amp;lt;type/&amp;gt; with an emoji :&lt;/p&gt;

&lt;p&gt;🎨 Improve structure / format of the code.&lt;/p&gt;

&lt;p&gt;⚡️ Improve performance.&lt;/p&gt;

&lt;p&gt;🔥 Remove code or files.&lt;/p&gt;

&lt;p&gt;🐛 Fix a bug.&lt;/p&gt;

&lt;p&gt;✨ Introduce new features.&lt;/p&gt;

&lt;p&gt;📝 Add or update documentation.&lt;/p&gt;

&lt;p&gt;🚀 Deploy stuff.&lt;/p&gt;

&lt;p&gt;💚 Fix CI Build.&lt;/p&gt;

&lt;p&gt;👷 Add or update CI build system.&lt;/p&gt;

&lt;p&gt;🔧 Add or update configuration files.&lt;/p&gt;

&lt;p&gt;🔨 Add or update development scripts.&lt;/p&gt;

&lt;p&gt;⚰️ Remove dead code.&lt;/p&gt;

&lt;p&gt;Example of commits :&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

✨ &lt;span class="o"&gt;(&lt;/span&gt;home, components&lt;span class="o"&gt;)&lt;/span&gt;: Add login button
✨ &lt;span class="o"&gt;(&lt;/span&gt;home, components&lt;span class="o"&gt;)&lt;/span&gt;: Add login modal
🐛 &lt;span class="o"&gt;(&lt;/span&gt;home, components&lt;span class="o"&gt;)&lt;/span&gt;: Resolve issue with modal collapses
🚚 &lt;span class="o"&gt;(&lt;/span&gt;home&lt;span class="o"&gt;)&lt;/span&gt;: Move icons folder
✨ &lt;span class="o"&gt;(&lt;/span&gt;newsletter&lt;span class="o"&gt;)&lt;/span&gt;: Add Newsletter component
✨ &lt;span class="o"&gt;(&lt;/span&gt;navbar&lt;span class="o"&gt;)&lt;/span&gt;: Add navbar container
🔥 &lt;span class="o"&gt;(&lt;/span&gt;navbar&lt;span class="o"&gt;)&lt;/span&gt;: Remove old navbar file
✅ &lt;span class="o"&gt;(&lt;/span&gt;home&lt;span class="o"&gt;)&lt;/span&gt;: Add login &lt;span class="nb"&gt;test &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;
🎨 &lt;span class="o"&gt;(&lt;/span&gt;home, component&lt;span class="p"&gt;)&lt;/span&gt;: Improve login modal
📦️ &lt;span class="o"&gt;(&lt;/span&gt;npm&lt;span class="o"&gt;)&lt;/span&gt;: Add react-table
🔨 Update script start-server.js


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Additionnal icons
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

🐳 Add Dockerfile
🐳 Add docker-compose.yml
☸️ &lt;span class="o"&gt;(&lt;/span&gt;helm&lt;span class="o"&gt;)&lt;/span&gt;: Add postgres helm chart
☸️ &lt;span class="o"&gt;(&lt;/span&gt;helm&lt;span class="o"&gt;)&lt;/span&gt;: Update frontend.yaml
☸️ &lt;span class="o"&gt;(&lt;/span&gt;helm&lt;span class="o"&gt;)&lt;/span&gt;: Update pvc.yaml
🐎 &lt;span class="o"&gt;(&lt;/span&gt;home&lt;span class="o"&gt;)&lt;/span&gt;: Increase speed load &lt;span class="k"&gt;for &lt;/span&gt;navbar
🍎 &lt;span class="o"&gt;(&lt;/span&gt;home&lt;span class="o"&gt;)&lt;/span&gt;: Fix issue with MacOS &lt;span class="k"&gt;for &lt;/span&gt;navbar


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Link: &lt;a href="https://emojipedia.org/" rel="noopener noreferrer"&gt;EmojiPedia&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦️ Gitmoji-CLI
&lt;/h2&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%2Fcloud.githubusercontent.com%2Fassets%2F7629661%2F20454643%2F11eb9e40-ae47-11e6-90db-a1ad8a87b495.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%2Fcloud.githubusercontent.com%2Fassets%2F7629661%2F20454643%2F11eb9e40-ae47-11e6-90db-a1ad8a87b495.gif" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A gitmoji interactive client for using gitmojis on commit messages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;With npm :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm &lt;span class="nb"&gt;install &lt;/span&gt;gitmoji-cli


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;On MacOS :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

brew &lt;span class="nb"&gt;install &lt;/span&gt;gitmoji


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Interactive Client
&lt;/h3&gt;

&lt;p&gt;Start the interactive commit client, to auto generate your commit based on your prompts.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

gitmoji &lt;span class="nt"&gt;-c&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Hook
&lt;/h3&gt;

&lt;p&gt;Run the init option, add your changes and commit them, after that the prompts will begin and your commit message will be built.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

gitmoji &lt;span class="nt"&gt;-i&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fuser-images.githubusercontent.com%2F7629661%2F41189947-1de56124-6bd6-11e8-9567-e7f1a8e99500.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%2Fuser-images.githubusercontent.com%2F7629661%2F41189947-1de56124-6bd6-11e8-9567-e7f1a8e99500.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Search
&lt;/h3&gt;

&lt;p&gt;Search using specific keywords to find the right gitmoji.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

gitmoji &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"criteria"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fuser-images.githubusercontent.com%2F7629661%2F41189878-d24a3b78-6bd4-11e8-8d47-c8edf3b87e53.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%2Fuser-images.githubusercontent.com%2F7629661%2F41189878-d24a3b78-6bd4-11e8-8d47-c8edf3b87e53.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  List
&lt;/h3&gt;

&lt;p&gt;Pretty print all the available gitmojis.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

gitmoji &lt;span class="nt"&gt;-l&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fuser-images.githubusercontent.com%2F7629661%2F41189877-d22b145a-6bd4-11e8-97f8-a8e36bcab062.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%2Fuser-images.githubusercontent.com%2F7629661%2F41189877-d22b145a-6bd4-11e8-97f8-a8e36bcab062.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Config
&lt;/h3&gt;

&lt;p&gt;Run gitmoji -g to setup some gitmoji-cli preferences.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

gitmoji config


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fuser-images.githubusercontent.com%2F7629661%2F41189876-d21167ee-6bd4-11e8-9008-4c987502f307.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%2Fuser-images.githubusercontent.com%2F7629661%2F41189876-d21167ee-6bd4-11e8-9008-4c987502f307.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔨Extensions (Integration with IDE)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gitmoji for Vscode
&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%2Fcdn.jsdelivr.net%2Fgh%2Fvtrois%2Fgitmoji-vscode%401%2Fimages%2Fabout.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%2Fcdn.jsdelivr.net%2Fgh%2Fvtrois%2Fgitmoji-vscode%401%2Fimages%2Fabout.gif" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://marketplace.visualstudio.com/items?itemName=Vtrois.gitmoji-vscode" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=Vtrois.gitmoji-vscode&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gitmoji for Atom
&lt;/h3&gt;

&lt;p&gt;Go to Settings (cmd + , or ctrl + ,) &amp;gt; Install and search for gitmoji-atom.&lt;/p&gt;

&lt;p&gt;Alternatively, run the following command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

apm &lt;span class="nb"&gt;install &lt;/span&gt;gitmoji-atom


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Link : &lt;a href="https://atom.io/packages/gitmoji-atom" rel="noopener noreferrer"&gt;https://atom.io/packages/gitmoji-atom&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Integration with DEV.TO ?
&lt;/h2&gt;

&lt;p&gt;Do you think that we can use it while writing posts for Dev.TO ?&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;🐳 Docker&lt;br&gt;
☸️ Kubernetes&lt;br&gt;
...&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Links&lt;br&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://emojipedia.org/laptop/" rel="noopener noreferrer"&gt;https://emojipedia.org/laptop/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gitmoji.dev/" rel="noopener noreferrer"&gt;https://gitmoji.dev/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/carloscuesta/gitmoji" rel="noopener noreferrer"&gt;https://github.com/carloscuesta/gitmoji&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/carloscuesta/gitmoji-cli" rel="noopener noreferrer"&gt;https://github.com/carloscuesta/gitmoji-cli&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716" rel="noopener noreferrer"&gt;https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/robertpainsi/b632364184e70900af4ab688decf6f53" rel="noopener noreferrer"&gt;https://gist.github.com/robertpainsi/b632364184e70900af4ab688decf6f53&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/parmentf/035de27d6ed1dce0b36a" rel="noopener noreferrer"&gt;https://gist.github.com/parmentf/035de27d6ed1dce0b36a&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/i5han3/git-commit-message-convention-that-you-can-follow-1709"&gt;https://dev.to/i5han3/git-commit-message-convention-that-you-can-follow-1709&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/helderburato/patterns-for-writing-better-git-commit-messages-4ba0"&gt;https://dev.to/helderburato/patterns-for-writing-better-git-commit-messages-4ba0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://chris.beams.io/posts/git-commit/" rel="noopener noreferrer"&gt;https://chris.beams.io/posts/git-commit/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Avoid Procrastination and Improve Focus</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Wed, 14 Apr 2021 18:31:43 +0000</pubDate>
      <link>https://dev.to/javidjms/avoid-procrastination-and-improve-focus-3l63</link>
      <guid>https://dev.to/javidjms/avoid-procrastination-and-improve-focus-3l63</guid>
      <description>&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is Procrastination?
&lt;/h3&gt;

&lt;p&gt;People who procrastinate are often mislabeled as lazy. Many of us even engage in self talk about how lazy or unfocused we are when we engage in procrastination. But procrastination is not a reflection of someone’s work ethic or their ability to focus. There’s more to it than that.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When we procrastinate, we typically put off something that we find difficult, challenging, or uncomfortable in favor of something easier or more appealing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Chronic procrastinators know that waiting will cause more harm than good. We know that this choice will ultimately lead to a worse outcome for us physically, emotionally, and otherwise, but we do it anyway&lt;/p&gt;

&lt;h3&gt;
  
  
  The Real Reason We Procrastinate
&lt;/h3&gt;

&lt;p&gt;Dr. Tim Pychyl is also a professor of psychology and a member of the Procrastination Research Group at Carleton University in Ottawa. He said, “Procrastination is an emotion regulation problem, not a time management problem.” Sirois and Pychyl teamed up in 2013 to research the notion that people place a priority on their immediate emotional needs over those of their future selves via procrastination. Here’s what they concluded.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;People engage in this irrational cycle of chronic procrastination because of an inability to manage negative moods around a task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When faced with an “aversive” task, i.e. something that we find “boring, frustrating, lacking in meaning and/or structure,” we react with negative feelings and moods. Then we have a choice. We can get through those feelings and moods via “self-regulation” or we can succumb to the immediately protective choice of procrastination.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem with Procrastination
&lt;/h3&gt;

&lt;p&gt;We believe that when we sit down to work tomorrow, or next week, or next month before the big deadline, we will feel like doing it. But we are wrong. When we choose the temporary reprieve from boredom, frustration, or challenge and kick the can down the road to our future selves, we are only making matters cumulatively worse.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We aren’t dismissing our future selves as being unimportant or anything. We are just absolutely convinced that our future self will be better able to handle the given task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For one thing, a constant current of anxiety and tension will be along for the entire procrastination ride. This nagging looming deadline will be churning in the background, coloring our daily mood and impacting our health and well being. The negative feelings we have about the task itself make us procrastinate. That, in turn, leads to ruminating negative thoughts about the act of procrastination itself. It’s a cycle that has a snowball effect, gathering more self blame, shame, anxiety, and stress along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Techniques
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Daily Todo List (Don't forget to read/update it daily !)
&lt;/h3&gt;

&lt;p&gt;Make a list of 3-6 things that you want to get done during the day. Put them in order of the most important or time sensitive to the least important or time sensitive. Start working on the first task until it is finished. Check it off, mark it out, and move to the next item. Keep going until your the end of the day. Move any tasks that are left undone to the new list you will create for the next day.&lt;/p&gt;

&lt;h5&gt;Remember to start the day by reading the current list of tasks and update it if it is needed.&lt;/h5&gt;

&lt;h3&gt;
  
  
  2. Digitally Declutter
&lt;/h3&gt;

&lt;p&gt;Let’s face it. Distractions are very easily found these days. If you tend to wander into social media or headline news or your personal inbox instead of working on the more pressing task at hand, it’s time to digitally declutter your workspace.&lt;/p&gt;

&lt;p&gt;The idea here is to make it harder to get distracted by removing the devices that hold those distractions. So, let’s say you need to create an outline for an upcoming presentation and you plan to work at the breakfast counter in the kitchen. Take only your laptop into the workspace. Put your phone, tablet, and any other devices you may have in another room and make sure they are on silent.&lt;/p&gt;

&lt;p&gt;Close all tabs other than the document you are actively writing into. If you find that you cannot stop opening new windows to browse online, go old school and pull out an actual pad of paper and pen to write your outline in ink.&lt;/p&gt;

&lt;p&gt;To take this a step further, declutter your actual devices so that distractions are not as easily accessible. Remove social media apps from your devices, delete games, and create folders to organize essential apps.&lt;/p&gt;

&lt;h5&gt;Remember to keep a specific workspace based on your task in order to avoid distractions&lt;/h5&gt;

&lt;h3&gt;
  
  
  3. Bundle Up
&lt;/h3&gt;

&lt;p&gt;We all love a package deal. Bring the bundle up benefit into your life to get things done. This technique works very well for self care and health habits as well as household chores and responsibilities that we all find so easy to put off.&lt;/p&gt;

&lt;p&gt;We are generally only accountable to ourselves for things like working out, mowing the grass, cleaning the house, cooking healthy meals, or doing the laundry. Make these tasks less tiresome and more appealing by bundling them with something you really love.&lt;/p&gt;

&lt;p&gt;If audiobooks are your jam, only listen to them when you are cleaning the house. Catch up on your favorite podcasts only while you cut the grass or cook dinner. Watch the latest binge-worthy show only when you are on the treadmill.&lt;/p&gt;

&lt;h5&gt;Find the trick to do annoying chores in a funny way.&lt;/h5&gt;

&lt;h3&gt;
  
  
  4. Set a Timer (Ex: Custom, Podomoro, Flow)
&lt;/h3&gt;

&lt;p&gt;People can accomplish staggering volumes of work simply by committing to show up and do the work for a set period of time, no matter what. Writers past and present have found success with time techniques but it works with a wide variety of tasks. Here’s how it works.&lt;/p&gt;

&lt;p&gt;Pick a task that you want to get done. This can be a routine, daily responsibility or a special project or work product you need to produce on a particular deadline. Decide how much time you have to work on the task each day or in this particular work period. It could be 15 minutes, 2 hours, or 60 seconds...pick a time period that makes sense for the task at hand. Set a timer for that time period and don’t stop until the timer goes off. No matter what!&lt;/p&gt;

&lt;p&gt;But, what if your kid comes in the room and needs help with their lesson? What if you need to take a bathroom break? What if the doorbell rings or your mom calls or the dog starts barking madly to go out? Look, life happens. We know that. Hit the pause button on the timer, take care of the immediate need, and get right back to it.&lt;/p&gt;

&lt;h5&gt;Remember to start the timer each time you pick a task.&lt;/h5&gt;

&lt;h3&gt;
  
  
  5. Worst Thing First
&lt;/h3&gt;

&lt;p&gt;This is a little psychological trick that is both effective and super rewarding. Think about all the things you want to do today or that should happen everyday. Take care of the task that is the least appealing as soon as humanly possible. Get it over with and move on to the things that are more engaging, easy, and fun, or just less frustrating, dull, or challenging.&lt;/p&gt;

&lt;p&gt;Once that “worst thing” is finished and done, there will be an immediate lift in spirit and a real sense of accomplishment. Ride that wave of success forward knowing that things will only get better from there! Worst Thing First is motivating, rewarding, and really works.&lt;/p&gt;

&lt;h5&gt;Remember to not pick the easiest task first&lt;/h5&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.doit.io/procrastinate/"&gt;https://blog.doit.io/procrastinate/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>zen</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>20 Nice repos/tools/posts - 1st April - #1</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Thu, 01 Apr 2021 11:37:36 +0000</pubDate>
      <link>https://dev.to/javidjms/nice-repos-tools-posts-1st-april-1-6fp</link>
      <guid>https://dev.to/javidjms/nice-repos-tools-posts-1st-april-1-6fp</guid>
      <description>&lt;h2&gt;
  
  
  Trending
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Awesome GitHub Profile README
&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%2Fgithub.com%2Fabhisheknaiidu%2Fawesome-github-profile-readme%2Fraw%2Fmaster%2Fassets%2Fagpr.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%2Fgithub.com%2Fabhisheknaiidu%2Fawesome-github-profile-readme%2Fraw%2Fmaster%2Fassets%2Fagpr.gif" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A curated list of awesome Github Profile READMEs&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/abhisheknaiidu/awesome-github-profile-readme" rel="noopener noreferrer"&gt;https://github.com/abhisheknaiidu/awesome-github-profile-readme&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Clone Wars
&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%2Fgourav.io%2F_next%2Fstatic%2Fmedia%2Fpages%2Fclone-wars%2Fimg%2Fog.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%2Fgourav.io%2F_next%2Fstatic%2Fmedia%2Fpages%2Fclone-wars%2Fimg%2Fog.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100+ open-source clones or alternatives of popular sites like Airbnb, Amazon, Instagram, Netflix, Tiktok, Spotify, Trello, Whatsapp, Youtube, etc. List contains source code, demo links, tech stack, and, GitHub stars count. Great for learning purpose!&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://gourav.io/clone-wars" rel="noopener noreferrer"&gt;https://gourav.io/clone-wars&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Algo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Visualgo
&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%2Frushis.com%2Fwp-content%2Fuploads%2F2014%2F08%2FVisuAlgo.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%2Frushis.com%2Fwp-content%2Fuploads%2F2014%2F08%2FVisuAlgo.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visualising data structures and algorithms through animation&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://visualgo.net/en" rel="noopener noreferrer"&gt;https://visualgo.net/en&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Collaborative Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Excalidraw
&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%2Fdigital-learning-academy.com%2Fwp-content%2Fuploads%2F2020%2F02%2Fexcalidraw-partage-768x365-1.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%2Fdigital-learning-academy.com%2Fwp-content%2Fuploads%2F2020%2F02%2Fexcalidraw-partage-768x365-1.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Excalidraw is a virtual collaborative whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://excalidraw.com/" rel="noopener noreferrer"&gt;https://excalidraw.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  CSS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Neumorphism.io
&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%2Fneumorphism.io%2FogImage.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%2Fneumorphism.io%2FogImage.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Generate Soft-UI CSS code with neumorphism styles.&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://neumorphism.io/#e0e0e0" rel="noopener noreferrer"&gt;https://neumorphism.io/#e0e0e0&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Glassmorphism
&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%2Fph-files.imgix.net%2F9b44fb10-8497-4838-ba05-007ccff6f7a7.png%3Fauto%3Dformat%26auto%3Dcompress%26codec%3Dmozjpeg%26cs%3Dstrip" 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%2Fph-files.imgix.net%2F9b44fb10-8497-4838-ba05-007ccff6f7a7.png%3Fauto%3Dformat%26auto%3Dcompress%26codec%3Dmozjpeg%26cs%3Dstrip" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Glassmorphism is a unified name for the popular Frosted Glass aesthetic. It has many names depending on the company using it, so we wanted to create a common ground for designers and developers to find related resources easier and faster.&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://glassmorphism.com/" rel="noopener noreferrer"&gt;https://glassmorphism.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS Grid Generator
&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%2Fs3-us-west-2.amazonaws.com%2Fs.cdpn.io%2F28963%2Fog-cssgrid.jpg" 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%2Fs3-us-west-2.amazonaws.com%2Fs.cdpn.io%2F28963%2Fog-cssgrid.jpg" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Layoutit grid is a CSS Grid layout generator. Quickly design web pages layouts with our clean editor, and get HTML and CSS code to quickstart your next project.&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://cssgrid-generator.netlify.app/" rel="noopener noreferrer"&gt;https://cssgrid-generator.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Awesome-Design-Tools
&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%2Fgithub.com%2FLisaDziuba%2FAwesome-Design-Tools%2Fraw%2Fmaster%2FMedia%2Fawesome-design-tools-joins-abstract-cover.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%2Fgithub.com%2FLisaDziuba%2FAwesome-Design-Tools%2Fraw%2Fmaster%2FMedia%2Fawesome-design-tools-joins-abstract-cover.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/goabstract/Awesome-Design-Tools" rel="noopener noreferrer"&gt;https://github.com/goabstract/Awesome-Design-Tools&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Undesign
&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%2Fmyweb-concept.fr%2Fwp-content%2Fuploads%2F2019%2F12%2Fundesign.jpg" 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%2Fmyweb-concept.fr%2Fwp-content%2Fuploads%2F2019%2F12%2Fundesign.jpg" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Collection of free design tools and resources for makers, developers and designers&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://undesign.learn.uno/" rel="noopener noreferrer"&gt;https://undesign.learn.uno/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Diun
&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%2Fgithub.com%2Fcrazy-max%2Fdiun%2Fraw%2Fmaster%2F.res%2Fscreenshot.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%2Fgithub.com%2Fcrazy-max%2Fdiun%2Fraw%2Fmaster%2F.res%2Fscreenshot.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Diun is a CLI application written in Go and delivered as a single executable (and a Docker image) to receive notifications when a Docker image is updated on a Docker registry.&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/crazy-max/diun" rel="noopener noreferrer"&gt;https://github.com/crazy-max/diun&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  K8S
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Trow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/fabe9876306bb443bd7abef1e8521d1bb97ad152f46fba15609081811192a088/68747470733a2f2f61736369696e656d612e6f72672f612f3438484b3838795234724a7730517548743256646b75565a6e2e737667" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/fabe9876306bb443bd7abef1e8521d1bb97ad152f46fba15609081811192a088/68747470733a2f2f61736369696e656d612e6f72672f612f3438484b3838795234724a7730517548743256646b75565a6e2e737667" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Image Management for Kubernetes&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/ContainerSolutions/trow" rel="noopener noreferrer"&gt;https://github.com/ContainerSolutions/trow&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MacOS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Docker-OSX
&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%2Fgithub.com%2Fsickcodes%2FDocker-OSX%2Fraw%2Fmaster%2Frunning-mac-inside-docker-qemu.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fsickcodes%2FDocker-OSX%2Fraw%2Fmaster%2Frunning-mac-inside-docker-qemu.png%3Fraw%3Dtrue" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run Mac OS X in Docker with near-native performance! X11 Forwarding! iMessage security research!&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/sickcodes/Docker-OSX" rel="noopener noreferrer"&gt;https://github.com/sickcodes/Docker-OSX&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  OSX Serial Generator
&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%2Fgithub.com%2Fsickcodes%2Fosx-serial-generator%2Fraw%2Fmaster%2Frunning-mac-inside-docker-qemu.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fsickcodes%2Fosx-serial-generator%2Fraw%2Fmaster%2Frunning-mac-inside-docker-qemu.png%3Fraw%3Dtrue" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Generate macOS valid serials, uuids, and board serials for good-faith security research.s&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/sickcodes/osx-serial-generator" rel="noopener noreferrer"&gt;https://github.com/sickcodes/osx-serial-generator&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  React
&lt;/h2&gt;

&lt;h3&gt;
  
  
  React Static
&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%2Fmiro.medium.com%2Fmax%2F5106%2F1%2AW5p6IVbRIarxENsIKfvniQ.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%2Fmiro.medium.com%2Fmax%2F5106%2F1%2AW5p6IVbRIarxENsIKfvniQ.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A progressive static-site generator for React.&lt;/p&gt;

&lt;p&gt;React-Static is a fast, lightweight, and powerful progressive static site generator based on React and its ecosystem. It resembles the simplicity and developer experience you're used to in tools like Create React App and has been carefully designed for performance, flexibility, and user/developer experience.&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/react-static/react-static" rel="noopener noreferrer"&gt;https://github.com/react-static/react-static&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nextra
&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%2Fgithub.com%2Fshuding%2Fnextra%2Fraw%2Fmaster%2Fpublic%2Fdemo.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%2Fgithub.com%2Fshuding%2Fnextra%2Fraw%2Fmaster%2Fpublic%2Fdemo.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nextra is a Next.js and MDX powered, no-code site generator.&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/shuding/nextra" rel="noopener noreferrer"&gt;https://github.com/shuding/nextra&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Refactoring Guru
&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%2Fmiro.medium.com%2Fmax%2F5600%2F1%2ArSicPoWDzUu92JCsgVsVSQ.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%2Fmiro.medium.com%2Fmax%2F5600%2F1%2ArSicPoWDzUu92JCsgVsVSQ.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refactoring.Guru makes it easy for you to discover everything you need to know about refactoring, design patterns, SOLID principles, and other smart programming topics.&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://refactoring.guru/" rel="noopener noreferrer"&gt;https://refactoring.guru/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Buildbase
&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%2Fd33wubrfki0l68.cloudfront.net%2Fb720c97d920781c8dc6f930377faa1203041299e%2F27562%2Fimg%2Fimg%2Fhero-img-ui.webp" 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%2Fd33wubrfki0l68.cloudfront.net%2Fb720c97d920781c8dc6f930377faa1203041299e%2F27562%2Fimg%2Fimg%2Fhero-img-ui.webp" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Build internal tools on your own infrastructure in minutes&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://www.budibase.com/" rel="noopener noreferrer"&gt;https://www.budibase.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CodeTour - VS Code extension
&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%2Fuser-images.githubusercontent.com%2F116461%2F76165260-c6c00500-6112-11ea-9cda-0a6cb9b72e8f.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%2Fuser-images.githubusercontent.com%2F116461%2F76165260-c6c00500-6112-11ea-9cda-0a6cb9b72e8f.gif" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CodeTour is a Visual Studio Code extension, which allows you to record and playback guided walkthroughs of your codebases. It's like a table of contents, that can make it easier to onboard (or re-board!) to a new project/feature area, visualize bug reports, or understand the context of a code review/PR change&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/microsoft/codetour" rel="noopener noreferrer"&gt;https://github.com/microsoft/codetour&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fusuma
&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%2Fgithub.com%2Fhiroppy%2Ffusuma%2Fblob%2Fmaster%2Fsite%2Fdocs%2Fassets%2Fthemes%2Fwebpack.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fhiroppy%2Ffusuma%2Fblob%2Fmaster%2Fsite%2Fdocs%2Fassets%2Fthemes%2Fwebpack.png%3Fraw%3Dtrue" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A tool to create slides easily for you ✍ ️&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://github.com/hiroppy/fusuma" rel="noopener noreferrer"&gt;https://github.com/hiroppy/fusuma&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Responsively
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/9c692245c2ec3c3d5b4485c2cd4d266b01e6a3849620ea1363b7a61fced78e12/68747470733a2f2f726573706f6e736976656c792e6170702f6173736574732f696d672f726573706f6e736976656c792d6170702e676966" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/9c692245c2ec3c3d5b4485c2cd4d266b01e6a3849620ea1363b7a61fced78e12/68747470733a2f2f726573706f6e736976656c792e6170702f6173736574732f696d672f726573706f6e736976656c792d6170702e676966" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A must-have devtool for web developers for quicker responsive web development. 🚀&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://responsively.app/" rel="noopener noreferrer"&gt;https://responsively.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Quick handle CORS with Nginx</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Thu, 01 Apr 2021 09:56:15 +0000</pubDate>
      <link>https://dev.to/javidjms/quick-handle-cors-with-nginx-3m5</link>
      <guid>https://dev.to/javidjms/quick-handle-cors-with-nginx-3m5</guid>
      <description>&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;p&gt;In some cases, you would like to disable the cross origin requests restrictions because it is only allowed for same origin by default.&lt;/p&gt;

&lt;p&gt;In my case, I deal with several APIs with differents origins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;1) GET/OPTIONS endpoint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  location / &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="c"&gt;# Allow some origins&lt;/span&gt;
      &lt;span class="c"&gt;#if ($http_origin ~* (https?:\/\/(localhost:8000|myfirstorigin:8000))) {&lt;/span&gt;
      &lt;span class="c"&gt;# set $cors "1";&lt;/span&gt;
      &lt;span class="c"&gt;#}&lt;/span&gt;

      &lt;span class="c"&gt;# Allow all origins&lt;/span&gt;
      &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$cors&lt;/span&gt; &lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c"&gt;# Append CORS headers to any request from allowed CORS domain, except OPTIONS&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          add_header Access-Control-Allow-Credentials &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          add_header Access-Control-Allow-Origin &lt;span class="nv"&gt;$http_origin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;

      &lt;span class="c"&gt;# OPTIONS (pre-flight) request from allowed CORS domain. return response directly&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'OPTIONS'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
           add_header Access-Control-Allow-Methods &lt;span class="s1"&gt;'GET, POST, OPTIONS, PUT, DELETE'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           add_header Access-Control-Allow-Credentials &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           add_header Access-Control-Allow-Headers &lt;span class="s1"&gt;'Origin,Content-Type,Accept'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           add_header Content-Length 0&lt;span class="p"&gt;;&lt;/span&gt;
           add_header Content-Type text/plain&lt;span class="p"&gt;;&lt;/span&gt;
           &lt;span class="k"&gt;return &lt;/span&gt;204&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;

      proxy_set_header Host &lt;span class="nv"&gt;$http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      proxy_set_header X-Real-IP &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      proxy_pass https://mysecondorigin/api/&lt;span class="p"&gt;;&lt;/span&gt;
      proxy_http_version 1.1&lt;span class="p"&gt;;&lt;/span&gt;
      proxy_read_timeout 600s&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) POST endpoint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;add_header Access-Control-Allow-Origin &lt;span class="nv"&gt;$http_origin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>devops</category>
      <category>nginx</category>
    </item>
    <item>
      <title>Nice vector illustrations resources</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Mon, 29 Mar 2021 13:49:57 +0000</pubDate>
      <link>https://dev.to/javidjms/nice-vector-illustrations-resources-h3p</link>
      <guid>https://dev.to/javidjms/nice-vector-illustrations-resources-h3p</guid>
      <description>&lt;h2&gt;
  
  
  Drawkit
&lt;/h2&gt;

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

&lt;p&gt;Link: &lt;a href="https://www.drawkit.io/"&gt;https://www.drawkit.io/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Undraw
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J25fOrTs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0esmhd3aynmr6785p55w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J25fOrTs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0esmhd3aynmr6785p55w.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://undraw.co/illustrations"&gt;https://undraw.co/illustrations&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Storyset
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f4k9OFKw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ieas6aebyq7i4vy8jqb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f4k9OFKw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ieas6aebyq7i4vy8jqb.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://storyset.com/"&gt;https://storyset.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Icons8
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KaX-nnb7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2j0h3kj55fltzncd51x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KaX-nnb7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2j0h3kj55fltzncd51x.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://icons8.com/illustrations"&gt;https://icons8.com/illustrations&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Error404
&lt;/h2&gt;

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

&lt;p&gt;Link : &lt;a href="https://error404.fun/"&gt;https://error404.fun/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Delesign
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f5ZMgb9q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/80yu0m7eszeozeh8pdmv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f5ZMgb9q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/80yu0m7eszeozeh8pdmv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://delesign.com/free-designs/graphics"&gt;https://delesign.com/free-designs/graphics/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Brooklyn
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rg33fJuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ruybst0aenkadkwk81h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rg33fJuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ruybst0aenkadkwk81h.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://www.streamlinehq.com/illustrations/brooklyn"&gt;https://www.streamlinehq.com/illustrations/brooklyn&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Blush Design
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nlZ3sMt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6mqcdrqjt5iurq9gb9fw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nlZ3sMt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6mqcdrqjt5iurq9gb9fw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://blush.design/fr"&gt;https://blush.design/fr&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Control Rocks
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q1FgouEl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ii04j8fxbs8c7w7w9jw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q1FgouEl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ii04j8fxbs8c7w7w9jw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link : &lt;a href="https://control.rocks/"&gt;https://control.rocks/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you know other illustrations resouces, I would be happy to hear it. 😊 &lt;/strong&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>webdev</category>
      <category>ux</category>
      <category>javascript</category>
    </item>
    <item>
      <title>YASG: The Redoc Swagger UI for Django/DRF</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Wed, 24 Mar 2021 09:29:36 +0000</pubDate>
      <link>https://dev.to/javidjms/yasg-the-redoc-swagger-ui-for-django-drf-32n6</link>
      <guid>https://dev.to/javidjms/yasg-the-redoc-swagger-ui-for-django-drf-32n6</guid>
      <description>&lt;h2&gt;
  
  
  Concepts
&lt;/h2&gt;

&lt;p&gt;Generate real Swagger/OpenAPI 2.0 specifications from a Django Rest Framework API.&lt;/p&gt;

&lt;p&gt;Compatible with&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Django Rest Framework: 3.10, 3.11, 3.12&lt;/li&gt;
&lt;li&gt;Django: 2.2, 3.0, 3.1&lt;/li&gt;
&lt;li&gt;Python: 3.6, 3.7, 3.8, 3.9&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4NRZr3IY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/axnsan12/drf-yasg/1.0.2/screenshots/redoc-nested-response.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4NRZr3IY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/axnsan12/drf-yasg/1.0.2/screenshots/redoc-nested-response.png" alt="Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;1) Installation&lt;/p&gt;

&lt;p&gt;The preferred instalation method is directly from pypi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;drf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;yasg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;2) Quickstart&lt;/p&gt;

&lt;p&gt;In settings.py:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="p"&gt;...&lt;/span&gt;
   &lt;span class="s"&gt;'django.contrib.staticfiles'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# required for serving swagger ui's css/js files
&lt;/span&gt;   &lt;span class="s"&gt;'drf_yasg'&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;In urls.py:&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="p"&gt;...&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;rest_framework&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;permissions&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;drf_yasg.views&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_schema_view&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;drf_yasg&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;openapi&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;schema_view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_schema_view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;openapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Snippets API"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;default_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'v1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Test description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;terms_of_service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://www.google.com/policies/terms/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;contact&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;openapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"contact@snippets.local"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="n"&gt;license&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;openapi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;License&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="s"&gt;"BSD License"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
   &lt;span class="p"&gt;),&lt;/span&gt;
   &lt;span class="n"&gt;public&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;permission_classes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowAny&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&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="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s"&gt;'^swagger(?P&amp;lt;format&amp;gt;\.json|\.yaml)$'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema_view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;without_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_timeout&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;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'schema-json'&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="sa"&gt;r&lt;/span&gt;&lt;span class="s"&gt;'^swagger/$'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema_view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'swagger'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache_timeout&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;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'schema-swagger-ui'&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="sa"&gt;r&lt;/span&gt;&lt;span class="s"&gt;'^redoc/$'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema_view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'redoc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache_timeout&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;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'schema-redoc'&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 exposes 4 endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A JSON view of your API specification at /swagger.json&lt;/li&gt;
&lt;li&gt;A YAML view of your API specification at /swagger.yaml&lt;/li&gt;
&lt;li&gt;A swagger-ui view of your API specification at /swagger/&lt;/li&gt;
&lt;li&gt;A ReDoc view of your API specification at /redoc/&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/axnsan12"&gt;
        axnsan12
      &lt;/a&gt; / &lt;a href="https://github.com/axnsan12/drf-yasg"&gt;
        drf-yasg
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Automated generation of real Swagger/OpenAPI 2.0 schemas from Django REST Framework code.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://drf-yasg-demo.herokuapp.com/redoc/"&gt;https://drf-yasg-demo.herokuapp.com/redoc/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Django-probes: wait until database is ready - Probes for Docker and Kubernetes</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Sat, 20 Mar 2021 19:39:41 +0000</pubDate>
      <link>https://dev.to/javidjms/django-probes-wait-until-database-is-ready-probes-for-docker-and-kubernetes-6o7</link>
      <guid>https://dev.to/javidjms/django-probes-wait-until-database-is-ready-probes-for-docker-and-kubernetes-6o7</guid>
      <description>&lt;h2&gt;
  
  
  Concepts
&lt;/h2&gt;

&lt;p&gt;Provides a Django management command to check whether the primary database is ready to accept connections.&lt;/p&gt;

&lt;p&gt;Run this command in a Kubernetes or OpenShift Init Container to make your Django application wait until the database is available (e.g. to run database migrations).&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;The easiest way to install django-probes is with pip&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;probes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Basic Usage
&lt;/h2&gt;

&lt;p&gt;1) Add django-probes to your Django application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="s"&gt;'django_probes'&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;2) Add an Init Container to your Kubernetes/OpenShift deployment configuration, which calls the wait_for_database management command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;- kind: Deployment
  apiVersion: apps/v1
  spec:
    template:
      spec:
        initContainers:
        - name: wait-for-database
          image: my-django-app:latest
          envFrom:
          - secretRef:
              name: django
          &lt;span class="nb"&gt;command&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'python'&lt;/span&gt;, &lt;span class="s1"&gt;'manage.py'&lt;/span&gt;, &lt;span class="s1"&gt;'wait_for_database'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/painless-software/django-probes"&gt;https://github.com/painless-software/django-probes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>kubernetes</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Photologue : Nice Image Management for Django with DRF Integration</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Sat, 20 Mar 2021 10:58:43 +0000</pubDate>
      <link>https://dev.to/javidjms/photologue-nice-image-management-for-django-with-drf-integration-6o9</link>
      <guid>https://dev.to/javidjms/photologue-nice-image-management-for-django-with-drf-integration-6o9</guid>
      <description>&lt;h2&gt;
  
  
  Concepts
&lt;/h2&gt;

&lt;p&gt;A powerful image management and gallery application for the Django web framework. Upload photos, group them into galleries, apply effects such as watermarks.&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%2F80ogkcayq9iyamvb1bnc.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%2F80ogkcayq9iyamvb1bnc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Django.&lt;/li&gt;
&lt;li&gt;Pillow.&lt;/li&gt;
&lt;li&gt;Django-sortedm2m. (Automatically installed with django-photologue)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;The easiest way to install Photologue is with pip; this will give you the latest version available on PyPi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;django-photologue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Ensure that you have set &lt;em&gt;MEDIA_URL&lt;/em&gt; and &lt;em&gt;MEDIA_ROOT&lt;/em&gt; in &lt;em&gt;setting.py&lt;/em&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;#settings.py
&lt;/span&gt;
&lt;span class="n"&gt;MEDIA_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;MEDIA_ROOT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&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;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;1) Add &lt;em&gt;photologue&lt;/em&gt;, &lt;em&gt;sortedm2m&lt;/em&gt;, &lt;em&gt;django.contrib.sites&lt;/em&gt; in &lt;em&gt;INSTALLED_APPS&lt;/em&gt; and &lt;em&gt;SITE_ID=1&lt;/em&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;#settings.py
&lt;/span&gt;&lt;span class="n"&gt;SITE_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&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.contrib.sites&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# Django Image Library - Photologue
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;photologue&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;sortedm2m&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;2) Apply photologue migrations&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 migrate photologue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Register photologue urls in &lt;em&gt;urls.py&lt;/em&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="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="c1"&gt;# Photologue Urls
&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;photologue/&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;photologue.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;photologue&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;h3&gt;
  
  
  Models
&lt;/h3&gt;

&lt;p&gt;Add the photologue Photo field in your model :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;image&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;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;photologue.Photo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;null&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;blank&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;on_delete&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="n"&gt;SET_NULL&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;Then apply migrations.&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 makemigrations
python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example of model :&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BlogPost&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;uuid&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;UUIDField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;primary_key&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;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The uuid4 primary key of the post&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="n"&gt;title&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;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The title of the post&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="n"&gt;content&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;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;blank&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;help_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The content of the post&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="n"&gt;publishers&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;ManyToManyField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;auth.User&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;related_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;posts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The maintainers of the pods&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="n"&gt;preview_image&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;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;photologue.Photo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;null&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;blank&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;on_delete&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="n"&gt;SET_NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The preview image of the appx&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="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="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Appx: &lt;/span&gt;&lt;span class="si"&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;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gallery
&lt;/h3&gt;

&lt;p&gt;You can add a Gallery field which is a M2M of Photo field.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;gallery&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;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;photologue.Gallery&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;null&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;blank&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;on_delete&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="n"&gt;SET_NULL&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;h3&gt;
  
  
  Photo Sizes
&lt;/h3&gt;

&lt;p&gt;Go to the Django Admin Interface, then you can create new PhotoSize instances.&lt;br&gt;
When a Photo instance will be created, an image will be created for each photo sizes with automatic crop and quality compression.&lt;/p&gt;

&lt;p&gt;Here is examples of photo sizes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;thumbnail (100 x 100)&lt;/li&gt;
&lt;li&gt;small (320 x 200)&lt;/li&gt;
&lt;li&gt;medium (640 x 400)&lt;/li&gt;
&lt;li&gt;large (960 x 600)&lt;/li&gt;
&lt;/ul&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%2F7cb89iy6iavblc5d5t0b.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%2F7cb89iy6iavblc5d5t0b.png" alt="Alt Text"&gt;&lt;/a&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%2F630hocamctfj30u51hwk.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%2F630hocamctfj30u51hwk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Accessors
&lt;/h3&gt;

&lt;p&gt;The base of Photologue is the Photo model. When an instance is created, methods will be automatically added in order to retrieve photos at various photosizes. E.g. if you have an instance of Photo called image, then the following methods will have been added automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;preview_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_small_url&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;preview_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_medium_url&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;preview_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_large_url&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;preview_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_raw_url&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These can be used in a custom template to display a thumbnail, e.g.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{{ preview_image.image.url }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"{{ preview_image.get_raw_url }}"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"{{ preview_image.title }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utils
&lt;/h3&gt;

&lt;p&gt;Here is an function that take an image and produce a Photo instance :&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.utils.text&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;slugify&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;photologue.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Photo&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_photo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;slugify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;photo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Photo&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;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;title&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;slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;image&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="n"&gt;photo&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  DRF Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mixins
&lt;/h3&gt;

&lt;p&gt;You can define this method &lt;em&gt;create_mixin_image_serializer()&lt;/em&gt; which produces a MixinSerializer based on a image field name.&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rest_framework&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;serializers&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;photologue.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PhotoSize&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OrderedDict&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_get_image_factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_field_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;photo_size&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;get_image&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;obj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&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;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;request&lt;/span&gt;&lt;span class="sh"&gt;'&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;request&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image_field_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image_field_name&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;image&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&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;get_url_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;get_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;photo_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_url&lt;/span&gt;&lt;span class="sh"&gt;'&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="nf"&gt;get_url_method&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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build_absolute_uri&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="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;get_image&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_mixin_image_serializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_field_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;photo_sizes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PhotoSize&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__gte&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&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;name&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImageSerializerMixin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelSerializer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="n"&gt;ImageSerializerMixin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_declared_fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OrderedDict&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_field_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;photo_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SerializerMethodField&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;photo_size&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;photo_sizes&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;photo_size&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;photo_sizes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;setattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;ImageSerializerMixin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;get_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_field_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;photo_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nf"&gt;_get_image_factory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_field_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;photo_size&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="n"&gt;ImageSerializerMixin&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Serializers
&lt;/h3&gt;

&lt;p&gt;1) You can instanciate a mixin image serializer with the field &lt;em&gt;preview_image&lt;/em&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="n"&gt;PreviewImageSerializerMixin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_mixin_image_serializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&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;Otherwise you can manually create the mixin image serializer :&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PreviewImageSerializerMixin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelSerializer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;preview_image_small&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SerializerMethodField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;preview_image_medium&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SerializerMethodField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;preview_image_large&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SerializerMethodField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;preview_image_raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SerializerMethodField&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;get_preview_image_small&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;obj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
       &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&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;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;request&lt;/span&gt;&lt;span class="sh"&gt;'&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;request&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&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;image&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_small_url&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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build_absolute_uri&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="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_preview_image_medium&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;obj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
       &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&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;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;request&lt;/span&gt;&lt;span class="sh"&gt;'&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;request&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&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;image&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_medium_url&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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build_absolute_uri&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="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_preview_image_large&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;obj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
       &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&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;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;request&lt;/span&gt;&lt;span class="sh"&gt;'&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;request&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&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;image&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_large_url&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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build_absolute_uri&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="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_preview_image_raw&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;obj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
       &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&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;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;request&lt;/span&gt;&lt;span class="sh"&gt;'&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;request&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&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;image&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_raw_url&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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build_absolute_uri&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="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Here is an exemple of serializer :&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BlogPostSerializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PreviewImageSerializerMixin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Serializer for BlogPost instance
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Meta&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;BlogPost&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;uuid&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;title&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;content&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;preview_image_small&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;preview_image_medium&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;preview_image_large&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;preview_image_raw&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;3) Define &lt;em&gt;create()&lt;/em&gt; and &lt;em&gt;update()&lt;/em&gt; in case of uploading image :&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&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;validated_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;preview_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;validated_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&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;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BlogPostSerializer&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="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;validated_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Save image field
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;preview_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preview_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_photo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preview_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&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;instance&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&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;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;validated_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
          &lt;span class="n"&gt;preview_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;validated_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;preview_image&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&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;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BlogPostSerializer&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="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;validated_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Update image field
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;preview_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preview_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_photo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preview_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&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;instance&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Notes for Production
&lt;/h2&gt;

&lt;p&gt;You should integrate the photologue library step by step.&lt;/p&gt;

&lt;p&gt;1) Install the package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;django-photologue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Add &lt;em&gt;photologue&lt;/em&gt;, &lt;em&gt;sortedm2m&lt;/em&gt;, &lt;em&gt;django.contrib.sites&lt;/em&gt; in &lt;em&gt;INSTALLED_APPS&lt;/em&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="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.contrib.sites&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# Django Image Library - Photologue
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;photologue&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;sortedm2m&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py migrate photologue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Apply photologue migrations&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 migrate photologue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) If you would like to replace an ImageField with a Photo in your models.py, you have to follow theses steps :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove ImageField in your models.py&lt;/li&gt;
&lt;li&gt;Apply migrations &lt;/li&gt;
&lt;li&gt;Add Photo in your models.py&lt;/li&gt;
&lt;li&gt;Apply migrations &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you would like to keep your images, you should keep two fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add Photo in your models.py&lt;/li&gt;
&lt;li&gt;Apply migrations &lt;/li&gt;
&lt;li&gt;Instanciates Photo&lt;/li&gt;
&lt;li&gt;Remove ImageField in your models.py&lt;/li&gt;
&lt;li&gt;Apply migrations &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://django-photologue.readthedocs.io/" rel="noopener noreferrer"&gt;https://django-photologue.readthedocs.io/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.django-photologue.net/" rel="noopener noreferrer"&gt;https://www.django-photologue.net/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/richardbarran/django-photologue/wiki/Examples-and-forks" rel="noopener noreferrer"&gt;https://github.com/richardbarran/django-photologue/wiki/Examples-and-forks&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Atomize : Simple Design System for React</title>
      <dc:creator>Javid Mougamadou</dc:creator>
      <pubDate>Mon, 15 Mar 2021 14:27:30 +0000</pubDate>
      <link>https://dev.to/javidjms/atomize-simple-design-system-for-react-14h5</link>
      <guid>https://dev.to/javidjms/atomize-simple-design-system-for-react-14h5</guid>
      <description>&lt;h2&gt;
  
  
  Concept
&lt;/h2&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%2F5jb99b2cv0ey1gxujwox.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%2F5jb99b2cv0ey1gxujwox.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Atomize React is a UI framework that helps developers collaborate with designers and build consistent user interfaces effortlessly.&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%2Fe7d7qv80qohkllvqkmdl.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%2Fe7d7qv80qohkllvqkmdl.png" alt="Alt Text"&gt;&lt;/a&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%2Fliucqb0osnj1daeu8by3.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%2Fliucqb0osnj1daeu8by3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;UI design system for web apps.&lt;/li&gt;
&lt;li&gt;Elegant and beautiful React components&lt;/li&gt;
&lt;li&gt;Environment Support&lt;/li&gt;
&lt;li&gt;Modern browsers and Internet Explorer 9+&lt;/li&gt;
&lt;li&gt;Server-side Rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;atomize react-transition-group
yarn add atomize react-transition-group
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;atomize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mountNode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Link
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://atomizecode.com/" rel="noopener noreferrer"&gt;https://atomizecode.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/proksh/atomize" rel="noopener noreferrer"&gt;https://github.com/proksh/atomize&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>design</category>
    </item>
  </channel>
</rss>
