<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Vinit Kumar]]></title><description><![CDATA[My essays on programming, technology and life]]></description><link>https://vinitkumar.me</link><generator>GatsbyJS</generator><lastBuildDate>Mon, 02 Mar 2026 10:09:04 GMT</lastBuildDate><item><title><![CDATA[New Blog After a Hiatus]]></title><description><![CDATA[I have not written a blog in some weeks. What Happened I worked on a big feature at work that took me some months of work and last couple of…]]></description><link>https://vinitkumar.me/new-blog-after-hiatus/</link><guid isPermaLink="false">https://vinitkumar.me/new-blog-after-hiatus/</guid><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have not written a blog in some weeks.&lt;/p&gt;
&lt;h2&gt;What Happened&lt;/h2&gt;
&lt;p&gt;I worked on a big feature at work that took me some months of work and last couple of weeks where we took it live to production. There was an extensive round of testing and that took all my energy and attention.&lt;/p&gt;
&lt;h2&gt;Why I Stepped Away&lt;/h2&gt;
&lt;p&gt;I realised I was doing a lot of work at work and also on open source and I started feeling a wee-bit exhausted so I thought it was best to take a break and go easy on myself. And, I am glad that I did that. All my experience tells when to step back and go easy on myself.&lt;/p&gt;
&lt;h2&gt;What Changed&lt;/h2&gt;
&lt;p&gt;Now, as the dust has settled from the deployment, I am going to be more active in my blogs. I am also thinking of writing more general topics and not just mostly tech posts.&lt;/p&gt;
&lt;p&gt;I also went on a couple vacations. Here are some picture from the same. Enjoy! :)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a5a76abc79810cf12de98f1927da7c3f/0cf16/image1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAFGSLiwlF//xAAcEAACAgIDAAAAAAAAAAAAAAABAgQRAAMUMUH/2gAIAQEAAQUCMx75T4ZOy2FP6e//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwFH/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BV//EABkQAAIDAQAAAAAAAAAAAAAAAAABAhAyQf/aAAgBAQAGPwLiNRNod//EABwQAAMAAQUAAAAAAAAAAAAAAAABITERUXGBwf/aAAgBAQABPyHCaXBXyMZ0oUglDYQyUR//2gAMAwEAAgADAAAAEJvP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxAf/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8Qo//EABsQAQEAAwEBAQAAAAAAAAAAAAERACExoUFh/9oACAEBAAE/EEVM1FN9xZMh+cmUtT8Z7kKwWGM5Es5nOQdAZ//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Vacation photo 1&quot;
        title=&quot;&quot;
        src=&quot;/static/a5a76abc79810cf12de98f1927da7c3f/1c72d/image1.jpg&quot;
        srcset=&quot;/static/a5a76abc79810cf12de98f1927da7c3f/a80bd/image1.jpg 148w,
/static/a5a76abc79810cf12de98f1927da7c3f/1c91a/image1.jpg 295w,
/static/a5a76abc79810cf12de98f1927da7c3f/1c72d/image1.jpg 590w,
/static/a5a76abc79810cf12de98f1927da7c3f/a8a14/image1.jpg 885w,
/static/a5a76abc79810cf12de98f1927da7c3f/fbd2c/image1.jpg 1180w,
/static/a5a76abc79810cf12de98f1927da7c3f/0cf16/image1.jpg 6912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/fcc7acbf9e84f6152d1369300bceb819/e5166/image2.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.1081081081081%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAQFAwEC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGn6g751VEBENJ/YbFxP//EAB8QAAEDAwUAAAAAAAAAAAAAAAEAAgMEETEQEhMjQf/aAAgBAQABBQLCDrhdia6a15E2UbucI1LtDnz/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPwEp/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAGxAAAQQDAAAAAAAAAAAAAAAAAAERIDEhQWH/2gAIAQEABj8ChwobSGEKh//EAB0QAAICAgMBAAAAAAAAAAAAAAABESExQRCBkVH/2gAIAQEAAT8hW0iVu1JJjh+iq12Z9U9LZN3Y93W2yRSLhoCSgf/aAAwDAQACAAMAAAAQExqP/8QAFxEBAQEBAAAAAAAAAAAAAAAAABEBcf/aAAgBAwEBPxDOKrFf/8QAGBEBAAMBAAAAAAAAAAAAAAAAAQAQEXH/2gAIAQIBAT8Qe1gzSf/EABwQAQACAwEBAQAAAAAAAAAAAAEAESExUUFx8P/aAAgBAQABPxBgsU5NTVqrSU9FerBwFe/24EG7FEHLsfMIKGwNnGIcBtl9GOS3quNsAQs9I1I4CORBUn//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Vacation photo 2&quot;
        title=&quot;&quot;
        src=&quot;/static/fcc7acbf9e84f6152d1369300bceb819/1c72d/image2.jpg&quot;
        srcset=&quot;/static/fcc7acbf9e84f6152d1369300bceb819/a80bd/image2.jpg 148w,
/static/fcc7acbf9e84f6152d1369300bceb819/1c91a/image2.jpg 295w,
/static/fcc7acbf9e84f6152d1369300bceb819/1c72d/image2.jpg 590w,
/static/fcc7acbf9e84f6152d1369300bceb819/a8a14/image2.jpg 885w,
/static/fcc7acbf9e84f6152d1369300bceb819/fbd2c/image2.jpg 1180w,
/static/fcc7acbf9e84f6152d1369300bceb819/e5166/image2.jpg 1200w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/eb9a14c9f2424a16d69457597141e601/d2602/image3.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHCums0pcT/xAAaEAADAAMBAAAAAAAAAAAAAAAAAQIDERIh/9oACAEBAAEFApZ7Jjz1EJaF0zk//8QAFREBAQAAAAAAAAAAAAAAAAAAABL/2gAIAQMBAT8BS//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ASf/xAAbEAACAgMBAAAAAAAAAAAAAAAAAREhEEFhof/aAAgBAQAGPwJqDZBXpFJcx//EABoQAQEBAQEBAQAAAAAAAAAAAAERACFxMVH/2gAIAQEAAT8hGIG88zCSPMMLw+cy/q+MipusGM//2gAMAwEAAgADAAAAENAv/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAEDAQE/EJqH/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARMf/aAAgBAgEBPxAb2Fv/xAAcEAEAAwACAwAAAAAAAAAAAAABABEhQVGRweH/2gAIAQEAAT8Qp0BrL1AwGsbdS+Zna9HUCEvBgV4Y0UfRr65lB9n/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Vacation photo 3&quot;
        title=&quot;&quot;
        src=&quot;/static/eb9a14c9f2424a16d69457597141e601/1c72d/image3.jpg&quot;
        srcset=&quot;/static/eb9a14c9f2424a16d69457597141e601/a80bd/image3.jpg 148w,
/static/eb9a14c9f2424a16d69457597141e601/1c91a/image3.jpg 295w,
/static/eb9a14c9f2424a16d69457597141e601/1c72d/image3.jpg 590w,
/static/eb9a14c9f2424a16d69457597141e601/a8a14/image3.jpg 885w,
/static/eb9a14c9f2424a16d69457597141e601/fbd2c/image3.jpg 1180w,
/static/eb9a14c9f2424a16d69457597141e601/d2602/image3.jpg 4032w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f1a0a5816ab284cf0d5207f26715179f/0cf16/IMG_4634.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAgP/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAG0IZjIqH//xAAaEAACAgMAAAAAAAAAAAAAAAAAAQIDEBET/9oACAEBAAEFAldMnc0u8xs3j//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABoQAAEFAQAAAAAAAAAAAAAAAAABAhEgITL/2gAIAQEABj8C1piScU//xAAZEAADAQEBAAAAAAAAAAAAAAAAARFRMYH/2gAIAQEAAT8he4L0obMo7hmjbSvT/9oADAMBAAIAAwAAABBQz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABwQAAIABwAAAAAAAAAAAAAAAAABESFBUWGhsf/aAAgBAQABPxBByI+IoQUptkW5i7GYf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Vacation photo 4&quot;
        title=&quot;&quot;
        src=&quot;/static/f1a0a5816ab284cf0d5207f26715179f/1c72d/IMG_4634.jpg&quot;
        srcset=&quot;/static/f1a0a5816ab284cf0d5207f26715179f/a80bd/IMG_4634.jpg 148w,
/static/f1a0a5816ab284cf0d5207f26715179f/1c91a/IMG_4634.jpg 295w,
/static/f1a0a5816ab284cf0d5207f26715179f/1c72d/IMG_4634.jpg 590w,
/static/f1a0a5816ab284cf0d5207f26715179f/a8a14/IMG_4634.jpg 885w,
/static/f1a0a5816ab284cf0d5207f26715179f/fbd2c/IMG_4634.jpg 1180w,
/static/f1a0a5816ab284cf0d5207f26715179f/0cf16/IMG_4634.jpg 6912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/689764b9e13ed5bec0c6c9b5c2336439/d2602/IMG_5082.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAFm5m5aRB//xAAYEAEBAQEBAAAAAAAAAAAAAAABABIQE//aAAgBAQABBQL0LVshY5//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPwGn/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAGRABAQADAQAAAAAAAAAAAAAAAQARQVFh/9oACAEBAAE/IUuwd3q3VJst/9oADAMBAAIAAwAAABDkL//EABYRAQEBAAAAAAAAAAAAAAAAAAARAf/aAAgBAwEBPxCl1//EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxCIiP/EABkQAQEBAQEBAAAAAAAAAAAAAAERADFRgf/aAAgBAQABPxBAEIss3SkDrbvYPlyAFM5lBXNu7//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Vacation photo 5&quot;
        title=&quot;&quot;
        src=&quot;/static/689764b9e13ed5bec0c6c9b5c2336439/1c72d/IMG_5082.jpg&quot;
        srcset=&quot;/static/689764b9e13ed5bec0c6c9b5c2336439/a80bd/IMG_5082.jpg 148w,
/static/689764b9e13ed5bec0c6c9b5c2336439/1c91a/IMG_5082.jpg 295w,
/static/689764b9e13ed5bec0c6c9b5c2336439/1c72d/IMG_5082.jpg 590w,
/static/689764b9e13ed5bec0c6c9b5c2336439/a8a14/IMG_5082.jpg 885w,
/static/689764b9e13ed5bec0c6c9b5c2336439/fbd2c/IMG_5082.jpg 1180w,
/static/689764b9e13ed5bec0c6c9b5c2336439/d2602/IMG_5082.jpg 4032w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7600298cefa431644bd6cc61e6141bd7/d2602/IMG_5091.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIFAQT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABZ52y9ZFKP//EABkQAAMBAQEAAAAAAAAAAAAAAAABAwITIf/aAAgBAQABBQJXR1Q75IJOl/NH/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAEDAQE/AaV//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/AYF//8QAGRAAAgMBAAAAAAAAAAAAAAAAABABESEx/9oACAEBAAY/Ajq0ml//xAAYEAEBAQEBAAAAAAAAAAAAAAABEQAhMf/aAAgBAQABPyFwd1sA+4SCkuBMmu//2gAMAwEAAgADAAAAEMgP/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAwEBPxDC0rP/xAAXEQADAQAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/ENJCI//EABwQAQACAwADAAAAAAAAAAAAAAEAESExQVFhcf/aAAgBAQABPxA+vaZx2Aqw+kSl17Bag6PklJ2mj1FXuf/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Vacation photo 6&quot;
        title=&quot;&quot;
        src=&quot;/static/7600298cefa431644bd6cc61e6141bd7/1c72d/IMG_5091.jpg&quot;
        srcset=&quot;/static/7600298cefa431644bd6cc61e6141bd7/a80bd/IMG_5091.jpg 148w,
/static/7600298cefa431644bd6cc61e6141bd7/1c91a/IMG_5091.jpg 295w,
/static/7600298cefa431644bd6cc61e6141bd7/1c72d/IMG_5091.jpg 590w,
/static/7600298cefa431644bd6cc61e6141bd7/a8a14/IMG_5091.jpg 885w,
/static/7600298cefa431644bd6cc61e6141bd7/fbd2c/IMG_5091.jpg 1180w,
/static/7600298cefa431644bd6cc61e6141bd7/d2602/IMG_5091.jpg 4032w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;What’s Next&lt;/h2&gt;
&lt;p&gt;I am looking forward to writing more regularly and sharing my thoughts and experiences with all of you.&lt;/p&gt;
&lt;h2&gt;Closing Thoughts&lt;/h2&gt;
&lt;p&gt;Thank you for sticking with me during the hiatus. I hope you enjoy the content I write going forward.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[json2xml v6.0.1: 29x Faster with Native Rust Extension]]></title><description><![CDATA[I’ve been maintaining json2xml for years now. It’s a simple library that converts JSON to XML, and it’s been working fine. But “fine” wasn’t…]]></description><link>https://vinitkumar.me/json2xml-rust-extension/</link><guid isPermaLink="false">https://vinitkumar.me/json2xml-rust-extension/</guid><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d2427608eacaf2becaf77784d6649f2c/133ae/json2xml-hero.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.70270270270271%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAACm0lEQVR42hXSyU8TYQAF8BHmm+2bpTMwZShbWyhtpzPttENLW7pRFltLbRXFChQEhIKJ4EHUKptRFI2iFw3Gg4lH4hYOLvFAYtCDJB408aA3/Qf8Eyy3d/nlHd5DAOVEoYqyXpTzo3wQCGFMjAI+BLgAYDsArWG0B2e8NPSKhk6W87NCmBMjdE0nyWsIStoBJeOshnM6MAQA5yfqY5T9MDCGUUEnGiLQkiCFDhRTWTZSJ/XX1afM8niL4zQt6AcYhzIBXaKoCUad4HSsJijlSm1za9aZJduVdVNqDNAeX4N8UvNmPLGI3ONQcu3R2Vp7FiEZpVlyjfSFVqfz4/ksw6kY5zOfvZre+Rj48Hlo70tk8SaCuc5pjp/znl+rvX82C/s3R5P9I5w+ijRJvrVS4dJo78Vi+mk5bzerh0iZ7yu2rWy67z3qfvyscWACQe1pm7o7n/i6Mvh7Mfq2lGyypmg1j8gtsTszudlM8vpEz5uNwaXJgXTPQHah3Lf9OvryVfjBln55vXuufKE48uP+qe9rmb2SXtBiDB2lmuKI3Ji7MTW0s5x5fzv3aWtqe2NybnjQFz6inL+W+7bvnF6Ugrng0OzkcPH5mfi/svth2i0Z/JAJkGIXwhm0E33D75aO/n1R2HsydiwWI3BbNe6gLDH/8l28OYRUWapQK+Q8CYu6O+5SJS8BfRisTOhGeHNc9hQWjk/cmopnI10846KhE1IyxaikoOHQCaj2aqK9CnPwrNpap1EVSevoAVYQrjFZ29xvMqbq+YRJCJiMIZ5WDKTMkk6asJFEK4ZbUKK14it3QEk3Rmso9KKwEmSk0sAwHo6WaxhFZNwmLiCxPiN0i5TCUw6GspKEGRBmlLACyg6gDGgFo1UAXQA6/gMM+o0jWAvGXgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;json2xml&quot;
        title=&quot;&quot;
        src=&quot;/static/d2427608eacaf2becaf77784d6649f2c/fcda8/json2xml-hero.png&quot;
        srcset=&quot;/static/d2427608eacaf2becaf77784d6649f2c/12f09/json2xml-hero.png 148w,
/static/d2427608eacaf2becaf77784d6649f2c/e4a3f/json2xml-hero.png 295w,
/static/d2427608eacaf2becaf77784d6649f2c/fcda8/json2xml-hero.png 590w,
/static/d2427608eacaf2becaf77784d6649f2c/efc66/json2xml-hero.png 885w,
/static/d2427608eacaf2becaf77784d6649f2c/c83ae/json2xml-hero.png 1180w,
/static/d2427608eacaf2becaf77784d6649f2c/133ae/json2xml-hero.png 1424w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I’ve been maintaining &lt;a href=&quot;https://github.com/vinitkumar/json2xml&quot;&gt;json2xml&lt;/a&gt; for years now. It’s a simple library that converts JSON to XML, and it’s been working fine. But “fine” wasn’t good enough. I wanted it to be fast.&lt;/p&gt;
&lt;p&gt;Today, I’m releasing version 6.0.1 with a native Rust extension that makes the library 29x faster.&lt;/p&gt;
&lt;h2&gt;Why Rust?&lt;/h2&gt;
&lt;p&gt;Python is great for many things, but raw performance isn’t one of them. When you’re converting large JSON files to XML, every millisecond counts. The pure Python implementation had several performance bottlenecks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;String escaping&lt;/strong&gt;: Multiple &lt;code&gt;.replace()&lt;/code&gt; calls for XML special characters (&lt;code&gt;&amp;#x26;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;&lt;/code&gt;, &lt;code&gt;&gt;&lt;/code&gt;, &lt;code&gt;&quot;&lt;/code&gt;, &lt;code&gt;&apos;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type dispatch&lt;/strong&gt;: Chains of &lt;code&gt;isinstance()&lt;/code&gt; checks to determine how to serialize each value&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;String building&lt;/strong&gt;: Repeated f-string concatenation creating intermediate string objects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rust eliminates all of these. Single-pass string escaping, compiled match statements for type dispatch, and pre-allocated buffers for string building. Combined with memory safety guarantees, it was the obvious choice.&lt;/p&gt;
&lt;h2&gt;The Rust Extension Architecture&lt;/h2&gt;
&lt;p&gt;The Rust code lives in &lt;code&gt;rust/src/lib.rs&lt;/code&gt; and exposes these core functions via PyO3:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;escape_xml()&lt;/code&gt; - Single-pass XML character escaping&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrap_cdata()&lt;/code&gt; - CDATA section wrapping&lt;/li&gt;
&lt;li&gt;&lt;code&gt;convert_dict()&lt;/code&gt; - Recursive dictionary to XML conversion&lt;/li&gt;
&lt;li&gt;&lt;code&gt;convert_list()&lt;/code&gt; - List to XML conversion with configurable item wrapping&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dicttoxml()&lt;/code&gt; - Main entry point exposed to Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Python signature is preserved exactly:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;def dicttoxml(
    obj: Any,
    root: bool = True,
    custom_root: str = &amp;quot;root&amp;quot;,
    attr_type: bool = True,
    item_wrap: bool = True,
    cdata: bool = False,
    list_headers: bool = False,
) -&amp;gt; bytes&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Automatic Backend Selection&lt;/h2&gt;
&lt;p&gt;The magic happens in &lt;code&gt;dicttoxml_fast.py&lt;/code&gt;, a new hybrid module that automatically selects the fastest available backend:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;try:
    from json2xml_rs import dicttoxml as _rust_dicttoxml
    _USE_RUST = True
    LOG.debug(&amp;quot;Using Rust backend for dicttoxml&amp;quot;)
except ImportError:
    LOG.debug(&amp;quot;Rust backend not available, using pure Python&amp;quot;)
    _USE_RUST = False&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;The module also detects features that require Python fallback:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;needs_python = (
    ids is not None
    or item_func is not None
    or xml_namespaces
    or xpath_format
)

if not needs_python and isinstance(obj, dict):
    needs_python = _has_special_keys(obj)  # @attrs, @val, @flat&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This means if you’re using advanced features like custom &lt;code&gt;item_func&lt;/code&gt; callbacks, XML namespaces, or special dict keys for attribute injection, it transparently falls back to Python. For the common case, you get Rust speed automatically.&lt;/p&gt;
&lt;h2&gt;Handling Edge Cases&lt;/h2&gt;
&lt;p&gt;One tricky bit was handling very large integers. Rust’s &lt;code&gt;i64&lt;/code&gt; can’t hold Python’s arbitrary-precision integers. Instead of throwing &lt;code&gt;OverflowError&lt;/code&gt; and breaking compatibility, the Rust implementation falls back to string representation for numbers outside the &lt;code&gt;i64&lt;/code&gt; range. It’s a sensible trade-off that keeps behavior aligned with the pure Python backend.&lt;/p&gt;
&lt;p&gt;I also added compatibility tests for edge cases like &lt;code&gt;item_wrap=False&lt;/code&gt; and &lt;code&gt;list_headers=True&lt;/code&gt; to ensure both backends produce semantically equivalent output.&lt;/p&gt;
&lt;h2&gt;CI/CD Setup&lt;/h2&gt;
&lt;p&gt;Getting the build pipeline right took some work. I set up two new GitHub Actions workflows:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;build-rust-wheels.yml&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Builds manylinux, macOS (both Intel and ARM), and Windows wheels via maturin&lt;/li&gt;
&lt;li&gt;Tests across Python 3.9, 3.10, 3.11, 3.12, and 3.13&lt;/li&gt;
&lt;li&gt;Publishes to PyPI using trusted publishing (no API tokens needed)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;rust-ci.yml&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Runs &lt;code&gt;rustfmt&lt;/code&gt; and &lt;code&gt;clippy&lt;/code&gt; for code quality&lt;/li&gt;
&lt;li&gt;Builds the extension across multiple OS/Python combinations&lt;/li&gt;
&lt;li&gt;Executes both Rust-specific tests and the existing Python test suite&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The benchmark job only runs on pushes to main or manual triggers now, not on every PR. No point slowing down the feedback loop for regular contributions.&lt;/p&gt;
&lt;h2&gt;Benchmark Results&lt;/h2&gt;
&lt;p&gt;The benchmark script (&lt;code&gt;benchmark_rust.py&lt;/code&gt;) tests various data shapes:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;--- Simple Dict ---
 Python: 45.23µs avg
 Rust:   1.54µs avg
 Speedup: 29.37x

--- Nested Dict ---
 Python: 89.12µs avg
 Rust:   3.21µs avg
 Speedup: 27.76x

--- Large List ---
 Python: 234.56µs avg
 Rust:   8.92µs avg
 Speedup: 26.30x&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;For anyone processing large JSON files or doing batch conversions, this is a game-changer.&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;The library maintains 100% backward compatibility. If you’re already using json2xml:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;pip install --upgrade json2xml&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;The Rust extension is bundled in the wheel. If it fails to build on your platform for some reason, you still have the pure Python fallback.&lt;/p&gt;
&lt;p&gt;To check which backend you’re using:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;from json2xml.dicttoxml_fast import get_backend, is_rust_available

print(f&amp;quot;Backend: {get_backend()}&amp;quot;)  # &amp;#39;rust&amp;#39; or &amp;#39;python&amp;#39;
print(f&amp;quot;Rust available: {is_rust_available()}&amp;quot;)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;PyO3 is genuinely impressive. Writing Rust extensions for Python used to be painful, but PyO3 makes it almost pleasant. The maturin build tool handles all the wheel building complexity, and the GitHub Actions integration with trusted publishing means no more manual PyPI uploads.&lt;/p&gt;
&lt;p&gt;If you have a Python library with a performance-critical hot path, I’d highly recommend exploring this approach. The setup involves:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Adding a &lt;code&gt;rust/&lt;/code&gt; directory with &lt;code&gt;Cargo.toml&lt;/code&gt; and &lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Writing your Rust code with &lt;code&gt;#[pyfunction]&lt;/code&gt; and &lt;code&gt;#[pymodule]&lt;/code&gt; attributes&lt;/li&gt;
&lt;li&gt;Using maturin for building: &lt;code&gt;maturin develop --release&lt;/code&gt; for local dev&lt;/li&gt;
&lt;li&gt;Setting up GitHub Actions with the maturin-action for CI/CD&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The initial setup takes some effort, but the payoff is worth it.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/267&quot;&gt;PR #267&lt;/a&gt; for all the implementation details, or just grab the new version from PyPI.&lt;/p&gt;
&lt;p&gt;Cheers! 🤘&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building json2xml Across Three Languages in One Day]]></title><description><![CDATA[Yesterday was one of those rare days where everything clicks. I spent the day working on my json2xml project across three different language…]]></description><link>https://vinitkumar.me/json2xml-multiplatform-day/</link><guid isPermaLink="false">https://vinitkumar.me/json2xml-multiplatform-day/</guid><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d2427608eacaf2becaf77784d6649f2c/133ae/json2xml-hero.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.70270270270271%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAACm0lEQVR42hXSyU8TYQAF8BHmm+2bpTMwZShbWyhtpzPttENLW7pRFltLbRXFChQEhIKJ4EHUKptRFI2iFw3Gg4lH4hYOLvFAYtCDJB408aA3/Qf8Eyy3d/nlHd5DAOVEoYqyXpTzo3wQCGFMjAI+BLgAYDsArWG0B2e8NPSKhk6W87NCmBMjdE0nyWsIStoBJeOshnM6MAQA5yfqY5T9MDCGUUEnGiLQkiCFDhRTWTZSJ/XX1afM8niL4zQt6AcYhzIBXaKoCUad4HSsJijlSm1za9aZJduVdVNqDNAeX4N8UvNmPLGI3ONQcu3R2Vp7FiEZpVlyjfSFVqfz4/ksw6kY5zOfvZre+Rj48Hlo70tk8SaCuc5pjp/znl+rvX82C/s3R5P9I5w+ijRJvrVS4dJo78Vi+mk5bzerh0iZ7yu2rWy67z3qfvyscWACQe1pm7o7n/i6Mvh7Mfq2lGyypmg1j8gtsTszudlM8vpEz5uNwaXJgXTPQHah3Lf9OvryVfjBln55vXuufKE48uP+qe9rmb2SXtBiDB2lmuKI3Ji7MTW0s5x5fzv3aWtqe2NybnjQFz6inL+W+7bvnF6Ugrng0OzkcPH5mfi/svth2i0Z/JAJkGIXwhm0E33D75aO/n1R2HsydiwWI3BbNe6gLDH/8l28OYRUWapQK+Q8CYu6O+5SJS8BfRisTOhGeHNc9hQWjk/cmopnI10846KhE1IyxaikoOHQCaj2aqK9CnPwrNpap1EVSevoAVYQrjFZ29xvMqbq+YRJCJiMIZ5WDKTMkk6asJFEK4ZbUKK14it3QEk3Rmso9KKwEmSk0sAwHo6WaxhFZNwmLiCxPiN0i5TCUw6GspKEGRBmlLACyg6gDGgFo1UAXQA6/gMM+o0jWAvGXgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;json2xml across Python, Go, and Zig&quot;
        title=&quot;&quot;
        src=&quot;/static/d2427608eacaf2becaf77784d6649f2c/fcda8/json2xml-hero.png&quot;
        srcset=&quot;/static/d2427608eacaf2becaf77784d6649f2c/12f09/json2xml-hero.png 148w,
/static/d2427608eacaf2becaf77784d6649f2c/e4a3f/json2xml-hero.png 295w,
/static/d2427608eacaf2becaf77784d6649f2c/fcda8/json2xml-hero.png 590w,
/static/d2427608eacaf2becaf77784d6649f2c/efc66/json2xml-hero.png 885w,
/static/d2427608eacaf2becaf77784d6649f2c/c83ae/json2xml-hero.png 1180w,
/static/d2427608eacaf2becaf77784d6649f2c/133ae/json2xml-hero.png 1424w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Yesterday was one of those rare days where everything clicks. I spent the day working on my json2xml project across three different language implementations: Python, Go, and Zig. Here’s what I accomplished and how I did it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update (Jan 15, 2026):&lt;/strong&gt; Added cross-linking documentation between all three repos, fuzz testing for the Go version, and educational Zig comments for newcomers. All three repos now feature the unified hero image in their READMEs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Day 2 Updates (Jan 15)&lt;/h2&gt;
&lt;h3&gt;json2xml-go Improvements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fuzz testing&lt;/strong&gt;: Added fuzz tests for dicttoxml functions to catch edge cases and improve robustness&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-documentation&lt;/strong&gt;: README now links to Python and Zig versions with benchmark comparisons&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hero image&lt;/strong&gt;: Unified branding across all three repos&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;json2xml-zig Improvements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Educational comments&lt;/strong&gt;: Added comprehensive comments throughout the codebase to help Zig newcomers understand idiomatic patterns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better testing&lt;/strong&gt;: Improved test suite with &lt;code&gt;zig fmt&lt;/code&gt; integration and invalid JSON handling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-documentation&lt;/strong&gt;: Enhanced Related Projects section with comparison table linking to Python and Go versions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Python CLI (json2xml-py)&lt;/h2&gt;
&lt;p&gt;The original &lt;a href=&quot;https://github.com/vinitkumar/json2xml&quot;&gt;json2xml&lt;/a&gt; library has been around for years, but it always required importing as a Python module. I finally added a proper CLI interface.&lt;/p&gt;
&lt;h3&gt;What I Built&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cli.py&lt;/strong&gt;: A full-featured command-line tool with the same flags as the Go version&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Console script entry point&lt;/strong&gt;: Install with pip and run &lt;code&gt;json2xml-py&lt;/code&gt; directly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comprehensive tests&lt;/strong&gt;: 19 CLI-specific tests bringing total coverage to 210 tests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The CLI supports all the conversion options:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Convert a file
json2xml-py data.json

# Convert a JSON string
json2xml-py -s &amp;#39;{&amp;quot;name&amp;quot;: &amp;quot;John&amp;quot;, &amp;quot;age&amp;quot;: 30}&amp;#39;

# Use XPath 3.1 format with pretty printing
json2xml-py -x -p data.json

# Read from stdin
cat data.json | json2xml-py -&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Flags include &lt;code&gt;-w/--wrapper&lt;/code&gt;, &lt;code&gt;-r/--root&lt;/code&gt;, &lt;code&gt;-p/--pretty&lt;/code&gt;, &lt;code&gt;-t/--type&lt;/code&gt;, &lt;code&gt;-i/--item-wrap&lt;/code&gt;, &lt;code&gt;-x/--xpath&lt;/code&gt;, &lt;code&gt;-c/--cdata&lt;/code&gt;, &lt;code&gt;-l/--list-headers&lt;/code&gt;, &lt;code&gt;-u/--url&lt;/code&gt;, &lt;code&gt;-s/--string&lt;/code&gt;, and &lt;code&gt;-o/--output&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;PR &lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/266&quot;&gt;#266&lt;/a&gt; added 1,867 lines including benchmark scripts and ReadTheDocs documentation.&lt;/p&gt;
&lt;h2&gt;The Go Port (json2xml-go)&lt;/h2&gt;
&lt;p&gt;I created &lt;a href=&quot;https://github.com/vinitkumar/json2xml-go&quot;&gt;json2xml-go&lt;/a&gt; as a high-performance alternative for when Python isn’t fast enough.&lt;/p&gt;
&lt;h3&gt;Features Ported&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Basic JSON to XML conversion&lt;/li&gt;
&lt;li&gt;Custom wrapper/root elements&lt;/li&gt;
&lt;li&gt;Type attributes (&lt;code&gt;type=&quot;str&quot;&lt;/code&gt;, &lt;code&gt;type=&quot;int&quot;&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Item wrapping for lists&lt;/li&gt;
&lt;li&gt;CDATA sections and XML namespaces&lt;/li&gt;
&lt;li&gt;XPath 3.1 json-to-xml format&lt;/li&gt;
&lt;li&gt;Pretty printing&lt;/li&gt;
&lt;li&gt;Custom attributes (&lt;code&gt;@attrs&lt;/code&gt;) and values (&lt;code&gt;@val&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Read from file, string, or URL&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Production-Ready Touches&lt;/h3&gt;
&lt;p&gt;I spent time making this production-ready:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CI/CD&lt;/strong&gt;: GitHub Actions for build, test, lint across Go 1.22-1.24&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linting&lt;/strong&gt;: Passed golangci-lint and staticcheck with zero issues&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Man page&lt;/strong&gt;: Comprehensive &lt;code&gt;man json2xml-go&lt;/code&gt; documentation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Makefile&lt;/strong&gt;: Easy &lt;code&gt;make install&lt;/code&gt; and &lt;code&gt;make uninstall&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apache 2.0 License&lt;/strong&gt;: Matching the Python version&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The code follows Go conventions properly, renaming &lt;code&gt;Json2xml&lt;/code&gt; to &lt;code&gt;JSON2xml&lt;/code&gt; per Go initialism rules.&lt;/p&gt;
&lt;h2&gt;The Zig Implementation (json2xml-zig)&lt;/h2&gt;
&lt;p&gt;For maximum performance, I created &lt;a href=&quot;https://github.com/vinitkumar/json2xml-zig&quot;&gt;json2xml-zig&lt;/a&gt;. Zig’s compile-time evaluation and zero-cost abstractions make it blazingly fast.&lt;/p&gt;
&lt;h3&gt;What It Includes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Full CLI with all conversion options&lt;/li&gt;
&lt;li&gt;XPath 3.1 json-to-xml format support&lt;/li&gt;
&lt;li&gt;Comprehensive test suite (36 unit tests)&lt;/li&gt;
&lt;li&gt;Tests for edge cases: empty objects, numeric keys, unicode, large data handling&lt;/li&gt;
&lt;li&gt;Fixed a memory leak in the XPath format function during testing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Benchmarks: The Fun Part&lt;/h2&gt;
&lt;p&gt;I ran comprehensive benchmarks comparing all implementations:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Relative Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPython 3.14.2&lt;/td&gt;
&lt;td&gt;1.00x (baseline)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPython 3.15.0a4&lt;/td&gt;
&lt;td&gt;1.16x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPy 3.10.16&lt;/td&gt;
&lt;td&gt;1.22x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go json2xml-go&lt;/td&gt;
&lt;td&gt;7.34x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zig json2xml-zig&lt;/td&gt;
&lt;td&gt;~100x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Key Findings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Go is 7-20x faster&lt;/strong&gt; than Python implementations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPython 3.15&lt;/strong&gt; shows 13-35% improvement over 3.14 (nice to see Python getting faster)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PyPy&lt;/strong&gt; excels at large inputs but has JIT overhead for small ones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zig&lt;/strong&gt; is ridiculously fast, as expected&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AI-Assisted Development&lt;/h2&gt;
&lt;p&gt;I used Claude Opus 4.5 extensively throughout this work. Having an AI pair programmer helped me move fast across three different languages in a single day. It assisted with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Porting the Python logic to idiomatic Go and Zig&lt;/li&gt;
&lt;li&gt;Writing comprehensive test suites for each implementation&lt;/li&gt;
&lt;li&gt;Setting up CI/CD pipelines and linting configurations&lt;/li&gt;
&lt;li&gt;Creating man pages and documentation&lt;/li&gt;
&lt;li&gt;Running and analyzing benchmarks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key was having clear ideas about what I wanted to build. The AI helped translate those ideas into working code across unfamiliar territories (I don’t write Zig daily). It’s a force multiplier when you know what you’re building.&lt;/p&gt;
&lt;h2&gt;Lessons Learned&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CLI parity matters&lt;/strong&gt;: Having the same flags across implementations makes switching seamless&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing is portable&lt;/strong&gt;: The test patterns I developed in Python translated directly to Go and Zig&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Benchmarking reveals truths&lt;/strong&gt;: The 7x speedup in Go justified the port for high-throughput use cases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation matters&lt;/strong&gt;: Man pages and ReadTheDocs integration make tools discoverable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI accelerates polyglot work&lt;/strong&gt;: Moving between Python, Go, and Zig in one day would have been much harder without AI assistance&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What’s Next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Explore free-threaded Python 3.14t for parallel processing (PR &lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/256&quot;&gt;#256&lt;/a&gt; is open with a 1.55x speedup)&lt;/li&gt;
&lt;li&gt;Add streaming support for very large JSON files&lt;/li&gt;
&lt;li&gt;Consider WASM builds for browser usage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was a satisfying day of building tools that solve real problems across the performance spectrum. Whether you need the flexibility of Python, the balance of Go, or the raw speed of Zig, there’s now a json2xml for you.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Check out the repos: &lt;a href=&quot;https://github.com/vinitkumar/json2xml&quot;&gt;json2xml&lt;/a&gt; | &lt;a href=&quot;https://github.com/vinitkumar/json2xml-go&quot;&gt;json2xml-go&lt;/a&gt; | &lt;a href=&quot;https://github.com/vinitkumar/json2xml-zig&quot;&gt;json2xml-zig&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to Be a Good Programmer in the Age of AI]]></title><description><![CDATA[Introduction AI models are remarkably capable and can accomplish tasks faster than many new and intermediate developers. Given this, you…]]></description><link>https://vinitkumar.me/2026-01-08-good-programmer-ai-age/</link><guid isPermaLink="false">https://vinitkumar.me/2026-01-08-good-programmer-ai-age/</guid><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;AI models are remarkably capable and can accomplish tasks faster than many new and intermediate developers. Given this, you might wonder why bother upskilling yourself when you can simply prompt your way to solutions with minimal effort. The answer is: it matters more than ever.&lt;/p&gt;
&lt;p&gt;Now is the time to leverage AI strategically to accelerate your learning and growth.&lt;/p&gt;
&lt;h2&gt;Don’t Skip the Fundamentals&lt;/h2&gt;
&lt;p&gt;The most important rule: don’t dismiss the advice of experienced programmers about AI usage. They’ve written hundreds of thousands of lines of code and built entire applications from scratch, which enables them to evaluate AI-generated code critically and distinguish quality from mediocrity. This skill comes from years of dedicated work.&lt;/p&gt;
&lt;p&gt;Yes, you can use the same AI model, but the output quality won’t match what experienced engineers achieve. It’s not just about generating code—it’s about maintaining it. What happens when you generate code for a large application and later lose access to the AI model? Can you understand that code well enough to modify or maintain it on your own?&lt;/p&gt;
&lt;p&gt;Reading and understanding code has never been more critical. If you don’t fully comprehend what you’re working with, invest the time to understand it thoroughly.&lt;/p&gt;
&lt;p&gt;Computer science fundamentals don’t change much. Data structures, design patterns, and algorithms remain core to programming. With solid fundamentals, you can identify when AI suggests a suboptimal data structure or flawed algorithm, and guide it toward the correct solution. To someone lacking these foundations, a flawed AI solution might appear correct.&lt;/p&gt;
&lt;p&gt;AI won’t replace these fundamentals. In fact, those who excel at writing and improving AI-generated code are invariably strong in these areas.&lt;/p&gt;
&lt;h2&gt;A Practical Workflow for AI-Assisted Development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plan first.&lt;/strong&gt; Read the specifications and sketch out the structure of your solution. Write this plan down, then consult AI to think through it with you and catch anything you missed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Write code by hand.&lt;/strong&gt; Use an editor or IDE without AI integration, or disable it temporarily. This keeps you sharp and ensures you retain the ability to write code independently.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Generate tests early.&lt;/strong&gt; Once your code is ready, ask AI to generate test cases based on your plan. Run them. Your hand-written code likely has edge cases you missed, and tests will catch them. Fix the failing tests yourself and look for similar issues. In the AI era, when test-writing costs have plummeted, skipping unit tests is inexcusable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get an AI code review.&lt;/strong&gt; When your code works and matches your plan, ask AI to act as a senior engineer and review it for correctness, maintainability, best practices, and quality. Export this review to a file, open it alongside your code, and work through the feedback methodically. Keep running tests as you make changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Write good commit messages.&lt;/strong&gt; Use AI to generate clear, descriptive commit messages and pull request descriptions. This makes your contributions easier for reviewers to evaluate and appreciate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Read Good Code and Build Judgment&lt;/h2&gt;
&lt;p&gt;Invest time in reading well-written code to develop an eye for quality. AI can generate excellent code, but understanding it is your responsibility. If all you did was write prompts and ended up with code you don’t fully understand, you’ve essentially hired a consultant and claimed credit for their work. Short-term wins don’t matter if you’ve created a codebase you can’t maintain.&lt;/p&gt;
&lt;h2&gt;Know AI’s Strengths and Limits&lt;/h2&gt;
&lt;p&gt;AI excels as a research assistant and prototyping partner. It’s remarkably good at generating personal projects and scripts where rigor isn’t critical. Production code is a different story. The stakes are higher, and quality matters.&lt;/p&gt;
&lt;h2&gt;Be Honest About Attribution&lt;/h2&gt;
&lt;p&gt;Integrity is more important now than ever. Declare the extent of AI-generated code in your work. Don’t claim ownership until you’ve developed a deep understanding of it and could maintain it without AI assistance. Anything less is technical debt, not value.&lt;/p&gt;
&lt;h2&gt;The Competitive Advantage&lt;/h2&gt;
&lt;p&gt;AI is a powerful tool in the hands of experienced engineers who maintain strong fundamentals and keep their coding skills sharp. For those who overuse AI without understanding it or prioritize short-term productivity over learning, the outlook is grim. They risk becoming easily replaceable.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This is not the time to relax or cut corners. Work hard to develop solid skills and keep yourself sharp. The programming landscape is transforming rapidly, and no one knows what the field will look like even a year from now. The question isn’t whether to use AI—it’s whether you’ll remain a skilled engineer capable of evaluating and improving what AI produces.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Related AI Posts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;../ai-agents/&quot;&gt;AI Agents, Me, and My Feelings&lt;/a&gt; - Exploring the balance between productivity and preserving coding skills&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../new-ai-workflow/&quot;&gt;My New AI Workflow: Embracing Command-Line AI Tools&lt;/a&gt; - Moving to a command-line AI workflow that fits your development style&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../ai-workflow/&quot;&gt;Balancing AI Tools in Development: A Practical Workflow Guide&lt;/a&gt; - Using AI as a pair programmer rather than a code generator&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../how-i-use-ai/&quot;&gt;Developer’s Guide to AI Tools: Real-world Experience with 5 Leading Platforms&lt;/a&gt; - A practical comparison of AI tools and when to use them&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Hello 2026]]></title><description><![CDATA[2026 is here and we are already in the first week. This year, for a change, I
don’t want to start with a resolution that feels forced and…]]></description><link>https://vinitkumar.me/new-year/</link><guid isPermaLink="false">https://vinitkumar.me/new-year/</guid><pubDate>Tue, 06 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2026 is here and we are already in the first week. This year, for a change, I
don’t want to start with a resolution that feels forced and that we forget
about by the end of the first week.&lt;/p&gt;
&lt;p&gt;Instead, I want to be more intentional, write more, read much more, and
have a lot of fun writing code. I want to write a huge amount of code. I want
to pick up one or two new languages and write something useful with them. I have
also become very good at using AI effectively over this past year, and I can see it
augmenting my work and improving my output by a significant margin. AI is here
to stay, and there is no denying that fact. It is also the most significant event
in our lifetime as developers.&lt;/p&gt;
&lt;p&gt;At the same time, I want to work on many fun projects like writing a compiler
and some low-level C code (all handwritten) to sharpen my skills. I am also quite
satisfied with my Vim (NeoVim) setup and I don’t want to diverge from it anymore
or spend time endlessly configuring it. I have also recently learned about Git worktrees,
and I think they change the nature and scope of concurrent work on the same
codebase, especially with AI assistance. I have been using Git since 2010 and only
recently did I discover Git worktrees, and it is excellent. This is why one
should learn the tools they use thoroughly and not just the bare minimum.&lt;/p&gt;
&lt;p&gt;I wish you all a good and productive year ahead and a fulfilling life.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The 25x Speedup: Why Python Performance Rules Matter]]></title><description><![CDATA[I recently came across a tweet outlining seven golden rules for Python performance optimization. These rules target critical-path code—the…]]></description><link>https://vinitkumar.me/coding-rules-comparison/</link><guid isPermaLink="false">https://vinitkumar.me/coding-rules-comparison/</guid><pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently came across &lt;a href=&quot;https://x.com/quantbeckman/status/2004660554149904830&quot;&gt;a tweet&lt;/a&gt; outlining seven golden rules for Python performance optimization. These rules target critical-path code—the hot loops that determine application performance. I decided to test them by implementing the same signal processing pipeline twice: once following all the rules, and once ignoring them completely.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;My golden rules when using Python:&lt;br&gt;-No Python loops in the critical path (no for, while, comprehensions, or map).&lt;br&gt;-No Python objects (lists, dicts, tuples) in the critical path: use typed arrays.&lt;br&gt;-Avoid repeated calls (each Python call costs). Prefer batching, operation fusion,…&lt;/p&gt;&amp;mdash; Quant Beckman (@quantbeckman) &lt;a href=&quot;https://twitter.com/quantbeckman/status/2004660554149904830?ref_src=twsrc%5Etfw&quot;&gt;December 26, 2025&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;The results exceeded my expectations: &lt;strong&gt;25x faster&lt;/strong&gt; execution time.&lt;/p&gt;
&lt;h2&gt;The Seven Golden Rules&lt;/h2&gt;
&lt;p&gt;The tweet outlined these performance optimization principles:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No Python loops&lt;/strong&gt; in the critical path (no &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, comprehensions, or &lt;code&gt;map&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Python objects&lt;/strong&gt; (lists, dicts, tuples) in the critical path: use typed arrays&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid repeated calls&lt;/strong&gt;: Prefer batching, operation fusion, or doing everything in one shot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No allocations&lt;/strong&gt; in the hot path: preallocate and reuse buffers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid branches&lt;/strong&gt; (&lt;code&gt;if/else&lt;/code&gt;) in the critical path: use masks / &lt;code&gt;where&lt;/code&gt; / lookup tables&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid conversions&lt;/strong&gt;: &lt;code&gt;list &amp;#x3C;-&gt; np.array&lt;/code&gt;, dtype changes, &lt;code&gt;.astype(...)&lt;/code&gt; on the hot path&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid I/O and logging&lt;/strong&gt; inside the hot path (stdout, files, network)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These rules target numerical computing scenarios where performance matters: real-time signal processing, high-frequency trading, scientific simulations, and machine learning inference.&lt;/p&gt;
&lt;h2&gt;The Test Case: Batch Signal Processing&lt;/h2&gt;
&lt;p&gt;I implemented a signal processing pipeline that performs four operations on batches of signals:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Normalization&lt;/strong&gt;: Scale each signal to [0, 1] range&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threshold filtering&lt;/strong&gt;: Zero out values below a threshold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moving average smoothing&lt;/strong&gt;: Apply a sliding window average&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outlier detection&lt;/strong&gt;: Replace outliers with the mean value&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This pipeline processes 50 signals, each 500 samples long—a realistic batch size for real-time processing scenarios.&lt;/p&gt;
&lt;h2&gt;The Bad Implementation&lt;/h2&gt;
&lt;p&gt;The bad implementation violates every rule:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;def bad_process_signals(signals_list, threshold, outlier_threshold):
    &amp;quot;&amp;quot;&amp;quot;
    BAD: Uses inefficient patterns.
    
    Problems:
    - Python loops (for loops)
    - Python objects (lists)
    - Allocations in hot path (creating new lists)
    - Repeated calculations
    - Branches (if/else)
    - No preallocation
    &amp;quot;&amp;quot;&amp;quot;
    results = []  # BAD: Creating new list
    
    for signal in signals_list:
        # BAD: Repeated min/max calls
        signal_min = min(signal)
        signal_max = max(signal)
        signal_range = signal_max - signal_min
        
        # BAD: Creating new list in hot path
        normalized = []
        for val in signal:
            if signal_range &amp;gt; 0:
                normalized.append((val - signal_min) / signal_range)
            else:
                normalized.append(0.0)
        
        # BAD: Creating new list, repeated if/else
        filtered = []
        for val in normalized:
            if val &amp;gt; threshold:
                filtered.append(val)
            else:
                filtered.append(0.0)
        
        # BAD: Moving average with inefficient loop
        smoothed = []
        window_size = 5
        for i in range(len(filtered)):
            start = max(0, i - window_size + 1)
            window = filtered[start:i+1]
            smoothed.append(sum(window) / len(window))  # BAD: Repeated sum/len
        
        # BAD: Repeated mean/std calculations
        mean_val = sum(smoothed) / len(smoothed)
        std_val = np.sqrt(sum((x - mean_val) ** 2 for x in smoothed) / len(smoothed))
        
        # BAD: Creating new list, repeated if/else
        final = []
        for val in smoothed:
            z_score = abs((val - mean_val) / std_val) if std_val &amp;gt; 0 else 0
            if z_score &amp;gt; outlier_threshold:
                final.append(mean_val)
            else:
                final.append(val)
        
        results.append(final)
    
    return results&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Violations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple nested Python &lt;code&gt;for&lt;/code&gt; loops&lt;/li&gt;
&lt;li&gt;Python lists created and appended to repeatedly&lt;/li&gt;
&lt;li&gt;Memory allocations in the hot path&lt;/li&gt;
&lt;li&gt;Repeated &lt;code&gt;if/else&lt;/code&gt; branches&lt;/li&gt;
&lt;li&gt;Multiple passes over the same data&lt;/li&gt;
&lt;li&gt;Type conversions between lists and arrays&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Good Implementation&lt;/h2&gt;
&lt;p&gt;The good implementation follows all seven rules:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;class FastSignalProcessor:
    &amp;quot;&amp;quot;&amp;quot;
    GOOD: Uses optimization principles.
    
    Follows all golden rules:
    1. No Python loops (vectorized NumPy operations)
    2. No Python objects (NumPy arrays only)
    3. Batched operations (process entire batch at once)
    4. Preallocated buffers (no allocations in hot path)
    5. Mask-based logic (no branches)
    6. No conversions (consistent dtype throughout)
    7. No I/O (pure computation)
    &amp;quot;&amp;quot;&amp;quot;
    
    def __init__(self, signal_length, batch_size, window_size):
        # Preallocate all buffers as NumPy arrays
        self.signal_length = signal_length
        self.batch_size = batch_size
        self.window_size = window_size
        
        self.normalized = np.empty((batch_size, signal_length), dtype=np.float32)
        self.filtered = np.empty((batch_size, signal_length), dtype=np.float32)
        self.smoothed = np.empty((batch_size, signal_length), dtype=np.float32)
        self.final_output = np.empty((batch_size, signal_length), dtype=np.float32)
        
        # Temporary buffers
        self.batch_min = np.empty(batch_size, dtype=np.float32)
        self.batch_max = np.empty(batch_size, dtype=np.float32)
        self.batch_range = np.empty(batch_size, dtype=np.float32)
        self.threshold_mask = np.empty((batch_size, signal_length), dtype=np.bool_)
        self.z_scores = np.empty((batch_size, signal_length), dtype=np.float32)
        self.outlier_mask = np.empty((batch_size, signal_length), dtype=np.bool_)
        self.mean_vals = np.empty(batch_size, dtype=np.float32)
        self.std_vals = np.empty(batch_size, dtype=np.float32)
        
        self.window_norm = np.float32(1.0 / window_size)
    
    def process_batch(self, signals, threshold, outlier_threshold):
        &amp;quot;&amp;quot;&amp;quot;GOOD: Preallocated buffers, efficient calculations, vectorized operations.&amp;quot;&amp;quot;&amp;quot;
        # Convert to NumPy array if needed (only once, at entry point)
        if not isinstance(signals, np.ndarray):
            signals = np.array(signals, dtype=np.float32)
        else:
            if signals.dtype != np.float32:
                signals = signals.astype(np.float32, copy=False)
        
        signals = signals.reshape(self.batch_size, self.signal_length)
        
        # Normalize (vectorized)
        np.min(signals, axis=1, out=self.batch_min)
        np.max(signals, axis=1, out=self.batch_max)
        np.subtract(self.batch_max, self.batch_min, out=self.batch_range)
        
        batch_min_2d = self.batch_min[:, np.newaxis]
        batch_range_2d = self.batch_range[:, np.newaxis]
        
        np.subtract(signals, batch_min_2d, out=self.normalized)
        
        range_mask = self.batch_range &amp;gt; 0
        range_mask_2d = range_mask[:, np.newaxis]
        
        np.divide(self.normalized, batch_range_2d, out=self.normalized, where=range_mask_2d)
        np.multiply(self.normalized, 0.0, out=self.normalized, where=~range_mask_2d)
        
        # Threshold filtering (mask-based, no branches)
        np.greater(self.normalized, threshold, out=self.threshold_mask)
        np.multiply(self.normalized, self.threshold_mask, out=self.filtered)
        
        # Moving average (vectorized)
        padded = np.pad(self.filtered, ((0, 0), (self.window_size, 0)), mode=&amp;#39;constant&amp;#39;)
        cumsum = np.cumsum(padded, axis=1, dtype=np.float32)
        
        cumsum_valid = cumsum[:, self.window_size:]
        cumsum_shifted = cumsum[:, :-self.window_size]
        
        np.subtract(cumsum_valid, cumsum_shifted, out=self.smoothed)
        np.multiply(self.smoothed, self.window_norm, out=self.smoothed)
        
        # Outlier detection (vectorized)
        np.mean(self.smoothed, axis=1, out=self.mean_vals)
        
        mean_2d = self.mean_vals[:, np.newaxis]
        np.subtract(self.smoothed, mean_2d, out=self.z_scores)
        np.square(self.z_scores, out=self.z_scores)
        variance = np.mean(self.z_scores, axis=1)
        np.sqrt(variance, out=self.std_vals)
        
        std_2d = self.std_vals[:, np.newaxis]
        np.subtract(self.smoothed, mean_2d, out=self.z_scores)
        np.divide(self.z_scores, std_2d, out=self.z_scores, where=std_2d &amp;gt; 0)
        np.abs(self.z_scores, out=self.z_scores)
        
        np.greater(self.z_scores, outlier_threshold, out=self.outlier_mask)
        
        np.copyto(self.final_output, self.smoothed)
        np.copyto(self.final_output, mean_2d, where=self.outlier_mask)
        
        return self.final_output&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Key optimizations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All operations vectorized—no Python loops&lt;/li&gt;
&lt;li&gt;Preallocated NumPy arrays—no allocations in hot path&lt;/li&gt;
&lt;li&gt;Mask-based logic replaces &lt;code&gt;if/else&lt;/code&gt; branches&lt;/li&gt;
&lt;li&gt;Batch processing—entire batch processed at once&lt;/li&gt;
&lt;li&gt;Consistent &lt;code&gt;float32&lt;/code&gt; dtype—no conversions&lt;/li&gt;
&lt;li&gt;In-place operations using &lt;code&gt;out=&lt;/code&gt; parameter&lt;/li&gt;
&lt;li&gt;Precomputed constants—&lt;code&gt;window_norm&lt;/code&gt; avoids repeated division&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Performance Results&lt;/h2&gt;
&lt;p&gt;Running the comparison on 50 signals of 500 samples each:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;BAD Implementation (inefficient patterns):
  - Python loops (for)
  - Python objects (lists)
  - Allocations in hot path
  - Branches (if/else)
Time: 0.0079 seconds
Result type: &amp;lt;class &amp;#39;list&amp;#39;&amp;gt; (Python list)

GOOD Implementation (optimized patterns):
  - Vectorized NumPy operations (no Python loops)
  - NumPy arrays (no Python objects)
  - Preallocated buffers (no allocations in hot path)
  - Mask-based logic (no branches)
Time: 0.0003 seconds
Result type: &amp;lt;class &amp;#39;numpy.ndarray&amp;#39;&amp;gt; (NumPy array)
Speedup: 25.0x faster&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;The optimized version runs &lt;strong&gt;25 times faster&lt;/strong&gt; while producing identical results.&lt;/p&gt;
&lt;h2&gt;Why These Rules Matter&lt;/h2&gt;
&lt;p&gt;Each rule addresses a specific performance bottleneck:&lt;/p&gt;
&lt;h3&gt;1. No Python Loops&lt;/h3&gt;
&lt;p&gt;Python loops execute bytecode interpretation overhead on every iteration. Vectorized NumPy operations run compiled C code, leveraging SIMD instructions and CPU pipelining. This alone provides 10-100x speedup for numerical operations.&lt;/p&gt;
&lt;h3&gt;2. No Python Objects&lt;/h3&gt;
&lt;p&gt;Python lists store pointers to objects scattered in memory. NumPy arrays store contiguous blocks of typed data, enabling:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better CPU cache utilization&lt;/li&gt;
&lt;li&gt;SIMD vectorization&lt;/li&gt;
&lt;li&gt;Reduced memory overhead&lt;/li&gt;
&lt;li&gt;Predictable memory access patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. Batched Operations&lt;/h3&gt;
&lt;p&gt;Processing entire batches amortizes Python call overhead and enables better vectorization. NumPy operations on large arrays are more efficient than many small operations.&lt;/p&gt;
&lt;h3&gt;4. Preallocated Buffers&lt;/h3&gt;
&lt;p&gt;Allocating memory in the hot path causes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Garbage collection pressure&lt;/li&gt;
&lt;li&gt;Memory fragmentation&lt;/li&gt;
&lt;li&gt;Cache misses from heap allocations&lt;/li&gt;
&lt;li&gt;Unpredictable performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Preallocating buffers eliminates these issues.&lt;/p&gt;
&lt;h3&gt;5. Mask-Based Logic&lt;/h3&gt;
&lt;p&gt;Branch mispredictions stall CPU pipelines. Mask-based operations using boolean arrays enable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SIMD vectorization&lt;/li&gt;
&lt;li&gt;Better CPU pipelining&lt;/li&gt;
&lt;li&gt;Predictable execution paths&lt;/li&gt;
&lt;li&gt;Vectorized conditional logic&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. No Conversions&lt;/h3&gt;
&lt;p&gt;Type conversions create temporary arrays, copying memory and adding overhead. Maintaining consistent dtypes throughout eliminates these copies.&lt;/p&gt;
&lt;h3&gt;7. No I/O&lt;/h3&gt;
&lt;p&gt;I/O operations are orders of magnitude slower than computation. Keeping the hot path pure computation ensures predictable performance.&lt;/p&gt;
&lt;h2&gt;Real-World Impact&lt;/h2&gt;
&lt;p&gt;These optimizations matter most in performance-critical scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-time signal processing&lt;/strong&gt;: Processing audio, video, or sensor data streams&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High-frequency trading&lt;/strong&gt;: Executing trades in microseconds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scientific simulations&lt;/strong&gt;: Running millions of iterations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine learning inference&lt;/strong&gt;: Serving predictions at scale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Game engines&lt;/strong&gt;: Rendering frames at 60+ FPS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In these domains, a 25x speedup translates to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lower latency for real-time systems&lt;/li&gt;
&lt;li&gt;Reduced infrastructure costs&lt;/li&gt;
&lt;li&gt;Better user experience&lt;/li&gt;
&lt;li&gt;Ability to process larger datasets&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When to Apply These Rules&lt;/h2&gt;
&lt;p&gt;These rules target &lt;strong&gt;critical-path code&lt;/strong&gt;—the hot loops that determine application performance. Not all code needs this level of optimization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apply these rules to&lt;/strong&gt;: Hot loops, frequently called functions, batch processing, numerical computations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t apply to&lt;/strong&gt;: One-time initialization, error handling, configuration parsing, user interface code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Premature optimization wastes time. Profile first, then optimize the bottlenecks.&lt;/p&gt;
&lt;h2&gt;Key Takeaways&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance rules have measurable impact&lt;/strong&gt;: The 25x speedup demonstrates that following best practices produces real results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vectorization beats loops&lt;/strong&gt;: NumPy’s vectorized operations leverage optimized C code and SIMD instructions that Python loops cannot match.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Memory layout matters&lt;/strong&gt;: Contiguous NumPy arrays enable better cache utilization and vectorization compared to scattered Python objects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preallocation eliminates overhead&lt;/strong&gt;: Allocating buffers once during initialization avoids GC pressure and memory fragmentation in the hot path.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mask-based logic enables vectorization&lt;/strong&gt;: Boolean arrays replace branches, allowing SIMD optimization and better CPU pipelining.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consistency reduces overhead&lt;/strong&gt;: Maintaining consistent dtypes and avoiding conversions eliminates unnecessary memory copies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pure computation is fastest&lt;/strong&gt;: Removing I/O and logging from hot paths ensures predictable, optimal performance.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Following performance optimization rules isn’t about pedantry—it’s about writing code that executes efficiently. The 25x speedup demonstrates that these principles produce measurable results.&lt;/p&gt;
&lt;p&gt;The rules target numerical computing scenarios where performance matters. They require understanding NumPy’s vectorization capabilities, memory layout implications, and CPU architecture considerations. The investment in learning these techniques pays dividends in performance-critical applications.&lt;/p&gt;
&lt;p&gt;What performance optimization techniques have you found most impactful? I’d love to hear about your experiences optimizing Python code.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Django CMS Fellows & Community Annual Report 2025: A Year of Extraordinary Contributions]]></title><description><![CDATA[The Django CMS Fellowship Program continues to drive the development and maintenance of one of the most powerful open-source content…]]></description><link>https://vinitkumar.me/django-cms-fellows-2025-report/</link><guid isPermaLink="false">https://vinitkumar.me/django-cms-fellows-2025-report/</guid><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Django CMS Fellowship Program continues to drive the development and maintenance of one of the most powerful open-source content management systems in the Python ecosystem. This report covers the contributions made by the two Django CMS Fellows—&lt;strong&gt;Fabian Braun&lt;/strong&gt;and &lt;strong&gt;Vinit Kumar&lt;/strong&gt;—from January 1, 2025, to December 3, 2025.&lt;/p&gt;
&lt;h2&gt;About the Django CMS Fellowship Program&lt;/h2&gt;
&lt;p&gt;The Django CMS Fellowship Program supports dedicated developers who work on maintaining, improving, and evolving the Django CMS ecosystem. Fellows contribute across multiple repositories, handling everything from critical bug fixes to major feature implementations, code reviews, issue triage, and community support.&lt;/p&gt;
&lt;p&gt;This year marks another exceptional period of growth and stability for Django CMS, with significant milestones including the release of Django CMS 5.0, Django 6.0 compatibility work, and continued modernization of the entire ecosystem.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🌟 Community Collaboration: The Heart of Open Source&lt;/h2&gt;
&lt;p&gt;While the Fellows provide dedicated maintenance, Django CMS thrives because of its vibrant community. This year, &lt;strong&gt;37 community contributors&lt;/strong&gt; submitted &lt;strong&gt;89 pull requests&lt;/strong&gt; alongside the Fellows’ work, demonstrating the collaborative spirit that makes open source powerful.&lt;/p&gt;
&lt;h3&gt;Top Community Contributors&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contributor&lt;/th&gt;
&lt;th&gt;PRs&lt;/th&gt;
&lt;th&gt;Key Areas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/mrbazzan&quot;&gt;@mrbazzan&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;djangocms-transfer, quickstart, frontend, badges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/wfehr&quot;&gt;@wfehr&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;4-migration, stories, core bug fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/metaforx&quot;&gt;@metaforx&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;djangocms-rest API, OpenAPI schemas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/pierreben&quot;&gt;@pierreben&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;djangocms-form-builder improvements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/marbru&quot;&gt;@marbru&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Frontend image plugin, documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/stefanw&quot;&gt;@stefanw&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Multi-site support, menu fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/Vincent-Ngobeh&quot;&gt;@Vincent-Ngobeh&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Core CMS fixes, apphook handling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Highlighted Community Contributions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;API &amp;#x26; Headless Development&lt;/strong&gt; (&lt;a href=&quot;https://github.com/metaforx&quot;&gt;@metaforx&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-rest/pull/79&quot;&gt;feat: Add page search schema extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-rest/pull/53&quot;&gt;feat: add OpenAPI support for “preview” query parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-rest/pull/67&quot;&gt;docs: init&lt;/a&gt; - Documentation initialization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Transfer &amp;#x26; Migration Tools&lt;/strong&gt; (&lt;a href=&quot;https://github.com/mrbazzan&quot;&gt;@mrbazzan&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms-quickstart/pull/74&quot;&gt;feat: Add management command to load demo content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-transfer/pull/49&quot;&gt;fix: Update the pks for internal child plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8282&quot;&gt;chore: Introduce dynamic badges&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Migration Customization&lt;/strong&gt; (&lt;a href=&quot;https://github.com/wfehr&quot;&gt;@wfehr&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-4-migration/pull/27&quot;&gt;feat: added 2 settings to provide custom functions for processing data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-4-migration/pull/29&quot;&gt;added another custom-function-point to run after cleanup is completed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8375&quot;&gt;fix: avoid stringifying None-values in page attribute template tag&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Multi-Site &amp;#x26; Core Improvements&lt;/strong&gt; (&lt;a href=&quot;https://github.com/stefanw&quot;&gt;@stefanw&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8303&quot;&gt;feat: Refactor site handling, and allow single-instance multi-site configurations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-versioning/pull/479&quot;&gt;feat: Allow “View on Site” for objects not on the current site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Form Builder Enhancements&lt;/strong&gt; (&lt;a href=&quot;https://github.com/pierreben&quot;&gt;@pierreben&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-form-builder/pull/35&quot;&gt;feat: Add required class to form widget div attributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-form-builder/pull/36&quot;&gt;fix: Strip email subject to remove new lines chars&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Frontend &amp;#x26; Documentation&lt;/strong&gt; (&lt;a href=&quot;https://github.com/marbru&quot;&gt;@marbru&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-frontend/pull/316&quot;&gt;feat: Image plugin refactored for simpler size control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-frontend/pull/317&quot;&gt;docs: Deduplication and clarity in the tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;All Community Contributors&lt;/h3&gt;
&lt;p&gt;We extend our heartfelt thanks to everyone who contributed code in 2025:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mrbazzan&quot;&gt;@mrbazzan&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/wfehr&quot;&gt;@wfehr&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/metaforx&quot;&gt;@metaforx&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Vincent-Ngobeh&quot;&gt;@Vincent-Ngobeh&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/pierreben&quot;&gt;@pierreben&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/marbru&quot;&gt;@marbru&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/stefanw&quot;&gt;@stefanw&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/macolo&quot;&gt;@macolo&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/wesleyboar&quot;&gt;@wesleyboar&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/va-lang&quot;&gt;@va-lang&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/zbohm&quot;&gt;@zbohm&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/pietzschke&quot;&gt;@pietzschke&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/albanbochsler&quot;&gt;@albanbochsler&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/joshyu&quot;&gt;@joshyu&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/florianschieder&quot;&gt;@florianschieder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mhsiddiqui&quot;&gt;@mhsiddiqui&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/h-peters&quot;&gt;@h-peters&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/benzkji&quot;&gt;@benzkji&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/marksweb&quot;&gt;@marksweb&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/invi84&quot;&gt;@invi84&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Aaditya1273&quot;&gt;@Aaditya1273&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/aymericderbois&quot;&gt;@aymericderbois&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/payamnj&quot;&gt;@payamnj&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mihalikv&quot;&gt;@mihalikv&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rvanlaar&quot;&gt;@rvanlaar&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/g-builder-0&quot;&gt;@g-builder-0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mbi&quot;&gt;@mbi&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/corentinbettiol&quot;&gt;@corentinbettiol&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/jrief&quot;&gt;@jrief&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Grosskopf&quot;&gt;@Grosskopf&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/FreemanPancake&quot;&gt;@FreemanPancake&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/ms-18&quot;&gt;@ms-18&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/theShinigami&quot;&gt;@theShinigami&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/stefan6419846&quot;&gt;@stefan6419846&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nchaourar&quot;&gt;@nchaourar&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/arkain&quot;&gt;@arkain&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/krmax44&quot;&gt;@krmax44&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;🐛 Community Issue Reporting&lt;/h3&gt;
&lt;p&gt;Issue reporting is vital to the health of any open-source project. Community members reported &lt;strong&gt;177 issues&lt;/strong&gt; this year, helping identify bugs, request features, and improve documentation across the ecosystem.&lt;/p&gt;
&lt;h4&gt;Top Issue Reporters&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reporter&lt;/th&gt;
&lt;th&gt;Issues&lt;/th&gt;
&lt;th&gt;Key Areas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/metaforx&quot;&gt;@metaforx&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;djangocms-rest API improvements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/mrbazzan&quot;&gt;@mrbazzan&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Transfer, frontend, testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/stefan6419846&quot;&gt;@stefan6419846&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;License compliance, attribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/wfehr&quot;&gt;@wfehr&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Core CMS, migrations, stories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/MacLake&quot;&gt;@MacLake&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Text editor, stories, templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/corentinbettiol&quot;&gt;@corentinbettiol&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Form builder, alias, stories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jrief&quot;&gt;@jrief&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Security, versioning, core&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/stefanw&quot;&gt;@stefanw&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;CSP compliance, multi-site, menus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Notable Issues That Drove Improvements&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Security &amp;#x26; Compliance&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-filer/issues/1548&quot;&gt;Remove inline scripts to make templates work with best practice CSP&lt;/a&gt; - Led to CSP compliance in django-filer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/issues/8378&quot;&gt;[BUG] Never trust user input&lt;/a&gt; - Security hardening&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Core Functionality&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/issues/8398&quot;&gt;[BUG] Copying between langs not handling missing placeholders&lt;/a&gt; - Fixed cross-language copying&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/issues/8150&quot;&gt;[BUG] Method &lt;code&gt;CMSPlugin.get_ancestors()&lt;/code&gt; is missing&lt;/a&gt; - API enhancement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/issues/8201&quot;&gt;[BUG] django-cms 4.1.5 is incompatible with django 5.2&lt;/a&gt; - Django 5.2 compatibility&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ecosystem Packages&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-frontend/issues/289&quot;&gt;GridRowPlugin: Columns per Row are not saved&lt;/a&gt; - Frontend fix&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-versioning/issues/470&quot;&gt;django management command “create_versions” is gone&lt;/a&gt; - Versioning tool restored&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-link/issues/233&quot;&gt;Missing migration in djangocms-link 5.0.0&lt;/a&gt; - Migration fix&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Documentation &amp;#x26; UX&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/issues/8300&quot;&gt;Help menu on CMS5&lt;/a&gt; - UX improvement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/issues/8242&quot;&gt;[DOC] Fix broken links in CONTRIBUTING&lt;/a&gt; - Documentation fix&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-sekizai/issues/184&quot;&gt;Django 5.2.x LTS support?&lt;/a&gt; - Version support clarification&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;All Community Issue Reporters&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;79 unique users&lt;/strong&gt; reported issues in 2025, including:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/metaforx&quot;&gt;@metaforx&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mrbazzan&quot;&gt;@mrbazzan&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/stefan6419846&quot;&gt;@stefan6419846&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/wfehr&quot;&gt;@wfehr&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/MacLake&quot;&gt;@MacLake&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/corentinbettiol&quot;&gt;@corentinbettiol&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/jrief&quot;&gt;@jrief&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/stefanw&quot;&gt;@stefanw&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/marbru&quot;&gt;@marbru&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Grosskopf&quot;&gt;@Grosskopf&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/jasperbok&quot;&gt;@jasperbok&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/florianschieder&quot;&gt;@florianschieder&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/dkoenigroer&quot;&gt;@dkoenigroer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/svandeneertwegh&quot;&gt;@svandeneertwegh&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/i-salameh95&quot;&gt;@i-salameh95&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/bartTC&quot;&gt;@bartTC&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/pietzschke&quot;&gt;@pietzschke&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rprader&quot;&gt;@rprader&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/TLuesebrinck&quot;&gt;@TLuesebrinck&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/sveetch&quot;&gt;@sveetch&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/payamnj&quot;&gt;@payamnj&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/PeterW-LWL&quot;&gt;@PeterW-LWL&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/creimers&quot;&gt;@creimers&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mbi&quot;&gt;@mbi&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/ehallein&quot;&gt;@ehallein&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/alonso-sand&quot;&gt;@alonso-sand&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/febsn&quot;&gt;@febsn&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/maxnoelp2&quot;&gt;@maxnoelp2&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/arcanjo45&quot;&gt;@arcanjo45&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/k-kramer&quot;&gt;@k-kramer&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Will-Hoey&quot;&gt;@Will-Hoey&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/bachvtuan&quot;&gt;@bachvtuan&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/agajankush&quot;&gt;@agajankush&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/aacimov&quot;&gt;@aacimov&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;…and 45 more&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Community Statistics Summary&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community PRs (Human Contributors)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unique Code Contributors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community Issues Reported&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;177&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unique Issue Reporters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automated PRs (Bots)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;181&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total Community + Bot PRs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;270&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The combination of dedicated Fellowship work and enthusiastic community participation creates a sustainable model for open-source development. Every contribution—whether a major feature, a bug report, or a typo fix—strengthens Django CMS.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Fellow Contributions&lt;/h2&gt;
&lt;h3&gt;Vinit Kumar (&lt;a href=&quot;https://github.com/vinitkumar&quot;&gt;@vinitkumar&lt;/a&gt;)&lt;/h3&gt;
&lt;p&gt;Vinit Kumar brings extensive experience in Python, Django, and open-source development to the Fellowship. His contributions this year focused on strategic improvements, CI/CD optimization, and ensuring the ecosystem stays current with the latest Python and Django versions.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pull Requests Created&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pull Requests Reviewed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;136&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Issues Opened&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Issues Commented On&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Key Contributions&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Python 3.14 and Django 6.0 Readiness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vinit spearheaded efforts to ensure Django CMS and its ecosystem packages are ready for upcoming Python and Django versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added Django 5.2 support to the core test matrix&lt;/li&gt;
&lt;li&gt;Implemented Python 3.14 compatibility across multiple packages including &lt;code&gt;djangocms-alias&lt;/code&gt;, &lt;code&gt;djangocms-versioning&lt;/code&gt;, and &lt;code&gt;djangocms-frontend&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Updated CI matrices to include Django 6.0 testing for &lt;code&gt;djangocms-rest&lt;/code&gt;, &lt;code&gt;djangocms-versioning&lt;/code&gt;, and &lt;code&gt;djangocms-modules&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CI/CD Optimization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of Vinit’s significant contributions was optimizing the continuous integration infrastructure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implemented conditional database testing and nightly runs to reduce CI costs while maintaining test coverage&lt;/li&gt;
&lt;li&gt;Fixed issues with deprecated GitHub Actions for publishing packages&lt;/li&gt;
&lt;li&gt;Improved coverage file uploads and reporting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ecosystem Maintenance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vinit contributed to maintaining package quality across the ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prepared release 3.3.3 for django-filer&lt;/li&gt;
&lt;li&gt;Added Django 5.2 to the Django CMS core test matrix&lt;/li&gt;
&lt;li&gt;Matched test matrices across &lt;code&gt;djangocms-frontend&lt;/code&gt; and Django CMS core&lt;/li&gt;
&lt;li&gt;Created and maintained the &lt;code&gt;djangocms-react-proj&lt;/code&gt; repository for React integration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Code Reviews&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With &lt;strong&gt;136 pull requests reviewed&lt;/strong&gt;, Vinit played a crucial role in maintaining code quality across the Django CMS ecosystem. His reviews covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Major feature implementations in Django CMS core&lt;/li&gt;
&lt;li&gt;Bug fixes across multiple ecosystem packages&lt;/li&gt;
&lt;li&gt;Documentation improvements&lt;/li&gt;
&lt;li&gt;CI/CD pipeline updates&lt;/li&gt;
&lt;li&gt;Security-related changes&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Notable Pull Requests&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8377&quot;&gt;feat: optimize CI with conditional database testing and nightly runs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-versioning/pull/489&quot;&gt;Modernize Python and Django support: Drop Python 3.9, add Python 3.14 and Django 6.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8151&quot;&gt;feat: add django 5.2 to the test matrix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-frontend/pull/320&quot;&gt;feat: match django-cms core test matrix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;Fabian Braun (&lt;a href=&quot;https://github.com/fsbraun&quot;&gt;@fsbraun&lt;/a&gt;)&lt;/h3&gt;
&lt;p&gt;Fabian Braun serves as the lead maintainer of Django CMS and brings deep expertise in the CMS architecture. His extraordinary output this year demonstrates unwavering commitment to the project’s success.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pull Requests Created&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;393&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pull Requests Reviewed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;471&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Issues Opened&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Issues Commented On&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;129&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Key Contributions&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Django CMS 5.0 Release&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Fabian led the monumental effort of releasing Django CMS 5.0, which included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complete djangocms-frontend JavaScript rewrite removing jQuery dependencies&lt;/li&gt;
&lt;li&gt;New design language implementation for Django CMS 5.1&lt;/li&gt;
&lt;li&gt;CSP (Content Security Policy) compliance across the board&lt;/li&gt;
&lt;li&gt;Improved editor response times through global caching of plugin restrictions&lt;/li&gt;
&lt;li&gt;Better database query optimization for edit and structure endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Core Architecture Improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Merged the &lt;code&gt;Page&lt;/code&gt; and &lt;code&gt;TreeNode&lt;/code&gt; models with backwards migration support by @jrief&lt;/li&gt;
&lt;li&gt;Implemented async support and middleware updates for Django CMS 5.0+&lt;/li&gt;
&lt;li&gt;Added placeholder-level error handling&lt;/li&gt;
&lt;li&gt;Created the &lt;code&gt;CMS_ALWAYS_REFRESH_CONTENT&lt;/code&gt; setting for better UX&lt;/li&gt;
&lt;li&gt;Implemented the new Django CMS design language&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;JavaScript Modernization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A significant portion of Fabian’s work focused on modernizing the JavaScript infrastructure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upgraded JS build pipeline across Django CMS core&lt;/li&gt;
&lt;li&gt;Bundled JS files and removed jQuery dependencies from django-filer&lt;/li&gt;
&lt;li&gt;Modernized JS build and removed jQuery bundle from djangocms-versioning&lt;/li&gt;
&lt;li&gt;Ensured CSP compliance by removing inline scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ecosystem Package Development&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Fabian maintained and improved numerous packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;djangocms-text&lt;/strong&gt;: Added Tiptap editor support, markdown pasting, configurable block styles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;djangocms-frontend&lt;/strong&gt;: Template components, simpler configuration, inline editing support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;djangocms-versioning&lt;/strong&gt;: Version locking, permission improvements, language menu fixes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;djangocms-alias&lt;/strong&gt;: Static aliases in structure board, CSP-compliant data bridge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;djangocms-rest&lt;/strong&gt;: Menu endpoints, page search, OpenAPI support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;djangocms-stories&lt;/strong&gt;: Complete rewrite and testing infrastructure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;djangocms-transfer&lt;/strong&gt;: Django CMS 5.0 compatibility&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Release Management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Fabian orchestrated multiple releases across the ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django CMS 5.0.0, 5.0.1, 5.0.2, 5.0.3, 5.0.4, 5.0.5&lt;/li&gt;
&lt;li&gt;Django CMS 4.1.5, 4.1.6, 4.1.7, 4.1.8, 4.1.9&lt;/li&gt;
&lt;li&gt;Django CMS 3.11.10&lt;/li&gt;
&lt;li&gt;Multiple releases for djangocms-versioning, djangocms-alias, djangocms-text, django-filer, and other packages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Documentation and Community&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated LTS definitions per board decisions&lt;/li&gt;
&lt;li&gt;Improved coding style documentation&lt;/li&gt;
&lt;li&gt;Added documentation for toolbar methods&lt;/li&gt;
&lt;li&gt;Autogenerated LTS table and core plugin list from ecosystem repository&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Notable Pull Requests&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8320&quot;&gt;feat: Implement new Django CMS design language for Django CMS 5.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8299&quot;&gt;feat: Django 6 compatibility (July 2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8109&quot;&gt;feat: Allow for CSP - remove inline scripts from edit endpoint markup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8140&quot;&gt;feat: Better editor turn-around times&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8120&quot;&gt;feat: Optimize DB queries for edit and structure endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-frontend/pull/263&quot;&gt;feat: Add template components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Repositories Impacted&lt;/h2&gt;
&lt;p&gt;The Fellows’ contributions span the entire Django CMS ecosystem:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core Packages:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;django-cms&lt;/li&gt;
&lt;li&gt;djangocms-versioning&lt;/li&gt;
&lt;li&gt;djangocms-alias&lt;/li&gt;
&lt;li&gt;djangocms-moderation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Frontend &amp;#x26; UI:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;djangocms-frontend&lt;/li&gt;
&lt;li&gt;djangocms-admin-style&lt;/li&gt;
&lt;li&gt;djangocms-text&lt;/li&gt;
&lt;li&gt;djangocms-text-ckeditor5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Content Plugins:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;djangocms-link&lt;/li&gt;
&lt;li&gt;djangocms-picture&lt;/li&gt;
&lt;li&gt;djangocms-snippet&lt;/li&gt;
&lt;li&gt;djangocms-file&lt;/li&gt;
&lt;li&gt;djangocms-video&lt;/li&gt;
&lt;li&gt;djangocms-style&lt;/li&gt;
&lt;li&gt;djangocms-icon&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;API &amp;#x26; Headless:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;djangocms-rest&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Utilities:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;django-filer&lt;/li&gt;
&lt;li&gt;django-sekizai&lt;/li&gt;
&lt;li&gt;django-classy-tags&lt;/li&gt;
&lt;li&gt;djangocms-attributes-field&lt;/li&gt;
&lt;li&gt;djangocms-transfer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Migration &amp;#x26; Tooling:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;djangocms-4-migration&lt;/li&gt;
&lt;li&gt;cms-template&lt;/li&gt;
&lt;li&gt;django-cms-quickstart&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Major Milestones in 2025&lt;/h2&gt;
&lt;h3&gt;Django CMS 5.0 Release&lt;/h3&gt;
&lt;p&gt;The release of Django CMS 5.0 marked a significant milestone:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complete JavaScript modernization&lt;/strong&gt; - Removed jQuery dependencies, adopted modern build tooling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSP compliance&lt;/strong&gt; - Removed inline scripts across the entire platform&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance improvements&lt;/strong&gt; - Optimized database queries and caching strategies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New design language&lt;/strong&gt; - Fresh, modern UI for the editing experience&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Async support&lt;/strong&gt; - Middleware updates for Django’s async capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Django 6.0 Compatibility&lt;/h3&gt;
&lt;p&gt;Both Fellows worked extensively on ensuring Django 6.0 compatibility:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated deprecated Django APIs&lt;/li&gt;
&lt;li&gt;Added Django 6.0 to test matrices across all packages&lt;/li&gt;
&lt;li&gt;Fixed compatibility issues early, before Django 6.0’s stable release&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Python 3.14 Support&lt;/h3&gt;
&lt;p&gt;Forward-looking work to ensure Python 3.14 compatibility:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated package dependencies&lt;/li&gt;
&lt;li&gt;Fixed deprecation warnings&lt;/li&gt;
&lt;li&gt;Updated CI/CD pipelines to test against Python 3.14 alphas&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;The Impact of the Fellowship Program&lt;/h2&gt;
&lt;p&gt;The Fellowship Program enables sustained, focused development that would be difficult to achieve through volunteer contributions alone. The numbers tell a compelling story:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;409 pull requests created&lt;/strong&gt; - Nearly every day of 2025 saw new code contributed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;607 code reviews&lt;/strong&gt; - Ensuring high-quality contributions from the broader community&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;132 issues addressed&lt;/strong&gt; - Responsive support for users and developers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond the numbers, the Fellows have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintained backward compatibility while pushing the platform forward&lt;/li&gt;
&lt;li&gt;Ensured security through proactive updates and CSP compliance&lt;/li&gt;
&lt;li&gt;Improved developer experience with better documentation and tooling&lt;/li&gt;
&lt;li&gt;Supported the community through issue triage and discussions&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Looking Ahead&lt;/h2&gt;
&lt;p&gt;As we close 2025, Django CMS stands stronger than ever:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Django CMS 5.x&lt;/strong&gt; provides a modern, performant foundation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Django 6.0 compatibility&lt;/strong&gt; ensures users can adopt the latest Django LTS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python 3.14 readiness&lt;/strong&gt; future-proofs the ecosystem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved headless capabilities&lt;/strong&gt; with djangocms-rest opens new use cases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Fellowship Program continues to prove its value in maintaining one of Python’s most important open-source projects. The dedication shown by Fabian Braun and Vinit Kumar throughout 2025 exemplifies the spirit of open-source contribution.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Supporting Django CMS&lt;/h2&gt;
&lt;p&gt;If you or your organization benefits from Django CMS, consider supporting the project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Contribute code&lt;/strong&gt; - PRs are always welcome&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Report issues&lt;/strong&gt; - Help identify bugs and improvements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sponsor the Fellowship&lt;/strong&gt; - Enable continued dedicated development&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spread the word&lt;/strong&gt; - Share your Django CMS success stories&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://www.django-cms.org/&quot;&gt;django-cms.org&lt;/a&gt; to learn more about supporting the project.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This report was compiled using contribution data from the django-cms GitHub organization. All statistics reflect contributions made between January 1, 2025, and December 3, 2025.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thank you to Vinit Kumar and Fabian Braun for their exceptional dedication to Django CMS.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Reposted from here: &lt;a href=&quot;https://www.django-cms.org/en/blog/2025/12/07/django-cms-fellows-community-annual-report-2025-a-year-of-extraordinary-contributions/&quot;&gt;https://www.django-cms.org/en/blog/2025/12/07/django-cms-fellows-community-annual-report-2025-a-year-of-extraordinary-contributions/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My Open Source Contributions in 2025]]></title><description><![CDATA[2025 has been an incredibly productive year for open source contributions. I’ve authored 57 merged pull requests across 20 different…]]></description><link>https://vinitkumar.me/open-source-contributions-2025/</link><guid isPermaLink="false">https://vinitkumar.me/open-source-contributions-2025/</guid><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;    ╔═══════════════════════════════════════════════╗
    ║                                               ║
    ║  ██╗   ██╗██╗███╗   ██╗██╗████████╗           ║
    ║  ██║   ██║██║████╗  ██║██║╚══██╔══╝           ║
    ║  ██║   ██║██║██╔██╗ ██║██║   ██║              ║
    ║  ╚██╗ ██╔╝██║██║╚██╗██║██║   ██║              ║
    ║   ╚████╔╝ ██║██║ ╚████║██║   ██║              ║
    ║    ╚═══╝  ╚═╝╚═╝  ╚═══╝╚═╝   ╚═╝              ║
    ║                                               ║
    ║          [ Open Source Warrior ]              ║
    ║   57 PRs Created | 139 PRs Reviewed           ║
    ║          21 Projects Launched                 ║
    ║                                               ║
    ╚═══════════════════════════════════════════════╝&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;2025 has been an incredibly productive year for open source contributions. I’ve authored &lt;strong&gt;57 merged pull requests&lt;/strong&gt; across 20 different repositories, reviewed and approved &lt;strong&gt;139 merged pull requests&lt;/strong&gt;, and created &lt;strong&gt;21 new projects&lt;/strong&gt;. This post is a comprehensive retrospective of the year’s work.&lt;/p&gt;
&lt;h2&gt;Django CMS Fellow: Maintainer Report&lt;/h2&gt;
&lt;p&gt;As a Django CMS maintainer and fellow, my contributions to the ecosystem span both code authorship and comprehensive code review. In 2025, I authored &lt;strong&gt;11 PRs&lt;/strong&gt; and reviewed/approved &lt;strong&gt;95 PRs&lt;/strong&gt; across the Django CMS family of projects.&lt;/p&gt;
&lt;h3&gt;Authored Contributions (11 PRs)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms&quot;&gt;django-cms&lt;/a&gt;&lt;/strong&gt; (3 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8377&quot;&gt;feat: optimize CI with conditional database testing and nightly runs&lt;/a&gt; - CI optimization&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8371&quot;&gt;chore: change python version&lt;/a&gt; - Version management&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-cms/pull/8151&quot;&gt;feat: add django 5.2 to the test matrix&lt;/a&gt; - Django 5.2 support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-versioning&quot;&gt;djangocms-versioning&lt;/a&gt;&lt;/strong&gt; (1 PR)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-versioning/pull/489&quot;&gt;Modernize Python and Django support: Drop Python 3.9, add Python 3.14 and Django 6.0&lt;/a&gt; - Major version support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-frontend&quot;&gt;djangocms-frontend&lt;/a&gt;&lt;/strong&gt; (1 PR)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-frontend/pull/320&quot;&gt;feat: match django-cms core test matrix&lt;/a&gt; - Test alignment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-rest&quot;&gt;djangocms-rest&lt;/a&gt;&lt;/strong&gt; (2 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-rest/pull/72&quot;&gt;Add Django 6.0 support to CI&lt;/a&gt; - Modern Django support&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-rest/pull/74&quot;&gt;fix: try to fix the issue with coverage files not uploading&lt;/a&gt; - Coverage fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-admin-style&quot;&gt;djangocms-admin-style&lt;/a&gt;&lt;/strong&gt; (1 PR)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-admin-style/pull/546&quot;&gt;fix: issues with deprecated github actions to publish&lt;/a&gt; - GitHub Actions updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/django-cms/django-filer&quot;&gt;django-filer&lt;/a&gt;&lt;/strong&gt; (1 PR)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/django-filer/pull/1554&quot;&gt;Chore/prepare 3.3.3&lt;/a&gt; - Release prep&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-react-proj&quot;&gt;djangocms-react-proj&lt;/a&gt;&lt;/strong&gt; (2 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-react-proj/pull/1&quot;&gt;feat: add react project&lt;/a&gt; - Initial setup&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/django-cms/djangocms-react-proj/pull/2&quot;&gt;feat: add a basic outline&lt;/a&gt; - Project scaffolding&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Code Reviews &amp;#x26; Approvals (95 PRs)&lt;/h3&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;╔══════════════════════════════════════════════╗
║     Django CMS Ecosystem - PRs Reviewed      ║
╠══════════════════════════════════════════════╣
║ django-cms/django-cms          ██████████ 71 ║
║ djangocms-versioning           ████ 8        ║
║ django-filer                   ███ 5         ║
║ djangocms-alias                ██ 4          ║
║ djangocms-moderation           ██ 3          ║
║ djangocms-link                 █ 2           ║
║ django-classy-tags             █ 2           ║
║ djangocms-snippet              1             ║
║ djangocms-attributes-field     1             ║
║ django-cms-quickstart          1             ║
║                                              ║
║ Total PRs Reviewed:           95             ║
╚══════════════════════════════════════════════╝&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;The core &lt;code&gt;django-cms&lt;/code&gt; project received the majority of review attention with 71 merged PRs covering modernization, bug fixes, and feature development. This review work ensures code quality and consistency across the entire Django CMS ecosystem.&lt;/p&gt;
&lt;h2&gt;Personal Project Contributions (46 PRs)&lt;/h2&gt;
&lt;p&gt;Beyond my work as a Django CMS Fellow, I contributed &lt;strong&gt;46 PRs&lt;/strong&gt; across my personal open source projects and community initiatives.&lt;/p&gt;
&lt;h2&gt;Contribution Timeline&lt;/h2&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;┌─ Monthly PR Distribution ─────────────────────────────┐
│                                                       │
│ January      ██ (2)                                   │
│ February     ██████ (6)                               │
│ March        █ (1)                                    │
│ April        █████ (5)                                │
│ May          ████ (4)                                 │
│ June         ██████ (6)                               │
│ July         ███ (3)                                  │
│ August       ████ (4)                                 │
│ September    █████ (5)                                │
│ October      ███████████████ (15) ⚡                   │
│ November     ██████ (6)                               │
│                                                       │
└───────────────────────────────────────────────────────┘&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;October was the most prolific month with 15 PRs merged, primarily focused on Python version updates and theme development.&lt;/p&gt;
&lt;h2&gt;Top Contributing Repositories&lt;/h2&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;╔════════════════════════════════════════════════╗
║           Repository Activity                  ║
╠════════════════════════════════════════════════╣
║ vinitkumar/json2xml            ████████████ 18 ║
║ vinitkumar/nvim                █████ 5         ║
║ vinitkumar/pdf-joiner          █████ 5         ║
║ django-cms/django-cms          ███ 3           ║
║ vinitkumar/oscura-vim          ███ 3           ║
║ vinitkumar/vinitkumar.me       ██ 2            ║
║ django-cms/djangocms-rest      ██ 2            ║
║ obsidianmd/obsidian-releases   ██ 2            ║
║ vinitkumar/monokai-pro-vim     ██ 2            ║
║ vinitkumar/dark-paper          ██ 2            ║
║                                                ║
║ Other 10 repositories           ✦ 1 each       ║
╚════════════════════════════════════════════════╝&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Heaviest Activity Days - Top 10&lt;/h2&gt;
&lt;p&gt;Days with the most merged PRs, showing peak productivity periods:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;╔════════════════════════════════════════════════════════════╗
║            Top 10 Busiest Days of 2025                     ║
╠════════════════════════════════════════════════════════════╣
║                                                            ║
║ 🥇 Wed, Oct 8    ████████ 4 PRs                            ║
║    └─ json2xml sprint: tooling &amp;amp; testing updates           ║
║                                                            ║
║ 🥈 Wed, Nov 5    ████ 2 PRs                                ║
║    └─ nvim: lazy.nvim migration push                       ║
║                                                            ║
║ 🥉 Fri, Oct 24   ████ 2 PRs                                ║
║    └─ Django CMS: test matrix alignment                    ║
║                                                            ║
║ 🏅 Wed, Oct 15   ████ 2 PRs                                ║
║    └─ Obsidian: theme releases                             ║
║                                                            ║
║ 🏅 Thu, Sep 25   ████ 2 PRs                                ║
║    └─ dark-paper: security upgrades                        ║
║                                                            ║
║ 🏅 Sun, Aug 31   ████ 2 PRs                                ║
║    └─ oscura-vim: theme refinements                        ║
║                                                            ║
║ 🏅 Wed, Jun 18   ████ 2 PRs                                ║
║    └─ pdf-joiner &amp;amp; json2xml: features &amp;amp; security           ║
║                                                            ║
║ 🏅 Tue, Jun 10   ████ 2 PRs                                ║
║    └─ json2xml: testing enhancements                       ║
║                                                            ║
║ 🏅 Fri, Feb 21   ████ 2 PRs                                ║
║    └─ json2xml: coverage &amp;amp; dependencies                    ║
║                                                            ║
║ 🏅 Sun, Jan 19   ████ 2 PRs                                ║
║    └─ node-twitter: security upgrades                      ║
║                                                            ║
╚════════════════════════════════════════════════════════════╝&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Key Observation&lt;/strong&gt;: October 8 was the most productive day with 4 simultaneous PR merges, all in the json2xml project focused on Python tooling and testing infrastructure.&lt;/p&gt;
&lt;h3&gt;json2xml Project (18 PRs)&lt;/h3&gt;
&lt;p&gt;The most actively maintained project with heavy focus on Python modernization and testing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python Modernization &amp;#x26; Support:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/255&quot;&gt;feat: improvements to ruff and new python 3.15&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/254&quot;&gt;Modernize Python code to 3.10+ with pyupgrade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/251&quot;&gt;Add Python 3.14t (freethreaded) to testing matrix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/234&quot;&gt;feat: add latest python 3.14 alpha&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/232&quot;&gt;feat:try pypy 3.11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/227&quot;&gt;feat: update to python 3.14.5 alpha&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tooling &amp;#x26; Infrastructure:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/252&quot;&gt;Migrate from mypy to ty for type checking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/240&quot;&gt;Feat/tox python 3.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/253&quot;&gt;check arm build ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/249&quot;&gt;prod release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/229&quot;&gt;fix: upgrade deps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/226&quot;&gt;Feat/upgrade deps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bug Fixes &amp;#x26; Features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/242&quot;&gt;fix: escape XML special characters in @attrs values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/243&quot;&gt;🔒 Security: Fix Jinja2 and py library vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/241&quot;&gt;feat: add tests for utils as well&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/230&quot;&gt;fix: add tests for uncovered lines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/231&quot;&gt;feat:updated diagram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/json2xml/pull/247&quot;&gt;Feat/remove py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Neovim Configuration (5 PRs)&lt;/h3&gt;
&lt;p&gt;Major modernization with performance improvements - &lt;a href=&quot;https://github.com/vinitkumar/nvim&quot;&gt;Repository&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/nvim/pull/9&quot;&gt;feat: replace fzf.nvim with fff.nvim&lt;/a&gt; (Nov 27) - Plugin upgrade&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/nvim/pull/7&quot;&gt;Migrate from packer to lazy.nvim with 15x performance improvement&lt;/a&gt; (Nov 5) - Major perf win&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/nvim/pull/8&quot;&gt;Lazy nvim migration&lt;/a&gt; (Nov 5) - Package manager migration&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/nvim/pull/6&quot;&gt;feat: nvim is lazy now&lt;/a&gt; (Aug 23) - Lazy loading&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/nvim/pull/5&quot;&gt;update&lt;/a&gt; (Jul 10) - Regular updates&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;PDF Joiner (5 PRs)&lt;/h3&gt;
&lt;p&gt;Cross-platform utility development - &lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner&quot;&gt;Repository&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner/pull/6&quot;&gt;feat: improve linux support&lt;/a&gt; - Cross-platform improvements&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner/pull/4&quot;&gt;feat: implement cross-platform PDF joiner with Linux support&lt;/a&gt; - Major feature&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner/pull/5&quot;&gt;fix: try automatic release with binary&lt;/a&gt; - Release automation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner/pull/2&quot;&gt;Feat/add GitHub actions ci&lt;/a&gt; - CI setup&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner/pull/1&quot;&gt;Add MIT License to the project&lt;/a&gt; - Licensing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Theme Development (8 PRs)&lt;/h3&gt;
&lt;p&gt;Creative work on color schemes and visual design across platforms:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/vinitkumar/oscura-vim&quot;&gt;oscura-vim&lt;/a&gt;&lt;/strong&gt; (3 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/oscura-vim/pull/5&quot;&gt;Feat/oscura dusk light theme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/oscura-vim/pull/4&quot;&gt;feat: Add oscura-dusk-light theme with accessibility compliance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/oscura-vim/pull/2&quot;&gt;feat: add tests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/obsidianmd/obsidian-releases&quot;&gt;obsidian-releases&lt;/a&gt;&lt;/strong&gt; (2 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/obsidianmd/obsidian-releases/pull/8184&quot;&gt;Add monokai ristretto obsidian dark mode theme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/obsidianmd/obsidian-releases/pull/8072&quot;&gt;Add theme: Oscura&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/vinitkumar/monokai-pro-vim&quot;&gt;monokai-pro-vim&lt;/a&gt;&lt;/strong&gt; (2 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/monokai-pro-vim/pull/2&quot;&gt;Add Obsidian themes for all Monokai Pro variants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/monokai-pro-vim/pull/1&quot;&gt;publish&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Security &amp;#x26; Maintenance (7 PRs)&lt;/h3&gt;
&lt;p&gt;Dependency upgrades and security fixes across multiple projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/vinitkumar/dark-paper&quot;&gt;dark-paper&lt;/a&gt; (2 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/dark-paper/pull/29&quot;&gt;Security upgrade jekyll from 4.3.4 to 4.4.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/dark-paper/pull/28&quot;&gt;Security upgrade octokit from 9.2.0 to 10.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/vinitkumar/vinitkumar.github.com&quot;&gt;vinitkumar.github.com&lt;/a&gt; (2 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/vinitkumar.github.com/pull/48&quot;&gt;Security upgrade jekyll from 4.3.4 to 4.4.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/vinitkumar.github.com/pull/47&quot;&gt;Security upgrade jekyll from 4.3.3 to 4.3.4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/vinitkumar/node-twitter&quot;&gt;node-twitter&lt;/a&gt; (2 PRs)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/node-twitter/pull/362&quot;&gt;Security upgrade mongoose from 8.8.3 to 8.9.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/node-twitter/pull/361&quot;&gt;Security upgrade express from 4.21.1 to 4.21.2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/vinitkumar/vinitkumar.me&quot;&gt;vinitkumar.me&lt;/a&gt; (1 PR)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/vinitkumar.me/pull/122&quot;&gt;Migrate packer to lazy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Community Contributions (4 PRs)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lobsters/lobsters&quot;&gt;lobsters&lt;/a&gt; - &lt;a href=&quot;https://github.com/lobsters/lobsters/pull/1516&quot;&gt;feat: update github actions setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kagisearch/smallweb&quot;&gt;kagisearch/smallweb&lt;/a&gt; - &lt;a href=&quot;https://github.com/kagisearch/smallweb/pull/389&quot;&gt;Add blog of Vinit Kumar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Private Repository Contributions&lt;/h2&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;╔═════════════════════════════════════════════════╗
║         Private Repo Statistics                 ║
╠═════════════════════════════════════════════════╣
║ PRs to Private Repos:          1                ║
║ Total Public PRs:              56               ║
║ Public/Private Ratio:          56:1             ║
╚═════════════════════════════════════════════════╝&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Private Repo PR:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Valpiccola/ApacheAirflow&lt;/strong&gt; - “(Don’t Merge) Feat/generate lockfile for better local development”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Other Open Source Reviews&lt;/h2&gt;
&lt;p&gt;Beyond the Django CMS ecosystem, I also reviewed and approved &lt;strong&gt;2 pull requests&lt;/strong&gt; in other projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vinitkumar/json2xml&lt;/strong&gt; (2 PRs) - Supporting quality assurance for my core project&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Meta: This Blog Itself (vinitkumar.me)&lt;/h2&gt;
&lt;p&gt;As a matter of transparency, this blog repository also saw significant activity in 2025:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Commits&lt;/strong&gt;: 91 commits to improve the blog infrastructure, styling, and content
&lt;strong&gt;Blog Posts in 2025&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2025 in Review (Nov 24)&lt;/li&gt;
&lt;li&gt;Migrating from Packer to Lazy.nvim: A 15x Faster Startup (Nov 6)&lt;/li&gt;
&lt;li&gt;Vibe Engineering with Django: Working with AI Coding Agents (Oct 8)&lt;/li&gt;
&lt;li&gt;Monokai Pro for Vim: Bringing Modern Aesthetics to Terminal Editing (Sep 10)&lt;/li&gt;
&lt;li&gt;My New AI Workflow: Embracing Command-Line AI Tools (Aug 31)&lt;/li&gt;
&lt;li&gt;Go 1.25: Container-Aware Runtime &amp;#x26; Developer Experience (Aug 13)&lt;/li&gt;
&lt;li&gt;AI Agents, Me, and My Feelings (Jul 18)&lt;/li&gt;
&lt;li&gt;PDF Joiner Now Supports Linux (Jul 7)&lt;/li&gt;
&lt;li&gt;Books on My Desk (Jun 7)&lt;/li&gt;
&lt;li&gt;Future of Error Handling in Go Notes (Jun 5)&lt;/li&gt;
&lt;li&gt;Balancing AI Tools in Development (May 7)&lt;/li&gt;
&lt;li&gt;Natural Coder (Apr 2)&lt;/li&gt;
&lt;li&gt;Oscura Vim - My New Favorite Theme Collection (Mar 28)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Notable Infrastructure Changes&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Restructured navigation and content organization for better UX&lt;/li&gt;
&lt;li&gt;Added blog statistics to Bio component&lt;/li&gt;
&lt;li&gt;Implemented TIL (Today I Learned) posts support&lt;/li&gt;
&lt;li&gt;Upgraded dependencies and accessibility fixes&lt;/li&gt;
&lt;li&gt;Refreshed design with improved colorschemes and navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Total of &lt;strong&gt;11 blog posts&lt;/strong&gt; authored in 2025 (plus many TIL entries), reflecting my journey through AI, tools, themes, and technical depth.&lt;/p&gt;
&lt;h2&gt;New Projects Created in 2025&lt;/h2&gt;
&lt;p&gt;I also created &lt;strong&gt;21 new projects&lt;/strong&gt; this year, reflecting diverse interests across themes, utilities, and infrastructure:&lt;/p&gt;
&lt;h3&gt;Public Projects (11)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Theme &amp;#x26; Design Projects:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/monokai-ristretto-obsidian&quot;&gt;monokai-ristretto-obsidian&lt;/a&gt; - Warm dark theme for Obsidian, ported from Monokai Pro Ristretto&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/oscura-obsidian&quot;&gt;oscura-obsidian&lt;/a&gt; - Dark, elegant theme for Obsidian, ported from oscura-vim&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/oscura-vim&quot;&gt;oscura-vim&lt;/a&gt; - Vim port for Oscura theme from VSCode&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/monokai-pro-vim&quot;&gt;monokai-pro-vim&lt;/a&gt; - Beautiful Monokai Pro theme variants for Vim&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Utility Projects:&lt;/strong&gt;
5. &lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner&quot;&gt;pdf-joiner&lt;/a&gt; - Join PDFs on Mac with ease using native Mac tools
6. &lt;a href=&quot;https://github.com/vinitkumar/gh-action-dashboard&quot;&gt;gh-action-dashboard&lt;/a&gt; - GitHub Actions dashboard tool
7. &lt;a href=&quot;https://github.com/vinitkumar/djangocms-action-dashboard&quot;&gt;djangocms-action-dashboard&lt;/a&gt; - Dashboard for Django CMS actions
8. &lt;a href=&quot;https://github.com/vinitkumar/django-cms-infographic&quot;&gt;django-cms-infographic&lt;/a&gt; - Infographics for Django CMS&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Community &amp;#x26; Learning:&lt;/strong&gt;
9. &lt;a href=&quot;https://github.com/vinitkumar/address-book&quot;&gt;address-book&lt;/a&gt; - React Router 7 Address Book Tutorial
10. &lt;a href=&quot;https://github.com/vinitkumar/datasette&quot;&gt;datasette&lt;/a&gt; - An open source multi-tool for exploring and publishing data (Fork)
11. &lt;a href=&quot;https://github.com/kagisearch/smallweb&quot;&gt;smallweb&lt;/a&gt; - Kagi Small Web (Forked)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django CMS:&lt;/strong&gt;
12. &lt;a href=&quot;https://github.com/django-cms/djangocms-react-proj&quot;&gt;djangocms-react-proj&lt;/a&gt; - React-first Django CMS demo project&lt;/p&gt;
&lt;h3&gt;Private Projects (10)&lt;/h3&gt;
&lt;p&gt;Infrastructure and personal development projects kept private:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/gotchacode-website&quot;&gt;gotchacode-website&lt;/a&gt; - Website project&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/unified-fonts&quot;&gt;unified-fonts&lt;/a&gt; - Font management system&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/.config-mac&quot;&gt;.config-mac&lt;/a&gt; - macOS development configuration&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/.config&quot;&gt;.config&lt;/a&gt; - Cross-platform configuration files&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vinitkumar/jobs&quot;&gt;jobs&lt;/a&gt; - Job tracking and management&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Valpiccola/ApacheAirflow&quot;&gt;ApacheAirflow&lt;/a&gt; - Airflow experimentation (shared)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/robertocommit/IntermediateProxy&quot;&gt;IntermediateProxy&lt;/a&gt; - Network proxy project (shared)&lt;/li&gt;
&lt;/ol&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;╔═════════════════════════════════════════════════╗
║         2025 Projects Created                   ║
╠═════════════════════════════════════════════════╣
║ Total New Projects:            21               ║
║ Public Projects:               11               ║
║ Private Projects:              10               ║
║                                                 ║
║ Project Categories:                             ║
║   • Themes &amp;amp; Design:           4                ║
║   • Utilities:                 4                ║
║   • Infrastructure:            3                ║
║   • Community/Learning:        2                ║
║   • Django CMS:                1                ║
║   • Configuration:             2                ║
║   • Other:                     2                ║
╚═════════════════════════════════════════════════╝&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Key Themes &amp;#x26; Insights&lt;/h2&gt;
&lt;h3&gt;1. Python Modernization&lt;/h3&gt;
&lt;p&gt;Significant effort modernizing codebases to support latest Python versions (3.14, 3.15) and deprecated versions (3.9). The json2xml project alone had 6 PRs dedicated to Python version updates.&lt;/p&gt;
&lt;h3&gt;2. Infrastructure &amp;#x26; CI/CD&lt;/h3&gt;
&lt;p&gt;Heavy investment in GitHub Actions, testing infrastructure, and CI/CD pipeline improvements across multiple Django CMS projects and personal projects.&lt;/p&gt;
&lt;h3&gt;3. Theme Creation&lt;/h3&gt;
&lt;p&gt;Creative energy went into developing color themes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ported existing themes (Monokai Pro, Oscura) to new platforms&lt;/li&gt;
&lt;li&gt;Created Obsidian theme variants&lt;/li&gt;
&lt;li&gt;Ensured accessibility compliance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. Performance Optimization&lt;/h3&gt;
&lt;p&gt;Achieved 15x performance improvement migrating Neovim from Packer to lazy.nvim - a significant quality-of-life improvement.&lt;/p&gt;
&lt;h3&gt;5. Security Focus&lt;/h3&gt;
&lt;p&gt;Multiple security updates addressing vulnerabilities in dependencies (Jinja2, mongoose, express, Jekyll).&lt;/p&gt;
&lt;h2&gt;Public vs Private Distribution&lt;/h2&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;╔═══════════════════════════════╗
║     Contribution Split        ║
╠═══════════════════════════════╣
║                               ║
║  Public  ████████████████     │ 98%
║  Private █                    │ 2%
║                               ║
╚═══════════════════════════════╝&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;The vast majority of contributions are to public open source projects, reflecting a strong commitment to the open source community.&lt;/p&gt;
&lt;h2&gt;Quick Stats Summary&lt;/h2&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;╔═════════════════════════════════════════╗
║      2025 OPEN SOURCE SUMMARY           ║
╠═════════════════════════════════════════╣
║  Total PRs Authored       │     57      ║
║  Total PRs Reviewed       │    139      ║
║  Repositories             │     20      ║
║  New Projects Created     │     21      ║
║  Most Active Project      │ json2xml    ║
╚═════════════════════════════════════════╝&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;2025 has been a year of consistent, high-impact contributions spanning infrastructure modernization, feature development, security improvements, and creative design work. The 57 merged PRs and 21 new projects created represent not just quantity, but a diverse range of contributions across different domains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python ecosystem&lt;/strong&gt;: json2xml, Django CMS family&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;: CI/CD improvements, Docker, testing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creative&lt;/strong&gt;: Theme design for Vim, Obsidian, VSCode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utility&lt;/strong&gt;: PDF manipulation, GitHub dashboards&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community&lt;/strong&gt;: Contributing to Lobsters, Kagi Small Web&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking forward to continuing this momentum in 2026.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Data accurate as of November 28, 2025&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[2025 in Review]]></title><description><![CDATA[2025 was the year I stopped fighting change and started embracing it intentionally. A lot happened this year—some of it planned, most of it…]]></description><link>https://vinitkumar.me/2025-a-review/</link><guid isPermaLink="false">https://vinitkumar.me/2025-a-review/</guid><pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/636ca850880383368de6fbd0f3dd5e4d/71c1d/yearview.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.89189189189189%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACkklEQVR42jWS3WvTYBTG80e4rU3TpM1H0yRNms83TZOmaT7atbOl2DEZ0jrFIWOrOL1wIkx34TbsvBAREfRCEdn0Tm8HsuEf5knH4MdLAud5z3ue52Alp8Pabc5uwwdXa7NWyABmerIpEYtS4LdotGijxaEQKgHeWcYYK2aMsGQnRTNm4VTdglIrVh1SsvLXkBVEKS4pu2W9zuke7/aExgroMVLxGDMq19qG26rUI1Jx8FI1L+oEr2ZZeZEWbxSEDKsU1YZgeKzqMigye7fVZFSCzoRk56SaWQ9u9TuWHxGVuZhXCoKKl5RFprJYFDOcQut+QWviaiC2hs5wbHbXYFiMEG1CtIJWyw0SGIGSaxlWzgtajlNAtgAUxAwjU1oTJcPd3enWdGdt44HU7DMowbKyv8AjyQnBLRrFBaVOlHVC0HNlDS+pOJ+epGhkZW97++HvL69/fHj17vAZbaUGYaP1O093t84+HhztPyaNSKy3KdkmJQQmXQGGlUy/aITju5Pjl08+nbzY3LxH6mkz7OJ0dnk2uzh9c/79OFi5BWFkuWra8JoMV4Uryk6bUANS8zmrlYZnJ2nnv6ezf7/eXp6dnH87nGyMYTZqng0hmnnRJCs2VbFp1QUxbQY4r+YECzyiDT/t/OfzwWx/Ohmvax6kHaHOqt1d1cJBuZbwdix5y6gzcnprejQgq16urMMUOcGgFAdWCNMbSV5tLkkuLrssSuRGF4DJWTNgjCZvh6Dv9QejfgeFXVL1sxyELy0xMgyIFa24oEGGDRbFAOxguoYmkG4orvg3R6sne/c3htH+ozFfSyjVy1fsvISgGGNQDKVXypS5E/AEgLMTcDUajH6+f/71aLq3M4Eb5wVtUDEo/g+elLWdoHdpvAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image&quot;
        title=&quot;&quot;
        src=&quot;/static/636ca850880383368de6fbd0f3dd5e4d/fcda8/yearview.png&quot;
        srcset=&quot;/static/636ca850880383368de6fbd0f3dd5e4d/12f09/yearview.png 148w,
/static/636ca850880383368de6fbd0f3dd5e4d/e4a3f/yearview.png 295w,
/static/636ca850880383368de6fbd0f3dd5e4d/fcda8/yearview.png 590w,
/static/636ca850880383368de6fbd0f3dd5e4d/efc66/yearview.png 885w,
/static/636ca850880383368de6fbd0f3dd5e4d/c83ae/yearview.png 1180w,
/static/636ca850880383368de6fbd0f3dd5e4d/71c1d/yearview.png 1536w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;2025 was the year I stopped fighting change and started embracing it intentionally.&lt;/p&gt;
&lt;p&gt;A lot happened this year—some of it planned, most of it a natural evolution of how I think about work, tools, and the craft of building software. Looking back at my writing and projects from these past eleven months, I see clear threads running through: an obsession with performance, a deepening relationship with AI, and an increasing clarity about what actually matters in both code and life.&lt;/p&gt;
&lt;p&gt;Let me walk through what shaped this year.&lt;/p&gt;
&lt;h2&gt;The Great Tooling Migration&lt;/h2&gt;
&lt;p&gt;This year was dominated by a particular kind of satisfaction: optimizing things until they sing.&lt;/p&gt;
&lt;p&gt;In March, I finally sat down and documented my complete Vim setup—both terminal and GUI. This wasn’t just configuration documentation; it was a statement about what I value: minimal, fast, and intentional. The post resonated with people because it wasn’t about using the latest hyped editor. It was about understanding your tools deeply enough that they become invisible.&lt;/p&gt;
&lt;p&gt;Then came November. After years of Packer serving me well, I migrated my entire Neovim configuration to Lazy.nvim. The numbers were stark: 1797ms startup time down to 115ms. That’s a 15x improvement. But the real win wasn’t just speed—it was clarity. Lazy.nvim forced me to be more deliberate about when and how plugins load. The result is a setup that’s faster, more maintainable, and honestly more fun to work in.&lt;/p&gt;
&lt;p&gt;This migration crystallized something I’ve been thinking about: good tooling isn’t about having more features. It’s about having the right features, loading at the right time, with no unnecessary overhead. That philosophy applies to everything I do now.&lt;/p&gt;
&lt;h2&gt;The AI Inflection Point&lt;/h2&gt;
&lt;p&gt;I’ve been writing about AI all year, and my perspective has evolved significantly. In February, I laid out my experience with five major AI platforms: Cursor, Copilot, ChatGPT, DeepSeek, and Claude. My conclusion then was pragmatic but uncertain: these tools are powerful but inconsistent.&lt;/p&gt;
&lt;p&gt;By May, I had articulated a workflow that still feels right. AI as a pair programmer, not a code generator. Think deeply, plan with the AI, implement carefully, review critically, and commit with your name on it. This approach acknowledges AI’s genuine usefulness without surrendering agency.&lt;/p&gt;
&lt;p&gt;Then in July, I went deeper. “AI Agents, Me, and My Feelings” was me working through something real: the anxiety that comes with powerful tools. If I let AI write most of my code, will I remember it? Will my skills atrophy? The honest answer is: yes, if you’re not careful. But the solution isn’t to avoid AI. It’s to use it strategically.&lt;/p&gt;
&lt;p&gt;By August, I had redefined my entire workflow. Out with VSCode-based editors. In with a multi-pane command-line approach: Vim for coding, AI tools running in a dedicated pane, LazyGit for version control. This setup feels native to how my brain works. No distractions, full modularity, room to breathe.&lt;/p&gt;
&lt;p&gt;The throughline here is intentionality. AI isn’t a magic wand. It’s a tool that amplifies both your strengths and your weaknesses. Use it to automate the truly tedious work. Use it for research and exploration. Use it as a code reviewer. But the important decisions, the hard thinking, the architecture—that still needs to be you.&lt;/p&gt;
&lt;h2&gt;Go 1.25: A Runtime Revolution&lt;/h2&gt;
&lt;p&gt;In August, I dived deep into Go 1.25, and honestly, it energized me. This wasn’t a minor version bump. The container-aware GOMAXPROCS feature solves a problem that’s plagued Go users in Kubernetes environments for years. The experimental Green Tea GC offers 10-40% performance improvements. The trace flight recorder opens debugging possibilities that were previously impossible.&lt;/p&gt;
&lt;p&gt;What struck me was how the Go team continues to deliver practical improvements that solve real-world problems. Not for the sake of novelty, but because they understand their users’ pain points. That’s good stewardship of a language.&lt;/p&gt;
&lt;h2&gt;Books, Focus, and the Deeper Work&lt;/h2&gt;
&lt;p&gt;In June, I shared my entire reading stack. It wasn’t random—it was deliberate. Books on deep work, focus, systems thinking, distributed systems, Go, and self-mastery. The through-line is clear: I’m investing heavily in understanding how to think better, build better systems, and live more intentionally.&lt;/p&gt;
&lt;p&gt;Cal Newport’s “Deep Work” and “Digital Minimalism” kept coming up throughout the year in my writing. There’s something increasingly important about the ability to focus deeply in a world of endless distraction. And I’m not talking about ignoring the world. I’m talking about choosing what deserves your attention.&lt;/p&gt;
&lt;h2&gt;What I Learned&lt;/h2&gt;
&lt;p&gt;2024 ended with a commitment to enjoy life more and write more. 2025 delivered on both.&lt;/p&gt;
&lt;p&gt;The writing came easier. I published substantial posts on architecture, tooling, and philosophy. Not because I had answers, but because working through the questions publicly helped clarify my own thinking.&lt;/p&gt;
&lt;p&gt;The enjoyment part was harder. It’s easy to let work dictate your mood. It’s easy to obsess over optimization until you forget why you’re optimizing in the first place.&lt;/p&gt;
&lt;p&gt;But here’s what shifted: I got clearer about what actually matters. It’s not about having the perfect setup (though I do like good tooling). It’s about using the time you have—with your family, with your work, with your learning—to build something you’re proud of. And doing that consistently, without burning out.&lt;/p&gt;
&lt;p&gt;The daily short blog posts in February were an experiment in this. Just showing up every day, writing something, nothing fancy. Some worked, some didn’t. The point was the consistency and the honesty.&lt;/p&gt;
&lt;h2&gt;What’s Next&lt;/h2&gt;
&lt;p&gt;As I head into the last month of 2025, here’s what’s clear:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tooling is increasingly a choice, not destiny.&lt;/strong&gt; You can have a world-class development environment without subscribing to whatever’s hyped this quarter. Be intentional.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI is real, and the early adopters who figure out how to work alongside it (not let it work for them) will be far ahead.&lt;/strong&gt; This isn’t about replacing developers. It’s about augmenting human judgment with machine capability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deep work is rarer and more valuable than ever.&lt;/strong&gt; The ability to think through a complex problem, implement it well, and ship it—that skill doesn’t get cheaper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Books still matter.&lt;/strong&gt; In a world of tweets and hot takes, a well-written book that makes you think differently is increasingly precious.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Your biggest threat isn’t AI.&lt;/strong&gt; It’s good developers armed with the superpower of understanding how to use AI well.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;2025 was a year of refinement. Not revolutionary change, but steady, intentional improvement. Better tooling. Clearer thinking about AI. A deeper commitment to deep work. More writing. Better reading.&lt;/p&gt;
&lt;p&gt;If 2024 was about change and transition, 2025 was about integration—taking the new circumstances and building something stable, sustainable, and genuinely good.&lt;/p&gt;
&lt;p&gt;I’m heading into 2026 with more energy, more clarity, and fewer illusions. The tools are good. The challenges are real. The opportunities are enormous. And I’m ready.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;If you’re interested in any of the topics I’ve touched on here—from Neovim optimization to practical AI workflows to Go’s newest features—I’d recommend diving into those posts. They go much deeper than what fits in a year review.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What shaped your 2025? I’d love to hear what stuck with you.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Migrating from Packer to Lazy.nvim: A 15x Faster Startup and Why Packer is Dead]]></title><description><![CDATA[In the ever-evolving world of Neovim plugins, staying current isn’t just about features—it’s about performance. My recent migration from…]]></description><link>https://vinitkumar.me/2025-11-06-migrating-from-packer-to-lazy-nvim/</link><guid isPermaLink="false">https://vinitkumar.me/2025-11-06-migrating-from-packer-to-lazy-nvim/</guid><pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/cee5fff83d2bd042b91f436df5a715d9/29114/nvim-current.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaUlEQVR42pWT246CMBiEeRRX3WQVKCDQcijlDKvuxb7/y8xO0Zho3EQv5oKEfp3/n6lz/B1RDDXcWCIuzaIo1wiyEkIVTxWXNRLdQJoOeTsgrVqqQahKOJmpkJQFPsUBqa7RzjPMNCOtW4SFhVfwZXEnL80vSnK4SQb3+u3GCo40BlJrbP1oudlME3Q/IG/axa11+gj8Tx7hztYPsN4LbAi0DrOK4xQVQZo/5S/DbsCPvQ8r6zCho7zpkJia41ZvubsB166A1cYP6a7BeDqhP5/QfM9QFs5dJqaBeAF+B9wSqHhw/jmjPx65xx4xQwmZuGB64l2Hy8jcoRknmIFVGkdIBiOuqb498lZEUExZEmp7eHFWLHu8dPLFkVdfHlY7Dxsv4M5a9HRX02U1DCiHDnrsoVpWqGFxGVqoWSUG5tsLHmQncYKMhUwVdnwpWTciZw8zwmTHHTKQAx0HLLct+TNFVnw1B8pO9QdBVGdW1mhZKAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Neovim current setup&quot;
        title=&quot;&quot;
        src=&quot;/static/cee5fff83d2bd042b91f436df5a715d9/fcda8/nvim-current.png&quot;
        srcset=&quot;/static/cee5fff83d2bd042b91f436df5a715d9/12f09/nvim-current.png 148w,
/static/cee5fff83d2bd042b91f436df5a715d9/e4a3f/nvim-current.png 295w,
/static/cee5fff83d2bd042b91f436df5a715d9/fcda8/nvim-current.png 590w,
/static/cee5fff83d2bd042b91f436df5a715d9/efc66/nvim-current.png 885w,
/static/cee5fff83d2bd042b91f436df5a715d9/c83ae/nvim-current.png 1180w,
/static/cee5fff83d2bd042b91f436df5a715d9/29114/nvim-current.png 1920w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In the ever-evolving world of Neovim plugins, staying current isn’t just about features—it’s about performance. My recent migration from Packer to Lazy.nvim didn’t just modernize my setup; it transformed it, delivering a staggering 15x improvement in startup time. Let’s unpack this migration, explore the nitty-gritty changes, and discuss why Packer, once a favorite, has become a relic of the past.&lt;/p&gt;
&lt;h2&gt;The Packer Exodus: Why I Finally Made the Switch&lt;/h2&gt;
&lt;p&gt;For years, Packer served me well as my Neovim plugin manager. It was the go-to choice when I first embraced Lua-based configurations. But as the ecosystem matured, cracks began to appear:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stagnation&lt;/strong&gt;: The repository has seen minimal activity, with pull requests languishing unmerged for months.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance Burden&lt;/strong&gt;: The maintainer has shifted focus, leaving users to fend for themselves with bugs and compatibility issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance Bottlenecks&lt;/strong&gt;: While functional, Packer lacks the optimizations that modern managers like Lazy offer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lazy.nvim, created by the same team behind some of Neovim’s most popular plugins, emerged as the natural successor. It’s not just faster—it’s designed for the way we use Neovim today, with lazy-loading and performance-first architecture.&lt;/p&gt;
&lt;h2&gt;Diving into the Migration: PR #8 in Detail&lt;/h2&gt;
&lt;p&gt;This PR migrates the Neovim configuration from Packer to lazy.nvim, replacing the plugin manager while adding performance optimizations like lazy loading. The main file changed is &lt;code&gt;init.lua&lt;/code&gt; (+42 additions, -98 deletions). Other files include &lt;code&gt;init.lua.back&lt;/code&gt; (backup), &lt;code&gt;lazy-lock.json&lt;/code&gt; (new lockfile), and &lt;code&gt;nvim.png&lt;/code&gt; (likely an icon update).&lt;/p&gt;
&lt;h3&gt;Core Changes: From Packer to Lazy&lt;/h3&gt;
&lt;p&gt;The heart of the migration was replacing Packer’s &lt;code&gt;startup&lt;/code&gt; function with Lazy’s declarative &lt;code&gt;setup&lt;/code&gt;. Instead of:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;packer.startup(function(use)
  use &amp;#39;wbthomason/packer.nvim&amp;#39;
  use &amp;#39;junegunn/fzf&amp;#39;
  -- ... (all plugin &amp;#39;use&amp;#39; calls)
end)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Lazy uses a table-based approach with bootstrap code:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath(&amp;quot;data&amp;quot;) .. &amp;quot;/lazy/lazy.nvim&amp;quot;
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    &amp;quot;git&amp;quot;,
    &amp;quot;clone&amp;quot;,
    &amp;quot;--filter=blob:none&amp;quot;,
    &amp;quot;https://github.com/folke/lazy.nvim.git&amp;quot;,
    &amp;quot;--branch=stable&amp;quot;,
    lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

-- Setup lazy.nvim
require(&amp;quot;lazy&amp;quot;).setup({
  -- plugin specs here
})&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Lazy-Loading: The Performance Game-Changer&lt;/h3&gt;
&lt;p&gt;Migrated plugins with Lazy’s sophisticated lazy-loading system, adding &lt;code&gt;event&lt;/code&gt;, &lt;code&gt;cmd&lt;/code&gt;, &lt;code&gt;keys&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, and &lt;code&gt;dependencies&lt;/code&gt; for performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example before (Packer):&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;use {&amp;#39;neoclide/coc.nvim&amp;#39;, branch = &amp;#39;master&amp;#39;, run = &amp;#39;npm ci&amp;#39;}
use {&amp;#39;tpope/vim-commentary&amp;#39;}
use {&amp;#39;nvim-lualine/lualine.nvim&amp;#39;, requires = { &amp;#39;nvim-tree/nvim-web-devicons&amp;#39;, opt = true }}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;After (lazy):&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;{ &amp;#39;neoclide/coc.nvim&amp;#39;, branch = &amp;#39;master&amp;#39;, build = &amp;#39;npm ci&amp;#39;, event = &amp;#39;BufReadPre&amp;#39; },
{ &amp;#39;tpope/vim-commentary&amp;#39;, keys = { { &amp;#39;gc&amp;#39;, mode = { &amp;#39;n&amp;#39;, &amp;#39;v&amp;#39; } } } },
{
  &amp;#39;nvim-lualine/lualine.nvim&amp;#39;,
  dependencies = { &amp;#39;nvim-tree/nvim-web-devicons&amp;#39; },
  event = &amp;#39;VeryLazy&amp;#39;
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This implements multiple loading strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Event-based loading&lt;/strong&gt;: Plugins like &lt;code&gt;fzf.vim&lt;/code&gt; now load only when the &lt;code&gt;:Files&lt;/code&gt; command is invoked&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keymap triggers&lt;/strong&gt;: &lt;code&gt;nvim-tree&lt;/code&gt; loads when pressing &lt;code&gt;&amp;#x3C;C-n&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command loading&lt;/strong&gt;: Plugins like Copilot activate only when needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Lualine Optimization: Cutting the Fat&lt;/h3&gt;
&lt;p&gt;Updated lualine config to enable global statusline and remove expensive refresh events:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;require(&amp;#39;lualine&amp;#39;).setup {
  -- ...
  globalstatus = true,  -- Changed from false
  refresh = {
    -- Removed &amp;#39;CursorMoved&amp;#39; and &amp;#39;CursorMovedI&amp;#39; events
    statusline = 1000,
    tabline = 1000,
    winbar = 1000,
    refresh_time = 16, -- ~60fps
    events = {
      &amp;#39;WinEnter&amp;#39;,
      &amp;#39;BufEnter&amp;#39;,
      &amp;#39;BufWritePost&amp;#39;,
      &amp;#39;SessionLoadPost&amp;#39;,
      &amp;#39;FileChangedShellPost&amp;#39;,
      &amp;#39;VimResized&amp;#39;,
      &amp;#39;Filetype&amp;#39;,
      &amp;#39;ModeChanged&amp;#39;,
    },
  },
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Deferred Setup: Non-Critical Plugins on Ice&lt;/h3&gt;
&lt;p&gt;Moved non-critical setups into &lt;code&gt;vim.defer_fn()&lt;/code&gt; for startup performance:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;-- Defer non-critical setup
vim.defer_fn(function()
  require(&amp;quot;ibl&amp;quot;).setup()
  require(&amp;quot;nvim-tree&amp;quot;).setup()
end, 0)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This prevents plugins like indent-blankline (&lt;code&gt;ibl&lt;/code&gt;) and &lt;code&gt;nvim-tree&lt;/code&gt; from blocking the main UI thread during startup.&lt;/p&gt;
&lt;h3&gt;Code Cleanup: Removing Duplicates&lt;/h3&gt;
&lt;p&gt;Eliminated duplicate autocmd definitions and redundant code, such as multiple yaml filetype sets and a typescript callback that auto-saved files. Removed about 60 lines without losing functionality.&lt;/p&gt;
&lt;h2&gt;The Numbers Don’t Lie: Performance Gains&lt;/h2&gt;
&lt;p&gt;The results speak for themselves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Before&lt;/strong&gt;: 1797ms startup time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;After&lt;/strong&gt;: 115ms startup time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt;: ~15x faster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s the difference between waiting almost 2 seconds and having Neovim ready in under a tenth of a second. In practical terms, this means instant responsiveness when opening files, switching projects, or just launching the editor.&lt;/p&gt;
&lt;h2&gt;Why Packer is Dead&lt;/h2&gt;
&lt;p&gt;Packer is showing its age and is barely maintained, with stagnant development and unresolved issues. For peace of mind, moving to lazy.nvim is the best option.&lt;/p&gt;
&lt;h2&gt;Migration Tips for Fellow Neovim Users&lt;/h2&gt;
&lt;p&gt;If you’re considering this migration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start small&lt;/strong&gt;: Migrate one plugin at a time to understand Lazy’s syntax&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage lazy-loading&lt;/strong&gt;: Not just for performance, but for cleaner keymap management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile first&lt;/strong&gt;: Use &lt;code&gt;:Lazy profile&lt;/code&gt; to identify your biggest performance bottlenecks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preserve your workflow&lt;/strong&gt;: Lazy can replicate any Packer functionality with better performance&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion: The Future is Lazy&lt;/h2&gt;
&lt;p&gt;This migration wasn’t just about faster startups—it was about embracing the future of Neovim plugin management. Lazy.nvim represents the next evolution, combining performance, maintainability, and modern features in a package that’s actively developed and community-supported.&lt;/p&gt;
&lt;p&gt;If your Neovim feels sluggish, it’s worth the switch. The 15x improvement in my case might be the extreme end, but even conservative estimates show 3-5x improvements for most users. In the world of text editors, every millisecond counts, and Lazy delivers them in spades.&lt;/p&gt;
&lt;p&gt;The code for this migration lives in my &lt;a href=&quot;https://github.com/vinitkumar/nvim&quot;&gt;nvim config repo&lt;/a&gt;, and I’m happy to help if you’re undertaking a similar journey. What’s holding you back from making the switch?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Vibe Engineering with Django: Working with AI Coding Agents]]></title><description><![CDATA[This post builds on the excellent work by Simon Willison and his original concept of “Vibe Engineering.” You can read his original piece…]]></description><link>https://vinitkumar.me/vibe-engineering/</link><guid isPermaLink="false">https://vinitkumar.me/vibe-engineering/</guid><pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;This post builds on the excellent work by &lt;a href=&quot;https://simonwillison.net/&quot;&gt;Simon Willison&lt;/a&gt; and his original concept of “Vibe Engineering.” You can read his original piece &lt;a href=&quot;https://simonwillison.net/2024/Oct/7/vibe-engineering/&quot; class=&quot;inline-link&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’ve been using AI coding assistants for over two years now—from GitHub Copilot to Cursor—and I’ve seen the landscape evolve rapidly. What started as simple autocomplete has transformed into sophisticated coding agents that can iterate, test, and modify code until they achieve specified goals.&lt;/p&gt;
&lt;p&gt;But here’s the thing: there’s a massive difference between letting AI write your code and using AI to amplify your engineering capabilities. That difference is what Simon Willison calls &lt;strong&gt;“Vibe Engineering.”&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What is Vibe Engineering?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Vibe engineering&lt;/strong&gt; represents the professional end of the AI-assisted development spectrum—where seasoned engineers accelerate their work with LLMs while staying proudly accountable for the software they produce.&lt;/p&gt;
&lt;p&gt;This contrasts with &lt;strong&gt;vibe coding&lt;/strong&gt;: the fast, loose, and entirely prompt-driven approach with no attention to how code actually works.&lt;/p&gt;
&lt;p&gt;The term itself is intentionally mischievous. The mismatch between “vibes” and “engineering” captures the absurdity of our current AI moment while establishing a clear distinction from the dismissive “vibe coding” label.&lt;/p&gt;
&lt;h2&gt;The Rise of Coding Agents&lt;/h2&gt;
&lt;p&gt;Modern coding agents (Claude Code, OpenAI’s Codex CLI, Gemini CLI) can iterate on code, actively testing and modifying it until achieving specified goals. Experienced engineers are now running multiple agents in parallel, tackling several problems simultaneously.&lt;/p&gt;
&lt;p&gt;But here’s the key insight: &lt;strong&gt;AI tools amplify existing expertise.&lt;/strong&gt; The more skills and experience you have as a software engineer, the faster and better your results with LLMs and coding agents.&lt;/p&gt;
&lt;h2&gt;Best Practices for Agent-Assisted Development&lt;/h2&gt;
&lt;p&gt;Let me walk you through the essential practices, using a Django application as our practical example throughout.&lt;/p&gt;
&lt;h3&gt;1. &lt;strong&gt;Automated Testing&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Robust test suites let agents fly. Without tests, agents may claim success without verification. Test-first development is particularly effective with iterative agents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# tests/test_models.py
from django.test import TestCase
from django.contrib.auth.models import User
from .models import BlogPost

class BlogPostModelTest(TestCase):
    def test_blog_post_creation(self):
        user = User.objects.create_user(&amp;#39;testuser&amp;#39;)
        post = BlogPost.objects.create(
            title=&amp;#39;Test Post&amp;#39;,
            content=&amp;#39;Test content&amp;#39;,
            author=user
        )
        self.assertEqual(str(post), &amp;#39;Test Post&amp;#39;)
        self.assertTrue(post.created_at)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;When working with agents, I start with comprehensive test cases. The agent can then implement features knowing exactly what success looks like.&lt;/p&gt;
&lt;h3&gt;2. &lt;strong&gt;Planning in Advance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Start with high-level plans. Iterate on the plan first, then hand off to the agent. Clear specifications lead to better results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;markdown&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;## Feature: User Profile Management

### Requirements:
- Users can view their profile
- Users can edit basic info (name, bio, avatar)
- Profile updates require authentication
- Avatar uploads should be validated and resized

### API Endpoints:
- GET /api/profile/ - View current user profile
- PUT /api/profile/ - Update profile
- POST /api/profile/avatar/ - Upload avatar

### Database Changes:
- Add bio field to User model
- Add avatar field to User model
- Create migration for new fields&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;I write detailed specifications like this before unleashing any agent. The clearer the requirements, the better the implementation.&lt;/p&gt;
&lt;h3&gt;3. &lt;strong&gt;Comprehensive Documentation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Agents can only keep a subset of the codebase in context. Good docs enable API usage without reading implementation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# api/views.py
class ProfileViewSet(viewsets.ModelViewSet):
    &amp;quot;&amp;quot;&amp;quot;
    ViewSet for managing user profiles.
    
    Provides:
    - list: Get current user&amp;#39;s profile
    - update: Update profile information
    - partial_update: Partially update profile
    
    Authentication required for all operations.
    &amp;quot;&amp;quot;&amp;quot;
    serializer_class = ProfileSerializer
    permission_classes = [IsAuthenticated]
    
    def get_queryset(self):
        return User.objects.filter(id=self.request.user.id)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Write documentation first; let agents implement from it. This approach ensures the agent understands the intended behavior before writing code.&lt;/p&gt;
&lt;h3&gt;4. &lt;strong&gt;Good Version Control Habits&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Essential for understanding and undoing agent changes. LLMs excel at Git navigation and tools like &lt;code&gt;git bisect&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Before starting agent work
git checkout -b feature/user-profiles
git add tests/test_models.py
git commit -m &amp;quot;Add tests for user profile functionality&amp;quot;

# After agent completes work
git add .
git commit -m &amp;quot;Implement user profile API endpoints&amp;quot;
git push origin feature/user-profiles&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;I always create feature branches and commit frequently. This makes it easy to review agent changes and rollback if needed.&lt;/p&gt;
&lt;h3&gt;5. &lt;strong&gt;Effective Automation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;CI/CD, automated formatting, linting, preview environments. LLMs make writing automation scripts easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;yaml&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# .github/workflows/django.yml
name: Django CI
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.11
    - name: Install dependencies
      run: |
        pip install -r requirements.txt
    - name: Run tests
      run: |
        python manage.py test
    - name: Run linting
      run: |
        flake8 .
        black --check .&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Automation helps agents repeat tasks consistently and catch issues early.&lt;/p&gt;
&lt;h3&gt;6. &lt;strong&gt;Code Review Culture&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Fast, productive code review is critical. Treat agent output like any other code submission.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Before agent work - I write this
def get_user_profile(user):
    &amp;quot;&amp;quot;&amp;quot;Get user profile with related data.&amp;quot;&amp;quot;&amp;quot;
    return User.objects.select_related(&amp;#39;profile&amp;#39;).get(id=user.id)

# After agent work - I review this
def get_user_profile(user):
    &amp;quot;&amp;quot;&amp;quot;Get user profile with related data.&amp;quot;&amp;quot;&amp;quot;
    try:
        return User.objects.select_related(&amp;#39;profile&amp;#39;).get(id=user.id)
    except User.DoesNotExist:
        return None&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;I always review agent code critically. In this case, the agent added error handling, which is good, but I need to verify it’s the right approach for our use case.&lt;/p&gt;
&lt;h3&gt;7. &lt;strong&gt;Management-Like Skills&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Provide clear instructions and necessary context. Give actionable feedback.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;Agent, please implement the user profile API with these specific requirements:

1. Use Django REST Framework ViewSets
2. Include proper serialization for all user fields
3. Add validation for avatar uploads (max 5MB, image files only)
4. Include proper error handling and status codes
5. Write comprehensive tests for all endpoints
6. Follow our existing code style (PEP 8, type hints)

Context: This is part of a social media application where users need to manage their public profiles.&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Clear, specific instructions lead to better results than vague prompts.&lt;/p&gt;
&lt;h3&gt;8. &lt;strong&gt;Manual QA Excellence&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Beyond automated tests, strong manual testing skills are essential. Preview environments are crucial for safe review.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# settings.py
if DEBUG:
    # Use local file storage for development
    DEFAULT_FILE_STORAGE = &amp;#39;django.core.files.storage.FileSystemStorage&amp;#39;
    MEDIA_URL = &amp;#39;/media/&amp;#39;
    MEDIA_ROOT = os.path.join(BASE_DIR, &amp;#39;media&amp;#39;)
else:
    # Use S3 for production
    DEFAULT_FILE_STORAGE = &amp;#39;storages.backends.s3boto3.S3Boto3Storage&amp;#39;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;I always test agent implementations in preview environments before merging. This catches integration issues that automated tests might miss.&lt;/p&gt;
&lt;h3&gt;9. &lt;strong&gt;Research Skills&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Identify the best approaches before implementation. Prove concepts before unleashing agents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;
Before implementing user authentication, I research:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django’s built-in authentication system&lt;/li&gt;
&lt;li&gt;JWT vs session-based authentication&lt;/li&gt;
&lt;li&gt;Third-party packages like django-allauth&lt;/li&gt;
&lt;li&gt;Security best practices for user management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only after understanding the landscape do I write specifications for the agent.&lt;/p&gt;
&lt;h3&gt;10. &lt;strong&gt;Knowing When to Use AI&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Maintain intuition for when LLMs can be applied. This constantly evolves as tools improve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Good for AI&lt;/strong&gt;: Boilerplate CRUD operations, API serializers, basic tests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not good for AI&lt;/strong&gt;: Complex business logic, security-critical code, performance optimizations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Depends&lt;/strong&gt;: Database migrations, configuration management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I use AI for the 80% of code that’s straightforward, but I write the critical 20% myself.&lt;/p&gt;
&lt;h3&gt;11. &lt;strong&gt;Updated Estimation Skills&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;AI changes project timelines unpredictably. Estimations now depend on new, evolving factors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django Example:&lt;/strong&gt;
A feature that used to take 2 days might now take 4 hours with AI assistance, but only if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I have clear requirements&lt;/li&gt;
&lt;li&gt;Tests are already written&lt;/li&gt;
&lt;li&gt;The agent doesn’t get stuck on edge cases&lt;/li&gt;
&lt;li&gt;I can review and integrate quickly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ve learned to factor in AI’s unpredictability when estimating projects.&lt;/p&gt;
&lt;h2&gt;The Vibe Engineering Mindset&lt;/h2&gt;
&lt;p&gt;Vibe engineering requires operating at the top of your game: researching approaches, deciding architecture, writing specs, defining success criteria, designing agentic loops, planning QA, and managing your “digital interns.”&lt;/p&gt;
&lt;p&gt;It’s not about letting AI do the work—it’s about using AI to amplify your existing expertise while maintaining full accountability for the software you produce.&lt;/p&gt;
&lt;h2&gt;Why This Matters Now&lt;/h2&gt;
&lt;p&gt;The next 12-24 months will be critical as many companies integrate AI agents into their main workflows. The engineers who master vibe engineering will have a significant advantage over those who either avoid AI entirely or rely on it blindly.&lt;/p&gt;
&lt;p&gt;Remember: These tools are powerful, but you remain accountable for the software produced. The goal isn’t to replace your engineering skills—it’s to amplify them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What’s your experience with AI coding agents? Are you practicing vibe engineering or falling into vibe coding? I’d love to hear your thoughts.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Monokai Pro for Vim: Bringing Modern Aesthetics to Terminal Editing]]></title><description><![CDATA[I’ve always believed that the right colorscheme makes a profound difference in how we write code. After years of switching between various…]]></description><link>https://vinitkumar.me/monokai-pro-vim-colorscheme/</link><guid isPermaLink="false">https://vinitkumar.me/monokai-pro-vim-colorscheme/</guid><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve always believed that the right colorscheme makes a profound difference in how we write code. After years of switching between various themes, I found myself constantly drawn back to Monokai Pro in VSCode. Its carefully crafted color palette strikes the perfect balance between vibrant syntax highlighting and comfortable readability.&lt;/p&gt;
&lt;p&gt;I wrote this theme in vim colorscheme based on the work from &lt;a href=&quot;https://github.com/vinitkumar/monokai-pro-vim?tab=readme-ov-file&quot;&gt;gthelding&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But here’s the thing - I spend most of my coding time in Vim. The existing Monokai ports never quite captured what made the Pro version special. So I decided to create a faithful port that brings all six Monokai Pro filters to Vim and Neovim.&lt;/p&gt;
&lt;h2&gt;Why Another Monokai Theme?&lt;/h2&gt;
&lt;p&gt;Monokai Pro isn’t just another colorscheme. It represents years of refinement by its original creator, with each color carefully chosen to reduce eye strain while maintaining excellent contrast. The Pro version introduced “filters” - subtle variations that cater to different preferences and lighting conditions.&lt;/p&gt;
&lt;p&gt;My port maintains these design principles while ensuring compatibility with both Vim 8+ and Neovim. Every highlight group has been meticulously mapped to preserve the original’s aesthetic integrity.&lt;/p&gt;
&lt;h2&gt;Six Filters, Six Moods&lt;/h2&gt;
&lt;p&gt;The beauty of Monokai Pro lies in its versatility. Each filter offers a distinct personality while maintaining the core Monokai DNA:&lt;/p&gt;
&lt;h3&gt;Classic&lt;/h3&gt;
&lt;p&gt;The original that started it all. Rich, vibrant colors with that signature Monokai warmth.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/936d9d05f00b5b8f04717c7fcca30a7a/0e322/monokai-pro-classic.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.37837837837837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAABnUlEQVR42u2TSU/DMBCFc+mlvSNBSZvFcWJnoU0qQBQh4FKJJQ2UsoXlj1CQaMRPZqulwZOwCAJC9Mzh6UXj0ac3Y0dZjWi3FfKs1+tdJcPkur+3O4qTnQ/vb4+SNL0eDAejON4qn0tP9uOruL9zt76+2lUCj2QbK4twfNgX6fkRnJzsw2k6+KyzofSDUj09e69NLi6PYHNzbayYpjp2GAGLqk8mqQuTzAtNr4umNvdF9ZJ0Q8290Zx7lN9QV2dvFUIametRWGi5Ioy4dBu4awHWXM8CjnIpME5Kwh50h5kTz7dBN5tjxXgFRp1ARB0P2iEDaptgO8avQhg6tfUJhtB1tQD6vgPBAhNLy21Y6YbQavM8JXdlEjdPUBLCsKcExJGZT8FiRHieDWHAZFpfJnUl2JErYMXoCPeKVeB4KD9wvk/IcV/MEvkIdt7wSd+Ni3VMWgYaWva6C/HW8Ff9CJwG9g/EW9Yynr+14lKmkYRO8DlpRiOTQOOm+LWsB2obzyZp/lkW1e+RIae9UWq12ky1Wo2kwkqlMrWQgawXYMuvQNPINpEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Monokai Pro Classic&quot;
        title=&quot;&quot;
        src=&quot;/static/936d9d05f00b5b8f04717c7fcca30a7a/fcda8/monokai-pro-classic.png&quot;
        srcset=&quot;/static/936d9d05f00b5b8f04717c7fcca30a7a/12f09/monokai-pro-classic.png 148w,
/static/936d9d05f00b5b8f04717c7fcca30a7a/e4a3f/monokai-pro-classic.png 295w,
/static/936d9d05f00b5b8f04717c7fcca30a7a/fcda8/monokai-pro-classic.png 590w,
/static/936d9d05f00b5b8f04717c7fcca30a7a/efc66/monokai-pro-classic.png 885w,
/static/936d9d05f00b5b8f04717c7fcca30a7a/c83ae/monokai-pro-classic.png 1180w,
/static/936d9d05f00b5b8f04717c7fcca30a7a/0e322/monokai-pro-classic.png 2916w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Machine&lt;/h3&gt;
&lt;p&gt;Cool, muted tones perfect for late-night coding sessions. This filter reduces blue light while maintaining excellent readability.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ec3f5eb4a5b7f70467804870668bc138/0e322/monokai-pro-machine.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.37837837837837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAABxklEQVR42u2TWWvbQBSF9eIX6T1vpfEma8toNKPFWtzYJaZNceQ44DQQWkp28hviBBLRn9wm9cDtHdltY1Qo8XMfPg5zuTo6dxYl43bKfFIM3324yacHt3uTyWy0n6OOFzrem+XHn24n0+lslI/+1J9pfrB/MxrnX7N+P1WI7xeD4S4cfj4RR2dXcPjlDD6enK9yeol6Uakfnf6uzY8vr6H/fvdBaRrOg8ET0D321CauaBEq6rYrNq1nmGR1vaTheKW+ttzHxhaDV83OvdKySGEHGbjxG8HSHtA4AcuPwQ7iUhckYPJuBTtY1A0WzZ0whTqGUxoOLWxcsOyt4L1tYGkKOo2g44X/RJpJ1Wkwlz+u6xYaWrTYijIg3Z4IB0NId3bAS3rLZJjELxMg4VIXmDwqeyqGLUxoYsI2i4QTpMDjDNMOwEu30VhuRVaOb/toIBXHlOM5YQIySDWhQwoLjWzeFeUItGxYYWXU5VrWZdK/jmzyMrr41fBSqoZyL2gg1jH7bygNGZ5yIk9MGPLWr0EHX4p8HJuGU6AhubPwkppe8F13/R9Nh76YNmHfpEfDsO4UTVM2VLXGVVVltVptbfB7rmnaxk9NWM2emw3/0QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Monokai Pro Machine&quot;
        title=&quot;&quot;
        src=&quot;/static/ec3f5eb4a5b7f70467804870668bc138/fcda8/monokai-pro-machine.png&quot;
        srcset=&quot;/static/ec3f5eb4a5b7f70467804870668bc138/12f09/monokai-pro-machine.png 148w,
/static/ec3f5eb4a5b7f70467804870668bc138/e4a3f/monokai-pro-machine.png 295w,
/static/ec3f5eb4a5b7f70467804870668bc138/fcda8/monokai-pro-machine.png 590w,
/static/ec3f5eb4a5b7f70467804870668bc138/efc66/monokai-pro-machine.png 885w,
/static/ec3f5eb4a5b7f70467804870668bc138/c83ae/monokai-pro-machine.png 1180w,
/static/ec3f5eb4a5b7f70467804870668bc138/0e322/monokai-pro-machine.png 2916w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Octagon&lt;/h3&gt;
&lt;p&gt;A warmer take with enhanced contrast. Ideal for bright environments or when you need that extra bit of visual clarity.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/901c3c3d33f9ea0a30636ecdc904837e/0e322/monokai-pro-octagon.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.37837837837837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAABxklEQVR42u2TTW/TQBCGfcnFvveGoPayib3rrT82KYkX2w1UhcRNQaiNaCsOCGjFb2hSiVj8ZL6y0rC7TWmjBqH0zOHR2KPZd9/xjC2RkizirH62u3dRvRpNhwf7k0FVTYf7izgcTkbjk+nB6zeTwWBwk78Vq9HoQj1/FUJkFmNP6p28gsOj93J8eg6Hbz/A0fHHJcYnZyp+WpH/k5sfv/sMef/lzPJQNPNpDs1W5yfGXGLcli7ictO7hZsuvy/wHndMfOTyHwhvw4OH/hcLoaSmrIQo2ZEpLyGOcyD0KRCmCG8IaHYHyq7yPunNw60cPMRmFsJasIC0vSt5uw9atOln0Ap6/ySgwsSm353rSzc9OrNc5ZBFJbC4lJ3uC8jEHsRpqVwJgz7kE+NiEa/QzrTIHUGEeR1sFYBJT4YshzTWbp9DwvuQJIX6FIVqTQANM3MBVTWhqtcthlGxSjCpiWqZUiFNC74pWGK51e61iHG6suWAGuvyumBd/iLYlfcR+y+opox4TcJCT0wNRe/c+rSCbK5/DhexWjmMLkmol3b7e9Pv/FJ7uTa41f6mNVxELy3HsTZsu5Hatp00Go17o86njuNs/AZduco9qWxzXAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Monokai Pro Octagon&quot;
        title=&quot;&quot;
        src=&quot;/static/901c3c3d33f9ea0a30636ecdc904837e/fcda8/monokai-pro-octagon.png&quot;
        srcset=&quot;/static/901c3c3d33f9ea0a30636ecdc904837e/12f09/monokai-pro-octagon.png 148w,
/static/901c3c3d33f9ea0a30636ecdc904837e/e4a3f/monokai-pro-octagon.png 295w,
/static/901c3c3d33f9ea0a30636ecdc904837e/fcda8/monokai-pro-octagon.png 590w,
/static/901c3c3d33f9ea0a30636ecdc904837e/efc66/monokai-pro-octagon.png 885w,
/static/901c3c3d33f9ea0a30636ecdc904837e/c83ae/monokai-pro-octagon.png 1180w,
/static/901c3c3d33f9ea0a30636ecdc904837e/0e322/monokai-pro-octagon.png 2916w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Ristretto&lt;/h3&gt;
&lt;p&gt;Deep, coffee-inspired browns and creams. This filter feels like coding in your favorite café.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b8f6efef7593a5fbc203934557de6a08/0e322/monokai-pro-ristretto.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.37837837837837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAABk0lEQVR42u2TXU/CMBSGd8MN3HtDcGOWteu2bg5hiS4GY/xCFJ0S0cR/IpAI8Sf7RZPj6YaKjkTl2os3pz3tnrxvc6a16tZWEPDJ7s7uXafdHh4fHQ3ah4ef9eBg0Emuht2T7qC9v58/x4rf3eH6IY7jLS3k1mQviqDfOZU3ySX0z87g+vz8q5ILrEmuf5N89Ka3vR604nisWXp1LCgDb814sU1dctOQlr4qa6vzqnzbZ6KGka0rlWdmGKCXy/caLibrNocNz5WRcKHhcvAZy8mzrJze+26tNg1sG0i1Ok6BAQKbfiAjX0BTOOCQ9NKPEpSm1SFkquBruo6RERhyB0LXlZthCNuNEBqem172GU3rInfZOcsDlUOfc+CWJdfRduQ66NaHhvAQ7MAG7gObQcDoLL4N6olURGUkDzTNNHJAqZyL8EWL4qq+UG7zkc3JDCRnD/xnLQQ6CFwG9g/MgOk84dgsmrff6ONPwRFEIBmJDPjECXmlpvln2YQ8CqaA5kgrlUorxWKxjgoLhcLSUgzFegMs2rH2QUzTIwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Monokai Pro Ristretto&quot;
        title=&quot;&quot;
        src=&quot;/static/b8f6efef7593a5fbc203934557de6a08/fcda8/monokai-pro-ristretto.png&quot;
        srcset=&quot;/static/b8f6efef7593a5fbc203934557de6a08/12f09/monokai-pro-ristretto.png 148w,
/static/b8f6efef7593a5fbc203934557de6a08/e4a3f/monokai-pro-ristretto.png 295w,
/static/b8f6efef7593a5fbc203934557de6a08/fcda8/monokai-pro-ristretto.png 590w,
/static/b8f6efef7593a5fbc203934557de6a08/efc66/monokai-pro-ristretto.png 885w,
/static/b8f6efef7593a5fbc203934557de6a08/c83ae/monokai-pro-ristretto.png 1180w,
/static/b8f6efef7593a5fbc203934557de6a08/0e322/monokai-pro-ristretto.png 2916w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Spectrum&lt;/h3&gt;
&lt;p&gt;Bold and vibrant, pushing saturation to create a more energetic coding environment.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c60ab4a48c0c395ddc2f98fd7752e22e/0e322/monokai-pro-spectrum.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.37837837837837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAABn0lEQVR42u2TS0/CQBSFu2FD9yQthb5mpmVaq6lRFxDDhg2W8hREF/4R0ESIP9kXk1zvFHwgGANrF1/OzJ3pybnTGaV2zKrREZ83Gs1JJ+3dtVrdaZJ0vvSiPe2Mbu+63dE0aaab66hp2pskSfuxVqtXFe6zefXkFHppXwwvr2HQG8Jlf7TOYIx6tVEfDj5ri/HoBs7P6zPFLJVmrkvAto1X09SFaRZF0dCFXvyGrq3PVxglI1NN115wDJqmPShWuTxnzAPOA3EQcgi4B5RSYIwBowzHSwghG8g9Ul3XXXieB6ZpzpQyGlJciKJDEUUhHIQ+pnXAcf5Gmkm1bXtBMEQJu80Mfc+HSoWLOI7h7CSGMODLlJSgZgkQZ6USmdDNkm81JJjQcl3hYesRr2DaCMIwQGMfeFDB1mhmTNjyKGR7Et/3txtSNPIIFVkLdrZhjazFH8cg6zLtFkNrvjoL8bFhV3413Mfs33Dzp+wDfruQ18nAG6NYlnMvJ3iRn3HhDZ/PzmDCJ/l8y5Z1r6iqUsjn88dInMvl9kZ6qKpaeAejPqOeKY3trgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Monokai Pro Spectrum&quot;
        title=&quot;&quot;
        src=&quot;/static/c60ab4a48c0c395ddc2f98fd7752e22e/fcda8/monokai-pro-spectrum.png&quot;
        srcset=&quot;/static/c60ab4a48c0c395ddc2f98fd7752e22e/12f09/monokai-pro-spectrum.png 148w,
/static/c60ab4a48c0c395ddc2f98fd7752e22e/e4a3f/monokai-pro-spectrum.png 295w,
/static/c60ab4a48c0c395ddc2f98fd7752e22e/fcda8/monokai-pro-spectrum.png 590w,
/static/c60ab4a48c0c395ddc2f98fd7752e22e/efc66/monokai-pro-spectrum.png 885w,
/static/c60ab4a48c0c395ddc2f98fd7752e22e/c83ae/monokai-pro-spectrum.png 1180w,
/static/c60ab4a48c0c395ddc2f98fd7752e22e/0e322/monokai-pro-spectrum.png 2916w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Light&lt;/h3&gt;
&lt;p&gt;Yes, a light theme! For those sunny days or well-lit offices where dark themes just don’t work.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/73ef42126187d1bffc43ae7155aa5f23/0e322/monokai-pro-light.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.37837837837837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB10lEQVR42tWTTU8aQRjH91MYuyGEePDQY3v07KnpxWM/i6CRTWP6LYypNcQvgLBUJVgagcam5140CCz7vsuyzMz++wwvURGSkp46yS/P7LMzv31mZkf5sLO99e79tpbJbOyur6s5VU1l1VQqR0yiqmbTm69z6cxGlvqP+edxl/j4Kp3eUmpfS1rQeUBNr/BK8RxXehmX5Tl0naL+Il8pFnFRKuGqXGb1ahUH+/t5pXV9nYdsPIqRDDlEzAFBJE8QC3IJ52w2FkOpODsrHCj1WlUDF3B6Xe4ZbYRmFwPHJqwn2Bh6zgt800Dk2oh9l4HF+Hx0lJ8IhUD/oc2dbhtBv4048DEKvEd87/nzlNA2pQws9BkEw5fj46mQMbj9Hjfu79C/+w3f6Iy/PHQtwhlPiv1JnFUn+4G1TCgSRJ7HB7aFkGQ2HZJLMTQ7CMweyUnsWTTGHlc1wzV6y4QCkW1xWY1cCg0ggmn0Fy5X5uX+LhDWNDoxxJ7L5ctFk5cx2YplQt/lq8jmqv3/hEL+Cny2J6tCUgY+IiH92K1GQ5PXJhGMz92sv0eWR61QONWUwsnJ3q9WE836t+jH9/roZ7OxMrfNm8Ft4wafDg/3FGprxFvizT8iHWt/AMaKGyVbgHBPAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Monokai Pro Light&quot;
        title=&quot;&quot;
        src=&quot;/static/73ef42126187d1bffc43ae7155aa5f23/fcda8/monokai-pro-light.png&quot;
        srcset=&quot;/static/73ef42126187d1bffc43ae7155aa5f23/12f09/monokai-pro-light.png 148w,
/static/73ef42126187d1bffc43ae7155aa5f23/e4a3f/monokai-pro-light.png 295w,
/static/73ef42126187d1bffc43ae7155aa5f23/fcda8/monokai-pro-light.png 590w,
/static/73ef42126187d1bffc43ae7155aa5f23/efc66/monokai-pro-light.png 885w,
/static/73ef42126187d1bffc43ae7155aa5f23/c83ae/monokai-pro-light.png 1180w,
/static/73ef42126187d1bffc43ae7155aa5f23/0e322/monokai-pro-light.png 2916w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Installation and Usage&lt;/h2&gt;
&lt;p&gt;Getting started is straightforward. If you’re using vim-plug:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;Plug &amp;#39;vinitkumar/monokai-pro-vim&amp;#39;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;For Packer.nvim users:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;use &amp;#39;vinitkumar/monokai-pro-vim&amp;#39;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Once installed, switching between filters is simple:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;&amp;quot; Set your preferred filter
colorscheme monokai-pro-classic
&amp;quot; or
colorscheme monokai-pro-machine
&amp;quot; or any other filter&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Technical Implementation&lt;/h2&gt;
&lt;p&gt;Creating a faithful port required careful attention to detail. Each highlight group maps to its VSCode equivalent, ensuring consistency across editors. The theme supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full TreeSitter integration for Neovim&lt;/li&gt;
&lt;li&gt;Language-specific optimizations for Python, JavaScript, Go, and more&lt;/li&gt;
&lt;li&gt;Plugin support for popular tools like NERDTree, fzf, and telescope.nvim&lt;/li&gt;
&lt;li&gt;Terminal color integration for a cohesive experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The implementation uses Vim’s native colorscheme architecture, avoiding external dependencies. This ensures fast loading times and broad compatibility.&lt;/p&gt;
&lt;h2&gt;Design Philosophy&lt;/h2&gt;
&lt;p&gt;A good colorscheme does more than just look pretty. It should:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reduce cognitive load by using color consistently&lt;/li&gt;
&lt;li&gt;Highlight important syntax elements without overwhelming&lt;/li&gt;
&lt;li&gt;Maintain readability across different file types&lt;/li&gt;
&lt;li&gt;Work well in various lighting conditions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Monokai Pro achieves all of these goals through its thoughtful color choices and semantic highlighting approach.&lt;/p&gt;
&lt;h2&gt;Future Development&lt;/h2&gt;
&lt;p&gt;This initial release focuses on core functionality and accuracy. Future updates will include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Additional plugin integrations&lt;/li&gt;
&lt;li&gt;Performance optimizations for large files&lt;/li&gt;
&lt;li&gt;Custom filter creation tools&lt;/li&gt;
&lt;li&gt;Better documentation for theme customization&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Try It Today&lt;/h2&gt;
&lt;p&gt;The theme is available on &lt;a href=&quot;https://github.com/vinitkumar/monokai-pro-vim&quot;&gt;GitHub&lt;/a&gt;. I’ve love it, and it’s transformed my Vim experience.&lt;/p&gt;
&lt;p&gt;Whether you’re a long-time Monokai fan or just exploring colorscheme options, give it a try. Your eyes will thank you.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Found this useful? Star the &lt;a href=&quot;https://github.com/vinitkumar/monokai-pro-vim&quot;&gt;repository&lt;/a&gt; or report issues to help improve it.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My New AI Workflow: Embracing Command-Line AI Tools]]></title><description><![CDATA[I’m changing how I work with AI, and it’s about time. The shift involves working with three or more panes depending on screen resolution…]]></description><link>https://vinitkumar.me/new-ai-workflow/</link><guid isPermaLink="false">https://vinitkumar.me/new-ai-workflow/</guid><pubDate>Sun, 31 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’m changing how I work with AI, and it’s about time.&lt;/p&gt;
&lt;p&gt;The shift involves working with three or more panes depending on screen resolution, but more importantly, it’s about returning to the command line where I feel most comfortable.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f0cce266b1f64887bb8fb072b195dbfc/29114/ai-workflow.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.83783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACkElEQVR42k1T2XLaQBAU2CDQfa5OdIIQN9iJk4c4Tqjy/39Sp3epVPLQJcFqe7p7ZrRivCDu97DyFrMgw9SJ8OQnWAYpgnQFT5QI0xpeXMDnu8On6AbE7RZRs0VYDwp23sBKK2j5eEbIQ7daw12tYWQNFiSYuQJulMMJUxhuDN0KoJs+liyW7a7I9i9ItjcIItqciDO8ZoRWH19QH18RdSOV7pTasB2pMEOUrRClJUwnhEEsbILki6TEMimgs+AszPBMNzMW1uMc2vr6hmJ3gVjvkWwOSDdHhCQ3whyiaGH5Ah1jSVY9ZksXBhXG3QZBTdCyT7s+3yU8utREf4BT9pgzmyeqkngm2ZyWayp2qOL9/ReG7RET3YZFRdLR5uU7su1JuYm7HclJTGjd5StKmclwQjoclUqr6KB7CQlH2LTz8+OO7f6Mqe4owvbyivXtDfF6VPYldFHALltozemLIstZTTZFj0tmkkGntXazR8qPvt0/0R8umBsuCVM6qmDmD5KHo3/OtNePT6VKdltmKbPQxQpzT6Bilp6o8Pv+jmG3x2Ruqwz9plGkM8bxNyYJ+Vu7/bij2t+UymQ4qKDtoleWo6yGz2yr8QpRbdTYGGySVzccr1JhkRT/ERbQgmpQAyobI4d7TsszQjYl5GAXdQ83EOx2goX1GJuoa2CSzG9q3imhsfjUTx+WNV6cKCSYeCm35FFNEvqiULC8GCYjkLMomxL3UkDHzBu64SIwFoPLsEy4KUHNDWHwTvE4NGlT58GC3Y34lIPtykawiMm1tPh/NpzV3MoZVLPIcTG5YSbXT7M5vMtkxSqlClXKnvLykkrCjIRFjZDfRESQcBVFDpeNc5mpzZikKptjZvFbSfoHxrJPuSIvHwoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ai-workflow&quot;
        title=&quot;&quot;
        src=&quot;/static/f0cce266b1f64887bb8fb072b195dbfc/fcda8/ai-workflow.png&quot;
        srcset=&quot;/static/f0cce266b1f64887bb8fb072b195dbfc/12f09/ai-workflow.png 148w,
/static/f0cce266b1f64887bb8fb072b195dbfc/e4a3f/ai-workflow.png 295w,
/static/f0cce266b1f64887bb8fb072b195dbfc/fcda8/ai-workflow.png 590w,
/static/f0cce266b1f64887bb8fb072b195dbfc/efc66/ai-workflow.png 885w,
/static/f0cce266b1f64887bb8fb072b195dbfc/c83ae/ai-workflow.png 1180w,
/static/f0cce266b1f64887bb8fb072b195dbfc/29114/ai-workflow.png 1920w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;The Problem with Editor-Based AI&lt;/h2&gt;
&lt;p&gt;I’ve never been a fan of VSCode. Since Cursor Agent is built on VSCode, I had to use it, but I never enjoyed the experience. I’m much more comfortable writing code in Vim, and I’ve always preferred command-line tools over GUI-based solutions.&lt;/p&gt;
&lt;p&gt;The irony is that I don’t actually need AI integrated into my editor. Modern AI tools like Claude Code, AMP Code, Gemini CLI, and even Cursor Agent work perfectly from the command line. There’s no compelling reason to confine AI assistance to a single editor pane when I can keep it running in a dedicated side pane.&lt;/p&gt;
&lt;h2&gt;The New Workflow&lt;/h2&gt;
&lt;p&gt;My new setup involves multiple panes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Main coding pane&lt;/strong&gt;: Vim for actual development&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;: - &lt;strong&gt;AI assistant pane&lt;/strong&gt;: Command-line AI tools running continuously&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LazyGit Pane&lt;/strong&gt;: I love to be able to see the code diff before making commits and lazygit is an amazing tool. I can also just use fugitive for git inside vim it I am on a lower resolution screen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Additional panes&lt;/strong&gt;: For documentation, testing, or other development tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach gives me the flexibility to use AI assistance without being locked into a specific editor. I can leverage the full power of command-line AI tools while maintaining my preferred Vim workflow.&lt;/p&gt;
&lt;h2&gt;Why This Works Better&lt;/h2&gt;
&lt;p&gt;Command-line AI tools offer several advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: I can use any AI service without being tied to a specific editor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: The same AI interface works across different projects and languages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;: No need to switch between different editor modes or AI integrations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Familiarity&lt;/strong&gt;: Command-line tools feel natural to someone who prefers Vim&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zen&lt;/strong&gt;: I feel I work best when there are no distractions and command line is that for me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The future of AI-assisted development isn’t about cramming AI into every editor. It’s about creating flexible workflows that let developers use AI tools in the way that works best for their individual preferences and development style.&lt;/p&gt;
&lt;p&gt;I also could just swap Vim with Pycharm,WebStorm or any other &lt;strong&gt;Proper&lt;/strong&gt; IDE and the workflow would still stay the same and modular. This is the most important part of this workflow. Tommorrow, I could just switch the AI assistant to Claude Code and Gemini CLI and nothing would change for me.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Go 1.25: Container-Aware Runtime, Experimental GC, and Developer Experience Enhancements]]></title><description><![CDATA[Go 1.25 arrives in August 2025, six months after Go 1.24, continuing the reliable cadence that developers have come to trust. While…]]></description><link>https://vinitkumar.me/go-1.25/</link><guid isPermaLink="false">https://vinitkumar.me/go-1.25/</guid><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Go 1.25 arrives in August 2025, six months after Go 1.24, continuing the reliable cadence that developers have come to trust. While maintaining the Go 1 promise of compatibility, this release delivers significant improvements that will reshape how Go applications behave in containerized environments and provide substantial performance gains through experimental features.&lt;/p&gt;
&lt;p&gt;This release focuses on three core areas: intelligent container-aware runtime behavior, an experimental garbage collector that promises 10-40% performance improvements, and comprehensive toolchain enhancements that make development more efficient and debugging more powerful.&lt;/p&gt;
&lt;p&gt;Let’s dive into what makes Go 1.25 a compelling upgrade for teams of all sizes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(This analysis is based on the official release notes from &lt;a href=&quot;https://go.dev/doc/go1.25&quot;&gt;go.dev/doc/go1.25&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Revolutionary Runtime: Container-Aware GOMAXPROCS&lt;/h2&gt;
&lt;p&gt;The most significant change in Go 1.25 transforms how Go applications behave in containerized environments. The runtime now automatically adjusts &lt;code&gt;GOMAXPROCS&lt;/code&gt; based on container resource limits, solving a long-standing pain point for Kubernetes deployments.&lt;/p&gt;
&lt;h3&gt;The Container Problem Solved&lt;/h3&gt;
&lt;p&gt;Previously, Go applications running in containers would set &lt;code&gt;GOMAXPROCS&lt;/code&gt; to the number of logical CPUs on the host machine, often ignoring container CPU limits. This led to oversubscription, poor performance, and unpredictable behavior in orchestrated environments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before Go 1.25:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Container with 2 CPU limit on 16-core host
$ docker run --cpus=2 mygoapp
$ # GOMAXPROCS = 16 (ignoring container limit)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Go 1.25 Behavior:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Same container, now respects CPU bandwidth limit
$ docker run --cpus=2 mygoapp
$ # GOMAXPROCS = 2 (honors container limit)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Dynamic GOMAXPROCS Updates&lt;/h3&gt;
&lt;p&gt;Go 1.25 goes further by periodically updating &lt;code&gt;GOMAXPROCS&lt;/code&gt; if CPU availability changes during runtime. This enables truly elastic applications that can adapt to changing resource constraints without restart.&lt;/p&gt;
&lt;h3&gt;Why This Matters&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved Container Performance:&lt;/strong&gt; Applications automatically optimize for their actual resource allocation, eliminating CPU contention and improving throughput in containerized environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better Resource Utilization:&lt;/strong&gt; Kubernetes clusters will see more predictable performance and better bin-packing as Go applications no longer oversubscribe CPU resources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zero Configuration Required:&lt;/strong&gt; The runtime handles this automatically. You can disable it with &lt;code&gt;GODEBUG=containermaxprocs=0&lt;/code&gt; if needed, but most applications will benefit from the default behavior.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Teams deploying Go applications in Kubernetes will see immediate performance improvements and more predictable resource usage without any code changes.&lt;/p&gt;
&lt;h2&gt;Experimental Garbage Collector: 10-40% Performance Boost&lt;/h2&gt;
&lt;p&gt;Go 1.25 introduces an experimental garbage collector that represents a fundamental shift in GC design, focusing on improved locality and CPU scalability for small object workloads.&lt;/p&gt;
&lt;h3&gt;The Green Tea GC&lt;/h3&gt;
&lt;p&gt;The new garbage collector, enabled with &lt;code&gt;GOEXPERIMENT=greenteagc&lt;/code&gt;, redesigns marking and scanning for better performance on modern CPU architectures:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Enable the experimental GC
$ GOEXPERIMENT=greenteagc go build myapp&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Performance Characteristics&lt;/h3&gt;
&lt;p&gt;The design targets workloads that heavily use the garbage collector, with expected improvements of &lt;strong&gt;10-40% reduction in garbage collection overhead&lt;/strong&gt;. The benefits are most pronounced in applications that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allocate many small objects&lt;/li&gt;
&lt;li&gt;Have high allocation rates&lt;/li&gt;
&lt;li&gt;Spend significant time in garbage collection&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Why You Should Try It&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Substantial Performance Gains:&lt;/strong&gt; Early benchmarks show significant improvements in GC-heavy workloads, translating to better application throughput and reduced latency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Production Feedback Opportunity:&lt;/strong&gt; The Go team explicitly encourages developers to test this experimental feature and provide feedback, giving you a chance to influence the future of Go’s runtime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt; Understanding and testing the new GC design positions your team for when it becomes the default in future releases.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt; Test the experimental GC in your staging environments, especially if your applications are GC-bound. The potential performance gains make this worth investigating.&lt;/p&gt;
&lt;h2&gt;Trace Flight Recorder: Debugging Rare Events&lt;/h2&gt;
&lt;p&gt;Go 1.25 introduces a game-changing debugging tool: the runtime trace flight recorder. This feature addresses the long-standing challenge of capturing execution traces for rare events without the overhead of continuous tracing.&lt;/p&gt;
&lt;h3&gt;How It Works&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;runtime/trace.FlightRecorder&lt;/code&gt; API maintains a ring buffer of trace data in memory, allowing you to capture trace snapshots only when needed:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;go&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;import &amp;quot;runtime/trace&amp;quot;

// Configure flight recorder
config := trace.FlightRecorderConfig{
    Duration: 5 * time.Second,  // Capture last 5 seconds
}

recorder := trace.NewFlightRecorder(config)

// Later, when an interesting event occurs
func handleCriticalEvent() {
    // Capture the last few seconds of execution trace
    file, _ := os.Create(&amp;quot;debug-trace.out&amp;quot;)
    recorder.WriteTo(file)
    file.Close()
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Debugging Revolution&lt;/h3&gt;
&lt;p&gt;This enables new debugging workflows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Production-Safe Debugging:&lt;/strong&gt; Continuously record trace data with minimal overhead, only writing traces when problems occur.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rare Event Capture:&lt;/strong&gt; Finally debug those hard-to-reproduce issues by capturing execution context around the problem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Targeted Performance Analysis:&lt;/strong&gt; Focus trace analysis on specific problematic periods rather than sifting through gigabytes of continuous trace data.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; This transforms runtime tracing from a development-only tool to a production debugging capability, dramatically improving your ability to diagnose complex issues.&lt;/p&gt;
&lt;h2&gt;Enhanced Development Tools&lt;/h2&gt;
&lt;p&gt;Go 1.25 significantly improves the developer experience with smarter tools and better debugging capabilities.&lt;/p&gt;
&lt;h3&gt;Address Sanitizer Integration&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;go build -asan&lt;/code&gt; flag now enables leak detection by default, helping catch memory management issues in C code integration:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Build with address sanitizer
$ go build -asan myapp

# Run with leak detection (default in Go 1.25)
$ ./myapp
# Will report memory leaks at program exit&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Improved Go Command Features&lt;/h3&gt;
&lt;p&gt;Several go command enhancements streamline development:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentation Server:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Start local docs and open in browser
$ go doc -http fmt.Printf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;JSON Version Information:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Get build info as JSON
$ go version -m -json mybinary&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Module Ignore Directive:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;go&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// In go.mod
ignore vendor/legacy-code&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Enhanced Vet Analyzers&lt;/h3&gt;
&lt;p&gt;Two new analyzers help catch common bugs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;waitgroup analyzer:&lt;/strong&gt; Detects misplaced &lt;code&gt;sync.WaitGroup.Add&lt;/code&gt; calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hostport analyzer:&lt;/strong&gt; Identifies IPv6-incompatible address construction&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example of hostport analyzer:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;go&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// This will trigger a warning
addr := fmt.Sprintf(&amp;quot;%s:%d&amp;quot;, host, port)  // Won&amp;#39;t work with IPv6

// Recommended approach
addr := net.JoinHostPort(host, strconv.Itoa(port))  // IPv6-compatible&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Comprehensive Standard Library Improvements&lt;/h2&gt;
&lt;p&gt;Go 1.25 delivers substantial improvements across the standard library, enhancing functionality without breaking compatibility.&lt;/p&gt;
&lt;h3&gt;HTTP and Networking&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cross-Origin Protection:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;go&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// New CSRF protection middleware
mux := http.NewServeMux()
protected := http.CrossOriginProtection(mux)
http.ListenAndServe(&amp;quot;:8080&amp;quot;, protected)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Enhanced File Operations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows now supports asynchronous I/O handles&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DirFS&lt;/code&gt; and &lt;code&gt;Root.FS&lt;/code&gt; implement &lt;code&gt;io/fs.ReadLinkFS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Multiple new &lt;code&gt;Root&lt;/code&gt; methods for filesystem operations&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Improved Testing Experience&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Test Attributes:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;go&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;func TestExample(t *testing.T) {
    t.Attr(&amp;quot;category&amp;quot;, &amp;quot;integration&amp;quot;)
    t.Attr(&amp;quot;duration&amp;quot;, &amp;quot;slow&amp;quot;)
    // Test implementation
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Better Output Control:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;go&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;func TestOutput(t *testing.T) {
    writer := t.Output()  // Get io.Writer for test output
    fmt.Fprintf(writer, &amp;quot;Debug info: %v\n&amp;quot;, data)
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Unique Package Performance&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;unique&lt;/code&gt; package receives significant performance improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More eager value reclamation&lt;/li&gt;
&lt;li&gt;Parallel processing&lt;/li&gt;
&lt;li&gt;Single-cycle collection for unused handles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes the unique package more viable for high-throughput applications that need string interning or value deduplication.&lt;/p&gt;
&lt;h2&gt;Platform and Architecture Updates&lt;/h2&gt;
&lt;h3&gt;macOS Requirements&lt;/h3&gt;
&lt;p&gt;Go 1.25 requires &lt;strong&gt;macOS 12 Monterey or later&lt;/strong&gt;, dropping support for older versions. This allows the Go runtime to take advantage of newer system APIs and security features.&lt;/p&gt;
&lt;h3&gt;Architecture Support&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;RISC-V Enhancements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;linux/riscv64&lt;/code&gt; now supports the &lt;code&gt;plugin&lt;/code&gt; build mode&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;GORISCV64=rva23u64&lt;/code&gt; environment variable for RVA23U64 profile&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Loong64 Improvements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Race detector support&lt;/li&gt;
&lt;li&gt;C traceback integration with &lt;code&gt;runtime.SetCgoTraceback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Internal link mode for cgo programs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Windows ARM Deprecation:&lt;/strong&gt;
Go 1.25 is the final release supporting the broken &lt;code&gt;windows/arm&lt;/code&gt; port, which will be removed in Go 1.26.&lt;/p&gt;
&lt;h2&gt;Critical Compiler Bug Fix&lt;/h2&gt;
&lt;p&gt;Go 1.25 fixes a significant compiler bug introduced in Go 1.21 that could incorrectly delay nil pointer checks. Programs that previously executed incorrectly will now properly panic:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;go&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// This will now correctly panic (was broken in Go 1.21-1.24)
func main() {
    f, err := os.Open(&amp;quot;nonExistentFile&amp;quot;)
    name := f.Name()  // Should panic here
    if err != nil {
        return
    }
    println(name)
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This fix improves program correctness and debugging experience by ensuring nil pointer dereferences are caught immediately.&lt;/p&gt;
&lt;h2&gt;Should You Upgrade to Go 1.25?&lt;/h2&gt;
&lt;p&gt;The answer depends on your specific context, but for most teams, the benefits significantly outweigh the minimal risks.&lt;/p&gt;
&lt;h3&gt;For Container-Native Applications: &lt;strong&gt;Absolutely Yes&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;If you deploy Go applications in Kubernetes or other container orchestrators, the container-aware &lt;code&gt;GOMAXPROCS&lt;/code&gt; feature alone justifies the upgrade. You’ll see immediate performance improvements and more predictable resource utilization.&lt;/p&gt;
&lt;h3&gt;For Performance-Critical Applications: &lt;strong&gt;Strongly Recommended&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The experimental garbage collector offers substantial performance improvements for GC-heavy workloads. Even if you don’t enable it immediately in production, testing it in staging environments will help you understand its impact on your specific use cases.&lt;/p&gt;
&lt;h3&gt;For Development Teams: &lt;strong&gt;Yes, with Enthusiasm&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The enhanced debugging tools, improved vet analyzers, and standard library improvements will make your development process more efficient and help catch bugs earlier in the development cycle.&lt;/p&gt;
&lt;h3&gt;For Production Services: &lt;strong&gt;Proceed with Standard Caution&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;While Go 1.25 maintains compatibility guarantees, the container-aware runtime behavior represents a significant change. Test thoroughly in staging environments, particularly if you have applications that manually set &lt;code&gt;GOMAXPROCS&lt;/code&gt; or rely on specific CPU scheduling behavior.&lt;/p&gt;
&lt;h2&gt;Migration Strategy&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test in Staging:&lt;/strong&gt; Deploy Go 1.25 in staging environments first, paying particular attention to container resource usage and application performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitor Container Metrics:&lt;/strong&gt; Watch CPU utilization, memory usage, and application throughput in containerized environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Experiment with Green Tea GC:&lt;/strong&gt; Test the experimental garbage collector on representative workloads to understand potential performance gains.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update CI/CD:&lt;/strong&gt; Incorporate the new vet analyzers and testing improvements into your development workflow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plan for Architecture Changes:&lt;/strong&gt; If you use affected platforms (macOS, Windows ARM), plan for the requirement changes and deprecations.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion: A Runtime Revolution&lt;/h2&gt;
&lt;p&gt;Go 1.25 represents more than an incremental update—it’s a fundamental improvement in how Go applications interact with modern infrastructure. The container-aware runtime, experimental garbage collector, and comprehensive tooling improvements position Go as an even more compelling choice for cloud-native development.&lt;/p&gt;
&lt;p&gt;The release demonstrates the Go team’s commitment to practical improvements that solve real-world problems. The container-aware &lt;code&gt;GOMAXPROCS&lt;/code&gt; addresses years of deployment friction, while the experimental GC promises substantial performance gains for the future.&lt;/p&gt;
&lt;p&gt;For teams running Go in production, especially in containerized environments, Go 1.25 offers immediate, tangible benefits. The risk of upgrading is minimal due to Go’s strong compatibility guarantees, while the potential gains in performance and operational efficiency are substantial.&lt;/p&gt;
&lt;p&gt;Start planning your upgrade to Go 1.25. Your infrastructure team will thank you for the improved resource utilization, your performance team will appreciate the GC improvements, and your developers will love the enhanced debugging capabilities.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[TIL] How Not To Install LazyGit on Ubuntu]]></title><description><![CDATA[I am working on an Ubuntu Linux VM at work. So while setting up the project repository, I naturally wanted to install
lazygit which is a…]]></description><link>https://vinitkumar.me/til/snap-lazygit/</link><guid isPermaLink="false">https://vinitkumar.me/til/snap-lazygit/</guid><pubDate>Tue, 29 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I am working on an Ubuntu Linux VM at work. So while setting up the project repository, I naturally wanted to install
&lt;code&gt;lazygit&lt;/code&gt; which is a wonderful TUI for git.&lt;/p&gt;
&lt;p&gt;When I got to install it. The normal recommendation was to install using snap with this command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo snap install lazygit&lt;/code&gt; which installed it successfully, but was for some reason sandboxed. which means I got errors
like this:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;log&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;
vinit in 🌐 vinit in demo on  feat/implement-feat [$?] via 🐹 v1.24.5
❯ sudo chown -R vinit:vinit /home/vinit/demo/.git

vinit in 🌐 vinit in demo on  feat/implement-feat [$?] via 🐹 v1.24.5
❯ lazygit
2025/07/29 06:13:16 An error occurred! Please create an issue at: https://github.com/jesseduffield/lazygit/issues


*fs.PathError open /home/vinit/demo/.git/packed-refs: permission denied
/build/lazygit/parts/lazygit/build/main.go:145 (0x969f74)
/snap/go/9416/src/runtime/proc.go:250 (0x437178)
/snap/go/9416/src/runtime/asm_arm64.s:1259 (0x464d44)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Which is not what you expect to see.&lt;/p&gt;
&lt;p&gt;An easy solution was to remove the snap version and install it from &lt;code&gt;go&lt;/code&gt; itself.&lt;/p&gt;
&lt;p&gt;This is how I fixed it&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;log&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;sudo snap remove lazygit
go install github.com/jesseduffield/lazygit@latest
# Make sure Go binaries are in PATH
export PATH=&amp;quot;$PATH:$(go env GOPATH)/bin&amp;quot;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;And then it just worked!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[AI Agents, Me, and My Feelings]]></title><description><![CDATA[I have been using AI-based editors for a couple of years. At my previous job, I used GitHub Copilot, and more recently, since November 202…]]></description><link>https://vinitkumar.me/ai-agents/</link><guid isPermaLink="false">https://vinitkumar.me/ai-agents/</guid><pubDate>Fri, 18 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been using AI-based editors for a couple of years. At my previous job, I used GitHub Copilot, and more recently, since November 2024, I have been using Cursor. The field of AI is evolving so rapidly that it’s challenging to form a consistent opinion about it. This post outlines some of my feelings on the subject.&lt;/p&gt;
&lt;p&gt;AI agents are powerful and useful, but they also present certain dangers. If you let an AI agent write most of your code, you risk creating a codebase that you won’t remember in the long run. Worse yet, if you don’t ask the agent to document its work, you could end up with a mess that is difficult to reason about. Personally, I remember all the code I’ve written and thought about deeply. While an agent can significantly reduce development time by doing the heavy lifting, I find that because I didn’t exert the mental effort myself, I don’t remember the details as minutely as when I write the code from scratch.&lt;/p&gt;
&lt;p&gt;However, not using AI agents or some form of AI assistance is not an option either, as it would likely lead to a significant drop in productivity and longer shipping times. So, what should we do?&lt;/p&gt;
&lt;p&gt;I can already foresee a significant problem for people who use AI for more than 80% of their work: muscle atrophy. It would be just like the fate of humans in the movie &lt;em&gt;Wall-E&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://m.media-amazon.com/images/M/MV5BZDQ5MzBmODItZDZjMC00Mjk3LThiYTUtOTc5NzkzNTU3NmNiXkEyXkFqcGc@._V1_QL75_UX820_.jpg&quot; alt=&quot;wall-e-humans&quot;&gt;&lt;/p&gt;
&lt;p&gt;They became totally atrophied and unable to walk because they didn’t use their muscles anymore. Who is to guarantee that the same fate doesn’t await us if we stop using our brains?&lt;/p&gt;
&lt;p&gt;This is the biggest conflict I have. While there are dangers in using AI extensively, there is also a loss in not using it. Personally, I want AI to become like Jarvis, doing the heavy lifting for monotonous tasks that don’t spark creativity. At the same time, it should be dependable and correct most of the time, giving me the time and scope to be creative and tackle the hard bits.&lt;/p&gt;
&lt;p&gt;The question is: how can we achieve this with current tooling?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI-Powered Research&lt;/strong&gt;: By using tools like ChatGPT and Google AI Studio for deep research, one can accumulate a wealth of information and learn it thoroughly. This would have taken much more time in the pre-AI era. Go deep with this research so you can spot when an agent f**ks up, because you will have the theory to back your judgment. Also, one should always download the research as Markdown or PDF files and maintain a local knowledge repository, even backing it up to Git.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code Implementation&lt;/strong&gt;: Think about the implementation in great detail and write some code and tests. Get the AI to write the boilerplate exactly to your liking, and then you can write the non-trivial bits. If you’re getting an AI to write functions or other pieces of code, have it write tests to validate what it wrote, so that it’s covered for any future refactoring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vigilant Review&lt;/strong&gt;: Never blindly trust the code an AI has written. Even if it looks good on the surface, go deep into the implementation and refactor where needed. No model, however strong, is equally capable in all languages and frameworks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous Learning&lt;/strong&gt;: While AI shortens the time for writing features and bug fixes, use that free time to learn more and go deeper. If you want job security, in-depth knowledge of the business logic is your only protection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Intelligent Tooling&lt;/strong&gt;: Use AI as an elaborate linter, code reviewer, and security analyst. It is seriously great at that. It can also be helpful with performance work, given the extensive training and exposure it has that you might not have.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I firmly believe that people with a strong foundational knowledge of languages and stacks, extensive experience building things, and a good grip on AI—knowing how much and when to use it—will smoke many inexperienced and inefficient developers. Your biggest threat is not AI, but good developers armed with the superpower of AI.&lt;/p&gt;
&lt;p&gt;The next 12-24 months will be critical as many companies integrate AI agents into their main workflows.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anything that can be automated by AI agents will be automated by AI agents.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[PDF Joiner Now Supports Linux: Quick Setup Guide]]></title><description><![CDATA[PDF Joiner now supports Linux with automatic tool detection and installation. The tool works on all major Linux distributions and provides…]]></description><link>https://vinitkumar.me/pdf-joiner-linux-support/</link><guid isPermaLink="false">https://vinitkumar.me/pdf-joiner-linux-support/</guid><pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;PDF Joiner now supports Linux with automatic tool detection and installation. The tool works on all major Linux distributions and provides the same simple interface as the macOS version.&lt;/p&gt;
&lt;p&gt;If you haven’t read about PDF Joiner before, check out my &lt;a href=&quot;/pdf-joiner/&quot;&gt;original post about the Mac version&lt;/a&gt; where I explain the motivation behind creating this free command-line utility.&lt;/p&gt;
&lt;h2&gt;Quick Setup&lt;/h2&gt;
&lt;h3&gt;1. Check Your CPU Architecture&lt;/h3&gt;
&lt;p&gt;First, determine your system architecture:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;uname -m&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;ul&gt;
&lt;li&gt;If output is &lt;code&gt;x86_64&lt;/code&gt; → use &lt;strong&gt;amd64&lt;/strong&gt; binary&lt;/li&gt;
&lt;li&gt;If output is &lt;code&gt;aarch64&lt;/code&gt; or &lt;code&gt;arm64&lt;/code&gt; → use &lt;strong&gt;arm64&lt;/strong&gt; binary&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Download the Correct Binary&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;For 64-bit Intel/AMD systems (x86_64):&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;curl -L https://github.com/vinitkumar/pdf-joiner/releases/download/v1.2.9/pdf-joiner-linux-amd64 -o pdf-joiner&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;For ARM64 systems (aarch64):&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;curl -L https://github.com/vinitkumar/pdf-joiner/releases/download/v1.2.9/pdf-joiner-linux-arm64 -o pdf-joiner&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;3. Make It Executable&lt;/h3&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;chmod +x pdf-joiner&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;4. Run It&lt;/h3&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;./pdf-joiner file1.pdf file2.pdf file3.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;First Run Setup&lt;/h2&gt;
&lt;p&gt;On first run, the tool automatically:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Detects your Linux distribution&lt;/li&gt;
&lt;li&gt;Installs required PDF tools if missing&lt;/li&gt;
&lt;li&gt;Asks for sudo permission to install dependencies&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example first run:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;$ ./pdf-joiner file1.pdf file2.pdf
No PDF joining tools found. Attempting to install them...
Detected Linux distribution: ubuntu
Installing PDF tools for Ubuntu/Debian...
[sudo] password for user:
PDF tools installed successfully!
Successfully joined PDFs into: combined_20250625_143812.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Supported Linux Distributions&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Distribution&lt;/th&gt;
&lt;th&gt;Package Manager&lt;/th&gt;
&lt;th&gt;Auto-Install&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu/Debian&lt;/td&gt;
&lt;td&gt;apt-get&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fedora&lt;/td&gt;
&lt;td&gt;dnf&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RHEL/CentOS&lt;/td&gt;
&lt;td&gt;yum&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arch Linux&lt;/td&gt;
&lt;td&gt;pacman&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Usage Examples&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Basic joining:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;./pdf-joiner file1.pdf file2.pdf file3.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Custom output filename:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;./pdf-joiner -o combined_document.pdf file1.pdf file2.pdf file3.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Move to system PATH (optional):&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;sudo mv pdf-joiner /usr/local/bin/
# Now you can run it from anywhere
pdf-joiner file1.pdf file2.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;PDF Tools Used&lt;/h2&gt;
&lt;p&gt;The tool automatically selects the best available PDF backend:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;pdfunite&lt;/strong&gt; (fastest, preferred)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ghostscript&lt;/strong&gt; (most compatible)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;qpdf&lt;/strong&gt; (alternative option)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Troubleshooting&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Permission denied error:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;chmod +x pdf-joiner&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;Tool not found after installation:&lt;/strong&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Reinstall PDF tools manually
sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install poppler-utils ghostscript  # Ubuntu/Debian
sudo dnf install poppler-utils ghostscript                              # Fedora
sudo yum install poppler-utils ghostscript                              # RHEL/CentOS
sudo pacman -S poppler ghostscript                                       # Arch Linux&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Build from Source (Optional)&lt;/h2&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;git clone https://github.com/vinitkumar/pdf-joiner.git
cd pdf-joiner
go build -o pdf-joiner
./pdf-joiner file1.pdf file2.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner&quot;&gt;vinitkumar/pdf-joiner&lt;/a&gt;
&lt;strong&gt;Latest Release&lt;/strong&gt;: &lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner/releases/tag/v1.2.9&quot;&gt;v1.2.9&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Linux support extends PDF Joiner’s reach beyond macOS, making it accessible to developers across all major platforms while maintaining the same privacy-focused, local processing approach that makes it a reliable alternative to online PDF tools.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Books on My Desk]]></title><description><![CDATA[📚 Books on My Desk Right Now A themed curation for anyone who loves thinking deeply, building well, and living intentionally. I often…]]></description><link>https://vinitkumar.me/books-on-my-desk/</link><guid isPermaLink="false">https://vinitkumar.me/books-on-my-desk/</guid><pubDate>Sat, 07 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e3f0b1542b3970c413ed73f47734c35f/e1596/stack1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEDBQb/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABcNtDyBYmv//EABkQAQADAQEAAAAAAAAAAAAAAAIAARIDIf/aAAgBAQABBQJLAT3ylgzBun4//8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Bp//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB4QAAIBAwUAAAAAAAAAAAAAAAERAAIQEiEiMTJh/9oACAEBAAY/AtpXEqy1VLt1EWIUI9n/xAAZEAEAAwEBAAAAAAAAAAAAAAABABExIYH/2gAIAQEAAT8hTLUgHI4OgBd2MWdTyXjsFJUAFhQn/9oADAMBAAIAAwAAABCQL//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QH//EABYRAAMAAAAAAAAAAAAAAAAAABARQf/aAAgBAgEBPxCIf//EABoQAQEBAQEBAQAAAAAAAAAAAAERADEhQWH/2gAIAQEAAT8QbjfUkb+vdIv3PBYZqXTg0PEvOZf/ABAlMZsUHYXf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;stack1&quot;
        title=&quot;&quot;
        src=&quot;/static/e3f0b1542b3970c413ed73f47734c35f/1c72d/stack1.jpg&quot;
        srcset=&quot;/static/e3f0b1542b3970c413ed73f47734c35f/a80bd/stack1.jpg 148w,
/static/e3f0b1542b3970c413ed73f47734c35f/1c91a/stack1.jpg 295w,
/static/e3f0b1542b3970c413ed73f47734c35f/1c72d/stack1.jpg 590w,
/static/e3f0b1542b3970c413ed73f47734c35f/a8a14/stack1.jpg 885w,
/static/e3f0b1542b3970c413ed73f47734c35f/fbd2c/stack1.jpg 1180w,
/static/e3f0b1542b3970c413ed73f47734c35f/e1596/stack1.jpg 2048w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/16912c9018c7f36d3342ec1c6cba1fe0/b7c1f/stack2.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHFtEikRw//xAAbEAACAgMBAAAAAAAAAAAAAAABEQIDABIhQf/aAAgBAQABBQKmTJe3lnI1gSxB/wD/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEv/aAAgBAwEBPwGj/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8Bh//EABoQAAIDAQEAAAAAAAAAAAAAAAABESFhAjH/2gAIAQEABj8ChtxhTlaeclUObGf/xAAcEAEAAgMAAwAAAAAAAAAAAAABABEhMUGBkbH/2gAIAQEAAT8h8WZuJVZhe6+wbDS9MQFXoggNL7HV6Z//2gAMAwEAAgADAAAAELz/AP/EABcRAQEBAQAAAAAAAAAAAAAAAAEAESH/2gAIAQMBAT8QMdl1v//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Q2qH/xAAcEAEBAAICAwAAAAAAAAAAAAABEQAhMVFxkdH/2gAIAQEAAT8QjHGooJbuYZNBCPjY8neVqFoVu9+smGDw4TAOwa27+ZGTFA6M/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;stack2&quot;
        title=&quot;&quot;
        src=&quot;/static/16912c9018c7f36d3342ec1c6cba1fe0/1c72d/stack2.jpg&quot;
        srcset=&quot;/static/16912c9018c7f36d3342ec1c6cba1fe0/a80bd/stack2.jpg 148w,
/static/16912c9018c7f36d3342ec1c6cba1fe0/1c91a/stack2.jpg 295w,
/static/16912c9018c7f36d3342ec1c6cba1fe0/1c72d/stack2.jpg 590w,
/static/16912c9018c7f36d3342ec1c6cba1fe0/a8a14/stack2.jpg 885w,
/static/16912c9018c7f36d3342ec1c6cba1fe0/fbd2c/stack2.jpg 1180w,
/static/16912c9018c7f36d3342ec1c6cba1fe0/b7c1f/stack2.jpg 5712w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;📚 Books on My Desk Right Now&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;A themed curation for anyone who loves thinking deeply, building well, and living intentionally.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I often rotate through books that either challenge how I think or sharpen how I work.
Here’s what’s currently in my reading stack—grouped by themes that matter to me.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🧠 Focus, Productivity &amp;#x26; Deep Work&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mastering attention in a distracted world.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deep Work&lt;/strong&gt; – &lt;em&gt;Cal Newport&lt;/em&gt;
One of the most important books I’ve read on achieving meaningful output in today’s distraction-heavy world.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Digital Minimalism&lt;/strong&gt; – &lt;em&gt;Cal Newport&lt;/em&gt;
Helps cut digital noise and reclaim intentionality in how we use tech.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hyperfocus&lt;/strong&gt; – &lt;em&gt;Chris Bailey&lt;/em&gt;
Great blend of science and practice on when to zoom in and when to intentionally scatter your focus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do It Today&lt;/strong&gt; – &lt;em&gt;Darius Foroux&lt;/em&gt;
Short, punchy, and action-oriented. Good for anyone struggling with procrastination.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;📈 Self-Mastery &amp;#x26; Personal Growth&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mental models, discipline, and growth mindset.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Almanack of Naval Ravikant&lt;/strong&gt; – &lt;em&gt;Eric Jorgenson&lt;/em&gt;
A goldmine of clarity on wealth, happiness, and leverage. I keep coming back to it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;101 Essays That Will Change The Way You Think&lt;/strong&gt; – &lt;em&gt;Brianna Wiest&lt;/em&gt;
Big ideas delivered in short essays. Great for reflection and reframing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mind Master&lt;/strong&gt; – &lt;em&gt;Viswanathan Anand&lt;/em&gt;
Chess legend shares how he stays sharp, focused, and humble. Surprisingly practical.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Greatest Secret&lt;/strong&gt; – &lt;em&gt;Rhonda Byrne&lt;/em&gt;
For those who seek peace and grounding through inner awareness.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;💸 Psychology, Communication &amp;#x26; Money&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Relationships and behavior, where it really counts.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Psychology of Money&lt;/strong&gt; – &lt;em&gt;Morgan Housel&lt;/em&gt;
Simple truths that reframe how I think about money and decisions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How to Win Friends and Influence People&lt;/strong&gt; – &lt;em&gt;Dale Carnegie&lt;/em&gt;
Still relevant, still powerful. Essential read for anyone who works with people.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How to Talk So Kids Will Listen…&lt;/strong&gt; – &lt;em&gt;Adele Faber &amp;#x26; Elaine Mazlish&lt;/em&gt;
Despite the title, it’s a masterclass in empathetic communication—for parents and leaders alike.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;🎯 Life Philosophy &amp;#x26; Memoir&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Stories and ideas that shape perspective.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zen and the Art of Motorcycle Maintenance&lt;/strong&gt; – &lt;em&gt;Robert M. Pirsig&lt;/em&gt;
Slow, philosophical, and incredibly rewarding. Explores the intersection of logic, art, and living well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Surely You’re Joking, Mr. Feynman!&lt;/strong&gt; – &lt;em&gt;Richard P. Feynman&lt;/em&gt;
Whimsical yet brilliant. Feynman’s curiosity is contagious.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Masters of Doom&lt;/strong&gt; – &lt;em&gt;David Kushner&lt;/em&gt;
A thrilling look at creativity, rebellion, and tech entrepreneurship. Highly recommended for builders.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;💻 Software Engineering Mastery&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;For going from good to great in engineering.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code Complete&lt;/strong&gt; – &lt;em&gt;Steve McConnell&lt;/em&gt;
An engineering bible. Every serious developer should read it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Designing Data-Intensive Applications&lt;/strong&gt; – &lt;em&gt;Martin Kleppmann&lt;/em&gt;
Still one of the best books on systems architecture and backend design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;High Performance MySQL&lt;/strong&gt; – &lt;em&gt;Baron Schwartz et al.&lt;/em&gt;
Essential if you’re tuning or scaling databases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Patterns of Distributed Systems&lt;/strong&gt; – &lt;em&gt;(various authors)&lt;/em&gt;
Understand and apply foundational patterns behind large-scale apps.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;⚙️ Systems Programming &amp;#x26; Compilers&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;For those who love understanding the machine.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C: A Reference Manual&lt;/strong&gt; – &lt;em&gt;Harbison &amp;#x26; Steele&lt;/em&gt;
Not glamorous, but rock-solid. Deepen your C fundamentals.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compilers (Dragon Book)&lt;/strong&gt; – &lt;em&gt;Aho, Lam, Sethi, Ullman&lt;/em&gt;
If you ever wanted to build a language or understand how they work under the hood—this is it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Introduction to Algorithms (CLRS)&lt;/strong&gt; – &lt;em&gt;Cormen et al.&lt;/em&gt;
The classic on algorithms. Still hard. Still worth it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;🧬 Go Programming Track&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;If Go is your main tool—this path sharpens it.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learning Go&lt;/strong&gt; – &lt;em&gt;Jon Bodner&lt;/em&gt;
Great intro with just enough depth. Good for onboarding too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Concurrency in Go&lt;/strong&gt; – &lt;em&gt;Katherine Cox-Buday&lt;/em&gt;
Explains goroutines, channels, and concurrency models with clarity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;100 Go Mistakes and How to Avoid Them&lt;/strong&gt; – &lt;em&gt;Teiva Harsanyi&lt;/em&gt;
A goldmine of real-world issues and better practices.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;This stack fuels both the craft of building software and the art of being thoughtful in life and work.
If you’ve read any of these—or have recommendations—I’d love to hear them!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;#books #softwareengineering #personalgrowth #deepwork #goprogramming #readinglist #developers&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Future of Error Handling in Go Notes]]></title><description><![CDATA[Today, a new blog was published about error handling in Go and their syntactic changes. Here is the quick TLDR: Go’s error handling—mainly…]]></description><link>https://vinitkumar.me/go-error-handling/</link><guid isPermaLink="false">https://vinitkumar.me/go-error-handling/</guid><pubDate>Thu, 05 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, a new &lt;a href=&quot;https://go.dev/blog/error-syntax&quot;&gt;blog&lt;/a&gt; was published about error handling in Go and their syntactic changes. Here is the quick TLDR:&lt;/p&gt;
&lt;p&gt;Go’s error handling—mainly the repetitive &lt;code&gt;if err != nil&lt;/code&gt; pattern—has been a top complaint due to its verbosity. Over the years, the Go team explored several syntactic improvements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;2018: &lt;code&gt;check/handle&lt;/code&gt;&lt;/strong&gt; — Introduced as part of the Go 2 discussion, but considered too complex.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2019: &lt;code&gt;try&lt;/code&gt; built-in&lt;/strong&gt; — Simpler, auto-returning on error, but obscured control flow and was widely rejected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024: &lt;code&gt;?&lt;/code&gt; operator&lt;/strong&gt; — Inspired by Rust, cleaner and more intuitive, but still failed to achieve consensus.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Despite intense effort and hundreds of community proposals, none of these changes gained broad support. The Go team has now &lt;strong&gt;decided to stop pursuing syntax changes&lt;/strong&gt; for error handling.&lt;/p&gt;
&lt;h3&gt;Reasons include:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lack of community and internal consensus.&lt;/li&gt;
&lt;li&gt;Risk of splitting the community over idiomatic style.&lt;/li&gt;
&lt;li&gt;Current error handling, while verbose, is explicit and predictable.&lt;/li&gt;
&lt;li&gt;In idiomatic Go, well-structured error handling includes adding context or stack traces, making verbosity less of an issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bottom line&lt;/strong&gt;: Go will keep its current approach to error handling for the foreseeable future.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[Redis Creator's Code Philosophy: 10 Programming Principles from Antirez]]></title><description><![CDATA[Antirez is one programmer I respect a lot. He has a singular approach and style of programming that is both effective and efficient. I have…]]></description><link>https://vinitkumar.me/code-like-antirez/</link><guid isPermaLink="false">https://vinitkumar.me/code-like-antirez/</guid><pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Antirez is one programmer I respect a lot. He has a singular approach and style of programming that is both effective and efficient. I have been following him and his blogs for over an decade and its amazing how much you can learn watching him work. He is recently very active on 📺 &lt;a href=&quot;https://www.youtube.com/@antirez&quot;&gt;Youtube&lt;/a&gt; and I would highly recommend watching him code and explain.&lt;/p&gt;
&lt;p&gt;This tips are compiled from this blogs and his code on Github.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f1f5b66dc4103bdc7aa4f18bca70af3c/e5715/antirez.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 102.02702702702702%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVR42mNgwA0YQ0NDme3t7VmM04xZ7evtWUDs+vp6JgZyAMgwV1dXRTc3N1lvCydpd3t3BS8vL3mQmLGxMSup5jEic2wutSvZXuhWJMdhjMiG/f//n9EjN5fdoiDMyDQ/1CC0PpQNJAaRZGD8/x/VYqxg8uTJwnPmzNEBYl6YJcaCgvz2/PwCMDX1Z4y5Juy2luvfbq7Qe8yCE6dhwEDnAIVZRFKSIZDDcXbVDpXC/TN7PU9293uemdxXfKah98jlOGUGBhV2Vz9jcxsnMy0PDxV2nAamAQPbx8eHaxUDA/OCubMC50+b/ajz4LL/zme7/jmfm/Sv5Vb6/zl7rR9N2hETwMAQzxEaKgNyHZZYr//PJHPsP6cFEIO4ZXsupU+fv+j/5O6u/7MWL7jkd6avJ/TEhN4pBwMutq6y/z9rn+v/2w8CUyDhrAUMVwYmlPA0rp/JpTJtv4XkzING9+//59Df9OCE+/rL/ycuXbv4//5VPDB1c45s4F1xOGDRzYva/x+e1jh169Y29undElrTexX0p9RrwdUxWFn58Rq6uEjZMzCImF76YCK98MBfqYXHP3vf+a8Kkm+dPVt80qxJtkD3MP//76p4epf8t6O75H5+fGJlycCgBkyrusZWVuq8qL7e/58FROeteF0cu/L7/9hFTw+C+BMnTuSbNm1aKRC7L5nTLQ8Se3HQcP//S+r/3xx3zQPxV9UzsKEaZr+fZW/cS+Xtga8kb1V9DT6V+OL/jrhL9/5v+s8FzGo80yZPK58/aZJGWtpM1v+3cvlO1Drdudrk9P/rvPCgbbkM7I969aUfFSIlH1DsZrnVq6Tb1ag+m/tfdGXi+cdrk6/+P9D+Pw7i+nqWVatCmcGRMCUr+nKb9f8DDZb3/+8vkfCx0DVK9DI3L3bV40a4EJjhA5wDhO2NfURA/COlnxcsL/n/vzjp2Of+ihfV/1tPaH3uOK/9Ki+r6nJ4+Jdf5RH/P00JWgjO8/amEt42uoLo2RWW1cBpauPG/+It+Q9XV6c9/7807/W/k5Ez/x6PnvfnS3LpvysR/v9vJiWvfjFhtjjMMThKl1VsmeFbNHOjt2mlh26WBom1VP3J25d79uGFmJnPzsSsePosY8KjDwVJuSCLX0f6aHyMDFL9HwoJCqwFg4WFm5AzyOv2oTz/Gf4zggqC/zPP8P9vvST+v/6C2Pv558H5eRXQkBxHR/0UGxs1ey2k9EcI1NdDguBywELNMwELlMHBAvEio7eurqCPsTFXqJYWG0lloY+xD1eiTahWvH2QRqhFKCcDNUA9A9hVRBX9ADm/l/ghY6dIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;antirez&quot;
        title=&quot;&quot;
        src=&quot;/static/f1f5b66dc4103bdc7aa4f18bca70af3c/fcda8/antirez.png&quot;
        srcset=&quot;/static/f1f5b66dc4103bdc7aa4f18bca70af3c/12f09/antirez.png 148w,
/static/f1f5b66dc4103bdc7aa4f18bca70af3c/e4a3f/antirez.png 295w,
/static/f1f5b66dc4103bdc7aa4f18bca70af3c/fcda8/antirez.png 590w,
/static/f1f5b66dc4103bdc7aa4f18bca70af3c/e5715/antirez.png 768w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;🧠 Write Code Like Salvatore Sanfilippo (antirez)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Drawn from Salvatore Sanfilippo’s &lt;a href=&quot;https://antirez.com/news/124&quot;&gt;blog post on comments&lt;/a&gt; and the &lt;a href=&quot;https://github.com/redis/redis&quot;&gt;Redis source code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Each tip includes concrete actions and examples for you to follow.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. Write Comments with a Purpose Class – Not a Reflex&lt;/h2&gt;
&lt;p&gt;Sanfilippo categorizes comments into nine types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Function&lt;/li&gt;
&lt;li&gt;✅ Design&lt;/li&gt;
&lt;li&gt;✅ Why&lt;/li&gt;
&lt;li&gt;✅ Teacher&lt;/li&gt;
&lt;li&gt;✅ Guide&lt;/li&gt;
&lt;li&gt;✅ Checklist&lt;/li&gt;
&lt;li&gt;❌ Trivial&lt;/li&gt;
&lt;li&gt;❌ Debt&lt;/li&gt;
&lt;li&gt;❌ Backup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt; Before committing code, mentally label every new comment. Keep it only if it fits in the first six.&lt;/p&gt;
&lt;h2&gt;2. Put a Design Comment at the Top of Every Non-Trivial File&lt;/h2&gt;
&lt;p&gt;He often opens a file with a short essay on &lt;strong&gt;how&lt;/strong&gt; the piece works and &lt;strong&gt;why&lt;/strong&gt; the chosen algorithm won.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt; Start new modules with a 10–20 line &lt;em&gt;“README-inside-the-file”&lt;/em&gt; explaining the approach and discarded alternatives.&lt;/p&gt;
&lt;h2&gt;3. Use “Why Comments” to Freeze Hidden Reasoning&lt;/h2&gt;
&lt;p&gt;Lines that seem obvious in a diff often hide performance traps or protocol quirks. He documents those explicitly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt; Anytime you touch a conditional or a magic constant, ask: &lt;em&gt;“Will future-me remember why?”&lt;/em&gt; If not, write a Why comment.&lt;/p&gt;
&lt;h2&gt;4. Lower Cognitive Load with Guide Comments and Vertical Rhythm&lt;/h2&gt;
&lt;p&gt;Redis files often have simple headers like:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;c&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;/* Free the query buffer */&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;These serve as section dividers to help skimming.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt; When a function exceeds ~40 lines, break it into visual blocks using one-line &lt;code&gt;Guide&lt;/code&gt; comments.&lt;/p&gt;
&lt;h2&gt;5. Annotate Dynamic State &lt;em&gt;In Situ&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;In Redis Lua helpers, he prints the Lua stack after every mutation—so readers never reconstruct it mentally.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt; For code that mutates state (stack, buffer, etc.), add live commentary after each transformation.&lt;/p&gt;
&lt;h2&gt;6. Keep the File/Build Surface Tiny&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/antirez/kilo&quot;&gt;Kilo&lt;/a&gt;, his text editor, is &amp;#x3C;1000 LOC. Redis builds with one &lt;code&gt;make&lt;/code&gt;. He avoids unnecessary complexity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Favor plain C/C++ (or Go/Rust) and the standard library unless a third-party dependency buys &lt;em&gt;a lot&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Resist new build steps. If one is needed, explain it in the Design comment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;7. Model First, Code Later – “Code is Rewriting”&lt;/h2&gt;
&lt;p&gt;He compares coding to rewriting paragraphs in a novel—iterate until it reads well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt; For greenfield components, plan to rewrite the first version at least once before merging.&lt;/p&gt;
&lt;h2&gt;8. Short, Single-Purpose Functions with CamelCase Names&lt;/h2&gt;
&lt;p&gt;Redis helpers like &lt;code&gt;raxSeekGreatest&lt;/code&gt; or &lt;code&gt;clientHasPendingReplies&lt;/code&gt; are clear, action-oriented, and do one thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep functions &amp;#x3C;100 LOC; if it grows, split it.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;UpperCamelCase&lt;/code&gt; for functions and &lt;code&gt;lowerCamelCase&lt;/code&gt; for variables.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;9. Prefer Data-Structure-Driven Design&lt;/h2&gt;
&lt;p&gt;He crafts his own arrays (&lt;a href=&quot;https://github.com/redis/redis/blob/unstable/src/sds.c&quot;&gt;SDS&lt;/a&gt;), radix trees (&lt;a href=&quot;https://github.com/antirez/rax&quot;&gt;Rax&lt;/a&gt;), and vectors instead of using generic containers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sketch your data structure on paper.&lt;/li&gt;
&lt;li&gt;If generic containers hide too much logic or performance, implement a slim, focused version and document it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;10. Use Comments as an Analysis Tool&lt;/h2&gt;
&lt;p&gt;He sees comments as a tool for &lt;strong&gt;rubber-duck debugging&lt;/strong&gt;—if you can’t explain it clearly, it’s not ready.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Action →&lt;/strong&gt; Don’t commit until you can explain every non-trivial function in 2–3 sentences that feel &lt;em&gt;obviously true&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;🛠️ Putting It into Practice&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start&lt;/strong&gt; each file with a &lt;strong&gt;Design comment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code&lt;/strong&gt; small, single-purpose functions; separate logic using &lt;strong&gt;Guide comments&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review&lt;/strong&gt; all comments: label them, trim the unnecessary ones, add Why or Teacher comments as needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactor&lt;/strong&gt; if a comment feels like an apology or excuse—make the code speak for itself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commit&lt;/strong&gt; with a message that reflects what changed and &lt;em&gt;why&lt;/em&gt;, ideally mirroring your Why comments.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Follow this loop and your codebase will begin to read like Redis:
&lt;strong&gt;direct&lt;/strong&gt;, &lt;strong&gt;self-narrating&lt;/strong&gt;, and friendly to the next engineer—quite possibly &lt;em&gt;future-you&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;📚 Further Reading &amp;#x26; Resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;📝 &lt;a href=&quot;https://antirez.com/news/124&quot;&gt;Salvatore’s blog post on comments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🧠 &lt;a href=&quot;https://github.com/redis/redis&quot;&gt;Redis source code (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;✏️ &lt;a href=&quot;https://github.com/antirez/rax&quot;&gt;Rax: A radix tree implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📃 &lt;a href=&quot;https://github.com/redis/redis/blob/unstable/src/sds.c&quot;&gt;SDS (Simple Dynamic Strings) in Redis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💡 &lt;a href=&quot;https://github.com/antirez/kilo&quot;&gt;Kilo — 1K LOC text editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📺 &lt;a href=&quot;https://www.youtube.com/@antirez&quot;&gt;Youtube Channel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Balancing AI Tools in Development: A Practical Workflow Guide]]></title><description><![CDATA[I have been using to do my professional work since 2 years when Github Copilot was launched and we got an official subscription from work…]]></description><link>https://vinitkumar.me/ai-workflow/</link><guid isPermaLink="false">https://vinitkumar.me/ai-workflow/</guid><pubDate>Wed, 07 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been using to do my professional work since 2 years when Github Copilot was launched and we got an official subscription from work. Since they I have used Claude, ChatGPT and more recently Cursor AI.&lt;/p&gt;
&lt;p&gt;However, these days I am getting mixed feelings about it. I believe getting AI to work in Agent Mode will basically cause brain atrophy and you will loose your ability to reason and program well. So solve this, I would use AI more as a pair programmer or research assistant and not as a code generator. And even in the case, it generates the code it has to to pass all benchmarks and code standards.
It is very easy to get overwhelmed by AI and the amount of code it generates.&lt;/p&gt;
&lt;p&gt;So from now on, this will be my workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Take the problem statement and think hard about it. Come up with a plan.&lt;/li&gt;
&lt;li&gt;Ask the same problem to the AI and use their thinking mode to come up with a plan. See if the plan is similar to mine and if mine can use some ideas from it.&lt;/li&gt;
&lt;li&gt;Once the plan is complete, start writing the code with a fast feedback loop and preferably in a test driven way to ensure the code written is correct.&lt;/li&gt;
&lt;li&gt;Once the code is written, ask the AI to review the code and suggest improvements. Again, no agentic mode here and I want to write all the code committed from my name. AI can be used to generate documentation but has to be critically reviewed.&lt;/li&gt;
&lt;li&gt;Finally, make a MR/PR and then get the review done and there would be cycle of QAs to check my work.&lt;/li&gt;
&lt;li&gt;I believe I can use the AI to its strengths and at the same time now weaken my abilities by over relying on it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it folks! Maybe you get smarter and prosper.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Natural Coder]]></title><description><![CDATA[I am a natural coder. I have always been someone who writes software because I enjoy it. I have over a decade of experience with Python and…]]></description><link>https://vinitkumar.me/natural-coder/</link><guid isPermaLink="false">https://vinitkumar.me/natural-coder/</guid><pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I am a natural coder. I have always been someone who writes software because I enjoy it. I have over a decade of experience with Python and JavaScript, but I enjoy working with any language or framework and quickly become proficient. However, of late, I have struggled with some aspects, and upon introspection, I realize it boils down to trying to copy others’ styles and ways of working rather than honing my natural abilities and doing something for enjoyment rather than for other goals.&lt;/p&gt;
&lt;p&gt;Goals such as trying to prove myself at a new job or cementing my role as an OSS community leader. The problem with these is that I constantly feel under pressure and am not doing it for fun. This will only lead to burnout.&lt;/p&gt;
&lt;p&gt;I just want to be my own cheerleader and a reasonable critic, doing honest work every day. On top of these things, I will focus on activities that I enjoy and only spend a limited amount of time on them so that I crave them more and more.&lt;/p&gt;
&lt;p&gt;I hate the constant feeding frenzy that short-form content has made us addicted to. So, no more constant dopamine-seeking; I want to do it for fun and enjoyment while writing the best possible code with the tools at hand.&lt;/p&gt;
&lt;p&gt;That’s it. That’s the goal. Wish me luck!!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Oscura Vim - My New Favorite Theme Collection]]></title><description><![CDATA[I’ve been coding for quite a while now, and one thing that really matters is having a comfortable theme that doesn’t strain your eyes. I…]]></description><link>https://vinitkumar.me/oscura-vim/</link><guid isPermaLink="false">https://vinitkumar.me/oscura-vim/</guid><pubDate>Fri, 28 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been coding for quite a while now, and one thing that really matters is having a comfortable theme that doesn’t strain your eyes. I recently created Oscura Vim, a port of the excellent &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Fey.oscura&quot;&gt;Oscura Theme for VSCode&lt;/a&gt; by the Fey team. The original theme’s meticulously curated accent colors and precisely balanced contrast inspired me to bring this sophisticated coding environment to Vim users. I also sought permission from them before publishing my port.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Of course! 🤝 and the port looks great&lt;/p&gt;&amp;mdash; T. Costa (@tcosta_co) &lt;a href=&quot;https://twitter.com/tcosta_co/status/1902719689903534386?ref_src=twsrc%5Etfw&quot;&gt;March 20, 2025&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h2&gt;Why Another Theme Collection?&lt;/h2&gt;
&lt;p&gt;Let’s be honest - there are countless themes out there. However, Oscura (originally crafted by the Fey team) stands out because it actually solves real problems. Following the original design principles, I’ve maintained four variants in the Vim port:&lt;/p&gt;
&lt;h3&gt;🌙 Dark Themes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Oscura&lt;/strong&gt;: A deep, rich dark background (#0B0B0F) that’s perfect for late-night coding sessions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.75675675675677%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACaklEQVR42oVT2XKjMBD0mw9ucSOBY8DEccpbW/mEzSb5xfW3WtFsjwDHSe3x0DUDQj3dM8PiqFT/9DScm647d8PhPDw8fsbh4fz47fv5BHB+wLvD12+A/vDwS4FrIXzxKmVDZVWTUq3Z7Qba7fYW27uemi3QdFRPmHP7foQZY0dpWr4uHMd/cT1h8rzSXbe7qLrWSta67ba6aWrteaF2nED7XqRdB/nG054f6PXK1aulw7hwxPN7IMTPhe/7L74fU1kWdDrtzf19T7u2p7YdlTVNC+V3wJbqup1iQ64XkutaGI4oTJaQFUZRSnGcEYiN7wsKw4iiKKYgEMTPfD4jjnPEzL6Hcobh6LoBXRUGQUJFIWkYOtP3e9oPA0mpKMsLEiAQIqMsqywZ+kRJUqBY/HdC1xX4MKXjkQk7DKS39vJc2YvLpXMDl1Yrl9ZrjzYbn2E4MunVsiwV3amK1ZgkyUFUoKclVOWUpDnUVxZlKaEug+IEtq8wcy5mQrZSFSVWR1rCNM0msmy0mTF5iULS2uf+cX8nmDm/EnIPhcgpTnLDF4TggUSYXDRdji04v7H6Z8vzUEpYatvWDBiIUvLDFgqkaQGrPIx8HsQtPg+FFYbWf8YqzKgmIge7ZdUA6yv8/xOOCmPulSlK9S5lbbAysJ6asUAyITZowQ0EFjpiu+9sG8I+CHlhQcCNNzzNOC6w3KlVzUvM52GY2B5OfwfA/bW95QLjuRAvsBw8g0jnhdTo1QWLq/m/xqJrKLZ5xsgqjaIa1iygSKMQn11QmL+7gPzHIgiC0HGc581m8wa8/gtw8wk3Z29LcDDXbwRHXV/eixosAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;oscura&quot;
        title=&quot;&quot;
        src=&quot;/static/9413b1e792b214aab71da509f8163314/fcda8/nvim2.png&quot;
        srcset=&quot;/static/9413b1e792b214aab71da509f8163314/12f09/nvim2.png 148w,
/static/9413b1e792b214aab71da509f8163314/e4a3f/nvim2.png 295w,
/static/9413b1e792b214aab71da509f8163314/fcda8/nvim2.png 590w,
/static/9413b1e792b214aab71da509f8163314/efc66/nvim2.png 885w,
/static/9413b1e792b214aab71da509f8163314/c83ae/nvim2.png 1180w,
/static/9413b1e792b214aab71da509f8163314/203d3/nvim2.png 1322w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Oscura Dusk&lt;/strong&gt;: A slightly lighter variant (#131419) that works well in various lighting conditions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.75675675675677%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACqklEQVR42nWT227iMBCGc4fEBYWEJNixkzhxQtK0lHa1B1GoeoCutLd9l0pc9i2WZ8X17NgJUK0E0qd/iJ3xzO+Jk/sDOZ/JXSLlTshqV1a1RRqt27i5nu2a2fz0rHv+FVlWfxlj0nl7e3v9tVgBjzOopqWuqgaKsoFyemVVFpeQS0NtkRhbiiO63VODT8ir8/HxsVk+vOiIMvXzW7lvmlw1TaGK60LlZaH8IFLeeKKCkKqxT9TID5UbTtTIDdVwFBj2nX66brB2ttvtZnH/CIQymN/d6ru7S7iaNzC9mWGFU6SALJdIbmNRZBAjnh+BNyYG3Sl0Cd83q4dnCHwKaUw0oRGEE4YHcJgQoxSJkcQSRQIoqh+wcwm3m+XyCSLG4cf3Ws9uari6bmxVcZIiHNdS9DhHFdZrxgUeys8nXCwewQ8pzG5vdH1Zw7SagixNQmEruRgGiA+DC9/qcBTCyJ2A61l0p6eE6/UfYBGHpmQ6TRNI0gyEyFBTSEWCscRY4jpqnFoL6Al9iIOgS/jwuLaeVWWmY3yB89RW12ps2zQtm8Q0SiEImfW5Qx9i95DwfvkMYUCgkkwzziHEGw9CczkUiTDm1jPT/pdWz7dsLoVgy3ghuplXEMscK4nRfAbmgIhltkpzKd6YHi7j/NgsV2ZsCOQJ0RRHJQwj+6KppiW0uF74f7IzY7N6wnaoLsr8U0yFFrnUE5Jo9Ar94cYjjLke+5HGLweVHhVb/WzbDlsP39/bwcZF4InUVODgYouEmEFO7TBjciS2l4FJ7V6jrbexOdiuY8KNE2fZi8hKhR4pHOA9Y8LGcZJbTMx4pjgXakK4wkqUOzbfcoD/mVnf0ygxe/ee5z07+Bv2er2Xfr//u9fvv57oHeP+gcHgyKBTfNfs+W1yXDjO8B9HEYsFMIZHZAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;oscura-dusk&quot;
        title=&quot;&quot;
        src=&quot;/static/ff22d9125b98de7bdc82519f19db2b07/fcda8/nvim3.png&quot;
        srcset=&quot;/static/ff22d9125b98de7bdc82519f19db2b07/12f09/nvim3.png 148w,
/static/ff22d9125b98de7bdc82519f19db2b07/e4a3f/nvim3.png 295w,
/static/ff22d9125b98de7bdc82519f19db2b07/fcda8/nvim3.png 590w,
/static/ff22d9125b98de7bdc82519f19db2b07/efc66/nvim3.png 885w,
/static/ff22d9125b98de7bdc82519f19db2b07/c83ae/nvim3.png 1180w,
/static/ff22d9125b98de7bdc82519f19db2b07/203d3/nvim3.png 1322w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;☀️ Light Themes (NEW!)&lt;/h3&gt;
&lt;p&gt;I’m excited to announce that I’ve added two new light mode variants to the collection:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Oscura Light&lt;/strong&gt;: A clean, modern light theme designed for bright environments. Provides excellent readability with a professional appearance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABSklEQVR42p1Sy07CQBTl/z/ApXGrCxPjRrdqjA8kVeQpNJRSpo9hOqWlD2jneIuYSA0JMMlZ3NfJmXtPzeUCU9eHDCJEiwRJmmGRpIgJabZEtlz9Q5pV4yXyQsFiNmoyjMGDGHGWYp+nCIVS27lN7HKO2kyGCMIF5DxEZ6CvB6QMIITYat6b0BNz2K6Awyw83F6uCwXJz4viOIWeT4RcgjMd2s0JVlQIzAmi0ei3+3BCy+YYGUNcX50hp5o/syC58YfiIMIQzPbQ03WcXpwjyXL02x/oN+vH7VCQXYIwgkOHeNPHKGhkRbYocdQOeanQD+BEAsyzYdpT8hb5SuXrQVVBmSsPtpXbHNDxvPLLMRhZZhK7MDhDZziA1moSubPbiwq7FWqtHhrtLurdJu5ennH/+IT3zxa6/S8YpokxXbwKoxqPf/peGxq+Af2VUNjnzprvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;oscura-light&quot;
        title=&quot;&quot;
        src=&quot;/static/6b366b1a88190ef18bbf7058810baf99/fcda8/oscura-light.png&quot;
        srcset=&quot;/static/6b366b1a88190ef18bbf7058810baf99/12f09/oscura-light.png 148w,
/static/6b366b1a88190ef18bbf7058810baf99/e4a3f/oscura-light.png 295w,
/static/6b366b1a88190ef18bbf7058810baf99/fcda8/oscura-light.png 590w,
/static/6b366b1a88190ef18bbf7058810baf99/efc66/oscura-light.png 885w,
/static/6b366b1a88190ef18bbf7058810baf99/c83ae/oscura-light.png 1180w,
/static/6b366b1a88190ef18bbf7058810baf99/29114/oscura-light.png 1920w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Oscura Dusk Light&lt;/strong&gt;: A warm light variant with dusk-inspired colors. Perfect for users who want the benefits of a light theme with warmer, more comfortable tones.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.08108108108109%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABZklEQVR42p1STU/CQBDt//8BHo1XTTzoSa+YGD8QUUQLQrEU22136ScWtu32uV0wgSoJssk7vNl5s29mVqN+AMICxMkX0vkCnGeYLzgWElmWI8+LX8iyOs9RloBDXGhhkoJGKVK+wC5H6iAq9XpsxT3GoE3DRLkL4wT6wFAXYRjB9/2N5J0LEhbik0zh2BM0Lk+VgMs2KghRovgDeVHnQhUkHoXm+TEIDcFsA+2LA+TyIrImSEaj5etSUBn4gaSqyEZMLB26VDqkQQybMHyYQ5yfHaF6LPBthMxca/IfLdMgkduh6BkGDk+OMecF+q/P6Hea+83Qj2aIkhlcuYgHYwwhJTnPFfbaMqscBhHcmQ+HEljEBs8yFGWhhGUNVawQYjMmxGqGtGo5hSO/zCT1YDIHb8MB2t2OLO5u/4sltjtsd3tovepo6h007m5xdX2Dp5cu9P47TMvCWG68DrPOx5bKvW894hvnhVCnSDNN+AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;oscura-dusk-light&quot;
        title=&quot;&quot;
        src=&quot;/static/a2a8411de101de7f41c23783c64f3b7a/fcda8/oscura-dusk-light.png&quot;
        srcset=&quot;/static/a2a8411de101de7f41c23783c64f3b7a/12f09/oscura-dusk-light.png 148w,
/static/a2a8411de101de7f41c23783c64f3b7a/e4a3f/oscura-dusk-light.png 295w,
/static/a2a8411de101de7f41c23783c64f3b7a/fcda8/oscura-dusk-light.png 590w,
/static/a2a8411de101de7f41c23783c64f3b7a/efc66/oscura-dusk-light.png 885w,
/static/a2a8411de101de7f41c23783c64f3b7a/c83ae/oscura-dusk-light.png 1180w,
/static/a2a8411de101de7f41c23783c64f3b7a/29114/oscura-dusk-light.png 1920w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;What I particularly love about this theme collection is its high contrast and readability across all variants. When you’re debugging a tricky issue or reviewing pull requests, the last thing you want is eye strain from poor color choices.&lt;/p&gt;
&lt;h2&gt;Installation and Setup&lt;/h2&gt;
&lt;p&gt;Setting up Oscura is straightforward. If you’re using Vim-Plug like I do, just add this to your &lt;code&gt;.vimrc&lt;/code&gt;:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;Plug &amp;#39;vinitkumar/oscura-vim&amp;#39;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;For Neovim users with Lazy.nvim (my current setup), you can configure it like this:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;{
  &amp;#39;vinitkumar/oscura-vim&amp;#39;,
  lazy = false,  -- We want the theme available at startup
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;After installation, activate any of the four themes by adding one of these lines to your &lt;code&gt;.vimrc&lt;/code&gt;:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;&amp;quot; Dark themes
colorscheme oscura          &amp;quot; Classic dark
colorscheme oscura-dusk     &amp;quot; Dark dusk variant

&amp;quot; Light themes (NEW!)
colorscheme oscura-light    &amp;quot; Classic light
colorscheme oscura-dusk-light &amp;quot; Light dusk variant&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Auto-switching Based on Time&lt;/h3&gt;
&lt;p&gt;You can even set up automatic theme switching based on the time of day:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;function! SetOscuraTheme()
  let hour = str2nr(strftime(&amp;#39;%H&amp;#39;))
  if hour &amp;gt;= 6 &amp;amp;&amp;amp; hour &amp;lt; 18
    &amp;quot; Daytime - use light theme
    colorscheme oscura-light
  else
    &amp;quot; Nighttime - use dark theme
    colorscheme oscura
  endif
endfunction

&amp;quot; Call on startup
call SetOscuraTheme()&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;What Makes It Special?&lt;/h2&gt;
&lt;p&gt;Having used this theme collection for a while now, here’s what stands out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;4 Complete Themes&lt;/strong&gt;: 2 dark + 2 light variants to suit any preference or lighting condition&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimized for Productivity&lt;/strong&gt;: Designed for long coding sessions with excellent eye comfort&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High Contrast&lt;/strong&gt;: Excellent readability in all lighting conditions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comprehensive Syntax Highlighting&lt;/strong&gt;: Support for 50+ programming languages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modern UI Support&lt;/strong&gt;: Status lines, line numbers, popup menus, and more&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git Integration&lt;/strong&gt;: Enhanced diff highlighting and merge conflict markers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search &amp;#x26; Visual Mode&lt;/strong&gt;: Clear highlighting for search results and selections&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin Compatibility&lt;/strong&gt;: Works with popular plugins like LSP, Treesitter, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Real-world Usage&lt;/h2&gt;
&lt;p&gt;I’ve been using Oscura during my daily coding sessions, and it’s made a noticeable difference. The theme maintains good contrast even during those long debugging sessions when you’re trying to track down a particularly nasty bug. The enhanced TypeScript support is particularly useful since that’s what I work with most days.&lt;/p&gt;
&lt;p&gt;With the new light themes, I can now seamlessly switch between dark and light modes depending on my environment. The light variants are perfect for bright office environments or daytime coding, while the dark themes remain ideal for late-night sessions.&lt;/p&gt;
&lt;p&gt;Sometimes, I switch between the original Oscura and Oscura Dusk depending on the time of day and lighting conditions. The Dusk variants work better during transitional periods, while the classic variants are perfect for consistent lighting environments.&lt;/p&gt;
&lt;h2&gt;A Note on Requirements&lt;/h2&gt;
&lt;p&gt;Make sure your Vim setup supports true colors - it makes a huge difference in how the theme renders. You’ll need Vim 7.4 or later, but honestly, you should be on a much newer version anyway.&lt;/p&gt;
&lt;p&gt;If you’re looking for a comfortable, eye-friendly theme collection that doesn’t compromise on readability and offers both dark and light options, give Oscura a try. It’s become an essential part of my development setup, and I think you’ll appreciate it too.&lt;/p&gt;
&lt;h2&gt;Credits&lt;/h2&gt;
&lt;p&gt;This Vim colorscheme collection is based on the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Fey.oscura&quot;&gt;Oscura Theme for VSCode&lt;/a&gt; created by the Fey team. Their original design’s color palette and principles guided this Vim port. If you’re a VSCode user, I highly recommend checking out their original theme.&lt;/p&gt;
&lt;p&gt;Cheers! 🤘&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mission Statement of Thorstel Ball]]></title><description><![CDATA[Here is a tweet from Thorsten Ball: Programming Principles It was amazing to read this, but it was still an image, so I uploaded the image…]]></description><link>https://vinitkumar.me/thorsten-mission-statement/</link><guid isPermaLink="false">https://vinitkumar.me/thorsten-mission-statement/</guid><pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here is a tweet from Thorsten Ball:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Just re-discovered these Programming Principles I wrote down in a note called &amp;quot;Mission Statement&amp;quot; years ago.&lt;br&gt;&lt;br&gt;I still think I stand by them 100%? &lt;a href=&quot;https://t.co/uCcaj6KrjG&quot;&gt;pic.twitter.com/uCcaj6KrjG&lt;/a&gt;&lt;/p&gt;&amp;mdash; Thorsten Ball (@thorstenball) &lt;a href=&quot;https://twitter.com/thorstenball/status/1904602053634383901?ref_src=twsrc%5Etfw&quot;&gt;March 25, 2025&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h2&gt;Programming Principles&lt;/h2&gt;
&lt;p&gt;It was amazing to read this, but it was still an image, so I uploaded the image to ChatGPT and asked it to extract the text, which is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Before all: write code for others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Working code is not enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write as little code as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write code to be changed and deleted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Solve the problem behind the feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nurse your codebase like a garden.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beauty has a place in software development.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Practice over theory. Theory is fantastic, but be mindful of the gap between practice and theory. And if you don’t see the gap, you need more practice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chop up the problem so that each problem is easy to understand and solve.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be fearless. Never be scared of looking into or touching code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I want to build robust systems that run for years on their own, that are easy to modify, in which bugs are easily spotted and removed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I want my systems to do their job and nothing more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Always strive towards high quality and know when tradeoffs need to be made.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I value simplicity higher than easiness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“It works” is not good enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have a bad memory and I build systems with that in mind.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I work with other people and the artifacts of my work should reflect that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hacking is not programming, nor is professional software development.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The history of the software is as important as its future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Robustness, simplicity, and maintainability are most important.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The artifacts of my work should do what they promise to do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I care about my work and what I build.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I love building.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I strive to reduce things to their most simple form.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elegance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove what’s not necessary.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Carefulness and thoroughness are essential parts of my work, even when going fast.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I strive for my work to be neat and uncluttered — “Ordentlichkeit”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I invest in my tools. Knowing how my tools work is important. Knowledge of my tools will pay off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Knowledge further down in the stack gives me more leverage higher up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I favor the Unix philosophy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Predictability is more important than “magic”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I try to work it out on my own, then ask other people.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Asking for help is good. Helping others is good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I never want to hear myself say: “We do it this way, because we’ve always done it this way”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I will always write code with debuggability and deletability in mind.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It depends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Good programmers program a lot. “If you want to get better at benching you need to bench more” “Everybody wants to be a body builder, but nobody wants to lift those heavy ass weights”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you can do it in a single machine, do it in a single machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you can get away without state: database, cash, memory — do it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You should have a healthy amount of respect and fear of building distributed systems. If you don’t, you’re either missing something or you don’t know the tools. Knowing how things break is important.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you think something not only has upsides, but no downsides, you probably haven’t used it enough. Tradeoffs are the name of the game.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Never fall for dogma. If you lean towards a dogmatic view — try the other side. You’ll see why the dogma doesn’t always apply.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the same vein: watch technologies and domains like a dog go faster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I always believed that technical debt can be avoided. Now I know:&lt;/p&gt;
&lt;p&gt;(1) taking on technical debt can be a conscious decision to go fast&lt;/p&gt;
&lt;p&gt;(2) not every bit of debt needs to be repaid immediately, some can linger and is not worth being repaid ever.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full credit is to &lt;a href=&quot;https://x.com/thorstenball&quot;&gt;Thorsten&lt;/a&gt; for sharing it with the world. I hope you find these principles as insightful as I did.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Pour Your Heart Into It]]></title><description><![CDATA[Lately, we’ve been spending a lot of time in coffee shops. Yesterday, at the Starbucks in Amanora, Pune, I noticed a quote on the wall…]]></description><link>https://vinitkumar.me/pour-your-heart-into-it/</link><guid isPermaLink="false">https://vinitkumar.me/pour-your-heart-into-it/</guid><pubDate>Sat, 15 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4e0acfdb1bf95287c2e4bb3ddcbab151/0ae7a/pour-your-heart.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 177.7027027027027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAkABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQEC/8QAFwEBAQEBAAAAAAAAAAAAAAAAAQADAv/aAAwDAQACEAMQAAABqW5b2OuC2DRT50pXGSmD0JwHX//EAB0QAAIDAAIDAAAAAAAAAAAAAAECAAMRBCEiMTL/2gAIAQEAAQUCWvYONoanD8BOww7ZSwUMIfYvCxeTqtf5MolFYZCgB//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AWP/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AV//xAAcEAABBQADAAAAAAAAAAAAAAAAAQIQESEiMVH/2gAIAQEABj8CnEnPTqHCq44rhQ6ykP/EABwQAQADAAMBAQAAAAAAAAAAAAEAESEQMVFhcf/aAAgBAQABPyFF1NBqLRUuhs2J1DggTvqVN1Pb4tw2jkygB4x1Wn4hKob8gb6NipGp/9oADAMBAAIAAwAAABD7F04IL//EABgRAQEAAwAAAAAAAAAAAAAAAAEAESEx/9oACAEDAQE/EFxakiPYv//EABkRAAIDAQAAAAAAAAAAAAAAAAABEBEhMf/aAAgBAgEBPxBGlaWLjj//xAAeEAEAAwACAgMAAAAAAAAAAAABABEhMUFRYZGh0f/aAAgBAQABPxCqB+IjAGot6fUwImrfRLWC64mjJqAMLDN8yinZtOEQqJN3MmB0QrIIBYtsaOgFGLhV2pZ9Q974QFnPDUJwD6/J/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;pour your heart into it&quot;
        title=&quot;&quot;
        src=&quot;/static/4e0acfdb1bf95287c2e4bb3ddcbab151/1c72d/pour-your-heart.jpg&quot;
        srcset=&quot;/static/4e0acfdb1bf95287c2e4bb3ddcbab151/a80bd/pour-your-heart.jpg 148w,
/static/4e0acfdb1bf95287c2e4bb3ddcbab151/1c91a/pour-your-heart.jpg 295w,
/static/4e0acfdb1bf95287c2e4bb3ddcbab151/1c72d/pour-your-heart.jpg 590w,
/static/4e0acfdb1bf95287c2e4bb3ddcbab151/a8a14/pour-your-heart.jpg 885w,
/static/4e0acfdb1bf95287c2e4bb3ddcbab151/fbd2c/pour-your-heart.jpg 1180w,
/static/4e0acfdb1bf95287c2e4bb3ddcbab151/0ae7a/pour-your-heart.jpg 2034w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Lately, we’ve been spending a lot of time in coffee shops. Yesterday, at the Starbucks in Amanora, Pune, I noticed a quote on the wall: “Pour Your Heart Into It.”&lt;/p&gt;
&lt;p&gt;For some reason, it struck me instantly. Maybe because, right now, I’m struggling with exactly that—fully committing myself to everything I do. It’s not easy. In fact, it’s incredibly difficult. But it’s also worth it, especially when applied to things that truly matter. Learning to work with deep focus is a skill worth mastering.&lt;/p&gt;
&lt;p&gt;I want to create meaningful work—work that brings both fulfillment and satisfaction. But doing so requires a mindset shift. Struggling and growing are choices, and seeing life through that lens isn’t always easy. Yet, anything worth achieving demands effort. Nothing comes without hard work.&lt;/p&gt;
&lt;p&gt;So, for me, this is a reminder to cut down on distractions and procrastination. To focus. To pour my heart into what matters.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Professional Vim Configuration: Terminal and GUI Setup for Modern Development]]></title><description><![CDATA[As a long-time Vim user, I’ve carefully curated my Vim configuration to create a powerful and efficient development environment. My setup…]]></description><link>https://vinitkumar.me/current-vim-setup/</link><guid isPermaLink="false">https://vinitkumar.me/current-vim-setup/</guid><pubDate>Tue, 11 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As a long-time Vim user, I’ve carefully curated my Vim configuration to create a powerful and efficient development environment. My setup works seamlessly in both terminal Vim and GVim (GUI Vim), providing flexibility depending on my needs. Let me walk you through the key components and explain why I chose them.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9b5498a6b42835cd00144cf00034dc6e/7ebf9/mvim-current.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.02702702702703%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACeElEQVR42mWRSU+TURSGb/sN/fq1DCaCERQTIopYSueRtkzViiiKTCogSoVikCExiokDxriRwEJFxSFGRaPRjQt+3+MpGF24eHNyF/e5z3uuShUKBJNp/KndtMQzHIulaZY0BaIkh64y9vwbpY0tFja/MC9Z+fyd2+++MrvxiSvr7+koFslPjjKzsoJqaQtTV7eHffU2Ho+Oy9TQNSdKOSSKPfUHaOzooTbaTlUgge2P426NyozJjGC2hKgKJugvFRmfm0b5giFqqiuwPCYOh9qB7MSxC/Tsb0ALZzCiXRjhHM5ygu04/ElUawJ1PI4VyXJ+dorppRLKHwxSW+kVYAVurwfbdmOaxj9gXQNmKIsdacclF12xHKY8oPsTaAJ1tiaxQmliZ07SOzZSBoaotFy4PTaWbaMbBk6n8y/QW9+AFe/AJZV1AeoRgUVlCtQZSKHaUthyjvflSfQVUJFQgEPVBralC0j7r3LlgYZdI7E0450Cy6FF/gDLtX0JKmJZsoODpIaGUM1HD3OwpgqvVwzdFm6xNE0Xmm7htS32Hj6CEcmJRSdWMIshYCNcnmIsUYGyYYaJxSlKyzdQ44s9pE+kyRXy+JIJfJk08VMpBmY6mX/SxfDiqCy+fCm9s3yXwF1iacjHGFJXtchvh1M8WJ/mzuNJ1ItfV3m0eY6Z+wUGigUGS6cYvtnN3OoJ1n6e49KdCVRjEj2QQYt14ghJVTHUBOw4HkU1RbGk+sMXI6y+voZ6sz3C2+1hNn9c4/PPeV5uFVl9Ncn0cj/3np1h+flZBm/lGVvuZWihl+t3h7k4N0D35TwjS6e5cKubsfs9PP0wztrHCX4DNvVGAXajNLUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;vim-macvim-setup&quot;
        title=&quot;&quot;
        src=&quot;/static/9b5498a6b42835cd00144cf00034dc6e/fcda8/mvim-current.png&quot;
        srcset=&quot;/static/9b5498a6b42835cd00144cf00034dc6e/12f09/mvim-current.png 148w,
/static/9b5498a6b42835cd00144cf00034dc6e/e4a3f/mvim-current.png 295w,
/static/9b5498a6b42835cd00144cf00034dc6e/fcda8/mvim-current.png 590w,
/static/9b5498a6b42835cd00144cf00034dc6e/efc66/mvim-current.png 885w,
/static/9b5498a6b42835cd00144cf00034dc6e/c83ae/mvim-current.png 1180w,
/static/9b5498a6b42835cd00144cf00034dc6e/7ebf9/mvim-current.png 1919w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Essential Plugins&lt;/h2&gt;
&lt;p&gt;My plugin setup is minimal but powerful, managed by vim-plug. Here are the core plugins I use:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;call plug#begin(&amp;#39;~/.vim/plugged&amp;#39;)
  Plug &amp;#39;tpope/vim-commentary&amp;#39;
  Plug &amp;#39;junegunn/fzf&amp;#39;, { &amp;#39;do&amp;#39;: { -&amp;gt; fzf#install() } }
  Plug &amp;#39;junegunn/fzf.vim&amp;#39;
  Plug &amp;#39;neoclide/coc.nvim&amp;#39;, {&amp;#39;branch&amp;#39;: &amp;#39;master&amp;#39;}
  Plug &amp;#39;tpope/vim-fugitive&amp;#39;
  Plug &amp;#39;github/copilot.vim&amp;#39;
  Plug &amp;#39;vimwiki/vimwiki&amp;#39;
call plug#end()&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Each plugin serves a specific purpose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vim-commentary&lt;/strong&gt;: Quick code commenting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fzf &amp;#x26; fzf.vim&lt;/strong&gt;: Lightning-fast fuzzy file finding and searching&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;coc.nvim&lt;/strong&gt;: Modern LSP support for intelligent code completion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vim-fugitive&lt;/strong&gt;: Git integration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;copilot.vim&lt;/strong&gt;: AI-powered code suggestions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vimwiki&lt;/strong&gt;: Personal note-taking and wiki system&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Smart Environment Detection&lt;/h2&gt;
&lt;p&gt;One of the interesting features of my setup is automatic theme switching based on macOS’s appearance settings:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;function! ChangeBackground()
  set termguicolors
  hi LineNr ctermbg=NONE guibg=NONE
  if system(&amp;quot;defaults read -g AppleInterfaceStyle&amp;quot;) =~ &amp;#39;^Dark&amp;#39;
    set background=dark
    if has(&amp;#39;gui_running&amp;#39;)
        colorscheme solarized
        set guifont=Source\ Code\ Pro:h16
    else
        colorscheme base16-bright
    endif
  else
    colorscheme rosepine
    set background=light
  endif
endfunction&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This function automatically switches between light and dark themes based on my system preferences. In GVim, it uses Solarized theme with Source Code Pro font, while in terminal it uses different themes optimized for each environment.&lt;/p&gt;
&lt;h2&gt;File-specific Settings&lt;/h2&gt;
&lt;p&gt;I use autocommands to set specific configurations based on file types:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;augroup filetypedetect
  autocmd BufNewFile,BufRead *.md set filetype=markdown sts=4 shiftwidth=4
  autocmd BufReadPost,BufNewFile *.md,*.txt,COMMIT_EDITMSG set wrap linebreak nolist spell spelllang=en_us complete+=kspell
  autocmd FileType javascript setlocal expandtab sw=2 ts=2 sts=2
  autocmd FileType typescript setlocal expandtab sw=2 ts=2 sts=2
  &amp;quot; ... more file types
augroup END&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This ensures consistent formatting across different file types and enables features like spell checking for markdown and text files.&lt;/p&gt;
&lt;h2&gt;Keyboard Mappings&lt;/h2&gt;
&lt;p&gt;My configuration includes carefully chosen keyboard mappings for efficiency:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;,&lt;/code&gt; as the leader key&lt;/li&gt;
&lt;li&gt;Quick file navigation with &lt;code&gt;Ctrl-p&lt;/code&gt; for file search&lt;/li&gt;
&lt;li&gt;Buffer management with &lt;code&gt;Ctrl-b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Git commit browsing with &lt;code&gt;Ctrl-c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Split window navigation with &lt;code&gt;Ctrl-h/j/k/l&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;GUI vs Terminal Usage&lt;/h2&gt;
&lt;p&gt;When I need seamless system clipboard integration or want a different visual experience, I use GVim. My configuration detects the GUI environment and applies specific settings:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;if has(&amp;#39;gui_running&amp;#39;)
    colorscheme solarized
    set guifont=Source\ Code\ Pro:h16
endif&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;The GUI version offers advantages like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better system clipboard integration&lt;/li&gt;
&lt;li&gt;Custom font rendering with Source Code Pro&lt;/li&gt;
&lt;li&gt;No terminal color limitations&lt;/li&gt;
&lt;li&gt;Easy menu access for less-used commands&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Quality of Life Features&lt;/h2&gt;
&lt;p&gt;Some notable features in my configuration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Automatic Trailing Space Removal&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;autocmd BufWritePre * :call StripTrailingWhitespace()&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;Custom Status Line&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I use a lightweight custom status line configuration instead of heavy plugins:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;set statusline=
set statusline +=%1*\ %n\ %*            &amp;quot;buffer number
set statusline +=%5*%{&amp;amp;ff}%*            &amp;quot;file format
set statusline +=%3*%y%*                &amp;quot;file type
&amp;quot; ... more status line components&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;Auto-reload Files&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;deckgo-highlight-code language=&quot;vim&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;autocmd FocusGained,BufEnter,CursorHold,CursorHoldI *
    \ if mode() !~ &amp;#39;\v(c|r.?|!|t)&amp;#39; &amp;amp;&amp;amp; getcmdwintype() == &amp;#39;&amp;#39; | checktime | endif&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This ensures files are automatically reloaded when changed externally.&lt;/p&gt;
&lt;h2&gt;Code Intelligence with CoC&lt;/h2&gt;
&lt;p&gt;The configuration includes comprehensive CoC (Conquer of Completion) settings for modern IDE-like features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code navigation (go to definition, references)&lt;/li&gt;
&lt;li&gt;Intelligent auto-completion&lt;/li&gt;
&lt;li&gt;Real-time diagnostics&lt;/li&gt;
&lt;li&gt;Code actions and quick fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;My Neovim Setup&lt;/h2&gt;
&lt;p&gt;I also maintain a modern Neovim configuration written in Lua, which provides similar functionality with some modern improvements. Here’s a detailed breakdown of my Neovim setup:&lt;/p&gt;
&lt;h3&gt;Plugin Management with Packer&lt;/h3&gt;
&lt;p&gt;My Neovim configuration uses Packer as the plugin manager, with a carefully selected set of plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Core plugins like &lt;code&gt;fzf&lt;/code&gt; and &lt;code&gt;fzf.vim&lt;/code&gt; for fuzzy finding&lt;/li&gt;
&lt;li&gt;&lt;code&gt;coc.nvim&lt;/code&gt; for LSP support and intelligent code completion&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim-commentary&lt;/code&gt; for quick commenting&lt;/li&gt;
&lt;li&gt;&lt;code&gt;copilot.vim&lt;/code&gt; for AI-assisted coding&lt;/li&gt;
&lt;li&gt;Theme-related plugins including &lt;code&gt;tinted-vim&lt;/code&gt; and &lt;code&gt;solarized-osaka.nvim&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Modern Editing Features&lt;/h3&gt;
&lt;p&gt;The configuration includes numerous modern editing features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Smart Indentation and Formatting&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Auto-indentation&lt;/li&gt;
&lt;li&gt;Smart tab behavior&lt;/li&gt;
&lt;li&gt;Language-specific formatting rules&lt;/li&gt;
&lt;li&gt;Proper UTF-8 encoding support&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;Advanced Folding&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Indent-based folding&lt;/li&gt;
&lt;li&gt;Starts with all folds open&lt;/li&gt;
&lt;li&gt;Custom fold text display&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;Enhanced UI Elements&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Line numbers with relative numbering&lt;/li&gt;
&lt;li&gt;Custom listchars for whitespace visualization&lt;/li&gt;
&lt;li&gt;Modern terminal colors support&lt;/li&gt;
&lt;li&gt;Cursor line highlighting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Solarized Osaka Theme Configuration&lt;/h3&gt;
&lt;p&gt;I use a customized version of the Solarized Osaka theme with specific settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transparent background support&lt;/li&gt;
&lt;li&gt;Custom styling for comments and keywords&lt;/li&gt;
&lt;li&gt;Adaptive brightness for day/night usage&lt;/li&gt;
&lt;li&gt;Special handling for sidebars and floating windows&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Smart Background Switching&lt;/h3&gt;
&lt;p&gt;Similar to my Vim configuration, the Neovim setup includes automatic theme switching based on macOS’s appearance settings:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;function SwitchBackgroundAndColorScheme()
  local mac_ui_mode = vim.fn.system(&amp;#39;defaults read -g AppleInterfaceStyle&amp;#39;)
  mac_ui_mode = mac_ui_mode:gsub(&amp;#39;%s+&amp;#39;, &amp;#39;&amp;#39;)
  if mac_ui_mode == &amp;#39;Dark&amp;#39; then
    vim.opt.background = &amp;#39;dark&amp;#39;
    vim.cmd(&amp;quot;colorscheme solarized-osaka&amp;quot;)
  else
    vim.opt.background = &amp;#39;light&amp;#39;
    vim.cmd(&amp;quot;colorscheme solarized-osaka-day&amp;quot;)
  end
end&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Advanced Auto Commands&lt;/h3&gt;
&lt;p&gt;The Neovim configuration includes a comprehensive set of auto commands using the modern Lua API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File type-specific settings for various languages&lt;/li&gt;
&lt;li&gt;Automatic spell checking for documentation files&lt;/li&gt;
&lt;li&gt;Special theme handling for markdown and wiki files&lt;/li&gt;
&lt;li&gt;Automatic saving for TypeScript files&lt;/li&gt;
&lt;li&gt;Custom handling for YAML files&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Intelligent Key Mappings&lt;/h3&gt;
&lt;p&gt;The configuration includes carefully thought-out key mappings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Leader key set to &lt;code&gt;,&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;File navigation with &lt;code&gt;Ctrl-p&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Buffer management with &lt;code&gt;Ctrl-b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Git integration with &lt;code&gt;Ctrl-g&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Advanced CoC integration for code navigation&lt;/li&gt;
&lt;li&gt;Split window management&lt;/li&gt;
&lt;li&gt;Tab navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CoC Integration&lt;/h3&gt;
&lt;p&gt;The Neovim setup includes sophisticated CoC integration with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tab completion&lt;/li&gt;
&lt;li&gt;Intelligent backspace handling&lt;/li&gt;
&lt;li&gt;Enhanced enter key behavior&lt;/li&gt;
&lt;li&gt;Automatic popup menu navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This Vim and Neovim setup provides a powerful development environment that works seamlessly in both terminal and GUI environments. The configuration focuses on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast file navigation and search&lt;/li&gt;
&lt;li&gt;Modern code completion and intelligence&lt;/li&gt;
&lt;li&gt;Git integration&lt;/li&gt;
&lt;li&gt;Automatic environment adaptation&lt;/li&gt;
&lt;li&gt;Consistent code formatting&lt;/li&gt;
&lt;li&gt;Efficient keyboard mappings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether I’m working in the terminal or need the convenience of GUI features, this setup ensures I have all the tools I need for efficient coding.&lt;/p&gt;
&lt;p&gt;Here is my current config files for vim: &lt;a href=&quot;https://github.com/vinitkumar/.vim/raw/refs/heads/master/vimrc&quot;&gt;https://github.com/vinitkumar/.vim/raw/refs/heads/master/vimrc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is my current Neovim Config: &lt;a href=&quot;https://github.com/vinitkumar/nvim/raw/refs/heads/main/init.lua&quot;&gt;https://github.com/vinitkumar/nvim/raw/refs/heads/main/init.lua&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Feel free to use it or borrow some parts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Fin&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Job Security]]></title><description><![CDATA[In the age of layoffs and company closures, job security is a myth. But there
are ways to make yourself indispensable. Here are some tips…]]></description><link>https://vinitkumar.me/job-security/</link><guid isPermaLink="false">https://vinitkumar.me/job-security/</guid><pubDate>Tue, 11 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the age of layoffs and company closures, job security is a myth. But there
are ways to make yourself indispensable. Here are some tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Do focused work every single day without fail. Consistency is the key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be nice with your colleagues and collaborate effectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep learning new skills and technologies and be proficient at it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn how to write testable code and have an ability to write good tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t waste time on Social Media while at work. It’s a productivity killer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Try too see the bigger picture and understand how your work fits in the grand
scheme of things. Also, foresee if you don’t fit and find a way out of that
situation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work hard, very hard, every single day. Make it an habit of working hard and
trying to improve yourself every single day. Consistency is the key and pays
off handsomely in the long run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be punctual and respect others time. If you have a meeting at 10:00, be there
at 9:55. It shows that you respect others time and are serious about your work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Being great at what you do is probably the only “Real Job Security” you can
have. If you are great at what you do, you will always have a job. Companies
will always need people who are great at what they do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[No Cross Posting In Foreseeable Future]]></title><description><![CDATA[Sharing a blog link on social media and seeing the likes and shares roll in is definitely a dopamine hit, but I’ve decided to stop cross…]]></description><link>https://vinitkumar.me/no-cross-posting/</link><guid isPermaLink="false">https://vinitkumar.me/no-cross-posting/</guid><pubDate>Mon, 10 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sharing a blog link on social media and seeing the likes and shares roll in is definitely a dopamine hit, but I’ve decided to stop cross-posting my blog on social media for the foreseeable future.&lt;/p&gt;
&lt;p&gt;I have specific goals I want to focus on deeply, and I can’t do that if I’m constantly distracted by Twitter and LinkedIn. From now on, I’ll write whatever I feel like, publish it, and leave it at that—no announcements, no notifications. If someone wants to read, they can subscribe to my blog’s RSS feed or just check in on the website from time to time.&lt;/p&gt;
&lt;p&gt;I’m doing this to protect my mental space and avoid getting sucked into the social media vortex. So if you enjoy reading my blog, subscribe to the RSS feed or drop by occasionally.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Simple PDF joiner to Join PDF Files on Mac]]></title><description><![CDATA[I have been quite busy in the last week or so and haven’t had much time to write blog posts. However, today I want to share a simple utility…]]></description><link>https://vinitkumar.me/pdf-joiner/</link><guid isPermaLink="false">https://vinitkumar.me/pdf-joiner/</guid><pubDate>Thu, 27 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been quite busy in the last week or so and haven’t had much time to write blog posts. However, today I want to share a simple utility I created to solve an annoying problem - joining PDF files on Mac.&lt;/p&gt;
&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Recently, I needed to combine multiple PDF files into a single document. Like many people, I started searching online for PDF joining tools. What I found was frustrating - most tools were either:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Web-based applications requiring file upload (privacy concerns)&lt;/li&gt;
&lt;li&gt;Free tools with aggressive upselling tactics&lt;/li&gt;
&lt;li&gt;Expensive commercial software with way more features than needed&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then I discovered something interesting - macOS actually has a built-in PDF joining utility! It’s located at:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/System/Library/Automator/Combine PDF Pages.action/Contents/MacOS/join&lt;/code&gt;. What my utility does is that it adds a nice interface on top of it and you can just it like this:&lt;/p&gt;
&lt;h2&gt;Source Code&lt;/h2&gt;
&lt;p&gt;You can browse the source code here: &lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner&quot;&gt;https://github.com/vinitkumar/pdf-joiner&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;You can install it directly from Github Release be following the above steps. This assumes you have wget installed
on your local machine, if not please run &lt;code&gt;brew install wget&lt;/code&gt;&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;cd /tmp
wget https://github.com/vinitkumar/pdf-joiner/releases/download/1.0.0/pdf-joiner
sudo chmod u+x pdf-joiner
sudo mv pdf-joiner /usr/local/bin&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This should ensure that it is downloaded and is in path, so that you can run the commands below.&lt;/p&gt;
&lt;p&gt;Join two PDF files:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;pdf-joiner file1.pdf file2.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Join multiple PDF files with a specific output path:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;pdf-joiner -o merged.pdf file1.pdf file2.pdf file3.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Join all PDF files in a directory:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;pdf-joiner -o merged.pdf /path/to/directory/*.pdf
`-o`: Specify the output file path. If not provided, the output will be saved as `joined-pdf-YYYY-MM-DD-HHMMSS.pdf` in the current directory.&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;The latest binary can be downloaded from &lt;a href=&quot;https://github.com/vinitkumar/pdf-joiner/releases/download/1.0.0/pdf-joiner&quot;&gt;here&lt;/a&gt; and installed in &lt;code&gt;/usr/local/bin&lt;/code&gt; and can be used as the examples above show the usage.&lt;/p&gt;
&lt;p&gt;Hope this tool also helps you join as many PDF files you want without any issues and for free.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Daily Blog Number 7]]></title><description><![CDATA[Everyone has their demons, and I have mine too. I have struggled with consistency, which affected my blogging routine for the past two days…]]></description><link>https://vinitkumar.me/daily-short-blog-7/</link><guid isPermaLink="false">https://vinitkumar.me/daily-short-blog-7/</guid><pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AFI6LFs7LW44J6JdOsmddti7mtu5ks+je+7n0/by4vf16Pb16/Tt2N+2ieC4jM+TZJNRMmc/LFw8LU83KgBGNStjQjFzPCqkYDvJn3jcxaLTpXvSr5Ds6dfx7Nvx6dXz793w6tbVqIDZroTQmWuVUzRuRTJiQjFUOy0AQC0lYkAwdD4rp2A82LeT4MqpxZJq1cGo3tjC5dvF5te+7OTQ7erW0a2MzZpw0Z5yk1EzbEQxYUIwVDotAGE+LnRKNW87KaljP93CoNSwi7qIZNzax9jPueDYwt/Tu+nizubhy9XApr+GX82YbYtMMGZCMV5BMVE5LQB0UTp6UztmNCSqZUXbvJjAh16/nX/W18PMxKzRybLVybDp5NLn4tDg2se1f13CgVWFSjFiQTBcQTBROi0AjF8+m21IYjMknlw+ypBmpWdDraaJtradxsKqvrqgzMKo0M+uv7uT5uXTu5yEn1MwckUwSzcrRDUqQDMpAJZfOaNvRoJWO5hRNJNEJaWGa7zEqb28or66obu5n8G8mpOOW42HV7i3l9PJtIVTO1k4KUQ3LDgwKjcuKACSVzGcZz+kd1B8STKEWkbNvJ6hh3OvpY/CvJ+5tZzSzrSadVWtnIKhjWvIwKyHZ1FPMiZTOixDNSsyLCgAlFUwkV48Zj0qbkg13NS7zauDcTgcq5mBpotrqZZ+3djDoH1ip5J+sZqCnYt4i3FcgGBNe1hEZEEyRjIpAHA7I2I9LEMuJ1M9M2tiV1xOQUY3LWpbTaV6WYpjTINmUHBWQndbRHlbRYhwXKmJcpxzXbmpl6GSf4Z0YgB+UzxSPTQnKCsrKy0rKSoxLy42MjFCODOLXkGVclm1o46Jc2BuVUJcSDpzZFdfNiloRjq7tqSYkX9wZlcAdFE7YEs8JSMnLi0uMTAwMzExNTExMzIxaFNGfGFSfmtea1ZKX0g5RzguSjswVTAmfmpbgHFeZVJCUkE0AIJLLJFdOD40LyUnLCwrLioqLS8vMCkqK0dCQoJuW2FJNUszJEYyJz4yLGFCNINzZJeWiIF8cG1pXmRaTgCqaj3RlV11YUgYHCUrKiwsLC8qKSsqKyyoq6Hv8uDs6tnNx7aXinuMbmCjhXJxXU5JQDlXVU93dmt7bV4AhGJC3bF5o3xUKCcrLjQ5Njk8Rk9RnKWj6OzgxMa9vbmzsJ6Q0biasm1HYzcoX09GkIN2YE09SzgtPDArAHhWPY5oRVw2J0cnIDwxLnV7eKepoaylnqGXjp2PgrOlld3Rt8Kgg29JPCoWFWFbWK+ch9OmdYpYOFcxIQBaRzZINClTPS11UT99XUudk4LPzL2PgnKtpJSvrKGXmpO/vbC2qZtqXFI1Ly0ZERVOOi7Gn3SweE53QCYAX0o6jnZcnIJniHFdx72j8e/V29W8w7mb08+8saqYlop3nJWHb2pgVEpBTD02STAoWT8yi2pOk189VjUnAFA9L4FgRcWmhYdoT1Y8LpyPfK6gf7OkgcCzmZCHe0U6ND8xKmxaS5F3W8KXbINWOkgsIjgpJTEnJCAfIQCgg2ShhGZ2WECDX0OGWzpFLSJRQjZaTkIxJyQrHRlxWkS0l3LYtorRo3ShdE9TOi0lICEkIiMmIyMlISKgtiGMt8XOqwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;daily-blog-1&quot;
        title=&quot;&quot;
        src=&quot;/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png&quot;
        srcset=&quot;/static/74c90c06a5822f21629dc323f853a7db/12f09/blog1.png 148w,
/static/74c90c06a5822f21629dc323f853a7db/e4a3f/blog1.png 295w,
/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png 590w,
/static/74c90c06a5822f21629dc323f853a7db/efc66/blog1.png 885w,
/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png 1024w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Everyone has their demons, and I have mine too. I have struggled with consistency, which affected my blogging routine for the past two days. On Sunday, we had a busy day filled with family activities. We enjoyed lunch at a &lt;a href=&quot;https://g.co/kgs/3frtVXw&quot;&gt;nice Bengali Food&lt;/a&gt; restaurant in Viman Nagar. While not particularly fancy, the food there is delicious and reminds me of home cooking. I must confess that I’ve grown weary of typical restaurant fare, and these home-style meals nourish both body and soul. Later that afternoon, we visited Third Wave Coffee in Koregaon Park, one of our family’s favorite cafes. My wife and I appreciate it for its coffee and ambiance, while our son enjoys playing Jenga and savoring cakes or cookies. After returning home, we relaxed while contemplating the upcoming Monday.&lt;/p&gt;
&lt;p&gt;Monday began with some stress. I received a message reminding me that I was behind on an important task. This feeling lingered throughout the day, and even after returning from the office, my energy remained low. This also explains my lack of motivation to write a blog post – the inspiration simply wasn’t there.&lt;/p&gt;
&lt;p&gt;This morning, after dropping my child at school, I returned home and slept, as I still wasn’t feeling well. I woke up at 11 AM, realizing I was working from home today to accompany my wife to a scheduled appointment. After her appointment, I picked up my son from school. Since it was lunchtime, we dined at another excellent restaurant we’ve been frequenting lately – Global Punjab in Seasons Mall. They serve authentic Punjabi cuisine that we thoroughly enjoy. Following a satisfying lunch, I returned to work and made significant progress on several issues.&lt;/p&gt;
&lt;p&gt;After completing my work responsibilities, I focused on helping with dinner preparation. Later, I began coding for Django CMS open-source work. I thoroughly enjoy contributing to open-source projects, and my German colleague is excellent to work with. Now that I’ve recounted the events of the past three days, I’m determined to become more consistent and overcome my inner lazy demon that sometimes prevents me from maintaining daily habits.&lt;/p&gt;
&lt;p&gt;Cheers! 🤘&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Daily Blog Number 6]]></title><description><![CDATA[Morning On Saturday morning, we usually try to sleep late since weekends provide our only opportunity for extra rest, but we had a dentist…]]></description><link>https://vinitkumar.me/daily-short-blog-6/</link><guid isPermaLink="false">https://vinitkumar.me/daily-short-blog-6/</guid><pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AFI6LFs7LW44J6JdOsmddti7mtu5ks+je+7n0/by4vf16Pb16/Tt2N+2ieC4jM+TZJNRMmc/LFw8LU83KgBGNStjQjFzPCqkYDvJn3jcxaLTpXvSr5Ds6dfx7Nvx6dXz793w6tbVqIDZroTQmWuVUzRuRTJiQjFUOy0AQC0lYkAwdD4rp2A82LeT4MqpxZJq1cGo3tjC5dvF5te+7OTQ7erW0a2MzZpw0Z5yk1EzbEQxYUIwVDotAGE+LnRKNW87KaljP93CoNSwi7qIZNzax9jPueDYwt/Tu+nizubhy9XApr+GX82YbYtMMGZCMV5BMVE5LQB0UTp6UztmNCSqZUXbvJjAh16/nX/W18PMxKzRybLVybDp5NLn4tDg2se1f13CgVWFSjFiQTBcQTBROi0AjF8+m21IYjMknlw+ypBmpWdDraaJtradxsKqvrqgzMKo0M+uv7uT5uXTu5yEn1MwckUwSzcrRDUqQDMpAJZfOaNvRoJWO5hRNJNEJaWGa7zEqb28or66obu5n8G8mpOOW42HV7i3l9PJtIVTO1k4KUQ3LDgwKjcuKACSVzGcZz+kd1B8STKEWkbNvJ6hh3OvpY/CvJ+5tZzSzrSadVWtnIKhjWvIwKyHZ1FPMiZTOixDNSsyLCgAlFUwkV48Zj0qbkg13NS7zauDcTgcq5mBpotrqZZ+3djDoH1ip5J+sZqCnYt4i3FcgGBNe1hEZEEyRjIpAHA7I2I9LEMuJ1M9M2tiV1xOQUY3LWpbTaV6WYpjTINmUHBWQndbRHlbRYhwXKmJcpxzXbmpl6GSf4Z0YgB+UzxSPTQnKCsrKy0rKSoxLy42MjFCODOLXkGVclm1o46Jc2BuVUJcSDpzZFdfNiloRjq7tqSYkX9wZlcAdFE7YEs8JSMnLi0uMTAwMzExNTExMzIxaFNGfGFSfmtea1ZKX0g5RzguSjswVTAmfmpbgHFeZVJCUkE0AIJLLJFdOD40LyUnLCwrLioqLS8vMCkqK0dCQoJuW2FJNUszJEYyJz4yLGFCNINzZJeWiIF8cG1pXmRaTgCqaj3RlV11YUgYHCUrKiwsLC8qKSsqKyyoq6Hv8uDs6tnNx7aXinuMbmCjhXJxXU5JQDlXVU93dmt7bV4AhGJC3bF5o3xUKCcrLjQ5Njk8Rk9RnKWj6OzgxMa9vbmzsJ6Q0biasm1HYzcoX09GkIN2YE09SzgtPDArAHhWPY5oRVw2J0cnIDwxLnV7eKepoaylnqGXjp2PgrOlld3Rt8Kgg29JPCoWFWFbWK+ch9OmdYpYOFcxIQBaRzZINClTPS11UT99XUudk4LPzL2PgnKtpJSvrKGXmpO/vbC2qZtqXFI1Ly0ZERVOOi7Gn3SweE53QCYAX0o6jnZcnIJniHFdx72j8e/V29W8w7mb08+8saqYlop3nJWHb2pgVEpBTD02STAoWT8yi2pOk189VjUnAFA9L4FgRcWmhYdoT1Y8LpyPfK6gf7OkgcCzmZCHe0U6ND8xKmxaS5F3W8KXbINWOkgsIjgpJTEnJCAfIQCgg2ShhGZ2WECDX0OGWzpFLSJRQjZaTkIxJyQrHRlxWkS0l3LYtorRo3ShdE9TOi0lICEkIiMmIyMlISKgtiGMt8XOqwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;daily-blog-1&quot;
        title=&quot;&quot;
        src=&quot;/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png&quot;
        srcset=&quot;/static/74c90c06a5822f21629dc323f853a7db/12f09/blog1.png 148w,
/static/74c90c06a5822f21629dc323f853a7db/e4a3f/blog1.png 295w,
/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png 590w,
/static/74c90c06a5822f21629dc323f853a7db/efc66/blog1.png 885w,
/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png 1024w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Morning&lt;/h2&gt;
&lt;p&gt;On Saturday morning, we usually try to sleep late since weekends provide our only opportunity for extra rest, but we had a dentist appointment scheduled for 10:30 AM. I served as the designated “Alarm Clock” since my family remains immune to all other wake-up calls. Rising at 8 AM, I took some time to clear my sleepy, foggy mind. My kid and wife woke up shortly after, and we quickly freshened up, had breakfast, and headed to the dentist’s clinic. Despite arriving nine minutes late, they expected us since I had messaged their office beforehand. The procedure lasted about an hour, during which my kid and I kept ourselves entertained - I watched some old episodes of Big Bang Theory while he played games. Afterward, we proceeded to a nearby location for another doctor’s appointment. While my wife attended her appointment, my kid and I enjoyed refreshing watermelon juice and buttermilk.&lt;/p&gt;
&lt;p&gt;The afternoons in Pune grow increasingly hot, naturally drawing us toward cold refreshments. After the medical procedures and some shopping, we headed to an excellent Punjabi restaurant for lunch. Our meal consisted of fried rice, chapati, and Chicken Chili, accompanied by more buttermilk. I must confess my love for buttermilk - it’s low in calories and perfect for summer. Though tempted by lassi, my wife reminded me of our sugar-restricted diet, so I contentedly settled for buttermilk instead. Following lunch, I called our music school, where my son studies piano and I learn guitar, requesting an earlier time slot due to our evening plans. Fortunately, they accommodated us. We completed our hour-long class before heading home to drop off our shopping items and continue to our next destination.&lt;/p&gt;
&lt;p&gt;We reached the mall within 20 minutes and made a beeline for coffee. Despite being extra cautious after yesterday’s coffee mishap, I managed to err again. While I ordered my usual Vietnamese Shakerato, I selected an Iced Cappuccino for my wife, which proved too watery. She typically prefers sugarless cold coffee with almond milk. I apologized for the mistake and promised to make it up to her.&lt;/p&gt;
&lt;p&gt;Afterward, we collected a watch we had left for water damage repair and did some shopping. My wife found several items she liked before I headed for a beard trim. Having recently started maintaining a beard, I’ve discovered it demands considerable effort. Later, hunger struck, but we opted for healthy choices at Subway - my wife and I ordered Chicken Salads while my son enjoyed a Subway sandwich. We then rode our scooter home, hoping to avoid another power outage surprise. Thankfully, we encountered none. My son and I spent some time studying for his upcoming test before he expressed readiness for bed. After putting him to sleep, I decided to write this blog, making up for yesterday’s missed post due to the power cut, while also completing today’s entry. Now that I’ve finished writing, I’ll edit and post it shortly.&lt;/p&gt;
&lt;p&gt;I hope you enjoyed reading this account of our day, and I look forward to sharing another story tomorrow.
Till then.&lt;/p&gt;
&lt;p&gt;Cheers! 🤘&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Daily Blog Number 5]]></title><description><![CDATA[Morning: A Welcome Break The morning started differently today. With half of my kid’s classmates attending a class picnic, we seized the…]]></description><link>https://vinitkumar.me/daily-short-blog-5/</link><guid isPermaLink="false">https://vinitkumar.me/daily-short-blog-5/</guid><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AFI6LFs7LW44J6JdOsmddti7mtu5ks+je+7n0/by4vf16Pb16/Tt2N+2ieC4jM+TZJNRMmc/LFw8LU83KgBGNStjQjFzPCqkYDvJn3jcxaLTpXvSr5Ds6dfx7Nvx6dXz793w6tbVqIDZroTQmWuVUzRuRTJiQjFUOy0AQC0lYkAwdD4rp2A82LeT4MqpxZJq1cGo3tjC5dvF5te+7OTQ7erW0a2MzZpw0Z5yk1EzbEQxYUIwVDotAGE+LnRKNW87KaljP93CoNSwi7qIZNzax9jPueDYwt/Tu+nizubhy9XApr+GX82YbYtMMGZCMV5BMVE5LQB0UTp6UztmNCSqZUXbvJjAh16/nX/W18PMxKzRybLVybDp5NLn4tDg2se1f13CgVWFSjFiQTBcQTBROi0AjF8+m21IYjMknlw+ypBmpWdDraaJtradxsKqvrqgzMKo0M+uv7uT5uXTu5yEn1MwckUwSzcrRDUqQDMpAJZfOaNvRoJWO5hRNJNEJaWGa7zEqb28or66obu5n8G8mpOOW42HV7i3l9PJtIVTO1k4KUQ3LDgwKjcuKACSVzGcZz+kd1B8STKEWkbNvJ6hh3OvpY/CvJ+5tZzSzrSadVWtnIKhjWvIwKyHZ1FPMiZTOixDNSsyLCgAlFUwkV48Zj0qbkg13NS7zauDcTgcq5mBpotrqZZ+3djDoH1ip5J+sZqCnYt4i3FcgGBNe1hEZEEyRjIpAHA7I2I9LEMuJ1M9M2tiV1xOQUY3LWpbTaV6WYpjTINmUHBWQndbRHlbRYhwXKmJcpxzXbmpl6GSf4Z0YgB+UzxSPTQnKCsrKy0rKSoxLy42MjFCODOLXkGVclm1o46Jc2BuVUJcSDpzZFdfNiloRjq7tqSYkX9wZlcAdFE7YEs8JSMnLi0uMTAwMzExNTExMzIxaFNGfGFSfmtea1ZKX0g5RzguSjswVTAmfmpbgHFeZVJCUkE0AIJLLJFdOD40LyUnLCwrLioqLS8vMCkqK0dCQoJuW2FJNUszJEYyJz4yLGFCNINzZJeWiIF8cG1pXmRaTgCqaj3RlV11YUgYHCUrKiwsLC8qKSsqKyyoq6Hv8uDs6tnNx7aXinuMbmCjhXJxXU5JQDlXVU93dmt7bV4AhGJC3bF5o3xUKCcrLjQ5Njk8Rk9RnKWj6OzgxMa9vbmzsJ6Q0biasm1HYzcoX09GkIN2YE09SzgtPDArAHhWPY5oRVw2J0cnIDwxLnV7eKepoaylnqGXjp2PgrOlld3Rt8Kgg29JPCoWFWFbWK+ch9OmdYpYOFcxIQBaRzZINClTPS11UT99XUudk4LPzL2PgnKtpJSvrKGXmpO/vbC2qZtqXFI1Ly0ZERVOOi7Gn3SweE53QCYAX0o6jnZcnIJniHFdx72j8e/V29W8w7mb08+8saqYlop3nJWHb2pgVEpBTD02STAoWT8yi2pOk189VjUnAFA9L4FgRcWmhYdoT1Y8LpyPfK6gf7OkgcCzmZCHe0U6ND8xKmxaS5F3W8KXbINWOkgsIjgpJTEnJCAfIQCgg2ShhGZ2WECDX0OGWzpFLSJRQjZaTkIxJyQrHRlxWkS0l3LYtorRo3ShdE9TOi0lICEkIiMmIyMlISKgtiGMt8XOqwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;daily-blog-1&quot;
        title=&quot;&quot;
        src=&quot;/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png&quot;
        srcset=&quot;/static/74c90c06a5822f21629dc323f853a7db/12f09/blog1.png 148w,
/static/74c90c06a5822f21629dc323f853a7db/e4a3f/blog1.png 295w,
/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png 590w,
/static/74c90c06a5822f21629dc323f853a7db/efc66/blog1.png 885w,
/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png 1024w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Morning: A Welcome Break&lt;/h2&gt;
&lt;p&gt;The morning started differently today. With half of my kid’s classmates attending a class picnic, we seized the opportunity to catch up on our sleep debt. This break from our usual routine pushed our wake-up time to 10 AM, just 30 minutes before my scheduled meeting.&lt;/p&gt;
&lt;p&gt;A quick breakfast of bread and peanut butter fueled both my kid and me before I jumped into the team standup. The meeting efficiently laid out our priorities for the day, setting a clear direction for the tasks ahead.&lt;/p&gt;
&lt;h2&gt;Technical Challenge and Solution&lt;/h2&gt;
&lt;p&gt;The day’s primary challenge proved more complex than initially anticipated. After multiple collaborative calls with teammates, we developed a promising solution. I methodically evaluated all possible scenarios, considering both immediate requirements and potential edge cases. The solution appeared solid, though it might require additional refinement in future iterations.&lt;/p&gt;
&lt;p&gt;Opening Vim, I transformed our theoretical solution into working code. Interestingly, the planning phase consumed 80% of the day, while the actual implementation took only 20% - a common pattern in software development. This distribution highlights a crucial truth: investing time in planning leads to more scalable, maintainable solutions.&lt;/p&gt;
&lt;h2&gt;Evening: Family Time and Valentine’s Day Celebrations&lt;/h2&gt;
&lt;p&gt;The evening shifted focus to family activities, starting with my kid’s skating class. His performance impressed everyone as he won every race he participated in. The new coach’s emphasis on proper technique continues to yield excellent results - a testament to the value of quality instruction.&lt;/p&gt;
&lt;p&gt;Valentine’s Day presented the perfect excuse for an impromptu family dinner. We chose our favorite Kerala restaurant, known for its consistently excellent cuisine. The meal proved both delicious and fulfilling.&lt;/p&gt;
&lt;h2&gt;A Sweet Ending&lt;/h2&gt;
&lt;p&gt;After dinner, we sought to satisfy my wife’s craving for cold coffee at a nearby bistro. Though the Valentine’s Day special menu replaced coffee with mocktails, we discovered something even better - an interactive dessert experience. The bistro provided a pastry with decorating ingredients, turning our dessert into a creative family activity. Watching my wife and kid collaborate on the decorations, their faces lit with joy, created a memorable moment.&lt;/p&gt;
&lt;p&gt;The evening concluded with an unexpected twist - we returned home to find a power outage. Despite concerns about sleeping without cooling, exhaustion won out, and we drifted off to sleep easily.&lt;/p&gt;
&lt;p&gt;Below, you’ll find a video capturing the joyful moments of our family’s pastry decoration adventure.&lt;/p&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/reel/DGF8bejq3Nt/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; data-instgrm-version=&quot;14&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:16px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/reel/DGF8bejq3Nt/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;&quot; target=&quot;_blank&quot;&gt; &lt;div style=&quot; display: flex; flex-direction: row; align-items: center;&quot;&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 19% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display:block; height:50px; margin:0 auto 12px; width:50px;&quot;&gt;&lt;svg width=&quot;50px&quot; height=&quot;50px&quot; viewBox=&quot;0 0 60 60&quot; version=&quot;1.1&quot; xmlns=&quot;https://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;https://www.w3.org/1999/xlink&quot;&gt;&lt;g stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;g transform=&quot;translate(-511.000000, -20.000000)&quot; fill=&quot;#000000&quot;&gt;&lt;g&gt;&lt;path d=&quot;M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div style=&quot;padding-top: 8px;&quot;&gt; &lt;div style=&quot; color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;&quot;&gt;View this post on Instagram&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 12.5% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;&quot;&gt;&lt;div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 8px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: auto;&quot;&gt; &lt;div style=&quot; width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;&lt;a href=&quot;https://www.instagram.com/reel/DGF8bejq3Nt/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;&quot; target=&quot;_blank&quot;&gt;A post shared by | R I T U P A R N A  D E Y | 🇮🇳 (@tiadey20)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;script async src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;</content:encoded></item><item><title><![CDATA[Daily Blog Number 4]]></title><description><![CDATA[Thursday, February 13th was a good day.
I woke up around 5:45 AM, got my kid ready for school, and we prepared for the gym. I reached the…]]></description><link>https://vinitkumar.me/daily-short-blog-4/</link><guid isPermaLink="false">https://vinitkumar.me/daily-short-blog-4/</guid><pubDate>Thu, 13 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AFI6LFs7LW44J6JdOsmddti7mtu5ks+je+7n0/by4vf16Pb16/Tt2N+2ieC4jM+TZJNRMmc/LFw8LU83KgBGNStjQjFzPCqkYDvJn3jcxaLTpXvSr5Ds6dfx7Nvx6dXz793w6tbVqIDZroTQmWuVUzRuRTJiQjFUOy0AQC0lYkAwdD4rp2A82LeT4MqpxZJq1cGo3tjC5dvF5te+7OTQ7erW0a2MzZpw0Z5yk1EzbEQxYUIwVDotAGE+LnRKNW87KaljP93CoNSwi7qIZNzax9jPueDYwt/Tu+nizubhy9XApr+GX82YbYtMMGZCMV5BMVE5LQB0UTp6UztmNCSqZUXbvJjAh16/nX/W18PMxKzRybLVybDp5NLn4tDg2se1f13CgVWFSjFiQTBcQTBROi0AjF8+m21IYjMknlw+ypBmpWdDraaJtradxsKqvrqgzMKo0M+uv7uT5uXTu5yEn1MwckUwSzcrRDUqQDMpAJZfOaNvRoJWO5hRNJNEJaWGa7zEqb28or66obu5n8G8mpOOW42HV7i3l9PJtIVTO1k4KUQ3LDgwKjcuKACSVzGcZz+kd1B8STKEWkbNvJ6hh3OvpY/CvJ+5tZzSzrSadVWtnIKhjWvIwKyHZ1FPMiZTOixDNSsyLCgAlFUwkV48Zj0qbkg13NS7zauDcTgcq5mBpotrqZZ+3djDoH1ip5J+sZqCnYt4i3FcgGBNe1hEZEEyRjIpAHA7I2I9LEMuJ1M9M2tiV1xOQUY3LWpbTaV6WYpjTINmUHBWQndbRHlbRYhwXKmJcpxzXbmpl6GSf4Z0YgB+UzxSPTQnKCsrKy0rKSoxLy42MjFCODOLXkGVclm1o46Jc2BuVUJcSDpzZFdfNiloRjq7tqSYkX9wZlcAdFE7YEs8JSMnLi0uMTAwMzExNTExMzIxaFNGfGFSfmtea1ZKX0g5RzguSjswVTAmfmpbgHFeZVJCUkE0AIJLLJFdOD40LyUnLCwrLioqLS8vMCkqK0dCQoJuW2FJNUszJEYyJz4yLGFCNINzZJeWiIF8cG1pXmRaTgCqaj3RlV11YUgYHCUrKiwsLC8qKSsqKyyoq6Hv8uDs6tnNx7aXinuMbmCjhXJxXU5JQDlXVU93dmt7bV4AhGJC3bF5o3xUKCcrLjQ5Njk8Rk9RnKWj6OzgxMa9vbmzsJ6Q0biasm1HYzcoX09GkIN2YE09SzgtPDArAHhWPY5oRVw2J0cnIDwxLnV7eKepoaylnqGXjp2PgrOlld3Rt8Kgg29JPCoWFWFbWK+ch9OmdYpYOFcxIQBaRzZINClTPS11UT99XUudk4LPzL2PgnKtpJSvrKGXmpO/vbC2qZtqXFI1Ly0ZERVOOi7Gn3SweE53QCYAX0o6jnZcnIJniHFdx72j8e/V29W8w7mb08+8saqYlop3nJWHb2pgVEpBTD02STAoWT8yi2pOk189VjUnAFA9L4FgRcWmhYdoT1Y8LpyPfK6gf7OkgcCzmZCHe0U6ND8xKmxaS5F3W8KXbINWOkgsIjgpJTEnJCAfIQCgg2ShhGZ2WECDX0OGWzpFLSJRQjZaTkIxJyQrHRlxWkS0l3LYtorRo3ShdE9TOi0lICEkIiMmIyMlISKgtiGMt8XOqwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;daily-blog-1&quot;
        title=&quot;&quot;
        src=&quot;/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png&quot;
        srcset=&quot;/static/74c90c06a5822f21629dc323f853a7db/12f09/blog1.png 148w,
/static/74c90c06a5822f21629dc323f853a7db/e4a3f/blog1.png 295w,
/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png 590w,
/static/74c90c06a5822f21629dc323f853a7db/efc66/blog1.png 885w,
/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png 1024w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Thursday, February 13th was a good day.
I woke up around 5:45 AM, got my kid ready for school, and we prepared for the gym. I reached the gym by 7:35 AM and started my workout.&lt;/p&gt;
&lt;p&gt;Today was “Back Day,” and what a painful and exhausting session it turned out to be. Back muscles remain my weakest point, which becomes evident during the reps. My trainer provides great support and helps me build those muscles better. After the gym, I grabbed some nice Idli for breakfast before heading home. Though tired from the gym session, a cold shower helped rejuvenate me. After the shower, I had some egg whites, packed my bags, and left for the office.&lt;/p&gt;
&lt;p&gt;The traffic on the way to office was manageable, and I arrived around 11:05 AM. Once there, I grabbed some coffee to get my brain functioning and reviewed the day’s tasks. I read through some articles I wanted to learn from and then started coding. While checking the server logs, I noticed the code hadn’t handled an edge case. I quickly patched it, pushed the code, and left it to the CI Gods to do their job. ;)&lt;/p&gt;
&lt;p&gt;My colleague and I went for lunch afterward. The meal proved quite fulfilling, and honestly, in the office environment, I always get a little sleepy after lunch. So, I took a nice 15-minute power nap before focusing back on work. I discussed a major issue with my colleagues, and it seems we found an elegant new approach to solve it. Instead of writing code right away, I decided to document my thoughts and share them with stakeholders. Fortunately, the person who created the ticket agreed with my solution. Tomorrow, I’ll implement the fix and get it working end-to-end. Once done, I packed my bags, grabbed a cold coffee from a café near my office, and drove home. I also picked up some iceberg lettuce on the way, as we’ve been eating chicken salad for dinner every day. If you don’t cook at home, you have no idea how much money you spend on expensive, sub-standard salads. I order chicken from Licious and lettuce from a shop near my office, and believe me, we save around Rs.500 daily compared to restaurant prices. It’s also much healthier since we use the best ingredients at home.&lt;/p&gt;
&lt;p&gt;Back home, I had a quick call with my fellow Django CMS Fellow, and we agreed on a testing approach for a major refactor in progress. I feel really positive about the direction we’re taking in the Django CMS project.&lt;/p&gt;
&lt;p&gt;Later, I called Mom and Dad and had a good conversation with them. Those of us who have parents, make sure you spend some time talking to them every day. Finally, I’ll leave you with this video from the 2015 Oscars featuring JK Simmons:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/EBoMKkmJEMg?si=AbNpnkl5k_mGRhlq&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;Hoping for a better and productive day tomorrow as well.&lt;/p&gt;
&lt;p&gt;Cheers! 🤘&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Daily Blog Number 3]]></title><description><![CDATA[Another day, another blog. Today was an interesting day. I woke up at 5:45 AM, still a bit tired, but managed to get my kid to school. I was…]]></description><link>https://vinitkumar.me/daily-short-blog-3/</link><guid isPermaLink="false">https://vinitkumar.me/daily-short-blog-3/</guid><pubDate>Wed, 12 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AFI6LFs7LW44J6JdOsmddti7mtu5ks+je+7n0/by4vf16Pb16/Tt2N+2ieC4jM+TZJNRMmc/LFw8LU83KgBGNStjQjFzPCqkYDvJn3jcxaLTpXvSr5Ds6dfx7Nvx6dXz793w6tbVqIDZroTQmWuVUzRuRTJiQjFUOy0AQC0lYkAwdD4rp2A82LeT4MqpxZJq1cGo3tjC5dvF5te+7OTQ7erW0a2MzZpw0Z5yk1EzbEQxYUIwVDotAGE+LnRKNW87KaljP93CoNSwi7qIZNzax9jPueDYwt/Tu+nizubhy9XApr+GX82YbYtMMGZCMV5BMVE5LQB0UTp6UztmNCSqZUXbvJjAh16/nX/W18PMxKzRybLVybDp5NLn4tDg2se1f13CgVWFSjFiQTBcQTBROi0AjF8+m21IYjMknlw+ypBmpWdDraaJtradxsKqvrqgzMKo0M+uv7uT5uXTu5yEn1MwckUwSzcrRDUqQDMpAJZfOaNvRoJWO5hRNJNEJaWGa7zEqb28or66obu5n8G8mpOOW42HV7i3l9PJtIVTO1k4KUQ3LDgwKjcuKACSVzGcZz+kd1B8STKEWkbNvJ6hh3OvpY/CvJ+5tZzSzrSadVWtnIKhjWvIwKyHZ1FPMiZTOixDNSsyLCgAlFUwkV48Zj0qbkg13NS7zauDcTgcq5mBpotrqZZ+3djDoH1ip5J+sZqCnYt4i3FcgGBNe1hEZEEyRjIpAHA7I2I9LEMuJ1M9M2tiV1xOQUY3LWpbTaV6WYpjTINmUHBWQndbRHlbRYhwXKmJcpxzXbmpl6GSf4Z0YgB+UzxSPTQnKCsrKy0rKSoxLy42MjFCODOLXkGVclm1o46Jc2BuVUJcSDpzZFdfNiloRjq7tqSYkX9wZlcAdFE7YEs8JSMnLi0uMTAwMzExNTExMzIxaFNGfGFSfmtea1ZKX0g5RzguSjswVTAmfmpbgHFeZVJCUkE0AIJLLJFdOD40LyUnLCwrLioqLS8vMCkqK0dCQoJuW2FJNUszJEYyJz4yLGFCNINzZJeWiIF8cG1pXmRaTgCqaj3RlV11YUgYHCUrKiwsLC8qKSsqKyyoq6Hv8uDs6tnNx7aXinuMbmCjhXJxXU5JQDlXVU93dmt7bV4AhGJC3bF5o3xUKCcrLjQ5Njk8Rk9RnKWj6OzgxMa9vbmzsJ6Q0biasm1HYzcoX09GkIN2YE09SzgtPDArAHhWPY5oRVw2J0cnIDwxLnV7eKepoaylnqGXjp2PgrOlld3Rt8Kgg29JPCoWFWFbWK+ch9OmdYpYOFcxIQBaRzZINClTPS11UT99XUudk4LPzL2PgnKtpJSvrKGXmpO/vbC2qZtqXFI1Ly0ZERVOOi7Gn3SweE53QCYAX0o6jnZcnIJniHFdx72j8e/V29W8w7mb08+8saqYlop3nJWHb2pgVEpBTD02STAoWT8yi2pOk189VjUnAFA9L4FgRcWmhYdoT1Y8LpyPfK6gf7OkgcCzmZCHe0U6ND8xKmxaS5F3W8KXbINWOkgsIjgpJTEnJCAfIQCgg2ShhGZ2WECDX0OGWzpFLSJRQjZaTkIxJyQrHRlxWkS0l3LYtorRo3ShdE9TOi0lICEkIiMmIyMlISKgtiGMt8XOqwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;daily-blog-1&quot;
        title=&quot;&quot;
        src=&quot;/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png&quot;
        srcset=&quot;/static/74c90c06a5822f21629dc323f853a7db/12f09/blog1.png 148w,
/static/74c90c06a5822f21629dc323f853a7db/e4a3f/blog1.png 295w,
/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png 590w,
/static/74c90c06a5822f21629dc323f853a7db/efc66/blog1.png 885w,
/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png 1024w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Another day, another blog. Today was an interesting day. I woke up at 5:45 AM, still a bit tired, but managed to get my kid to school. I was unsure about going to the gym, but still went. Training started a bit later, but it was a tough day. Today was “Shoulder Day” and those muscles are really sore now. However, a sweat session at the gym is somehow the best thing to uplift your mood.&lt;/p&gt;
&lt;p&gt;Came back home, had bread and peanut butter (unsweetened), and then did the daily prayer. Also, tried to clean up my wife’s desk a bit (not sure if she has noticed it yet).&lt;/p&gt;
&lt;p&gt;Took the standup call from home and then traveled to the office. It was medium traffic and I reached the office in about 15 minutes. Once at the office, had a double espresso with my colleague and then got to work.&lt;/p&gt;
&lt;p&gt;It was a decent day at work and made some progress understanding the Go backend for my project. I need to fix a tricky bug, and for that I need to have a really in-depth understanding of the codebase. By the evening, I did some journaling about the day and discovered that Cursor IDE has excellent prompt files like .cursorrules. You can actually configure it on a per-project basis and it can really help streamline the process and the output from AI. As I mentioned in my past post that AI has to be an integral part of your day-to-day work, I am trying to up my game with AI.&lt;/p&gt;
&lt;p&gt;Sometimes, I would leave projects midway because I would get demotivated by the scope of work or complexity. With good AI assistance, that’s not an issue anymore. You can tackle problems head-on while counting on AI as a reliable partner. However, I remain cautious and won’t blindly trust code written by AI, just as I wouldn’t blindly trust code written by any human colleague.&lt;/p&gt;
&lt;p&gt;Around 5:45 PM, I wrapped up work and headed home. On the way, there’s a bridge, and I was appalled to see the sorry state of the river flowing underneath. In Pune, almost all rivers are in a sorry state. This hits close to home, as I was raised next to a river in my hometown and would go swimming there every weekend and holiday. Few people might relate to the amazing feeling of bathing in fresh river water and having fun.&lt;/p&gt;
&lt;p&gt;The pollution is also really concerning, especially when traveling on a two-wheeler. I wear a full-covered helmet and still find it bad. I wish we as people and the government would do something about the poor air quality. At this point, it’s disheartening to think about living and investing in India when these basic necessities cannot be taken for granted.&lt;/p&gt;
&lt;p&gt;I really hope we can work towards building a better and more positive world.&lt;/p&gt;
&lt;p&gt;Cheers! 🤘&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Daily Blog Number 2]]></title><description><![CDATA[Today was a hectic day. It started with getting my kid to school at 7am, and then getting ready as we needed to
go back to his school at 9am…]]></description><link>https://vinitkumar.me/daily-short-blog-2/</link><guid isPermaLink="false">https://vinitkumar.me/daily-short-blog-2/</guid><pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AFI6LFs7LW44J6JdOsmddti7mtu5ks+je+7n0/by4vf16Pb16/Tt2N+2ieC4jM+TZJNRMmc/LFw8LU83KgBGNStjQjFzPCqkYDvJn3jcxaLTpXvSr5Ds6dfx7Nvx6dXz793w6tbVqIDZroTQmWuVUzRuRTJiQjFUOy0AQC0lYkAwdD4rp2A82LeT4MqpxZJq1cGo3tjC5dvF5te+7OTQ7erW0a2MzZpw0Z5yk1EzbEQxYUIwVDotAGE+LnRKNW87KaljP93CoNSwi7qIZNzax9jPueDYwt/Tu+nizubhy9XApr+GX82YbYtMMGZCMV5BMVE5LQB0UTp6UztmNCSqZUXbvJjAh16/nX/W18PMxKzRybLVybDp5NLn4tDg2se1f13CgVWFSjFiQTBcQTBROi0AjF8+m21IYjMknlw+ypBmpWdDraaJtradxsKqvrqgzMKo0M+uv7uT5uXTu5yEn1MwckUwSzcrRDUqQDMpAJZfOaNvRoJWO5hRNJNEJaWGa7zEqb28or66obu5n8G8mpOOW42HV7i3l9PJtIVTO1k4KUQ3LDgwKjcuKACSVzGcZz+kd1B8STKEWkbNvJ6hh3OvpY/CvJ+5tZzSzrSadVWtnIKhjWvIwKyHZ1FPMiZTOixDNSsyLCgAlFUwkV48Zj0qbkg13NS7zauDcTgcq5mBpotrqZZ+3djDoH1ip5J+sZqCnYt4i3FcgGBNe1hEZEEyRjIpAHA7I2I9LEMuJ1M9M2tiV1xOQUY3LWpbTaV6WYpjTINmUHBWQndbRHlbRYhwXKmJcpxzXbmpl6GSf4Z0YgB+UzxSPTQnKCsrKy0rKSoxLy42MjFCODOLXkGVclm1o46Jc2BuVUJcSDpzZFdfNiloRjq7tqSYkX9wZlcAdFE7YEs8JSMnLi0uMTAwMzExNTExMzIxaFNGfGFSfmtea1ZKX0g5RzguSjswVTAmfmpbgHFeZVJCUkE0AIJLLJFdOD40LyUnLCwrLioqLS8vMCkqK0dCQoJuW2FJNUszJEYyJz4yLGFCNINzZJeWiIF8cG1pXmRaTgCqaj3RlV11YUgYHCUrKiwsLC8qKSsqKyyoq6Hv8uDs6tnNx7aXinuMbmCjhXJxXU5JQDlXVU93dmt7bV4AhGJC3bF5o3xUKCcrLjQ5Njk8Rk9RnKWj6OzgxMa9vbmzsJ6Q0biasm1HYzcoX09GkIN2YE09SzgtPDArAHhWPY5oRVw2J0cnIDwxLnV7eKepoaylnqGXjp2PgrOlld3Rt8Kgg29JPCoWFWFbWK+ch9OmdYpYOFcxIQBaRzZINClTPS11UT99XUudk4LPzL2PgnKtpJSvrKGXmpO/vbC2qZtqXFI1Ly0ZERVOOi7Gn3SweE53QCYAX0o6jnZcnIJniHFdx72j8e/V29W8w7mb08+8saqYlop3nJWHb2pgVEpBTD02STAoWT8yi2pOk189VjUnAFA9L4FgRcWmhYdoT1Y8LpyPfK6gf7OkgcCzmZCHe0U6ND8xKmxaS5F3W8KXbINWOkgsIjgpJTEnJCAfIQCgg2ShhGZ2WECDX0OGWzpFLSJRQjZaTkIxJyQrHRlxWkS0l3LYtorRo3ShdE9TOi0lICEkIiMmIyMlISKgtiGMt8XOqwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;daily-blog-1&quot;
        title=&quot;&quot;
        src=&quot;/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png&quot;
        srcset=&quot;/static/74c90c06a5822f21629dc323f853a7db/12f09/blog1.png 148w,
/static/74c90c06a5822f21629dc323f853a7db/e4a3f/blog1.png 295w,
/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png 590w,
/static/74c90c06a5822f21629dc323f853a7db/efc66/blog1.png 885w,
/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png 1024w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
Today was a hectic day. It started with getting my kid to school at 7am, and then getting ready as we needed to
go back to his school at 9am. I also had to go to the office today, so I had to be ready before that. Last night’s
sleep was a bit disturbed and I woke up at least a couple of times. Summer is already here in Pune and it’s not fun at all.&lt;/p&gt;
&lt;p&gt;At work, it was a mixed day. Made some progress on the planning, but there are minor roadblocks on other aspects that
need more work. I was also making progress with the React Router tutorial, but it got a bit tiring at the end
so I dropped it during the day. I made some small fixes to my &lt;code&gt;json2xml&lt;/code&gt; project - even though it’s not a lot,
it’s still progress. I guess some days, you should just take whatever win comes your way. Coming back from the office,
I got a flat tire and that means tomorrow I need to take my Scooty to the tire shop. I hate this hassle, but I guess sometimes
there’s no way around it.&lt;/p&gt;
&lt;p&gt;Also, in the morning, I went to a nice café with my wife and had my favorite Vietnamese Shakerato - loved it! Now, before
going to bed, I want to make some progress with the book I’m currently reading on Kindle called “The Art of Doing Science and Engineering”
by Richard W. Hamming.&lt;/p&gt;
&lt;p&gt;Hoping for a better and more fulfilling tomorrow.&lt;/p&gt;
&lt;p&gt;Cheers! 🤘&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Daily Blog Number 1]]></title><description><![CDATA[Writing blog is something that is close to my heart and I thoroughly enjoy the process. It
also calms down the chaos inside me. I have…]]></description><link>https://vinitkumar.me/daily-short-blog-1/</link><guid isPermaLink="false">https://vinitkumar.me/daily-short-blog-1/</guid><pubDate>Mon, 10 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AFI6LFs7LW44J6JdOsmddti7mtu5ks+je+7n0/by4vf16Pb16/Tt2N+2ieC4jM+TZJNRMmc/LFw8LU83KgBGNStjQjFzPCqkYDvJn3jcxaLTpXvSr5Ds6dfx7Nvx6dXz793w6tbVqIDZroTQmWuVUzRuRTJiQjFUOy0AQC0lYkAwdD4rp2A82LeT4MqpxZJq1cGo3tjC5dvF5te+7OTQ7erW0a2MzZpw0Z5yk1EzbEQxYUIwVDotAGE+LnRKNW87KaljP93CoNSwi7qIZNzax9jPueDYwt/Tu+nizubhy9XApr+GX82YbYtMMGZCMV5BMVE5LQB0UTp6UztmNCSqZUXbvJjAh16/nX/W18PMxKzRybLVybDp5NLn4tDg2se1f13CgVWFSjFiQTBcQTBROi0AjF8+m21IYjMknlw+ypBmpWdDraaJtradxsKqvrqgzMKo0M+uv7uT5uXTu5yEn1MwckUwSzcrRDUqQDMpAJZfOaNvRoJWO5hRNJNEJaWGa7zEqb28or66obu5n8G8mpOOW42HV7i3l9PJtIVTO1k4KUQ3LDgwKjcuKACSVzGcZz+kd1B8STKEWkbNvJ6hh3OvpY/CvJ+5tZzSzrSadVWtnIKhjWvIwKyHZ1FPMiZTOixDNSsyLCgAlFUwkV48Zj0qbkg13NS7zauDcTgcq5mBpotrqZZ+3djDoH1ip5J+sZqCnYt4i3FcgGBNe1hEZEEyRjIpAHA7I2I9LEMuJ1M9M2tiV1xOQUY3LWpbTaV6WYpjTINmUHBWQndbRHlbRYhwXKmJcpxzXbmpl6GSf4Z0YgB+UzxSPTQnKCsrKy0rKSoxLy42MjFCODOLXkGVclm1o46Jc2BuVUJcSDpzZFdfNiloRjq7tqSYkX9wZlcAdFE7YEs8JSMnLi0uMTAwMzExNTExMzIxaFNGfGFSfmtea1ZKX0g5RzguSjswVTAmfmpbgHFeZVJCUkE0AIJLLJFdOD40LyUnLCwrLioqLS8vMCkqK0dCQoJuW2FJNUszJEYyJz4yLGFCNINzZJeWiIF8cG1pXmRaTgCqaj3RlV11YUgYHCUrKiwsLC8qKSsqKyyoq6Hv8uDs6tnNx7aXinuMbmCjhXJxXU5JQDlXVU93dmt7bV4AhGJC3bF5o3xUKCcrLjQ5Njk8Rk9RnKWj6OzgxMa9vbmzsJ6Q0biasm1HYzcoX09GkIN2YE09SzgtPDArAHhWPY5oRVw2J0cnIDwxLnV7eKepoaylnqGXjp2PgrOlld3Rt8Kgg29JPCoWFWFbWK+ch9OmdYpYOFcxIQBaRzZINClTPS11UT99XUudk4LPzL2PgnKtpJSvrKGXmpO/vbC2qZtqXFI1Ly0ZERVOOi7Gn3SweE53QCYAX0o6jnZcnIJniHFdx72j8e/V29W8w7mb08+8saqYlop3nJWHb2pgVEpBTD02STAoWT8yi2pOk189VjUnAFA9L4FgRcWmhYdoT1Y8LpyPfK6gf7OkgcCzmZCHe0U6ND8xKmxaS5F3W8KXbINWOkgsIjgpJTEnJCAfIQCgg2ShhGZ2WECDX0OGWzpFLSJRQjZaTkIxJyQrHRlxWkS0l3LYtorRo3ShdE9TOi0lICEkIiMmIyMlISKgtiGMt8XOqwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;daily-blog-1&quot;
        title=&quot;&quot;
        src=&quot;/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png&quot;
        srcset=&quot;/static/74c90c06a5822f21629dc323f853a7db/12f09/blog1.png 148w,
/static/74c90c06a5822f21629dc323f853a7db/e4a3f/blog1.png 295w,
/static/74c90c06a5822f21629dc323f853a7db/fcda8/blog1.png 590w,
/static/74c90c06a5822f21629dc323f853a7db/efc66/blog1.png 885w,
/static/74c90c06a5822f21629dc323f853a7db/2bef9/blog1.png 1024w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Writing blog is something that is close to my heart and I thoroughly enjoy the process. It
also calms down the chaos inside me. I have decided to write one every single day. It doesn’t have to
be long, just one paragraph will do as well as long as I am being honest.&lt;/p&gt;
&lt;p&gt;Today morning was a slow start and I didn’t wanted to travel to office. Also, my kid missed his school, so I thought
will just work remotely today. In the morning, got some important meetings with teammates and decided on the work that
I need to do in the coming few weeks. At work, we are building a very cool feature which would work on all the major OSes.
I am lucky to be able to play a major part in this process. I have also been enjoying writing TypeScript quite a bit
for this project. The other part of this is in Go and that is quite fun to write a well. Coming from writing Python for 12
straight years, working with Type Safe languages is a breath of fresh air. However, the work is by no means trivial and I am learning
/re-learning tonnes while working on it. I am really looking forward to shipping this to all our customers soon.&lt;/p&gt;
&lt;p&gt;At Open Source front, I am going to ship a major demo project integrating React with Django CMS. However, React Router
has undergone a major update and I need to learn a lot of things. My other team mate in Django CMS, Fabian is on Fire and It’s
sometime hard to catch up with him. At the same time, I am proud of the progress we have been making off late.&lt;/p&gt;
&lt;p&gt;I have also decided to work on my anger issues. Recently, I have let myself get into stressful situations and I have vowed to not
subject myself to those situations anymore and to keep myself first while interacting with folks. Yesterday, I also caught up with my friend
from college and his family and we had a nice time. Today, I also missed my Gym Session, as I just wanted to sleep in today. I have
accumulated a lot of sleep debt and want to do better on it.&lt;/p&gt;
&lt;p&gt;Alright, that’s it for now. Will post another update tomorrow.&lt;/p&gt;
&lt;p&gt;Cheers! 🤘&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Developer's Guide to AI Tools: Real-world Experience with 5 Leading Platforms]]></title><description><![CDATA[AI has been here for a while now. It is getting significantly better each and every day. There’s no denying the fact that it will continue…]]></description><link>https://vinitkumar.me/how-i-use-ai/</link><guid isPermaLink="false">https://vinitkumar.me/how-i-use-ai/</guid><pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI has been here for a while now. It is getting significantly better each and every day. There’s no denying the fact that it will continue to improve, and the only way to thrive is to adapt and use it to enhance productivity. Here’s a summary of my AI usage. I use multiple services and haven’t settled on just one yet.&lt;/p&gt;
&lt;p&gt;At work, we have a properly configured &lt;a href=&quot;https://cursor.sh/&quot;&gt;Cursor AI&lt;/a&gt; subscription.
&lt;a href=&quot;https://github.com/features/copilot&quot;&gt;GitHub Copilot&lt;/a&gt;: I use it for personal projects on my own computer.
&lt;a href=&quot;https://openai.com/chatgpt&quot;&gt;ChatGPT&lt;/a&gt;: I use both the Mac desktop app and the iPhone app.
&lt;a href=&quot;https://www.deepseek.com/&quot;&gt;DeepSeek R1:32B&lt;/a&gt;: A local LLM I’ve set up on both my work and personal machines using &lt;a href=&quot;https://ollama.ai/&quot;&gt;Ollama&lt;/a&gt;.
&lt;a href=&quot;https://claude.ai/&quot;&gt;Claude&lt;/a&gt;: A web-based AI that I use occasionally.&lt;/p&gt;
&lt;p&gt;My take on these? Sometimes, they are incredibly powerful, and other times, they spit out pure garbage. The tricky part is having the wisdom to tell the difference.&lt;/p&gt;
&lt;p&gt;Here’s my experience with these AI tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cursor AI&lt;/strong&gt; is nice. I get the hype, but it also confidently skips code or writes incorrect code. If you’re not careful, you’re in deep trouble, my friend. It’s great for some tasks and languages, but when the questions are non-trivial, it tends to mess up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; is quite nice, though maybe not at the same level of brilliance as Cursor or ChatGPT.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt; is probably my most-used AI tool, not just for coding but for a variety of tasks. It’s surprisingly good at handling non-coding-related prompts as well.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DeepSeek&lt;/strong&gt; is fantastic, and the best part is that I can run it locally using Ollama, eliminating privacy concerns when using AI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude&lt;/strong&gt; is impressive, and at times, it even outperforms all the others for coding tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Right now, my workflow is still evolving. I see AI as the next great equalizer, a tool that can massively boost productivity when used correctly. I also want to leverage it for deeper research into topics where my understanding isn’t as strong. Additionally, I use AI to catch grammar mistakes in my writing, which I think is a great use case. However, I limit how much editing I allow it to do, often sticking with my original phrasing.&lt;/p&gt;
&lt;p&gt;One thing I really dislike is Copilot auto-completing my code and breaking my flow. I’ll probably disable that feature by default and only use it when I actually want it.&lt;/p&gt;
&lt;p&gt;Despite the flaws, I’m optimistic about AI’s role in my workflow. It’s not perfect, but neither am I—and together, we can get a lot done.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[2024 in Review]]></title><description><![CDATA[2024 was one of the most interesting years of my life. Family-wise, it was pretty good, and I got to spend time with family and friends. My…]]></description><link>https://vinitkumar.me/2024-a-review/</link><guid isPermaLink="false">https://vinitkumar.me/2024-a-review/</guid><pubDate>Sat, 11 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2024 was one of the most interesting years of my life.&lt;/p&gt;
&lt;p&gt;Family-wise, it was pretty good, and I got to spend time with family and friends. My kid started Grade 1, and it’s so much fun watching him make new friends and have fun with his friends. I also bought a new Guitar and started going to the same Music class my kid goes to for learning Piano. I always had a desire to learn it during college, but I couldn’t afford to do that. My wife has a big role in pushing me to pursue my interest in this.&lt;/p&gt;
&lt;p&gt;I also had the first job change of my career. I worked on my last company for almost 12 years and around September 2024, I was informed that my time there was ending. It was a bittersweet moment since the original company was acquired 2 years ago, and the new work was not as fun. I quickly found a great company based in Pune and I am happy to say that I get to do cutting-edge work every day and I am treated very well by my colleagues and the management. Also, after a very long time, I get to work on some pretty challenging stuff and my neurons are firing again like crazy.&lt;/p&gt;
&lt;p&gt;My wife and I also made a habit of walking like 5-6km every day after dropping my kid to School and that is one thing I enjoyed the most during the day.&lt;/p&gt;
&lt;p&gt;One thing that didn’t turn out great was my time management and sleep. I had a horrible year of sleep and I would really like to focus on getting some good sleep and enjoying life more. I also sometimes let the work dictate my mood and well-being a lot and I would really like to just cut this habit out completely. Also, I want to cut Social Media by a significant percentage and use that time to do something productive or at least fun.
Finance-wise, it was an okay-ish year and I want to do better this year.&lt;/p&gt;
&lt;p&gt;My Goal this year is to just enjoy life a bit more and be happy. I also want to avoid people who don’t bring joy to my life and surround myself with family and good friends. I am going to do a tonne of OSS work as that is the kind of work I always love doing. I also want to write more and more every day. I believe I can bring a huge change if I am just reasonably consistent and honest with my pursuits.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[TIL] Git Sparse Checkout for Large Repos]]></title><description><![CDATA[Today I learned about git sparse-checkout, a powerful feature that allows you to work with only specific directories in a large repository…]]></description><link>https://vinitkumar.me/til/git-sparse-headers/</link><guid isPermaLink="false">https://vinitkumar.me/til/git-sparse-headers/</guid><pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I learned about &lt;code&gt;git sparse-checkout&lt;/code&gt;, a powerful feature that allows you to work with only specific directories in a large repository.&lt;/p&gt;
&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;When working with monorepos or large codebases, you often only need to work with specific directories, but &lt;code&gt;git clone&lt;/code&gt; downloads the entire repository.&lt;/p&gt;
&lt;h2&gt;The Solution&lt;/h2&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# Clone without checking out files
git clone --no-checkout &amp;lt;repo-url&amp;gt;
cd &amp;lt;repo-name&amp;gt;

# Initialize sparse checkout
git sparse-checkout init --cone

# Specify which directories to include
git sparse-checkout set src/frontend docs

# Check out the files
git checkout&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Key Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster clones&lt;/strong&gt;: Only download what you need&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Less disk space&lt;/strong&gt;: Smaller working directory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better performance&lt;/strong&gt;: IDE indexing is faster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focused development&lt;/strong&gt;: Reduces cognitive load&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When to Use It&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Large monorepos&lt;/li&gt;
&lt;li&gt;Documentation-only contributions&lt;/li&gt;
&lt;li&gt;Feature-specific development&lt;/li&gt;
&lt;li&gt;CI/CD optimization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This technique has saved me significant time when contributing to large open-source projects!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[[TIL] CSS Container Queries Are Game Changers]]></title><description><![CDATA[Today I discovered the power of CSS container queries, which solve a major limitation of traditional media queries. The Problem with Media…]]></description><link>https://vinitkumar.me/til/css-container-queries/</link><guid isPermaLink="false">https://vinitkumar.me/til/css-container-queries/</guid><pubDate>Fri, 27 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I discovered the power of CSS container queries, which solve a major limitation of traditional media queries.&lt;/p&gt;
&lt;h2&gt;The Problem with Media Queries&lt;/h2&gt;
&lt;p&gt;Media queries only respond to viewport size, not the actual container size. This makes it difficult to create truly reusable components.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;css&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;/* Traditional media query - viewport based */
@media (max-width: 768px) {
  .card {
    flex-direction: column;
  }
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Container Queries Solution&lt;/h2&gt;
&lt;deckgo-highlight-code language=&quot;css&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;/* Container query - container based */
.sidebar {
  container-type: inline-size;
}

@container (max-width: 400px) {
  .card {
    flex-direction: column;
  }
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Key Advantages&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Component-aware&lt;/strong&gt;: Responds to actual container size&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reusable&lt;/strong&gt;: Same component works in different layouts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Predictable&lt;/strong&gt;: Behavior doesn’t depend on viewport&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible&lt;/strong&gt;: Perfect for cards, widgets, and modular components&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Browser Support&lt;/h2&gt;
&lt;p&gt;Container queries are well-supported in modern browsers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome 105+&lt;/li&gt;
&lt;li&gt;Firefox 110+&lt;/li&gt;
&lt;li&gt;Safari 16+&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Real-World Example&lt;/h2&gt;
&lt;p&gt;A card component that adapts based on its container width, not the viewport:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;css&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;.card-container {
  container-type: inline-size;
}

@container (min-width: 300px) {
  .card {
    display: flex;
    align-items: center;
  }
  
  .card-image {
    width: 100px;
    margin-right: 1rem;
  }
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This enables truly modular, responsive components that work anywhere!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Creating Universal macOS Binaries: A Complete Guide to Fat Binary Generation]]></title><description><![CDATA[So at work, we needed to ship a binary for Mac. With Go, it is super
easy to build a binary for any OS and Architecture. However, having…]]></description><link>https://vinitkumar.me/how-to-generate-fat-binary-mac/</link><guid isPermaLink="false">https://vinitkumar.me/how-to-generate-fat-binary-mac/</guid><pubDate>Wed, 18 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So at work, we needed to ship a binary for Mac. With Go, it is super
easy to build a binary for any OS and Architecture. However, having separate
binaries would mean additional logic to detect the target and then deliver them.
Wouldn’t it be nice to ship just one binary which work on all Macs (Intel and Apple Silicon based)
We call this a Fat Binary.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b6f0b70c870d7fd1b409c179d75495c4/5a190/fat_binary_diagram.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAABW0lEQVR42o2TzY6CQBCEff9H4uCJg4SLbPSAGj0AUYwBFVmQlWU/KRxRsputA5me7uqf6mHUNM3tdvsaoK7r7xYchl4oEEf40jTN8/xyuXw+cD6ffd//aLFer3ERwH1RFIqEAnFEDgzSYJRleb1eq6rCPB6P2+02CALi5FVeeaFAvJOzLMMmdDweT6fTJEmaFiavvJZl2bZNUkwoL2Sy0moYhpwZ9Y2Md7FY7HY7mc/Kp9NJmqk9IwlTUIcbWsWUeJz5inInHw4HI4b0kEJExHH8pqVcUO5kiqi32WxG2yiknvttU2o+n7uuu9lsXtqGTCYIjuNMJhPP85bLJdFEmLzEuS3kFRlvNzPRLKl4QM+D8UxlztzTNpWMTN3M+QNEsNgoivb7fdSCAyKjnJhCN3N/H5qWONpbrVbsBiF00PKNHM9VGfL/0ZH7b9sgG6DvJbh727/9VX9Df9UPd3tb+TyVVR0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;fat-binary&quot;
        title=&quot;&quot;
        src=&quot;/static/b6f0b70c870d7fd1b409c179d75495c4/fcda8/fat_binary_diagram.png&quot;
        srcset=&quot;/static/b6f0b70c870d7fd1b409c179d75495c4/12f09/fat_binary_diagram.png 148w,
/static/b6f0b70c870d7fd1b409c179d75495c4/e4a3f/fat_binary_diagram.png 295w,
/static/b6f0b70c870d7fd1b409c179d75495c4/fcda8/fat_binary_diagram.png 590w,
/static/b6f0b70c870d7fd1b409c179d75495c4/5a190/fat_binary_diagram.png 800w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here is how you can do it:&lt;/p&gt;
&lt;p&gt;Consider this short Go program:&lt;/p&gt;
&lt;p&gt;Save this as main.go&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;go&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;package main

import &amp;quot;fmt&amp;quot;

func main() {
    fmt.Println(&amp;quot;Fat Binary&amp;quot;)
}&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Now, you can build a binary for both the architecture like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GOOS=darwin GOARCH=arm64 go build -o mac_arm64 main.go&lt;/code&gt;
&lt;code&gt;GOOS=darwin GOARCH=amd64 go build -o mac_amd64 main.go&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;When you run this, you will see two binaries your folder:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;ls
-rwxr-xr-x@ 1 vinitkumar  staff   2.1M Dec 18 18:00 mac_amd64
-rwxr-xr-x@ 1 vinitkumar  staff   2.1M Dec 18 18:00 mac_arm64&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Alright, this looks decent, now how do we stitch them together to make a big fat binary that works
on all Macs?&lt;/p&gt;
&lt;p&gt;Enter &lt;a href=&quot;https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary&quot;&gt;Lipo&lt;/a&gt;. This utility can take two binaries and then spit out a far binary that works on all CPU architectures. On Mac, with command line tools installed it just available as &lt;code&gt;lipo&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So doing &lt;code&gt;which lipo&lt;/code&gt; gives &lt;code&gt;/usr/bin/lipo&lt;/code&gt;. On Ubuntu however, it comes bundles with llvm.
So you need to do this:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;sudo apt install llvm
# and then it is present as `llvm-lipo-14` depending on which llvm it is, for me it is llvm-14
So `/usr/bin/llvm-lipo-14&amp;#39;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Now, as we have located Lipo, now, we will use it to generate the fat binary.&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# on Ubuntu
llvm-lipo-14 -create -output &amp;quot;mac_universal&amp;quot; &amp;quot;mac_arm64&amp;quot; &amp;quot;mac_amd64&amp;quot;
# on Mac
lipo -create -output &amp;quot;mac_universal&amp;quot; &amp;quot;main_arm64&amp;quot; &amp;quot;main_amd64&amp;quot;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Once created, we can verify if the binary is proper using the file util.&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;file mac_universal
mac_universal: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64]
mac_universal (for architecture x86_64):        Mach-O 64-bit executable x86_64
mac_universal (for architecture arm64): Mach-O 64-bit executable arm64&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;You can execute this on either of the CPUs and it would just work.&lt;/p&gt;
&lt;h2&gt;Bonus code&lt;/h2&gt;
&lt;p&gt;Here is code to generate the Ascii diagram above. You need to have Pillow installed though.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;from PIL import Image, ImageDraw, ImageFont
import os

# Create a new image with white background
width = 800
height = 600
image = Image.new(&amp;#39;RGB&amp;#39;, (width, height), &amp;#39;white&amp;#39;)
draw = ImageDraw.Draw(image)

# Try to load a font (you may need to adjust the path)
try:
    font = ImageFont.truetype(&amp;quot;Arial.ttf&amp;quot;, 32)
except:
    font = ImageFont.load_default()

# Draw the outer rectangle
draw.rectangle([(50, 50), (width-50, height-50)], outline=&amp;#39;black&amp;#39;, width=2)

# Draw the vertical divider
draw.line([(width/2, 100), (width/2, 400)], fill=&amp;#39;black&amp;#39;, width=2)

# Draw the horizontal dividers
draw.line([(50, 250), (width-50, 250)], fill=&amp;#39;black&amp;#39;, width=2)
draw.line([(50, 400), (width-50, 400)], fill=&amp;#39;black&amp;#39;, width=2)

# Add text
draw.text((width/4, 150), &amp;quot;x86_64\nCode&amp;quot;, font=font, fill=&amp;#39;black&amp;#39;, anchor=&amp;quot;mm&amp;quot;)
draw.text((3*width/4, 150), &amp;quot;ARM64\nCode&amp;quot;, font=font, fill=&amp;#39;black&amp;#39;, anchor=&amp;quot;mm&amp;quot;)
draw.text((width/4, 325), &amp;quot;x86_64\nResources&amp;quot;, font=font, fill=&amp;#39;black&amp;#39;, anchor=&amp;quot;mm&amp;quot;)
draw.text((3*width/4, 325), &amp;quot;ARM64\nResources&amp;quot;, font=font, fill=&amp;#39;black&amp;#39;, anchor=&amp;quot;mm&amp;quot;)
draw.text((width/2, 450), &amp;quot;Shared Resources&amp;quot;, font=font, fill=&amp;#39;black&amp;#39;, anchor=&amp;quot;mm&amp;quot;)
draw.text((width/2, 75), &amp;quot;Fat Binary&amp;quot;, font=font, fill=&amp;#39;black&amp;#39;, anchor=&amp;quot;mm&amp;quot;)

# Save the image
image.save(&amp;#39;fat_binary_diagram.png&amp;#39;)
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;</content:encoded></item><item><title><![CDATA[Building a Free Multi-Device Sync System for Obsidian with Git]]></title><description><![CDATA[I love making notes in Obsidian. It’s truly a Local-First Application. I love that it is free and doesn’t keep your content hostage. However…]]></description><link>https://vinitkumar.me/implement-multi-way-sync-obsidian/</link><guid isPermaLink="false">https://vinitkumar.me/implement-multi-way-sync-obsidian/</guid><pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I love making notes in Obsidian. It’s truly a Local-First Application. I love that it is free and doesn’t keep your content hostage. However, I many multiple Macs and keeping them in sync was becoming an issue. I didn’t wanted to use DropBox or Google Drive and thought why not just automated it myself with some line of code.&lt;/p&gt;
&lt;p&gt;We only need few tools to implement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;crontab&lt;/li&gt;
&lt;li&gt;shell script&lt;/li&gt;
&lt;li&gt;a private github repo (any git repo where you can push works)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create an empty private repo on Github and copy the SSH URl.
Not initialize the local repo with git if it’s not already done.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;sh&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;git init
git remote add origin git@github.com:&amp;lt;username&amp;gt;/repo.git&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Create a new file called as &lt;code&gt;auto_commit_push.sh&lt;/code&gt; in your home directory.&lt;/p&gt;
&lt;p&gt;The idea is to execute this script in frequent intervals using crontab.&lt;/p&gt;
&lt;p&gt;This is how the script looks like:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;sh&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;
# Set repository path - replace with your actual path
#REPO_PATH=&amp;quot;/Users/vinitkumar/Documents/knowledge-base&amp;quot;
# add path to your own repo
REPO_PATH=&amp;quot;&amp;quot;


cd &amp;quot;$REPO_PATH&amp;quot; || exit

git pull origin HEAD
git push origin HEAD
git add .
git commit -m &amp;quot;Auto commit and push on $(date &amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;)&amp;quot;
git push origin HEAD&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Here is how the crontab looks like, add it by executing this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;crontab -e&lt;/code&gt;&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;sh&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;*/1 * * * * /bin/bash ~/auto_commit_push.sh &amp;gt;&amp;gt; ~/auto_commit_push.log 2&amp;gt;&amp;amp;1&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT:&lt;/strong&gt; None of this will work, if you don’t give full disk access to cron.&lt;/p&gt;
&lt;p&gt;For this go to settings on Mac, and give full disk access by opening the settings, and add press &lt;code&gt;cmd + shift + g&lt;/code&gt; and use &lt;code&gt;/usr/sbin&lt;/code&gt; and then add &lt;code&gt;cron&lt;/code&gt; to the full disk access.&lt;/p&gt;
&lt;p&gt;Once done, you can also do the same in the other Mac and enjoy a free sync that just works, in secure.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6e1cce18a9f6fc03e6b0fde7fcdde857/536c7/fulldisk.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 95.94594594594595%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAABYlAAAWJQFJUiTwAAAC+UlEQVR42p2USVPTYBzG88V0vOnBr+CMJ+TAyRujLYvreMcDnhwcoCwtsjhSnG7YpknadE3SlaUtTZsuKG2Bg/r4f18LOCwOePhNksn0l+e/vBWGBgbhWZnGlGsKH5eW4XQ54SI2AwHEVBWhYBDu9XVsuN3w+3xQo9Ez6P3JNZ/PY3LyHYRRuw1JVYJv0w9ZVhAWRXg9HpjVKvbbbTQbDdRrNVj1Or9vt1poNZto0T2/Euzd8eEhVtc/Q3g8PApvOAavew0B7xeEAh7O1lYRmp5GKpnkZAyDk81kYOg6hz3rmgYtnYZV3YPLTcLbD0Zw65WBe+MB3H0WxJ3REO6/DmG7WEJz10K+kEOByrFYSuIk7d9UqzXsmvtQ1CiEh0PDeDOfwIsPIl5OhzHyXsT4VAj5XAHJaBy7Ozucmmly2Xmseg2liol0qQM/9V14PmaDuU2xo0Fk4iIyCRG5lIyskcXGhg/lUol+ZF0qq/dTlytVlBs9zM7OQLDb7dCpL2I4DEmWEZZkyIpCvSrC44sjnzWwvbV9pZBRM6vofv+GOYcDgo2mrBs6n64iSzRpGRElgkJhC3Isg0Iux5vPkrLJV/f2LlApl9Gkaa8sL1NCmw2GloYYCkKWKGWfcmmXVsPiTW9YVj+JeSlM2jk4gHNxEcIIlZyjhHJYpGQKhyVlX2239093je3fVbD9PD46gmthgYSUMKNrVHKIi6KKTNNVYFZI2GqfCv8Fq4At9iJLaHv6BOlUEsGvm1yqymHkEhFa1MrZqbiukCU8L2QJs+kkLJrcTYRHvd6foVwQRhTo1IJazby2kJ9l6uHszMwVQuNmQp6QSnY5nZeVLCGjpVA3/0PoWrpESEPJ94fSurawgW7nAIFACML42BiKhTwvNR5ToSdU7Ggx7NNS9+irvW6H0zlgdNGl5h+eo9vp4NfPH/B5/RAGHw3g09oqHHSw5+ccWFqYh+xegRGVEIuqRIz+uWPQUimkk3HEIxLtq8yP6AmSJPHj+XZiAr8BSG0vaz+tnb4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;full-disk&quot;
        title=&quot;&quot;
        src=&quot;/static/6e1cce18a9f6fc03e6b0fde7fcdde857/fcda8/fulldisk.png&quot;
        srcset=&quot;/static/6e1cce18a9f6fc03e6b0fde7fcdde857/12f09/fulldisk.png 148w,
/static/6e1cce18a9f6fc03e6b0fde7fcdde857/e4a3f/fulldisk.png 295w,
/static/6e1cce18a9f6fc03e6b0fde7fcdde857/fcda8/fulldisk.png 590w,
/static/6e1cce18a9f6fc03e6b0fde7fcdde857/efc66/fulldisk.png 885w,
/static/6e1cce18a9f6fc03e6b0fde7fcdde857/c83ae/fulldisk.png 1180w,
/static/6e1cce18a9f6fc03e6b0fde7fcdde857/536c7/fulldisk.png 1480w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Also, you might want to disable signing commits like this.&lt;/p&gt;
&lt;p&gt;Go to the notes directory and disable signing commits just for this repo.&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;[commit]
	gpgsign = false&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;&lt;del&gt;Also, add &lt;code&gt;.obsidian&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt; so that you don’t get merge conflicts between multiple machines.
All we care about notes files, and not the Obsidian configurations.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;Actually, we should sync the whole folder because we want the plugin and settings sync as well which is stored in .obsidian folder.&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;.obsidian/*&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;However, if you can afford, I would suggest to buy a paid obsidian subscription for &lt;a href=&quot;https://obsidian.md/sync&quot;&gt;sync&lt;/a&gt; as it is a genuinely great software.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[New Job at ScaleFusion]]></title><description><![CDATA[Reflecting on My Career Journey and a New Beginning at Scalefusion I began my professional journey in February 2013 with a Dutch company…]]></description><link>https://vinitkumar.me/new-job/</link><guid isPermaLink="false">https://vinitkumar.me/new-job/</guid><pubDate>Mon, 18 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Reflecting on My Career Journey and a New Beginning at Scalefusion&lt;/h2&gt;
&lt;p&gt;I began my professional journey in February 2013 with a Dutch company based in Pune.
As a fresh graduate, I was fortunate to find inspiring mentors like Jos, Ruben, and Jonathan, who shaped my early career.
I also had the privilege of working alongside incredible teammates such as Aashish, Robert, Edwin, Pratik, and others who became lifelong friends.&lt;/p&gt;
&lt;p&gt;During my time there, I worked on an ambitious project, SocialSchools, which became a cornerstone of my career.
I contributed to the development of its first communication platform for schools and later led the effort to build a multi-tenant CMS from scratch.
This platform powered thousands of domains and handled millions of monthly requests, marking a significant milestone for me and the team.
In 2022, SocialSchools was acquired by KidsKonnect, and I continued contributing to their vision for the next two years.&lt;/p&gt;
&lt;h2&gt;A Turning Point and the Path Ahead&lt;/h2&gt;
&lt;p&gt;By October 2024, it became clear that my journey with KidsKonnect would come to an end.
While contemplating my next steps, I reconnected with a company I’ve admired for years—Scalefusion.
Known for its innovative products and leadership, it felt like a natural fit for the challenges
I was eager to tackle. After a rewarding interview process, I was thrilled to accept the role of Principal Engineer.&lt;/p&gt;
&lt;h2&gt;Gratitude and Aspirations&lt;/h2&gt;
&lt;p&gt;Reflecting on nearly 12 years at my previous company, I am deeply grateful for the mentorship,
skills, and friendships that shaped me. This experience has prepared me to embrace this next phase with confidence and ambition.&lt;/p&gt;
&lt;p&gt;I would like to thank my wife, family, and colleagues for their unwavering support during this transition.
At Scalefusion, I look forward to reinventing myself, embracing new challenges, and achieving greater heights alongside an incredible team.&lt;/p&gt;
&lt;p&gt;Here’s to growth, learning, and making an impact!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/88a4d622f03a0c2dcf4e189d6fc66ae6/newsetup.jpg&quot; alt=&quot;newsetup&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Non Negotiables]]></title><description><![CDATA[I wrote this flying to Delhi a week before without internet/distractions on my journal.
Here, I just porting it to the digital format, so…]]></description><link>https://vinitkumar.me/non-negotiables/</link><guid isPermaLink="false">https://vinitkumar.me/non-negotiables/</guid><pubDate>Wed, 16 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I wrote this flying to Delhi a week before without internet/distractions on my journal.
Here, I just porting it to the digital format, so that I can refer to it anytime.
Or share it with someone who might find it useful.&lt;/p&gt;
&lt;p&gt;Just like Carmy wrote on the series “The Bear”, about the &lt;a href=&quot;https://screenrant.com/the-bear-season-3-carmy-non-negotiables-explained/&quot;&gt;non-negotiables&lt;/a&gt;, I want to write mine as a software artist.
I say “Software Artist” because that is who I am at the core.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Study everything interesting around you.&lt;/li&gt;
&lt;li&gt;Make mistakes, but only once.&lt;/li&gt;
&lt;li&gt;Live your own life, don’t give any employer the charge of your life.&lt;/li&gt;
&lt;li&gt;Don’t get blindsided by it.&lt;/li&gt;
&lt;li&gt;If you don’t enjoy a party/company just leave.&lt;/li&gt;
&lt;li&gt;Believe in yourself.&lt;/li&gt;
&lt;li&gt;Eat your own dog food.&lt;/li&gt;
&lt;li&gt;Create art everyday (Code/Music/Sketch/Write).&lt;/li&gt;
&lt;li&gt;Write type or Dictate everyday.&lt;/li&gt;
&lt;li&gt;Dream big without fear.&lt;/li&gt;
&lt;li&gt;8 hrs of sleep (~min 6 hours everyday).&lt;/li&gt;
&lt;li&gt;Set backs are sometimes part of life, don’t get bogged down by it.&lt;/li&gt;
&lt;li&gt;Study deeply and learn.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Why Asking For Help Is A Crucial Skill]]></title><description><![CDATA[If you ever worked as a software engineer, chances are you must have gotten stuck in a problem that
seemed super hard to solve. Also, if you…]]></description><link>https://vinitkumar.me/ask-for-help/</link><guid isPermaLink="false">https://vinitkumar.me/ask-for-help/</guid><pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you ever worked as a software engineer, chances are you must have gotten stuck in a problem that
seemed super hard to solve. Also, if you work in sprints like setup, pretty much all your time for the
next two weeks is booked already. What usually happens with these tricky issues is that, it would totally
derail all your estimates and planning and you would seriously lag behind your tasks and might perform even poorly
because of the mounting time pressure.&lt;/p&gt;
&lt;p&gt;Here are some of my suggestions based on my personal experiences working in early stage startup:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This one trick was taught by my CEO at the time in 2013 was that if you can’t figure out head or tail
of what to do with a problem, give it 30 mins of serious effort and ask for help.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Why is this such a great advice? Let me break it down for you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Asking for help early on basically limits the amount of time that could be wasted because you are trying to figure out something for which you don’t have complete context/background knowledge. If you have more experience folks at work, they can always show you a correct path and you can then follow their advise and solve it with a much higher probability than earlier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the contrary, if you don’t ask for help and only ask the team sometime or some days later, you also put them under pressure as someone else needs to do that task in place of you albeit with more time pressure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All setup related issues should be immediately brought to attention of the platform/Ops/Senior developers. A good reproducible working environment is a must with any productive company.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;However, this doesn’t mean that you run for cover every time you face a problem. You should definitely try to think about a solution and write it in a written format, then discuss your approach without writing a single line of code. The good thing about this approach is that your peers will see that you have put some effort into the problem, and discussing potential solutions also gives them an opportunity to improve your high-level design and suggest improvements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is also the culture that one should teach newer/junior devs so that it becomes more of a cultural thing with the dev team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You don’t have to suffer because of a hard problem/setup issue mostly because you are not asking for help because of your EGO. EGO has no place in a collaborative environment. It’s good to know what you don’t know so that you can ask help and be better at it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another important thing to note here is that one should try not to ask for the same advice twice. Let me explain:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Say you had a Docker issue, and you ask your senior for help and they solve your problem. It’s your duty to make a note or video recording of the help, so that if you face that problem once again, you can solve it on your own next time. This saves time for everyone involved. Anyone will get annoyed if you get stuck with the same problem and don’t take notes of the solution, and keep coming back with the same issue. Making notes of the solution is a great approach and it shows how much you respect others’ time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hope these tips would help you become a better developer and an asset to the team.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/912c6fe0b286cf0eeb36d798f2dec078/2bef9/coding-help.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEz0lEQVR42gHEBDv7AIK10Huqw3urw36txn+txIKvxoKxyX+ux4Gux3unv3+uxYGvxoOwx4KxyIGwyHqpwXysxH+uxnmmwICzzQCMtcqFlaKWrrqTqriUrLmMp7aAmqySp7WTq7iSq7mTrLqOprWIo7OAlqaSqbeRqriSqbeLpLOEmqmCqL0AkLjKW2N2bXSIVm+JT22JTGmHUHaScXuQbn6VVXONUm2JTmuGTm6IVHeTbIecXn6YXnyXi6S2SmeBgKO3AJO6zD1LY1VXbUVQaDFFYitAXjpffFVWbk9cczxUbzZJZitBXi9GZEBjgU9qgjpWc3qLnNDY2Etgd32htACUvM1IUmhfWGpHVW46UW40S2lBZ4NfXXddZ34+Wnc4U3EzTGo2UG9GbIlmfpNXcopIbItdepJLZH6CprgAlr3OQ1NrY2F0UV1zOlFtL0poRGmEXF56YGZ+Tl95O05qMU1rM09uS3CMQ2iEXlZiRUlbQ2aESWN+hqq8AJ+9yklWbEVifTpceUladEZSbEVrh1xifWRziEpjfjhPbTJLaj1XdE93k1h6kHROS0pCTEFsi1BthoirvQChvslBTmVHXntFY39NXXhIUm1HbYlhY3pdYG9QaX5Zan1EXHKgkZdygJFGX3enn6Dk6OZeg505X36Jrb4Al8PPTGB4Z2l9TVNnO05nPlNqSWN5X15tUGN6TWB2Uz5GU3GJeoOUlIuThKK1+P/85/z6kKu6V2uDo8DKALLU3q6+yK6+wlJsgXOTp1B2kWGDmkpgdD5XbkVUaWNJR1Zug0ZherrCyeTj4LXM1bPd54yyw5+zvePp5AC93ODRq6fRzMpLYnhme5E4XHtKaYU/Umtjc4KdqLPJycuOm6hKZHxFZoJlc4muzNus2+zCx864pqmz3OIApbzAr8LHxNnbcXN8aHOCcHqGb3SBd3yGoZ6gfFJZckZPg11jjY+Xb3B7aHKAdJSmb5ar09nYxLy5oLm8ALjZ3JCstn6nvKi5xdXa3LbK2tjx9Of//4yPmlcrNWI9RlgsNZusuc3t97nS2C5FXzxFV83e3crj47TR1AC9y8uhgX92Zm1raniLX2SegYKpmpugmp5jUVxaMjlhPERXLzduYm6omp2OjZY2Um9DMjq3j4i0ko64u7kAr7Oyej46gUhFgkM+hVpZla24lq65lai0WT9HVSsxVy82USYsYExTpsHNma66OlNwPS02dD06djk2qaKhAMHLx7J+b7F/crN8bqyEesXp69L09M/u7l5JSkQYGk8lKkIUGGZWWM/3+Mbm5lNsgz0vObJ7abV8br6/ugDCyMSrd2qvfW+kfXm1tbq1xMR+ipSnydJmX11nX19xaWpxbW1pYF7B5Oi91tdwhZcsKDaAdHard2y+urUAw8fDn15TnlxSplpavnZzmVBLMCk4aoyhg5SciJKZsKyriJWdiZSb0vb2rsjOY3CDKyUySVtvmF1UvraxALvAvZV7d6OOiptLSKZRT5JBPjE1R1dpfm1eX310d5mQkHpsb3FkZtTv7KO7wEtKVjMrNk1phY13dbe2swDH5OTH7O3L8/TA1NTA0tG/0tK21Na109atw8PG5ubJ7OzD4+KwxsbH5uXA2Ni1x8e0zMy52NzG6evJ6Oe55HwAyYYGpQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;coding-prblem&quot;
        title=&quot;&quot;
        src=&quot;/static/912c6fe0b286cf0eeb36d798f2dec078/fcda8/coding-help.png&quot;
        srcset=&quot;/static/912c6fe0b286cf0eeb36d798f2dec078/12f09/coding-help.png 148w,
/static/912c6fe0b286cf0eeb36d798f2dec078/e4a3f/coding-help.png 295w,
/static/912c6fe0b286cf0eeb36d798f2dec078/fcda8/coding-help.png 590w,
/static/912c6fe0b286cf0eeb36d798f2dec078/efc66/coding-help.png 885w,
/static/912c6fe0b286cf0eeb36d798f2dec078/2bef9/coding-help.png 1024w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Why Asking For Help Is A Crucial Skill]]></title><link>https://vinitkumar.me/new-blog/</link><guid isPermaLink="false">https://vinitkumar.me/new-blog/</guid><pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate><content:encoded></content:encoded></item><item><title><![CDATA[Monthly Review]]></title><description><![CDATA[This past month has been quite interesting. Work-wise, it was decent—some good moments and some not-so-great ones. We switched back to a…]]></description><link>https://vinitkumar.me/monthly-review/</link><guid isPermaLink="false">https://vinitkumar.me/monthly-review/</guid><pubDate>Tue, 13 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This past month has been quite interesting. Work-wise, it was decent—some good moments and some not-so-great ones. We switched back to a more structured way of working after trying out something new. While many people might dislike Scrum for good reasons (like all the meetings), it does bring some order to the chaos. The alternative we tried was even messier.&lt;/p&gt;
&lt;p&gt;On a personal note, my wife and I have managed to keep up a fairly consistent routine of walking five days a week, except when one of us is sick. However, our sleep quality and duration are still a concern. We always end up going to bed late and waking up early, so sometimes we need to make up for it with an afternoon nap. We’ll try to improve this in the coming months.&lt;/p&gt;
&lt;p&gt;Financially, our expenses have increased a bit, and we need to get them under control. We’re not in a bad shape, but we need to be more careful and frugal. I’ve also been struggling with motivation, which has been a persistent worry. I’m trying to cut motivation out of the equation altogether since it’s proven to be an unreliable ally.&lt;/p&gt;
&lt;p&gt;On a lighter note, we watched “Deadpool and Wolverine” movie recently, and it was a lot of fun.&lt;/p&gt;
&lt;p&gt;My guitar skills are improving, and I hope to be able to play some decent songs—both chords and solos—in the coming months.&lt;/p&gt;
&lt;p&gt;One thing I really want to focus on is reading and writing more. I have a great collection of books, but I just can’t seem to find the time to read them. I’m thinking I should start by reading a few pages a day and see how it goes. I also need to seriously cut down on social media use. It’s such a time-waster and always leaves me feeling bad.&lt;/p&gt;
&lt;p&gt;Here are some screenshots of the last month walking and sleep data:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/64270d1489dc62773163f27a0d44dcc6/acb04/IMG_103C22132295-1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 216.2162162162162%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAArABQDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAEDAgQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHxdTSbJBQSsyMmuoVSAB//xAAdEAACAQQDAAAAAAAAAAAAAAAAARECEBIhMUFC/9oACAEBAAEFAp11kbjdlUZWwZBB5cDFzUlB/8QAFxEAAwEAAAAAAAAAAAAAAAAAARARIP/aAAgBAwEBPwFQY//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BX//EABcQAAMBAAAAAAAAAAAAAAAAAAARMDH/2gAIAQEABj8CHDI//8QAHRAAAgIDAAMAAAAAAAAAAAAAAAERIRAxUUFhgf/aAAgBAQABPyEK2JerG/Z+k+ai9XiiB30MXUNyZULsSC6xLFlU9C00sf/aAAwDAQACAAMAAAAQrDdMyA//xAAYEQACAwAAAAAAAAAAAAAAAAABEBEgIf/aAAgBAwEBPxCQtqf/xAAXEQADAQAAAAAAAAAAAAAAAAABEBEg/9oACAECAQE/EFTMf//EAB0QAQADAAIDAQAAAAAAAAAAAAEAESExUUFxkWH/2gAIAQEAAT8QUhcDtcjfZB7JeAQDNQtWsmPDKLVGsuNjTeRywMKPk1ePuK1e4nbB6GCUbE8M/c+wQojhUKg2FtkorVJyQt4niO6CIDFttn//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;sleep&quot;
        title=&quot;&quot;
        src=&quot;/static/64270d1489dc62773163f27a0d44dcc6/1c72d/IMG_103C22132295-1.jpg&quot;
        srcset=&quot;/static/64270d1489dc62773163f27a0d44dcc6/a80bd/IMG_103C22132295-1.jpg 148w,
/static/64270d1489dc62773163f27a0d44dcc6/1c91a/IMG_103C22132295-1.jpg 295w,
/static/64270d1489dc62773163f27a0d44dcc6/1c72d/IMG_103C22132295-1.jpg 590w,
/static/64270d1489dc62773163f27a0d44dcc6/acb04/IMG_103C22132295-1.jpg 750w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/49308dcd24c22760a5af6a54d16ac377/acb04/IMG_286BE7834BDC-1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 216.2162162162162%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAArABQDASIAAhEBAxEB/8QAGQAAAwADAAAAAAAAAAAAAAAAAAIDAQQF/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAIBA//aAAwDAQACEAMQAAAB4uZKVJA7WaOmmVKi6ldyAB//xAAdEAACAgIDAQAAAAAAAAAAAAAAAQISAxEgITFC/9oACAEBAAEFAt9NouWfJQx6piJxin81GL2SWj//xAAYEQACAwAAAAAAAAAAAAAAAAAAEAEREv/aAAgBAwEBPwFYkp//xAAWEQADAAAAAAAAAAAAAAAAAAAQEiD/2gAIAQIBAT8BDR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARExIAIQIjNB/9oACAEBAAY/Ai8q2U63J2M4uTwvH//EAB8QAAMAAgEFAQAAAAAAAAAAAAABESExEFFxgZGh8f/aAAgBAQABPyF4KYET6Nut8mCXHMU0RB7HHJRlQ/AMx1m4LQ9j2JGZqnoWtLj/2gAMAwEAAgADAAAAELPOjjDP/8QAGBEBAAMBAAAAAAAAAAAAAAAAAQAQEZH/2gAIAQMBAT8QoY3TpFDl/wD/xAAZEQEAAgMAAAAAAAAAAAAAAAABEBEAUZH/2gAIAQIBAT8QhOnjg2XP/8QAHxABAAIDAAEFAAAAAAAAAAAAAQARITFRkUFxgdHw/9oACAEBAAE/EEsFFYu8QeVxmjb5jEyodQEWU0Tb7yzkKuSp2AOyV2YICJQQ4HxP1PqBRbZXqgEKFlWgPnsQVY3qFUrJuEzxOozoIgNxbbZ//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;walk&quot;
        title=&quot;&quot;
        src=&quot;/static/49308dcd24c22760a5af6a54d16ac377/1c72d/IMG_286BE7834BDC-1.jpg&quot;
        srcset=&quot;/static/49308dcd24c22760a5af6a54d16ac377/a80bd/IMG_286BE7834BDC-1.jpg 148w,
/static/49308dcd24c22760a5af6a54d16ac377/1c91a/IMG_286BE7834BDC-1.jpg 295w,
/static/49308dcd24c22760a5af6a54d16ac377/1c72d/IMG_286BE7834BDC-1.jpg 590w,
/static/49308dcd24c22760a5af6a54d16ac377/acb04/IMG_286BE7834BDC-1.jpg 750w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Optimizing ZSH Performance: A Guide to Profiling and Fixing Shell Slowness]]></title><description><![CDATA[Lately, my shell (zsh) feels slow to use. Even booting it for the first time feels like
it is slow to render. It shouldn’t happen as I am…]]></description><link>https://vinitkumar.me/fix-slow-zsh-shell/</link><guid isPermaLink="false">https://vinitkumar.me/fix-slow-zsh-shell/</guid><pubDate>Tue, 02 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lately, my shell (zsh) feels slow to use. Even booting it for the first time feels like
it is slow to render. It shouldn’t happen as I am using a beefy MacBook Pro. I also don’t
don’t use any other zsh plugin other than git. So, I decided to investigate what is causing
the slowness.&lt;/p&gt;
&lt;p&gt;A quick search on the internet led me to the &lt;code&gt;zsh&lt;/code&gt; profiling feature. I can profile the shell using this:&lt;/p&gt;
&lt;p&gt;Put the following code at the start and end of your &lt;code&gt;.zshrc&lt;/code&gt; file:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;zmodload zsh/zprof
# your zshrc file content here.
zprof&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Save it and source the ~/.zshrc file. Now, you can see the profiling output by running &lt;code&gt;zprof&lt;/code&gt;.&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;
num  calls                time                       self            name
-----------------------------------------------------------------------------------
 1)    1        3886.43  3886.43   93.04%   3348.16  3348.16   80.15%  compinit
 2)  831         381.00     0.46    9.12%    381.00     0.46    9.12%  compdef
 3)    2         169.68    84.84    4.06%     98.30    49.15    2.35%  nvm
 4)    1          86.15    86.15    2.06%     86.15    86.15    2.06%  compdump
 5)    2          71.57    35.78    1.71%     71.57    35.78    1.71%  compaudit
 6)   22          77.67     3.53    1.86%     58.00     2.64    1.39%  _omz_source
 7)    1          62.61    62.61    1.50%     54.07    54.07    1.29%  nvm_ensure_version_installed
 8)    1         209.63   209.63    5.02%     39.95    39.95    0.96%  nvm_auto
 9)    1           8.54     8.54    0.20%      8.54     8.54    0.20%  nvm_is_version_installed
10)    1           8.33     8.33    0.20%      8.02     8.02    0.19%  nvm_die_on_prefix
11)    1           6.24     6.24    0.15%      6.24     6.24    0.15%  regexp-replace
12)    4           3.69     0.92    0.09%      3.69     0.92    0.09%  add-zsh-hook
13)    1           3.62     3.62    0.09%      3.62     3.62    0.09%  colors
14)    6           3.57     0.59    0.09%      3.57     0.59    0.09%  is-at-least
15)    1           2.99     2.99    0.07%      2.99     2.99    0.07%  zrecompile
16)    1           2.12     2.12    0.05%      2.12     2.12    0.05%  test-ls-args
17)    1           0.44     0.44    0.01%      0.44     0.44    0.01%  nvm_has
18)    2           0.31     0.16    0.01%      0.31     0.16    0.01%  is_plugin
19)    4           0.31     0.08    0.01%      0.31     0.08    0.01%  nvm_npmrc_bad_news_bears
20)    1           0.08     0.08    0.00%      0.04     0.04    0.00%  complete
21)    3           0.04     0.01    0.00%      0.04     0.01    0.00%  is_theme
22)    2           0.02     0.01    0.00%      0.02     0.01    0.00%  bashcompinit
23)    2           0.02     0.01    0.00%      0.02     0.01    0.00%  env_default
24)    1         209.65   209.65    5.02%      0.02     0.02    0.00%  nvm_process_parameters
25)    1           0.01     0.01    0.00%      0.01     0.01    0.00%  nvm_is_zsh

-----------------------------------------------------------------------------------

 1)    1        3886.43  3886.43   93.04%   3348.16  3348.16   80.15%  compinit
       1/2        71.57    71.57    1.71%      0.28     0.28             compaudit [5]
       1/1        86.15    86.15    2.06%     86.15    86.15             compdump [4]
     818/831     380.55     0.47    9.11%    380.55     0.47             compdef [2]

-----------------------------------------------------------------------------------

     818/831     380.55     0.47    9.11%    380.55     0.47             compinit [1]
      12/831       0.41     0.03    0.01%      0.41     0.03             _omz_source [6]
       1/831       0.04     0.04    0.00%      0.04     0.04             complete [20]
 2)  831         381.00     0.46    9.12%    381.00     0.46    9.12%  compdef

-----------------------------------------------------------------------------------

24)    1         209.65   209.65    5.02%      0.02     0.02    0.00%  nvm_process_parameters
       1/1       209.63   209.63    5.02%     39.95    39.95             nvm_auto [8]

-----------------------------------------------------------------------------------

       1/1       209.63   209.63    5.02%     39.95    39.95             nvm_process_parameters [24]
 8)    1         209.63   209.63    5.02%     39.95    39.95    0.96%  nvm_auto
       1/2       169.68   169.68    4.06%      4.92     4.92             nvm [3]

-----------------------------------------------------------------------------------

       1/2       169.68   169.68    4.06%      4.92     4.92             nvm_auto [8]
       1/2       164.76   164.76    3.94%     93.38    93.38             nvm [3]
 3)    2         169.68    84.84    4.06%     98.30    49.15    2.35%  nvm
       1/1         0.44     0.44    0.01%      0.44     0.44             nvm_has [17]
       1/1         8.33     8.33    0.20%      8.02     8.02             nvm_die_on_prefix [10]
       1/1        62.61    62.61    1.50%     54.07    54.07             nvm_ensure_version_installed [7]
       1/2       164.76   164.76    3.94%     93.38    93.38             nvm [3]

-----------------------------------------------------------------------------------

       1/1        86.15    86.15    2.06%     86.15    86.15             compinit [1]
 4)    1          86.15    86.15    2.06%     86.15    86.15    2.06%  compdump

-----------------------------------------------------------------------------------

 6)   22          77.67     3.53    1.86%     58.00     2.64    1.39%  _omz_source
       1/2         0.01     0.01    0.00%      0.01     0.01             bashcompinit [22]
       2/2         0.02     0.01    0.00%      0.02     0.01             env_default [23]
      12/831       0.41     0.03    0.01%      0.41     0.03             compdef [2]
       1/1         2.12     2.12    0.05%      2.12     2.12             test-ls-args [16]
       6/6         3.57     0.59    0.09%      3.57     0.59             is-at-least [14]
       1/1         3.62     3.62    0.09%      3.62     3.62             colors [13]
       4/4         3.69     0.92    0.09%      3.69     0.92             add-zsh-hook [12]
       1/1         6.24     6.24    0.15%      6.24     6.24             regexp-replace [11]

-----------------------------------------------------------------------------------

       1/2        71.57    71.57    1.71%      0.28     0.28             compinit [1]
       1/2        71.29    71.29    1.71%     71.29    71.29             compaudit [5]
 5)    2          71.57    35.78    1.71%     71.57    35.78    1.71%  compaudit
       1/2        71.29    71.29    1.71%     71.29    71.29             compaudit [5]

-----------------------------------------------------------------------------------

       1/1        62.61    62.61    1.50%     54.07    54.07             nvm [3]
 7)    1          62.61    62.61    1.50%     54.07    54.07    1.29%  nvm_ensure_version_installed
       1/1         8.54     8.54    0.20%      8.54     8.54             nvm_is_version_installed [9]

-----------------------------------------------------------------------------------

       1/1         8.54     8.54    0.20%      8.54     8.54             nvm_ensure_version_installed [7]
 9)    1           8.54     8.54    0.20%      8.54     8.54    0.20%  nvm_is_version_installed

-----------------------------------------------------------------------------------

       1/1         8.33     8.33    0.20%      8.02     8.02             nvm [3]
10)    1           8.33     8.33    0.20%      8.02     8.02    0.19%  nvm_die_on_prefix
       4/4         0.31     0.08    0.01%      0.31     0.08             nvm_npmrc_bad_news_bears [19]

-----------------------------------------------------------------------------------

       1/1         6.24     6.24    0.15%      6.24     6.24             _omz_source [6]
11)    1           6.24     6.24    0.15%      6.24     6.24    0.15%  regexp-replace

-----------------------------------------------------------------------------------

       4/4         3.69     0.92    0.09%      3.69     0.92             _omz_source [6]
12)    4           3.69     0.92    0.09%      3.69     0.92    0.09%  add-zsh-hook

-----------------------------------------------------------------------------------

       1/1         3.62     3.62    0.09%      3.62     3.62             _omz_source [6]
13)    1           3.62     3.62    0.09%      3.62     3.62    0.09%  colors

-----------------------------------------------------------------------------------

       6/6         3.57     0.59    0.09%      3.57     0.59             _omz_source [6]
14)    6           3.57     0.59    0.09%      3.57     0.59    0.09%  is-at-least

-----------------------------------------------------------------------------------

15)    1           2.99     2.99    0.07%      2.99     2.99    0.07%  zrecompile

-----------------------------------------------------------------------------------

       1/1         2.12     2.12    0.05%      2.12     2.12             _omz_source [6]
16)    1           2.12     2.12    0.05%      2.12     2.12    0.05%  test-ls-args

-----------------------------------------------------------------------------------

       1/1         0.44     0.44    0.01%      0.44     0.44             nvm [3]
17)    1           0.44     0.44    0.01%      0.44     0.44    0.01%  nvm_has

-----------------------------------------------------------------------------------

18)    2           0.31     0.16    0.01%      0.31     0.16    0.01%  is_plugin

-----------------------------------------------------------------------------------

       4/4         0.31     0.08    0.01%      0.31     0.08             nvm_die_on_prefix [10]
19)    4           0.31     0.08    0.01%      0.31     0.08    0.01%  nvm_npmrc_bad_news_bears

-----------------------------------------------------------------------------------

20)    1           0.08     0.08    0.00%      0.04     0.04    0.00%  complete
       1/831       0.04     0.04    0.00%      0.04     0.04             compdef [2]

-----------------------------------------------------------------------------------

21)    3           0.04     0.01    0.00%      0.04     0.01    0.00%  is_theme

-----------------------------------------------------------------------------------

       1/2         0.01     0.01    0.00%      0.01     0.01             _omz_source [6]
22)    2           0.02     0.01    0.00%      0.02     0.01    0.00%  bashcompinit

-----------------------------------------------------------------------------------

       2/2         0.02     0.01    0.00%      0.02     0.01             _omz_source [6]
23)    2           0.02     0.01    0.00%      0.02     0.01    0.00%  env_default

-----------------------------------------------------------------------------------

25)    1           0.01     0.01    0.00%      0.01     0.01    0.00%  nvm_is_zsh&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;If notice the output you would see the nvm showing prominently in it. It means it’s the reason for the slowness.&lt;/p&gt;
&lt;p&gt;Here is my ~/.zshrc file for reference:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH

# Path to your oh-my-zsh installation.
export ZSH=&amp;quot;$HOME/.oh-my-zsh&amp;quot;

# Set name of the theme to load --- if set to &amp;quot;random&amp;quot;, it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME=&amp;quot;robbyrussell&amp;quot;

# Set list of themes to pick from when loading at random
# Setting this variable when ZSH_THEME=random will cause zsh to load
# a theme from this variable instead of looking in $ZSH/themes/
# If set to an empty array, this variable will have no effect.
# ZSH_THEME_RANDOM_CANDIDATES=( &amp;quot;robbyrussell&amp;quot; &amp;quot;agnoster&amp;quot; )

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE=&amp;quot;true&amp;quot;

# Uncomment the following line to use hyphen-insensitive completion.
# Case-sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE=&amp;quot;true&amp;quot;

# Uncomment one of the following lines to change the auto-update behavior
# zstyle &amp;#39;:omz:update&amp;#39; mode disabled  # disable automatic updates
# zstyle &amp;#39;:omz:update&amp;#39; mode auto      # update automatically without asking
# zstyle &amp;#39;:omz:update&amp;#39; mode reminder  # just remind me to update when it&amp;#39;s time

# Uncomment the following line to change how often to auto-update (in days).
# zstyle &amp;#39;:omz:update&amp;#39; frequency 13

# Uncomment the following line if pasting URLs and other text is messed up.
# DISABLE_MAGIC_FUNCTIONS=&amp;quot;true&amp;quot;

# Uncomment the following line to disable colors in ls.
# DISABLE_LS_COLORS=&amp;quot;true&amp;quot;

# Uncomment the following line to disable auto-setting terminal title.
# DISABLE_AUTO_TITLE=&amp;quot;true&amp;quot;

# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION=&amp;quot;true&amp;quot;

# Uncomment the following line to display red dots whilst waiting for completion.
# You can also set it to another string to have that shown instead of the default red dots.
# e.g. COMPLETION_WAITING_DOTS=&amp;quot;%F{yellow}waiting...%f&amp;quot;
# Caution: this setting can cause issues with multiline prompts in zsh &amp;lt; 5.7.1 (see #5765)
# COMPLETION_WAITING_DOTS=&amp;quot;true&amp;quot;

# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status check for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY=&amp;quot;true&amp;quot;

# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# You can set one of the optional three formats:
# &amp;quot;mm/dd/yyyy&amp;quot;|&amp;quot;dd.mm.yyyy&amp;quot;|&amp;quot;yyyy-mm-dd&amp;quot;
# or set a custom format using the strftime function format specifications,
# see &amp;#39;man strftime&amp;#39; for details.
# HIST_STAMPS=&amp;quot;mm/dd/yyyy&amp;quot;

# Would you like to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder

# Which plugins would you like to load?
# Standard plugins can be found in $ZSH/plugins/
# Custom plugins may be added to $ZSH_CUSTOM/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git)
alias c=&amp;#39;clear&amp;#39;
alias activate=&amp;#39;source venv/bin/activate&amp;#39;
alias syncall=&amp;#39;gco develop &amp;amp;&amp;amp; ggpull &amp;amp;&amp;amp; gco staging &amp;amp;&amp;amp; ggpull &amp;amp;&amp;amp; gco master &amp;amp;&amp;amp; ggpull&amp;#39;
alias vim=&amp;quot;nvim&amp;quot;
alias vi=&amp;quot;nvim&amp;quot;
alias v=&amp;quot;nvim&amp;quot;

source $ZSH/oh-my-zsh.sh

# User configuration

# export MANPATH=&amp;quot;/usr/local/man:$MANPATH&amp;quot;

# You may need to manually set your language environment
# export LANG=en_US.UTF-8

# Preferred editor for local and remote sessions
if [[ -n $SSH_CONNECTION ]]; then
  export EDITOR=&amp;#39;vim&amp;#39;
else
  export EDITOR=&amp;#39;mvim&amp;#39;
fi

# Compilation flags
# export ARCHFLAGS=&amp;quot;-arch x86_64&amp;quot;

# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig=&amp;quot;mate ~/.zshrc&amp;quot;
# alias ohmyzsh=&amp;quot;mate ~/.oh-my-zsh&amp;quot;

eval &amp;quot;$(zoxide init zsh)&amp;quot;
. &amp;quot;$HOME/.cargo/env&amp;quot;
export PATH=&amp;quot;/opt/homebrew/opt/ruby/bin:$PATH&amp;quot;
[ -f ~/.fzf.zsh ] &amp;amp;&amp;amp; source ~/.fzf.zsh

# export NVM_DIR=&amp;quot;$HOME/.nvm&amp;quot;
# [ -s &amp;quot;$NVM_DIR/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/nvm.sh&amp;quot;  # This loads nvm
# [ -s &amp;quot;$NVM_DIR/bash_completion&amp;quot; ] &amp;amp;&amp;amp; \. &amp;quot;$NVM_DIR/bash_completion&amp;quot;  # This loads nvm bash_completion
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Now, NVM is an useful tool, but it doesn’t need to be enabled all the time for my day to day development. So, I decided to just comment nvm for now and uncomment it as and when needed.&lt;/p&gt;
&lt;p&gt;~Fin&lt;/p&gt;
&lt;p&gt;Finally, my shell is back to normal speed. I hope this helps you too.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[New Week Start]]></title><description><![CDATA[Starting a new work week today. It’s exciting to start the week with a bang. I have a lot of things to do this week. I have to finish the…]]></description><link>https://vinitkumar.me/weekstart-july-1/</link><guid isPermaLink="false">https://vinitkumar.me/weekstart-july-1/</guid><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Starting a new work week today. It’s exciting to start the week with a bang. I have a lot of things to do this week. I have to finish the work on the new feature that I have been working on for the past 2 weeks.&lt;/p&gt;
&lt;p&gt;I also got a new Guitar this weekend. I am excited to learn how to play it. I have been watching a lot of YouTube videos on how to play the guitar. I am excited to learn how to play the guitar. I have always wanted to learn how to play the guitar. I am excited to start this new journey. I also got a new Guitar teacher at the same music school where my kiddo goes to learn Piano. Always wanted to learn it, but can’t afford it when I was in college.&lt;/p&gt;
&lt;p&gt;I got a new wireless earphones last weekend as well. It’s nice and comes with noise canceling as well. I also have an Audio Technica Headphones, but it is painful to wear with glasses. I will still use them but not while long work calls.&lt;/p&gt;
&lt;p&gt;I also want to write more and more and get that part of my brain reactivated. I also want to read many books I got. I have a lot of things to do this week. I am excited to start this new week.&lt;/p&gt;
&lt;p&gt;I am also working on my mindset. I want me to be more positive and grateful. I also want to be more focused towards my goal and meet my purpose.&lt;/p&gt;
&lt;p&gt;I also started watching “The Bear - Season 3” on Disney+ Hotstar. It’s a nice show. The third season is also nice. I am excited to watch the rest of the season.&lt;/p&gt;
&lt;p&gt;At this point, these things are main goals for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complete the work on the features and bug I need to do.&lt;/li&gt;
&lt;li&gt;Learn Guitar and practice everyday.&lt;/li&gt;
&lt;li&gt;Write more and more and get that part of my brain reactivated.&lt;/li&gt;
&lt;li&gt;Spend more quality time with my family.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;~Fin&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Weekly Review (24-28 June 2024)]]></title><description><![CDATA[I have been struggling fairly with the blog. I don’t write that often. I love writing and reading, but lately, I have not been to do either…]]></description><link>https://vinitkumar.me/weekly-review-1/</link><guid isPermaLink="false">https://vinitkumar.me/weekly-review-1/</guid><pubDate>Fri, 28 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been struggling fairly with the blog. I don’t write that often. I love writing and reading, but lately, I have not been to do either.&lt;/p&gt;
&lt;p&gt;Coming to the topic. The week started with me waking up at 5am every day. My kiddo started Grade-1 and we need to wake up, and get him ready for school and drop him to school. After that, my wife and  I go for a walk. We are doing this pretty regularly for some weeks and it feels good.&lt;/p&gt;
&lt;p&gt;The only thing that’s bad in this is what we go to sleep fairly late (Never before 12.30am), and wake up early, so we both are sleep deprived. Now to compensate the sleep loss, we tend to get a quick nap after our walk. This is not good, but we are trying to get to bed early. In a perfect world, I would always like to have a 8hr sleep, but that’s not possible with the current schedule.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/25ab2df8ebface8a63be516d52aa868b/b2cd5/walk.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 216.2162162162162%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAArABQDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAIDBAEF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAHx1RShINlMixooxeek5UgAf//EABwQAAIDAAMBAAAAAAAAAAAAAAABAhESECEiMf/aAAgBAQABBQKy0aFplcQUUecsw6oydUMX2SVH/8QAGBEAAgMAAAAAAAAAAAAAAAAAAREQEyD/2gAIAQMBAT8BixBLH//EABYRAAMAAAAAAAAAAAAAAAAAABASIP/aAAgBAgEBPwEJH//EABkQAQADAQEAAAAAAAAAAAAAAAEQESEAMP/aAAgBAQAGPwLcmibveQTz/8QAHRABAAICAwEBAAAAAAAAAAAAAQARIVEQMWFBof/aAAgBAQABPyHILU94mUtywSWDwWUYb6wxQQYfvhBSmtTvVjcvFQw2ZmNfs7TMj1DXDj//2gAMAwEAAgADAAAAECfITODP/8QAGBEAAgMAAAAAAAAAAAAAAAAAARARICH/2gAIAQMBAT8QgoYFH//EABcRAQEBAQAAAAAAAAAAAAAAAAERECD/2gAIAQIBAT8QuNNXj//EACEQAQEBAAIBAwUAAAAAAAAAAAERACFRMUFhoYGRscHR/9oACAEBAAE/EKmAOGp8GeCIQ7W/Gs98d4kgTgvR/MkSDlQ30Pvub+DUeVD8Yw0kADl/bdTYqlVHIBzN6Yt5HUeh7ZGix3DLN0OmJzZPjXYpA5XKrVq7/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;walk&quot;
        title=&quot;&quot;
        src=&quot;/static/25ab2df8ebface8a63be516d52aa868b/1c72d/walk.jpg&quot;
        srcset=&quot;/static/25ab2df8ebface8a63be516d52aa868b/a80bd/walk.jpg 148w,
/static/25ab2df8ebface8a63be516d52aa868b/1c91a/walk.jpg 295w,
/static/25ab2df8ebface8a63be516d52aa868b/1c72d/walk.jpg 590w,
/static/25ab2df8ebface8a63be516d52aa868b/b2cd5/walk.jpg 828w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/93ae7970e0d4dadf5a60067a63fc8759/b2cd5/sleep.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 135.8108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAECAwX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAfGkROaW8y6cjF//xAAdEAABAgcAAAAAAAAAAAAAAAABABECEBIgISIx/9oACAEBAAEFAupwjEskUSfVzb//xAAWEQEBAQAAAAAAAAAAAAAAAAAQEQH/2gAIAQMBAT8BuEP/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAUEAEAAAAAAAAAAAAAAAAAAAAw/9oACAEBAAY/Ak//xAAaEAACAwEBAAAAAAAAAAAAAAABEQAhMRBx/9oACAEBAAE/IWgZA9hZREsiuGY24aKhdMNQmLfBsOc//9oADAMBAAIAAwAAABDfDXD/xAAXEQEBAQEAAAAAAAAAAAAAAAABEBEh/9oACAEDAQE/EEuTAz//xAAXEQADAQAAAAAAAAAAAAAAAAABEBEh/9oACAECAQE/EIVpX//EACIQAQACAQMDBQAAAAAAAAAAAAEAESExQVFhodEQceHw8f/aAAgBAQABPxAqAeVp2hKIrcVvtPddT8htpWB4r4iMLdW2p5gbDpiYEoU11KfMQWF8fekW8szygLYPT//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;sleep&quot;
        title=&quot;&quot;
        src=&quot;/static/93ae7970e0d4dadf5a60067a63fc8759/1c72d/sleep.jpg&quot;
        srcset=&quot;/static/93ae7970e0d4dadf5a60067a63fc8759/a80bd/sleep.jpg 148w,
/static/93ae7970e0d4dadf5a60067a63fc8759/1c91a/sleep.jpg 295w,
/static/93ae7970e0d4dadf5a60067a63fc8759/1c72d/sleep.jpg 590w,
/static/93ae7970e0d4dadf5a60067a63fc8759/b2cd5/sleep.jpg 828w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Life at work has been moderately stressful as well. I am working on a newer stack and there is insane amount of code and business rules to understand. I think I am handling it fairly well, but it’s always humbling working on something new and realizing how much you don’t know. It’s also a project with DDD (Domain Driven Development) and I am trying to understand the concepts and apply them. It’s a good learning experience. Great thing about the project is an insane amount of test coverage and that gives me a lot of confidence in making changes. Also, my local setup has issues, so only way I can make sure my code works is by running the tests and writing them.  I have done most amount of TDD in my life in the last 1 year and I get the appeal, especially when you are working on a complex system and with many other people.&lt;/p&gt;
&lt;p&gt;I also got a couple of new books last week and I will try to read them this weekend and make some notes. I have so many great books at home and if I am able to make strides with them, I will definitely be able to achieve much more in life.&lt;/p&gt;
&lt;p&gt;I also have been thinking about my blog and how I can make it better. I have been thinking about writing more and more and I think I will be able to do it. I have been thinking about writing about my work, and even small things that I learnt daily. The blog is just for me and me alone.&lt;/p&gt;
&lt;p&gt;That’s it folks. Hoping to write more content like this in future. Til then, have a good weekend.&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;
o   ^__^
 o  (oo)\_______
    (__)\       )\/\
        ||----w |
        ||     ||&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;</content:encoded></item><item><title><![CDATA[Favorite Coding Fonts in 2024]]></title><description><![CDATA[I think every programmer who loves their craft must love one font or another and I am no exception. I have always been fascinated by the…]]></description><link>https://vinitkumar.me/favourite-coding-font/</link><guid isPermaLink="false">https://vinitkumar.me/favourite-coding-font/</guid><pubDate>Mon, 24 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I think every programmer who loves their craft must love one font or another and I am no exception. I have always been fascinated by the beauty of fonts and the way they can make or break a design. I have always been a fan of monospaced fonts and I have tried a lot of them over the years.&lt;/p&gt;
&lt;p&gt;Here are some of my favorite monospaced fonts that I have used over the years:&lt;/p&gt;
&lt;p&gt;I tried to make screenshots of these fonts in my terminal (Ghostty), with vim and rendering the same piece of code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Source Code Pro&lt;/p&gt;
&lt;p&gt;It is pretty much my all time favorite font. I always keep coming back to it and many programmers who I respect also use it even to date. It is a very readable font and it looks great on any screen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/41889f736f8c35bbe19fc1f190bdb9b9/8b69f/sourcecodepro.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC4klEQVR42qWT204TURSGBwiRUBUJD+Cz6BuYqJAADWlBLg0+AAmIcpLwNpzaEs4JiRAKba0xXhhU2pnpnkPnyMzmd+3dWovEKyf5Mnt2p1/Wv9ZsRaHr8UDfk8TAgxFFSQwqSs+QonS26Ox+2CQx1E20/9aE/tM50tWVeKo0r/vJl89P0xNpDA6O8GQyhenpGczNLRDzWFpawfLyKhYWVySzb+eJ95KZWQmfe7eIF4PDF+TqFsL+YvFzHj6gG3Zkej73Ys7diPP6dSzvQRTzMAx4HMc8BrhH+z7tgdZERODw6KhEroQQPiqXSudiU2MGZ6YFZjm4qpmoMAuG7cLxPHhEEATwCcf1JGLt+76QYnd37xO5eqWwVC5LoVkzeY0x1FgNpmnAoLWuaWCGBcuugzEDdcdBSKIwDIUMrutK4d7efkvYXyo1hL7rc2YwVPQKrnQVas2gNuhgdQajbkqBqDJoCsWdKr8rLBYbkcMg5FbdgmZqFNWEiK8bBlyK63qujC3WflPqB2FLuLPTFvm3MPACrus6Ln98R7Vaxc+Kim9XGrXAhKbpqFQqUHWGukt9peiW41Ir7KZwtz1yQ+gYDnfqDmzql+8HiKIIsSCO5Fo+x3HrWfx2HYaNyPsHfyosFArn4gVN0zijQYghGCKuXkOlqsmKRLygMdVbOM2hbG+3VVgoFM/d4BqqpnNN1aBWVYpXhWVZsB1PfkYinoxp2ZTAbt2pAH5zA2xlttt6SBXSHlTT5hpVpRJ6jdGnY8KgoQhxEPhysn9DVd+d8pfy1zOx6YZR5NBJcWnadBDkSRBX80T8C3lSDg4Oiy1h5mT14tJdw+nHE57P55E/O0Mul8PGxgY2N7eITVpvUqwMMpksMtksstkcvbON4+NjHlB/M1kZWR693rHJZx8mXw/n0ulXa+Pjk+up8Yn10dHk+vDw6G1ob7Sd5Nh6KpVem5p6k0uOpVbJ1SOEHcQ9ou8/EY6OX3WTgHeIf+6dAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;sourcecodepro&quot;
        title=&quot;&quot;
        src=&quot;/static/41889f736f8c35bbe19fc1f190bdb9b9/fcda8/sourcecodepro.png&quot;
        srcset=&quot;/static/41889f736f8c35bbe19fc1f190bdb9b9/12f09/sourcecodepro.png 148w,
/static/41889f736f8c35bbe19fc1f190bdb9b9/e4a3f/sourcecodepro.png 295w,
/static/41889f736f8c35bbe19fc1f190bdb9b9/fcda8/sourcecodepro.png 590w,
/static/41889f736f8c35bbe19fc1f190bdb9b9/efc66/sourcecodepro.png 885w,
/static/41889f736f8c35bbe19fc1f190bdb9b9/8b69f/sourcecodepro.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Inconsolata (G)&lt;/p&gt;
&lt;p&gt;I love this font. It is simple, not frills and reads great on any screen. It is one of a classic monospaced font that I have used over the years.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4f868ef361e9a24bb0e9673dfbef891c/8b69f/Inconsolata.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC9UlEQVR42qWT208TQRjFC6TRgCKExFf/Fn2WmBC1hNSGEgIYQ3zVhItyDdHEv8NQMBQERVttxScTo0AL+qTRWNq9X7vbZTh+M70R9c0mv3wz090z5zszGwrR71JPz+XzF7uiodbOSKi1oz8UChOtgnC4sz98tptqhxjX108RIaJtbR1XQrXfuZvXrn4ciA6gt7eP3bjej3v3JzA9PUvMYGFhCYuLjzA3v4R5gq9Pif9mMTk1g4nJGfbg4Tz6+iJ7pBXmgt37uS+f4QOW5QTlSoUxoEHAYYwdHx/XlmpzqqhCjwA7O+/zpNXBBbsOc/ldvvhTUlhB1lBQTXwvafgmaTiisWbaMA0DtuMQZci6CYUolz2izEWRybw7IK12IZjPVwU1SWW6psHUDRiEruvgc92w4NgODBJ1XRdBpSLwPJ/PhWA22xTszucPhaBtOqykyCjIBRSVEkqygqIkQTV0aCRuGiYs24bruMIdF7cs61+CVYe+5zPbsaGbJGCSS3JluxZsjxz6DiXIBEEQNKhQ5n8KNlr2PI8pmopfUgGSKqFQlPCjIME0LWjUukKOJUWDYdnkjDbmMegG45uk02+bDnN1QddjPDv+oq6RS0Kh/AzLEnmqPF8a+74Pj3Mqw0wm23SYq52yLhusfhg27e6JU3RxTK3RtWlQbbciKon/neH+fm6XPygrMuOtaRQ+R1FUFEsyTBIve+KKkKOyqHVs2xaC6XSm6XA/l9t1/QCSrDCZ2i2VJBwdFSk7OlXXq7Xt8JfF1eHrHIM2VVWNnZwAL7dTTYeHB/lPfBfZsAJZURgXpryYbuh0L3VmmSarVHzGT5Tun6inqH8puYbg5oe5va/qU7xIZdh26g1epTNYXnmGRCIhWE6sYHV1FWtra0gmk0iur1Ndx8bGc2SyWcbz3t5+fVD/9Nqjw5HHI3fiqZGR0c2xsdtbo0Q8PrQVi8W3YoPVekuMa/Mag8TQ0PDm+Pjd1EA09oS0znLBFuIMceE/4RotvwFt1Hyfry081gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Inconsolata&quot;
        title=&quot;&quot;
        src=&quot;/static/4f868ef361e9a24bb0e9673dfbef891c/fcda8/Inconsolata.png&quot;
        srcset=&quot;/static/4f868ef361e9a24bb0e9673dfbef891c/12f09/Inconsolata.png 148w,
/static/4f868ef361e9a24bb0e9673dfbef891c/e4a3f/Inconsolata.png 295w,
/static/4f868ef361e9a24bb0e9673dfbef891c/fcda8/Inconsolata.png 590w,
/static/4f868ef361e9a24bb0e9673dfbef891c/efc66/Inconsolata.png 885w,
/static/4f868ef361e9a24bb0e9673dfbef891c/8b69f/Inconsolata.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JetBrains Mono&lt;/p&gt;
&lt;p&gt;Relatively new font and I didn’t liked it in the beginning, but have learned to love it over time. It is a very readable font and looks great on any screen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e472389696bb2ebcbb9e7bb286763902/8b69f/jetbrainsmono.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACtElEQVR42qWTXU8TQRSGCw2BgIn2yp/CDWohqD9BLvg3emNi4iXxwoQYE6EgVlQIRAhUaUhMjAJdSEwIltL9nN3Zz3a7nR7PmbbQBr1ykidnZzbzznvOmUmlcNweTk+OjA3O4ucjZKafoZnU4Agy1Obaf7lnNp1OT6U648arF3Pfl5dzMDf3UszPv4Zc7i0sIktLK5DPf4TV1TV4l/8gWcytyH8UFxaX4c3Cksi//wSPnzw9RK0hEsyc/jr9CTiCWpIkAEIgzR5oDj3Q6JkntLdY3FdQa4wEb5UOjw5osazqoqKboFo2fSMGqIyD4wXgeR4EYQhBEADnXBJFEUGisL29e4xao1JQURQpaGmmYIyBZTKwmY0wMA0DLIsBdzhGC3zfh3q9LiFBPEAK7uwULgUzR0dth67jCc3Q4eziHC70KqjoUtU1YA4eYjNwXU869f0AQnRL0XXdjuCVw4yinEjBOIoFsy2omBVMWwPDMMFgJriRC17oQRzHUCc6DolarSYFd3cL11OOG7GwmAW/K2WoqiqUy+dwdlaWJVBVDc4rFdAwep4vcdGtw7loNpt9NcwoJ22HoR0Il3tg245MqdFoSMhZF5rTXeiCa9JhofDlymGpVDpoiRYwyxY2c8DBBnhYfKwPMGwOiZCLtkjzH4Jf+5tCji6qVUGpqZomUzRNS9aROk/pUZqO0z5QwqnzDFMWsLGx2etQOUgaTUpVkCPTIiFDdjQMI3lVsPjdJlxGAo1cu4eZY0X5QYtV7ie6pgndZMJ2fUF3DK+KjJiyfCEUe0nk4wLY2yuWLgX3978d1hsJGCikaQY6ZBBGdC3iPlyZstuBy+bZNhetFsDm5ufj7tMbnbgz+Sw79WDrXnZ6LZu9v343O73ejV1o/ndoz8Ot8fGJ56g1QoIDyDBy8z8hjYE/X02ISd00290AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;jetbrains&quot;
        title=&quot;&quot;
        src=&quot;/static/e472389696bb2ebcbb9e7bb286763902/fcda8/jetbrainsmono.png&quot;
        srcset=&quot;/static/e472389696bb2ebcbb9e7bb286763902/12f09/jetbrainsmono.png 148w,
/static/e472389696bb2ebcbb9e7bb286763902/e4a3f/jetbrainsmono.png 295w,
/static/e472389696bb2ebcbb9e7bb286763902/fcda8/jetbrainsmono.png 590w,
/static/e472389696bb2ebcbb9e7bb286763902/efc66/jetbrainsmono.png 885w,
/static/e472389696bb2ebcbb9e7bb286763902/8b69f/jetbrainsmono.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IBM Plex Mono&lt;/p&gt;
&lt;p&gt;It is my current favorite font. It is very nicely designed and I would recommend it to anyone looking for a new great font.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3cccdc3b4b0aa7742450317a9ab3ca60/8b69f/imbplexmono.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACs0lEQVR42qWTW08TQRSAiw2BgIkQfwwviAsB/oI88G/0xcTERxNeDCZGikBBuSQIBJAQiYnR3sBoTLCldG8ze+nutrsdj+fMdksbnoyTfunuXL45c85sKoXt/kB6cnD4zjw+PkLmeumfS90ZRPpjbo3LNfPpdHoq1W53Xy28+LKaXYGFhZdicfE1ZJZXIZNZheXlNVhf34SNd1uwln0P2exmPNZmKbMCb5beivWNLXj85GkeXf0kHP3549c3wBaErUgA4O+fiGjt6emnErqGSThSyBdy1FlRNVHVDKgZDK5UHd8NUJkNllsHx3GgXvcklmUhNvi+D57nkRQODo7O0TUkhaWLCynkOhc02ZbYYNs2cMbA4ja4jgucWySAMAwljUaDpFJ4fPyxIxwtlUpS6Lu+YBYHjetgWAaYjCMMnLoLjmujzJdRBUEAjWYTgkbQibBHWCgUpTDwAmEyEyraFaimBrpugG7qYHkWSh0ZEckSKYEpkMLDo64j53L5OEIMX9M1uKyUoXpdhd/lMlxelkHHvFar11AuV6BWU9s5jNF0JsIwgr29g5sIL77HOfQsT9QxVzSRooiiSNLE4yVQ7pJ+Igybt448kuSQmVQULIasaFxZeu8WtFpRzztu0hae3ERYLBZzlI/rWk2oqgaapgH9myYDwzCxuhxc10XqcgO5qe3Et4Bz8QeFux/2eiNstQRwyxK0mDESGVIQBL6MlgoiK0sVbhcnCBqdKh8eHnXlsHT+lTo1x4tMwxAGtwReZuHjZIxM0KIW7pg0er4hkl/KyclpsSM8O/ucb2KldJMJuioG3j/Px4gazR4cLBgdNTk2J7iNW+CRd/fPk09vaPzB5DNlanb/oTK9PaHM7Ewo0zsKMtGFgv1KZ2ymi9ltZH9sbPw5ugZJ2IcMIPf+E3L0/QXjoIqqmzzSoAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;IMB&quot;
        title=&quot;&quot;
        src=&quot;/static/3cccdc3b4b0aa7742450317a9ab3ca60/fcda8/imbplexmono.png&quot;
        srcset=&quot;/static/3cccdc3b4b0aa7742450317a9ab3ca60/12f09/imbplexmono.png 148w,
/static/3cccdc3b4b0aa7742450317a9ab3ca60/e4a3f/imbplexmono.png 295w,
/static/3cccdc3b4b0aa7742450317a9ab3ca60/fcda8/imbplexmono.png 590w,
/static/3cccdc3b4b0aa7742450317a9ab3ca60/efc66/imbplexmono.png 885w,
/static/3cccdc3b4b0aa7742450317a9ab3ca60/8b69f/imbplexmono.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cascadia Code&lt;/p&gt;
&lt;p&gt;A good font from Microsoft. It is a very readable font and looks great on any screen but I don’t use it much.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/596e4d123f57131c9cc053ca432911c9/8b69f/Cascadiacode.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACx0lEQVR42qWTW08TURSFCw2BgIny5O/RP6EP/BN8k5iYmNBSKT6YSOKDQI0FRJoYIBYI8ckopYWYhkqv0+lcOr3MpdPDcu/TC2J98yRf5szJnDVrn71OIEDj/mTwwdTM+BxNHxGPbzE+Qc8+ch74G94zFwwGHwb6487qq+VvG7F1rERfizerb7Gx8UESi8WxtbWD7e1dxOMfEd/cwTqtD1hbf493azGxufUJTxeep0hrggVnsz+zP9AF9KbjN30IV0DYXYgWYdPc63aF7/sCgODheZ7odDrynfAJnJx8zZDWDAveOztLn/JivlAUpbICpVpDoVhCsVyBotZg1utoNJpEA+12e4jjOLBtm0VxcJA8J61pKZjJZKSgoZqiqqpQalVoWg0qiVXoB5qqQdd0VKsqTLOOtm3DcV0pajUaUvDw8GgoOHt6eiYF7WZbKKqCy0oOeaWAMjvUFBgtHfWWCSoTVK505pGg2xOVgl+ShzeCqVRP0LUdUVYqyF5lkS/l8esqj8tcDmqNnCoKKhU6DqVKLk3p1DRMaLou2O3e3sFoyY7lCC6vUCjKEnsbTVh1C4ZuoFbTUKc5O2OX/BycYfJPhwNBs2aKOjXAshpo0fnQx2i2Wuh2u9zeIfw+oN9tHB0d3zjkknVykMvlBJeZzxckfIbslptjWZaEv9MNA4bRc88lU6qQSHy+cZim2Lhuh7qrCaXSO6tSqSwF2CVHhkt0HFliPy4yMmg1W6OxSZPD62vKoWaJSrmMsqJCNeo9R+SGn9xhhgJ+a84hH4nN+cXFd17seJ7PN4Lp9G/DAN7o3VrzJJ7nypuSPDpODwXppqRkbFxPEPTXDv41uAm+T41gZ+yy57bflJPzwdWbXlh49iISebkfDod3FxdDiVAolIhGoyNEIpHE0hKzNCQcjuwuL6/sz88/WSStKRYcIyaJu/8Ja4z9BtZJmVLdS6ALAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;cascadia&quot;
        title=&quot;&quot;
        src=&quot;/static/596e4d123f57131c9cc053ca432911c9/fcda8/Cascadiacode.png&quot;
        srcset=&quot;/static/596e4d123f57131c9cc053ca432911c9/12f09/Cascadiacode.png 148w,
/static/596e4d123f57131c9cc053ca432911c9/e4a3f/Cascadiacode.png 295w,
/static/596e4d123f57131c9cc053ca432911c9/fcda8/Cascadiacode.png 590w,
/static/596e4d123f57131c9cc053ca432911c9/efc66/Cascadiacode.png 885w,
/static/596e4d123f57131c9cc053ca432911c9/8b69f/Cascadiacode.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go mono&lt;/p&gt;
&lt;p&gt;I love this font as well. Simple yet, very nice font to keep you in the zone.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9b9ce9a35ba2adffa3bd4b20e617c7e3/8b69f/gomono.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACyUlEQVR42qWTS09TQRTHi4RAwERZ+Xn0S8iCb2HY6cYFcWFisZQUNxhd8G6LlDYN8hUMFlpcEAimvb3tfT/mvqfHc+a2tISlk/xyJuee+c953MlkcL2YnX45t/BkGbevkaWHzCxlnswhMymPvoszy9PTs68yw/X025fCr4PiPmxubvGtr99he3sf9vYOkRIcHVXg6McJlErHUCpX0FeEnd1D2N1L2dk94GWMefvu/QVqzZDg4vX1zW8YAFgsjL0EeAjAY8RPUiLcRxxXknDAPRHHCRKjK8FQgPrpzxZqLZDg8/PGRYNjWLsjcakrgyT3gOzd3zZ00PYUFTTdANO0wDAMsCwbLNsW1jRNuoAquUKteSHYarUa5LR0m6uqBrqmi8O6rqOACSoJot9AUUXRxDfGGPi+Dy5jqeDxWHCx1fojBAM/4BYGq5YKiqmCYRmgY0Y2c8ANXGA+gzAMAUuFKIoEQRAIwZNqbVIwzTDwAu7YDkiaBF1Nhr6mQL+vgGqoKGqD67kiqxEoBp6XZlg5qT4uGW/kjuPAze0t9BVF0MUekqgoHcvu9foCG+Mcx6U+CsFy+XicYbPZFILMYNyxHOxTKjDqk4+ZjLLyPA9tIMomRiVXq/VxhpeXzcZgMKBhcE3T00niFG0s3zBNMQQ6jL9IaodiBPY0FazVH2YYYoN7soxTVmGEoqiiTELDiTvDMil7y7IE9NvggmKxPM6wiRmGfgx3Uo93JAna7Q50JBnpgoTIsgyapt0PYnIwjHnpUCrVB1M+J6fmejGWyvFmbjiMM8/nge9zD8HDPIpCToMj6JWQxZLFS6nV6s2Jkq8uyElBaW8SoJ5OLiqLekivj2wUxUMbiQzr9dOr0dObX1398HF9ff1sbS1XzWY/17LZbC2Xy9c2Njbuyefz6MvdQ3HDfbVQKJy9WVn5hFpzJDiFzCLP/hPSmPoHjk6ZaeR538oAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;gomono&quot;
        title=&quot;&quot;
        src=&quot;/static/9b9ce9a35ba2adffa3bd4b20e617c7e3/fcda8/gomono.png&quot;
        srcset=&quot;/static/9b9ce9a35ba2adffa3bd4b20e617c7e3/12f09/gomono.png 148w,
/static/9b9ce9a35ba2adffa3bd4b20e617c7e3/e4a3f/gomono.png 295w,
/static/9b9ce9a35ba2adffa3bd4b20e617c7e3/fcda8/gomono.png 590w,
/static/9b9ce9a35ba2adffa3bd4b20e617c7e3/efc66/gomono.png 885w,
/static/9b9ce9a35ba2adffa3bd4b20e617c7e3/8b69f/gomono.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Iosevka&lt;/p&gt;
&lt;p&gt;Relatively new font, but great. In the same league as IBM Plex Mono and JetBrains Mono. I would recommend it to anyone looking for a new great font. It’s relatively thin font though so might not be everyone’s cup of tea.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6c44ab7051dd59596afc3e8e349d329b/8b69f/Iosveka.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACnElEQVR42qWTS08TURSACw2BgImw8vfon5AFK40LFiYKtIW1LlyYuDRsjCvEVp4i3VhCW0JcGe2LxgUrOu08OzN3ZjrtcHs857bTjigrb/Ll3pzJ/XIed2IxXPem4/dn5iaX8PgQWfyTqcXY5FRkv/ld3FmKx+MPYsN15/3m2+87exnY3HzHt7bSkMnsQjq9K/b9gyM4ODyG3b3PsLd/BGmMbX/cQT4JPmxn+MHhF3jx8lUZXVMkXLj8dfkTcDndIAgAeA/p8sF+TVxfc/zMaYXnCAHdPT//VkPXHAnnK5Vqiff70GjJXFZ1kFoqooCsG9C2bGDMBsdxcGdgWRbYNgPX9RCXYiSFXO70Al2zQlitVksUVFsql5otaMoyaJoGcksGVVFBR7GqaiiyoyKxI0J4cpIfCRfqtZoQMptxRVdAUprQkhXQ2zroTAfDboPv+4JutysYnHt0FsJCoTgW1obCjutxzdSAMNptzFIHx3UQN8xGiDqdjsDzPKQjhPn8WDgfCl3m8oYkwVWjAU0s/eqqIcqVMVtqhW4Yopc2lkslm6ZFLfhLOMqQGYxTwx3mAM07BCc74mYsLDkfKRmnXCn52BdFUTllRFC5lCUNIixzUKIXLZfaIYSnp4VxhhWcsofTkxoSp2nS07DwudjDsnBYwLBUOlOcME1TgL3mfRR+zZ1Eng2+QwrKmsE1FZ9J2xSZWSggKU012oKQXu+WKdfr9R8UtBw3YLbNbcflWNYIvDgiCGgPojHxpxSLZ9WRsFQqlynod3wU+KLZt60eZtbFzCg736f3OMyweHYR/nqzy8tPXyeS67nnK2vHz1ZWs4lkKptMbfyTRCKVXU0kB6wms2trqePk+kbu0eMnb9A1Q8IJZBq5+5+QY+I3ETqXlVYuzKcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;iosveka&quot;
        title=&quot;&quot;
        src=&quot;/static/6c44ab7051dd59596afc3e8e349d329b/fcda8/Iosveka.png&quot;
        srcset=&quot;/static/6c44ab7051dd59596afc3e8e349d329b/12f09/Iosveka.png 148w,
/static/6c44ab7051dd59596afc3e8e349d329b/e4a3f/Iosveka.png 295w,
/static/6c44ab7051dd59596afc3e8e349d329b/fcda8/Iosveka.png 590w,
/static/6c44ab7051dd59596afc3e8e349d329b/efc66/Iosveka.png 885w,
/static/6c44ab7051dd59596afc3e8e349d329b/8b69f/Iosveka.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Victor Mono&lt;/p&gt;
&lt;p&gt;I used this font for some months too. It’s good and I might revisit it in future.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f74927f190be818bc603cb52d259b409/8b69f/Victormono.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAChElEQVR42qWTT28SQRTAKYSUtCa28RPpl5BDP0rjyRBNTEzcAMZetImxVKW02nJoIEAb9GS0sMDB9NYYYHdn9v/CMn2+N3TLNu3FOMkvMzt/frz3ZkgksD1YTj3MrCY3cPgYyd4knU0kM0g6m0Rur8szG6lU6lHiqt3bfvP6x95+Gba23op32++hVPoEO0hp9zNUKl/h4OAQyntfoIzj0m5ZzhO058POR1HZP4SnuecddKVJuH7++/wXYJsJCLET/widgXb7ew9dqyRcUzvdM5q8GOvij2bA0OBwMdLoG8cWGKYNnHGwbQexwTAMYIyB67oESaFeb/bRtSKFvcFACi1uCtdxgHDwYDT2PQ8mkwn4QQCT6RRmsxmEYQhTHAdBIIXN5sm1cH0htIXODNCZDgZnoBsMNE0HzjkwhHqK0vN8EoHv++A4jhS2TmLCTleVQs/1BEPRyBjBSB9jagy4hTgcLNeSUUaiiCjlRiOWcjcmpAiH2hA0Q4fxWIPhcASmacroeCxKCZYD18TlJUCt3oil3JunHPiBME1LiqjoBEVpWbYUzcfWjSijCJvN1u1LcbkrHNsFCy+ENlPho+JH4+g74u5L6fWkkJtcUAQO3TI+CUqVngjV7i4xgWvzS2kthGuqqp7N8FXjYRGlSdCbo2hJ7Dg24sqUaU72CGNcCo+Pa4sI+73+TxJy0wxpg45iXdcFCgXVCIsvsASC0ov3hOd54dUtqwuhOujQpD+ZCt+jYgcghAD6kTCcyZ4azUXQHPWYtlw8bX/rR3+9lVzu2Yt8vlhTFOXolaJUFSVfLRSL1WKMQqFQzefzck2Re645wvXa5uaTl+jKkHAJWUbu/yfkWPoLAgWfcmydWk8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;victormono&quot;
        title=&quot;&quot;
        src=&quot;/static/f74927f190be818bc603cb52d259b409/fcda8/Victormono.png&quot;
        srcset=&quot;/static/f74927f190be818bc603cb52d259b409/12f09/Victormono.png 148w,
/static/f74927f190be818bc603cb52d259b409/e4a3f/Victormono.png 295w,
/static/f74927f190be818bc603cb52d259b409/fcda8/Victormono.png 590w,
/static/f74927f190be818bc603cb52d259b409/efc66/Victormono.png 885w,
/static/f74927f190be818bc603cb52d259b409/8b69f/Victormono.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SF Mono&lt;/p&gt;
&lt;p&gt;Apple’s font. It is a very readable font and looks great on any screen. Some people love it, some don’t. I am in the former camp.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c681e9ee5309d2742e95d1f8b8188201/8b69f/sfmono.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 81.08108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACrklEQVR42qWTzU7bQBCAAwiBoFKL+kTlJcqBt6g4cukB9VCpKCFQcUJVpRIKxDQhUUR5haqF/PRQoaIKYjv2+m8d27E305k1sVNVPXWlT7ter7+dmV0XCtieLsw9W1yeXcfhc2TtT+bXCrOLyHzKX+/lN+tzcwurhYf26N3+2y+nyjHs7x+Ig4P38OHwIxwdnSBVUM7qcPbpHKrVGihKHSpHp3BYOYEKgWsOK8eC1mxuvrxG1zwJV25+3HwDbF4wikMBIgIQMaQ9PdM4xp4aLpMkSSIRCb0GaF187qJrmYRP2u32FU32VV1oAwN0RNMHcHevgoq9YVrguB74vg+ex2E4HGZwzmkDqJ83euhaksJu97sUOswRmqaDMTDBsmwYoNg0GegoHegGWCyds20bxbRBLlSUWiZcmUTIPS5MwwSd6RKDmWDg8wBFDkc8R0YZBIHspyOs1c5zYafTlcJgGAiUQt9UQWMaCg2MFqO0TPB8F/iQS1lOSNJ/pzwaRcLnPvy8vcXIUGaaIEuAUdpYAsasNH3chGqJ0YHremnKZ/U8wonQt33huTyrE6UUhiEERBDKqCZzcRxLcCyFjUYrj7Dd6VzRjcD6yRqajEmh7TjA8FDogOhjvCaZaEIURamw2ZquYedqNBphepqgUyUYSilV+cxSKaVI0EaO4+JVQhxHjMcAp1Ulj5CEcZjAr74u+qoKd3f3dCdBVTWJrusotGTKGFGW/kMJ0kOpN6Zr2PtKkxYPYiqy67rC5r4Y4qlTjajHjwVmkRHHaR9FofxTms1WZyrl3jVNJnEsZJ2QsfzL8jbGvKjORFrLRI6xjiIVXvQmv97S1tar1zs75ctSqdTY3i42iVKp3Nzd3c0ol8s4V8ooFouTcWNvb+/yxcbGG3QtknAGWUAe/yfkmPkNf7GaL6/rMkkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;sfmono&quot;
        title=&quot;&quot;
        src=&quot;/static/c681e9ee5309d2742e95d1f8b8188201/fcda8/sfmono.png&quot;
        srcset=&quot;/static/c681e9ee5309d2742e95d1f8b8188201/12f09/sfmono.png 148w,
/static/c681e9ee5309d2742e95d1f8b8188201/e4a3f/sfmono.png 295w,
/static/c681e9ee5309d2742e95d1f8b8188201/fcda8/sfmono.png 590w,
/static/c681e9ee5309d2742e95d1f8b8188201/efc66/sfmono.png 885w,
/static/c681e9ee5309d2742e95d1f8b8188201/8b69f/sfmono.png 912w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Learning is Important]]></title><description><![CDATA[I have been in a bit of stagnancy these days. Things has not been smooth, health has been not that great either. My mental health health has…]]></description><link>https://vinitkumar.me/always-learning/</link><guid isPermaLink="false">https://vinitkumar.me/always-learning/</guid><pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been in a bit of stagnancy these days. Things has not been smooth, health has been not that great either. My mental health health has been a bit off too.
I have been unhappy and moody of late and I &lt;strong&gt;really, really&lt;/strong&gt; don’t like this version of me.&lt;/p&gt;
&lt;p&gt;I think reading books and keeping my mind busy always helped. I have been very bad at time management and that has caused majority of my problems.
When to work and when to take a good break is an art I have have not mastered yet.&lt;/p&gt;
&lt;p&gt;But I am not a person who gives up easily. So I am working actively on myself and want to get happier, and enjoy my life and work more.&lt;/p&gt;
&lt;p&gt;Here are a couple of new books my son gifted me on this “Fathers Day”. I love my kiddo more than anything else in this world.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/593ab336cb8d190bed93f022a44acb20/9c9b2/IMG_2349.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 177.7027027027027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAkABQDASIAAhEBAxEB/8QAGgABAAIDAQAAAAAAAAAAAAAAAAIEAQMFBv/EABcBAQEBAQAAAAAAAAAAAAAAAAIAAQP/2gAMAwEAAhADEAAAAcUu9SNyW1megoaqs5sMEaRdJBj/xAAeEAABBAIDAQAAAAAAAAAAAAAAAQIDEQQSExQhM//aAAgBAQABBQKRXDpZmnZlIVuLMS142kfzynG6jHNrai0JvBDZT//EABcRAAMBAAAAAAAAAAAAAAAAAAAQEQL/2gAIAQMBAT8BKRaX/8QAFxEBAQEBAAAAAAAAAAAAAAAAABECEP/aAAgBAgEBPwFVRnn/xAAgEAABAwQCAwAAAAAAAAAAAAAAAQIRITEyQRASIpGh/9oACAEBAAY/AvGSrnIZqNUZJoaN66WpZPROkFmsmP0hLJxc/8QAHRAAAgICAwEAAAAAAAAAAAAAAAERITFhQVFxEP/aAAgBAQABPyFLNPDkQ7+PsBCJbvI9sVSVjgW3NbhBlvoSZ6VC2LbNwzvZi/iKHauRi//aAAwDAQACAAMAAAAQt9Yy++//xAAYEQADAQEAAAAAAAAAAAAAAAAAAREQMf/aAAgBAwEBPxBvDlUh3n//xAAaEQADAAMBAAAAAAAAAAAAAAAAAREQITFR/9oACAECAQE/EIkR4U9JFHOP/8QAIBABAQACAQMFAAAAAAAAAAAAAREAITFBYdFRcYGRof/aAAgBAQABPxDc9kbjhG4cL95HzHjIlOX9cn0EOlOmATduoOPJA2cDAh2oCgJitFeaNzQUVxqXv0Lg2s1cXtzkQteoM3NGi+MIhD74Jlaz/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;img&quot;
        title=&quot;&quot;
        src=&quot;/static/593ab336cb8d190bed93f022a44acb20/1c72d/IMG_2349.jpg&quot;
        srcset=&quot;/static/593ab336cb8d190bed93f022a44acb20/a80bd/IMG_2349.jpg 148w,
/static/593ab336cb8d190bed93f022a44acb20/1c91a/IMG_2349.jpg 295w,
/static/593ab336cb8d190bed93f022a44acb20/1c72d/IMG_2349.jpg 590w,
/static/593ab336cb8d190bed93f022a44acb20/a8a14/IMG_2349.jpg 885w,
/static/593ab336cb8d190bed93f022a44acb20/fbd2c/IMG_2349.jpg 1180w,
/static/593ab336cb8d190bed93f022a44acb20/9c9b2/IMG_2349.jpg 2268w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Fire in my belly]]></title><description><![CDATA[I have a fire in my belly. I am ready to take on new challenges.
I have been working on my skills and I am ready to put them to the test. It…]]></description><link>https://vinitkumar.me/fire-in-my-belly/</link><guid isPermaLink="false">https://vinitkumar.me/fire-in-my-belly/</guid><pubDate>Fri, 10 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have a fire in my belly. I am ready to take on new challenges.
I have been working on my skills and I am ready to put them to the test.&lt;/p&gt;
&lt;p&gt;It’s very easy to live like a recluse, but I am ready to step out of my comfort zone and take on the world.&lt;/p&gt;
&lt;p&gt;A lot of hardships that I faced in the past, has been mostly because of me. I have been my own worst enemy. But not anymore. I am ready to take on the world and make a difference.&lt;/p&gt;
&lt;p&gt;I have not been eating well, sleeping well and even working out. But I am ready to change that. I am ready to take care of myself and be the best version of myself.&lt;/p&gt;
&lt;p&gt;I also want to write more and share my thoughts with the world. I have been holding back for too long. But not anymore. I am ready to share my thoughts and ideas with the world.
This is a promise from me to by future self. I want to be well for me and my family.&lt;/p&gt;
&lt;p&gt;That’s it for now. And I hope my readers are doing well. Take care and stay safe.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Leveling Up With Gary Bernhardt's Destroyallsoftware Series]]></title><description><![CDATA[Introduction: I believe that continuous learning and practice are key to staying ahead in the ever-evolving world of software development…]]></description><link>https://vinitkumar.me/coding-from-scratch/</link><guid isPermaLink="false">https://vinitkumar.me/coding-from-scratch/</guid><pubDate>Mon, 31 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introduction:&lt;/h2&gt;
&lt;p&gt;I believe that continuous learning and practice are key to staying ahead in the ever-evolving world of software development.
Recently, I stumbled upon an exceptional resource that has been highly recommended by many experienced programmers – Gary Bernhardt’s “destroyallsoftware” series.
In this blog, I will share my experience diving into this series and how it has helped me strengthen my coding fundamentals.
To illustrate my journey, I will focus on a specific project I worked on from the “from-scratch” repository and discuss the valuable insights gained from this process.&lt;/p&gt;
&lt;h3&gt;Gary Bernhardt and His destroyallsoftware Series:&lt;/h3&gt;
&lt;p&gt;Gary Bernhardt is a renowned programmer and educator who has gained a strong following for his in-depth and well-crafted educational content. The “destroyallsoftware” series is one of his most notable contributions to the programming community. The series covers a wide range of topics, including software design, testing, debugging, and performance optimization. Gary’s teaching style is engaging and enlightening, making complex concepts accessible to learners at various skill levels.&lt;/p&gt;
&lt;h3&gt;Investing in My Learning Journey:&lt;/h3&gt;
&lt;p&gt;Recognizing the significance of strengthening my coding basics, I decided to dedicate some focused time to learning from the “destroyallsoftware” series. My plan was simple: pick one of Gary’s videos and follow along, actively coding alongside him. To track my progress and share my work with others, I created a repository on GitHub: &lt;a href=&quot;https://github.com/vinitkumar/from-scratch&quot;&gt;https://github.com/vinitkumar/from-scratch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The “from-scratch” repository houses various projects, each designed to teach the fundamentals of a specific programming concept. For this blog, I chose the “malloc-from-scratch” project (&lt;a href=&quot;https://github.com/vinitkumar/from-scratch/tree/main/malloc-from-scratch&quot;&gt;https://github.com/vinitkumar/from-scratch/tree/main/malloc-from-scratch&lt;/a&gt;). This project aims to implement a basic memory allocation mechanism from scratch, an essential skill for any programmer.&lt;/p&gt;
&lt;h3&gt;My Weekly Learning Routine:&lt;/h3&gt;
&lt;p&gt;I decided to challenge myself and set a goal of completing one project from the “from-scratch” repository every week. This schedule allowed me to delve deeply into each topic while maintaining a sustainable learning pace. I believed that the combination of guided learning from Gary’s videos and hands-on coding practice would be the most effective way to solidify my understanding of core concepts.&lt;/p&gt;
&lt;h3&gt;The malloc-from-scratch Project:&lt;/h3&gt;
&lt;p&gt;With excitement and determination, I began working on the “malloc-from-scratch” project. The task involved implementing a simplified version of the malloc function, which dynamically allocates memory during program execution. Though it seemed daunting at first, Gary’s video provided a clear and concise breakdown of the process, making it less intimidating.&lt;/p&gt;
&lt;p&gt;I followed along with Gary, typing out the code as he explained each step. While coding, I encountered some challenges, but I found that these obstacles were valuable learning opportunities. They forced me to think critically, debug, and understand the underlying mechanisms better. Additionally, the satisfaction of seeing my code work correctly was immensely rewarding.&lt;/p&gt;
&lt;h3&gt;Key Insights and Takeaways:&lt;/h3&gt;
&lt;p&gt;As I progressed through the project, I gained several essential insights and takeaways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Understanding Memory Allocation: Implementing malloc from scratch deepened my understanding of memory allocation and management. I learned about the heap, memory fragmentation, and the importance of pointer arithmetic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debugging Skills: During the coding process, I faced bugs and logical errors. Debugging these issues sharpened my troubleshooting abilities and taught me to use tools like GDB effectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Software Design Principles: Gary’s approach to software design emphasized simplicity, readability, and modularity. These principles have influenced the way I approach coding, leading to more maintainable and scalable code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Appreciation for Standard Libraries: Creating a memory allocator from scratch made me appreciate the robustness and complexity of standard libraries. It also helped me comprehend the necessity of these foundational components in any programming language.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confidence in Coding: Tackling challenging projects alongside an experienced instructor gave me confidence in my coding skills. I realized that with determination and the right resources, I could tackle complex problems.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Keeping the Momentum Going:&lt;/h3&gt;
&lt;p&gt;Having completed the “malloc-from-scratch” project, I am motivated to continue my weekly learning routine. The experience of learning from Gary Bernhardt’s “destroyallsoftware” series has been transformative for my programming journey. Each week, I look forward to selecting a new project and delving into exciting and diverse programming concepts.&lt;/p&gt;
&lt;h3&gt;Conclusion:&lt;/h3&gt;
&lt;p&gt;Gary Bernhardt’s “destroyallsoftware” series has proven to be an invaluable resource for my coding education. The combination of guided learning through videos and hands-on coding practice has helped me strengthen my foundational knowledge and hone my programming skills.&lt;/p&gt;
&lt;p&gt;I would highly recommend Gary’s series to anyone looking to level up their coding skills, whether you are a beginner seeking a solid foundation or an experienced developer striving for continuous improvement. Investing time in learning from Gary Bernhardt is a worthwhile endeavor that will undoubtedly pay dividends in your programming journey. I am excited to continue my weekly learning routine and explore more of the “destroyallsoftware” series, as I strive to become a better programmer each day.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The Changing Landscape of Free Online Services and Open-Source Software]]></title><description><![CDATA[Introduction: In the past decade, the online world experienced a paradigm shift in the availability of free services.
Websites and platforms…]]></description><link>https://vinitkumar.me/changing-oss-landscape/</link><guid isPermaLink="false">https://vinitkumar.me/changing-oss-landscape/</guid><pubDate>Tue, 04 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;Introduction:&lt;/h3&gt;
&lt;p&gt;In the past decade, the online world experienced a paradigm shift in the availability of free services.
Websites and platforms that once offered generous free options, such as Flickr’s 1TB of storage or Google Photos’ unlimited
high-resolution uploads, have either transitioned to paid models or completely withdrawn their free offerings.
This transformation has disrupted users’ expectations and raised concerns about the future of freely accessible online services and open-source software.&lt;/p&gt;
&lt;h3&gt;Current Issues and their possible solutions?&lt;/h3&gt;
&lt;p&gt;As technology advances and the costs of maintaining these services rise, companies are forced to reevaluate their business models.
The harsh reality is that the days of receiving a “free lunch” online are gradually coming to an end.
This shift prompts a reflection on the consequences it has for both users and developers, as well as the strategies employed to fund open-source projects.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The End of Free Lunch:
The current reality is that the era of free online services is coming to an end.
Previously, users could enjoy services like Flickr, offering 1TB of free storage, or Google Photos
with unlimited high-resolution uploads.
However, these platforms have now transitioned to paid models or discontinued their free offerings altogether.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bait and Switch:
A common practice among companies is the bait and switch tactic.
This is particularly prevalent in the open-source software (OSS) community, where projects start as free
and open-source but later shift to enterprise or paid licenses.
This transition often leaves the community feeling betrayed and uncertain about the future of the software they rely on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Problems with OSS Funding Strategies:
Many OSS funding strategies are currently insufficient.
Developers cannot continue to share their code for free without
adequate compensation in the long run. It is only fair for OSS users to feel cheated when the license terms change unexpectedly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Treating OSS as Technical Debt:
When utilizing an OSS library, it is essential to view it as a form of technical debt rather than free labor.
Recognizing the value provided by these libraries can help users understand the need for fair compensation and support for the creators and contributors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contributing and Affordability:
To mitigate disappointment and ensure the sustainability of OSS, users are encouraged to contribute
financially to the creators or contributors whenever possible.
Alternatively, users can seek licenses that align with their financial capabilities.
This approach offers a more reasonable way to navigate the evolving landscape of paid and open-source software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shifting Paradigm:
As the economy and the world change, the funding model for OSS is likely to transform significantly.
The days of venture capital-funded OSS projects may be over, giving way to a more profit-driven mindset where money plays a crucial role.
This shift highlights the need for users and developers to adapt to the new realities of the industry.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Conclusion:&lt;/h3&gt;
&lt;p&gt;In conclusion, the evolving landscape of free online services and open-source software demands a proactive approach from users and developers.
The days of taking these services for granted are fading, requiring a new mindset and awareness of the changing economic realities.
As users, we must acknowledge the value provided by open-source projects and be willing to contribute financially to their sustainability.
This support can help ensure that developers are fairly compensated for their efforts and can continue to improve and maintain the software we rely on.&lt;/p&gt;
&lt;p&gt;Similarly, developers and project maintainers must explore innovative funding strategies that strike a balance between sustainability and accessibility.
While the transition to paid models may be necessary, it is vital to consider the needs and expectations of the community, ensuring that the transition is transparent and fair.&lt;/p&gt;
&lt;p&gt;In this evolving landscape, it is essential to foster a collaborative ecosystem where users, developers, and companies work together to sustain open-source projects.
By embracing these changes, we can navigate the challenges ahead, ensuring the availability of high-quality software and services while recognizing the
value and effort invested by creators and contributors.&lt;/p&gt;
&lt;p&gt;Ultimately, the end of the “free lunch” era signifies a shift towards a more profit-driven model.
However, it also presents an opportunity to establish new frameworks for collaboration, compensation, and open-source sustainability.
By adapting to these changes, we can shape a future where innovation and accessibility coexist, ensuring that the online world continues to thrive for years to come.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The Changing Landscape of Free Online Services and Open-Source Software]]></title><description><![CDATA[Introduction: In the past decade, the online world experienced a paradigm shift in the availability of free services.
Websites and platforms…]]></description><link>https://vinitkumar.me/ask-for-help/changing-oss-landscape/</link><guid isPermaLink="false">https://vinitkumar.me/ask-for-help/changing-oss-landscape/</guid><pubDate>Tue, 04 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;Introduction:&lt;/h3&gt;
&lt;p&gt;In the past decade, the online world experienced a paradigm shift in the availability of free services.
Websites and platforms that once offered generous free options, such as Flickr’s 1TB of storage or Google Photos’ unlimited
high-resolution uploads, have either transitioned to paid models or completely withdrawn their free offerings.
This transformation has disrupted users’ expectations and raised concerns about the future of freely accessible online services and open-source software.&lt;/p&gt;
&lt;h3&gt;Current Issues and their possible solutions?&lt;/h3&gt;
&lt;p&gt;As technology advances and the costs of maintaining these services rise, companies are forced to reevaluate their business models.
The harsh reality is that the days of receiving a “free lunch” online are gradually coming to an end.
This shift prompts a reflection on the consequences it has for both users and developers, as well as the strategies employed to fund open-source projects.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The End of Free Lunch:
The current reality is that the era of free online services is coming to an end.
Previously, users could enjoy services like Flickr, offering 1TB of free storage, or Google Photos
with unlimited high-resolution uploads.
However, these platforms have now transitioned to paid models or discontinued their free offerings altogether.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bait and Switch:
A common practice among companies is the bait and switch tactic.
This is particularly prevalent in the open-source software (OSS) community, where projects start as free
and open-source but later shift to enterprise or paid licenses.
This transition often leaves the community feeling betrayed and uncertain about the future of the software they rely on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Problems with OSS Funding Strategies:
Many OSS funding strategies are currently insufficient.
Developers cannot continue to share their code for free without
adequate compensation in the long run. It is only fair for OSS users to feel cheated when the license terms change unexpectedly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Treating OSS as Technical Debt:
When utilizing an OSS library, it is essential to view it as a form of technical debt rather than free labor.
Recognizing the value provided by these libraries can help users understand the need for fair compensation and support for the creators and contributors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contributing and Affordability:
To mitigate disappointment and ensure the sustainability of OSS, users are encouraged to contribute
financially to the creators or contributors whenever possible.
Alternatively, users can seek licenses that align with their financial capabilities.
This approach offers a more reasonable way to navigate the evolving landscape of paid and open-source software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shifting Paradigm:
As the economy and the world change, the funding model for OSS is likely to transform significantly.
The days of venture capital-funded OSS projects may be over, giving way to a more profit-driven mindset where money plays a crucial role.
This shift highlights the need for users and developers to adapt to the new realities of the industry.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Conclusion:&lt;/h3&gt;
&lt;p&gt;In conclusion, the evolving landscape of free online services and open-source software demands a proactive approach from users and developers.
The days of taking these services for granted are fading, requiring a new mindset and awareness of the changing economic realities.
As users, we must acknowledge the value provided by open-source projects and be willing to contribute financially to their sustainability.
This support can help ensure that developers are fairly compensated for their efforts and can continue to improve and maintain the software we rely on.&lt;/p&gt;
&lt;p&gt;Similarly, developers and project maintainers must explore innovative funding strategies that strike a balance between sustainability and accessibility.
While the transition to paid models may be necessary, it is vital to consider the needs and expectations of the community, ensuring that the transition is transparent and fair.&lt;/p&gt;
&lt;p&gt;In this evolving landscape, it is essential to foster a collaborative ecosystem where users, developers, and companies work together to sustain open-source projects.
By embracing these changes, we can navigate the challenges ahead, ensuring the availability of high-quality software and services while recognizing the
value and effort invested by creators and contributors.&lt;/p&gt;
&lt;p&gt;Ultimately, the end of the “free lunch” era signifies a shift towards a more profit-driven model.
However, it also presents an opportunity to establish new frameworks for collaboration, compensation, and open-source sustainability.
By adapting to these changes, we can shape a future where innovation and accessibility coexist, ensuring that the online world continues to thrive for years to come.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building Large Technical Projects: Lessons from HashiCorp's Co-Founder]]></title><description><![CDATA[Mitchell Hashimoto is one programmer I really admire and he has been insanely productive
and influential programmer for this last decade. He…]]></description><link>https://vinitkumar.me/how-to-approach-large-projects/</link><guid isPermaLink="false">https://vinitkumar.me/how-to-approach-large-projects/</guid><pubDate>Fri, 02 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mitchell Hashimoto is one programmer I really admire and he has been insanely productive
and influential programmer for this last decade. He co-founded Hashicorp and has written Vagrant, Terraform, Consul
and many other useful developer tools.&lt;/p&gt;
&lt;p&gt;He just wrote &lt;a href=&quot;https://mitchellh.com/writing/building-large-technical-projects&quot;&gt;My Approach to Building Large Technical Projects&lt;/a&gt; on his blog.
Here he basically talks about his process of building non-trivial software that might span months and months
of hard work. He gives some very nice tips about how to approach such tasks and succeed in finishing them.&lt;/p&gt;
&lt;p&gt;I really like these tips and I wanted to note down some actionable items based on what he wrote. These
tips are something we can incorportate in our daily routine.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Break down large tasks: When faced with a large project or task, break it down into smaller, more manageable chunks. This will allow you to see tangible progress and stay motivated throughout the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Focus on real results: Instead of solely focusing on the end goal, prioritize tasks that yield real results. Look for opportunities to create demos or prototypes that showcase the functionality you’re working on. This will give you a sense of accomplishment and help you gauge the success of your work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start with a feasible sub-project: Choose a sub-project within the larger task that is realistic and can yield visible outcomes. By starting with something achievable, you can build momentum and maintain your enthusiasm. Examples could include implementing a specific feature, setting up a basic framework, or creating a simple prototype.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Utilize automated testing: Incorporate automated testing, such as unit tests, early in the development process. This allows you to run your code and see it working, providing tangible feedback and boosting your confidence.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aim for regular demos: Strive to build and showcase demos of your progress regularly. These demos don’t have to be fully polished or complete; they should be functional enough to demonstrate the key aspects of your project. Regular demos provide valuable feedback and help you evaluate the feasibility and quality of your work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t pursue perfection at first: Avoid getting caught up in perfectionism during the initial stages of your project. Instead, focus on creating a “good enough” version that allows you to move forward and demonstrate progress. You can always iterate and improve upon it later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build for yourself initially: When working on personal projects, prioritize solving problems or building functionality that you personally need. By addressing your own needs and experiences, you’ll likely stay more motivated and engaged in the development process. This also increases the likelihood of creating a useful product for others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Incremental improvements and iterations: After reaching a demo stage, don’t stop there. Continuously iterate on the different components of your project, addressing areas that need improvement and adding new features gradually. This iterative process helps you refine and enhance your work over time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Migrating to Neovim: A Developer's Guide to Modern Editor Configuration]]></title><description><![CDATA[Imgur Vim has long been a popular choice for developers and power users as a highly customizable and efficient text editor. However, in…]]></description><link>https://vinitkumar.me/vim-to-nvim-transition/</link><guid isPermaLink="false">https://vinitkumar.me/vim-to-nvim-transition/</guid><pubDate>Wed, 24 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ZGDBz2M.png&quot; alt=&quot;Imgur&quot;&gt;&lt;/p&gt;
&lt;p&gt;Vim has long been a popular choice for developers and power users as a highly customizable and efficient text editor. However, in recent years, Neovim has emerged as a promising alternative to Vim, offering improved performance, enhanced features, and better extensibility. If you’re considering making the switch from Vim to Neovim, this blog post will guide you through the process and highlight the benefits of using Neovim.&lt;/p&gt;
&lt;h2&gt;What is Neovim?&lt;/h2&gt;
&lt;p&gt;Neovim is a modern fork of Vim that aims to improve upon Vim’s limitations while preserving its core principles and functionalities. Neovim maintains backward compatibility with Vim, meaning your existing Vim configuration and plugins should work seamlessly in Neovim with little to no modifications.&lt;/p&gt;
&lt;h2&gt;Why switch to Neovim?&lt;/h2&gt;
&lt;p&gt;There are several reasons why you might consider switching from Vim to Neovim:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Neovim is built with a strong focus on performance, offering faster startup times and smoother editing experience compared to Vim. Neovim’s architecture allows for better parallelism and asynchronous processing, resulting in improved responsiveness and reduced latency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhanced features:&lt;/strong&gt; Neovim introduces several new features and improvements over Vim. Some notable features include built-in terminal emulation, support for floating windows and pop-ups, better job control, and a revamped API for plugin development.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better extensibility:&lt;/strong&gt; Neovim provides a more powerful and flexible plugin architecture, making it easier to develop and maintain plugins. Neovim’s API offers enhanced scripting capabilities and better integration with modern tools and language servers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Migrating your Vim configuration to Neovim&lt;/h2&gt;
&lt;p&gt;Migrating your Vim configuration to Neovim is a straightforward process, thanks to their high level of compatibility. Here are the steps to get started:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Neovim:&lt;/strong&gt; Visit the Neovim website (&lt;a href=&quot;https://neovim.io/&quot;&gt;https://neovim.io/&lt;/a&gt;) and follow the installation instructions for your operating system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Copy your Vim configuration:&lt;/strong&gt; Neovim uses the same configuration file format as Vim. Locate your &lt;code&gt;.vimrc&lt;/code&gt; file and copy it to Neovim’s configuration directory. In the case of Neovim, the configuration file is typically located at &lt;code&gt;~/.config/nvim/init.vim&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install plugins:&lt;/strong&gt; Neovim supports the same plugin manager as Vim, such as Vundle, Pathogen, or vim-plug. Install your preferred plugin manager and use it to install the plugins you were using in Vim. In your Neovim configuration file, make sure to include the necessary plugin manager setup and plugin configurations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Update plugin-specific configurations:&lt;/strong&gt; While most plugins should work out of the box, some plugins may require specific configurations or adjustments for Neovim. Consult the documentation or GitHub repository of each plugin to ensure proper compatibility and make any necessary changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test and refine:&lt;/strong&gt; Launch Neovim and test your configuration and plugins. Check for any error messages or unexpected behavior and make the necessary adjustments. Neovim provides extensive documentation and a helpful community that can assist you in troubleshooting and optimizing your setup.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Notable Neovim-specific features and improvements&lt;/h2&gt;
&lt;p&gt;Once you have successfully migrated to Neovim, you can take advantage of its unique features and improvements. Here are a few noteworthy features that Neovim offers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Built-in terminal:&lt;/strong&gt; Neovim includes a built-in terminal emulator, allowing you to run shell commands directly within your editor. This feature eliminates the need to switch between a separate terminal window and your text editor, making it easier to interact with command-line tools and build systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Floating windows and pop-ups:&lt;/strong&gt; Neovim introduces support for floating windows and pop-ups, which are highly useful.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here are some points of comparison between a typical &lt;code&gt;.vimrc&lt;/code&gt; configuration file for Vim and an &lt;code&gt;init.lua&lt;/code&gt; configuration file for Neovim:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;File format:&lt;/strong&gt; The &lt;code&gt;.vimrc&lt;/code&gt; file uses a plain text format, whereas the &lt;code&gt;init.lua&lt;/code&gt; file uses a Lua scripting format. Lua is a lightweight and highly extensible scripting language, allowing for more advanced configuration options and logic in the &lt;code&gt;init.lua&lt;/code&gt; file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugin management:&lt;/strong&gt; In Vim, plugin management is typically done using plugin managers like Vundle, Pathogen, or vim-plug, which are included and configured in the &lt;code&gt;.vimrc&lt;/code&gt; file. In Neovim, plugin management is often done using Lua-based plugin managers like Packer or LuaRocks, which are included and configured in the &lt;code&gt;init.lua&lt;/code&gt; file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuration syntax:&lt;/strong&gt; The syntax for configuring options and mappings differs between the two files. In Vim’s &lt;code&gt;.vimrc&lt;/code&gt;, the configuration is typically written using Vimscript, a custom scripting language specific to Vim. In Neovim’s &lt;code&gt;init.lua&lt;/code&gt;, the configuration is written using Lua syntax, which provides a more expressive and powerful language for configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modularity and organization:&lt;/strong&gt; The &lt;code&gt;init.lua&lt;/code&gt; file allows for more modular and organized configuration compared to the &lt;code&gt;.vimrc&lt;/code&gt; file. Lua’s table-based data structure allows you to group related settings and mappings together, making it easier to navigate and maintain the configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error handling and debugging:&lt;/strong&gt; Neovim’s &lt;code&gt;init.lua&lt;/code&gt; file benefits from Lua’s robust error handling and debugging capabilities. Lua provides better error messages and stack traces, making it easier to identify and debug issues in the configuration file compared to Vim’s &lt;code&gt;.vimrc&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugin-specific configurations:&lt;/strong&gt; While Vim’s &lt;code&gt;.vimrc&lt;/code&gt; can include specific configurations for each plugin, the &lt;code&gt;init.lua&lt;/code&gt; file in Neovim provides more flexibility and control over plugin configurations. With Lua’s scripting capabilities, you can define custom functions, define mappings, and configure plugins in a more programmatic and dynamic way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Native Neovim features:&lt;/strong&gt; The &lt;code&gt;init.lua&lt;/code&gt; file allows you to take advantage of Neovim’s native features and APIs directly in your configuration. This includes features like floating windows, job control, built-in LSP support, and more. You can interact with these features using Lua code, enhancing the functionality and extensibility of your Neovim setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community support and examples:&lt;/strong&gt; While both Vim and Neovim have active communities and extensive plugin ecosystems, the &lt;code&gt;init.lua&lt;/code&gt; configuration format in Neovim is gaining popularity. As a result, you may find more up-to-date and Lua-based configuration examples, tips, and discussions for Neovim compared to Vim’s &lt;code&gt;.vimrc&lt;/code&gt; file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It’s important to note that while Neovim’s &lt;code&gt;init.lua&lt;/code&gt; file provides additional features and flexibility, Vim’s &lt;code&gt;.vimrc&lt;/code&gt; configuration is still widely supported and used. If you’re comfortable with your current Vim setup and it meets your needs, there may not be a pressing need to switch to Neovim and rewrite your configuration. However, if you’re interested in exploring the advantages and possibilities of Neovim, migrating your configuration to &lt;code&gt;init.lua&lt;/code&gt; can be a rewarding experience.&lt;/p&gt;
&lt;p&gt;Here is how my current nvim config in &lt;code&gt;~/.config/nvim/init.lua&lt;/code&gt; looks like:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;lua&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;
-- Packer related config &amp;amp; installed plugins
local status, packer = pcall(require, &amp;quot;packer&amp;quot;)
if (not status) then
  print(&amp;quot;Packer is not installed&amp;quot;)
  return
end

vim.cmd [[packadd packer.nvim]]

packer.startup(function(use)
  use &amp;#39;wbthomason/packer.nvim&amp;#39;
  use &amp;#39;nvim-lualine/lualine.nvim&amp;#39; -- Statusline
  use &amp;#39;nvim-lua/plenary.nvim&amp;#39; -- Common utilities
  use &amp;#39;onsails/lspkind-nvim&amp;#39; -- vscode-like pictograms
  use &amp;#39;hrsh7th/cmp-nvim-lsp&amp;#39; -- nvim-cmp source for neovim&amp;#39;s built-in LSP
  use &amp;#39;hrsh7th/nvim-cmp&amp;#39; -- Completion
  use &amp;#39;neovim/nvim-lspconfig&amp;#39; -- LSP
  use &amp;#39;jose-elias-alvarez/null-ls.nvim&amp;#39; -- Use Neovim as a language server to inject LSP diagnostics, code actions, and more via Lua
  use &amp;#39;williamboman/mason.nvim&amp;#39;
  use &amp;#39;EdenEast/nightfox.nvim&amp;#39;
  use &amp;#39;williamboman/mason-lspconfig.nvim&amp;#39;
  use &amp;#39;habamax/vim-rst&amp;#39;
  use &amp;#39;glepnir/lspsaga.nvim&amp;#39; -- LSP UIs
  use {
    &amp;#39;nvim-treesitter/nvim-treesitter&amp;#39;,
    run = &amp;#39;:TSUpdate&amp;#39;
  }
  use &amp;#39;nvim-treesitter/nvim-treesitter-context&amp;#39;
  use &amp;#39;kyazdani42/nvim-web-devicons&amp;#39; -- File icons
  use &amp;#39;nvim-telescope/telescope-file-browser.nvim&amp;#39;
  use &amp;#39;windwp/nvim-autopairs&amp;#39;
  use &amp;#39;tpope/vim-fugitive&amp;#39;
  use &amp;#39;sainnhe/edge&amp;#39;
  use &amp;#39;sainnhe/gruvbox-material&amp;#39;
  use &amp;#39;windwp/nvim-ts-autotag&amp;#39;
  use &amp;#39;folke/zen-mode.nvim&amp;#39;
  use({
    &amp;quot;iamcco/markdown-preview.nvim&amp;quot;,
    run = function() vim.fn[&amp;quot;mkdp#util#install&amp;quot;]() end,
  })
  use &amp;#39;akinsho/nvim-bufferline.lua&amp;#39;
  use &amp;#39;tpope/vim-commentary&amp;#39;
  use &amp;#39;github/copilot.vim&amp;#39;
  use {
    &amp;#39;nvim-telescope/telescope.nvim&amp;#39;,
    tag = &amp;#39;0.1.1&amp;#39;,
    requires = { {&amp;#39;nvim-lua/plenary.nvim&amp;#39;} }
  }
  use {
    &amp;#39;nvim-tree/nvim-tree.lua&amp;#39;,
    requires = {
      &amp;#39;nvim-tree/nvim-web-devicons&amp;#39;, -- optional
    },
    config = function()
      require(&amp;quot;nvim-tree&amp;quot;).setup {
        sort_by = &amp;quot;case_sensitive&amp;quot;,
        view = {
          width = 30,
        },
        renderer = {
          group_empty = true,
        },
        filters = {
          dotfiles = true,
        },
      }
    end
  }

end)

vim.cmd(&amp;quot;autocmd!&amp;quot;)

vim.scriptencoding = &amp;#39;utf-8&amp;#39;
vim.opt.encoding = &amp;#39;utf-8&amp;#39;
vim.opt.fileencoding = &amp;#39;utf-8&amp;#39;

vim.wo.number = true
vim.opt.title = true
vim.opt.autoindent = true
vim.opt.smarttab = true
vim.opt.smartindent = true
vim.opt.breakindent = true

vim.opt.cmdheight = 1
vim.opt.laststatus = 2
vim.opt.shell = &amp;#39;zsh&amp;#39;

vim.opt.inccommand = &amp;#39;split&amp;#39;
vim.opt.hlsearch = true

vim.opt.wrap = false -- No Wrap lines

vim.opt.swapfile = false
vim.opt.backup = false
vim.opt.writebackup = false
vim.opt.shiftwidth = 2
vim.opt.expandtab = true  -- expand tabs into spaces
vim.opt.tabstop = 2
vim.opt.softtabstop = 2
vim.opt.backspace = { &amp;#39;start&amp;#39;, &amp;#39;eol&amp;#39;, &amp;#39;indent&amp;#39; }
vim.opt.path:append { &amp;#39;**&amp;#39; } -- Finding files - Search down into subfolders
vim.opt.wildignore:append { &amp;#39;*/node_modules/*&amp;#39; }

-- Undercurl
vim.cmd([[let &amp;amp;t_Cs = &amp;quot;\e[4:3m&amp;quot;]])
vim.cmd([[let &amp;amp;t_Ce = &amp;quot;\e[4:0m&amp;quot;]])

-- Turn off paste mode when leaving insert
vim.api.nvim_create_autocmd(&amp;quot;InsertLeave&amp;quot;, {
  pattern = &amp;#39;*&amp;#39;,
  command = &amp;quot;set nopaste&amp;quot;
})

vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1

-- set termguicolors to enable highlight groups


vim.opt.cursorline = true
vim.opt.termguicolors = true
vim.opt.winblend = 0 -- adds pseudo transparency to a floating window
vim.opt.wildoptions = &amp;#39;pum&amp;#39;
vim.opt.background = &amp;#39;dark&amp;#39;
vim.cmd(&amp;#39;colorscheme peachpuff&amp;#39;)
require(&amp;quot;nvim-tree&amp;quot;).setup()



vim.g.mapleader = &amp;quot;,&amp;quot;
local keymap = vim.keymap

-- split settings
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;Leader&amp;gt;h&amp;#39;, &amp;#39;:&amp;lt;C-u&amp;gt;split&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;Leader&amp;gt;v&amp;#39;, &amp;#39;:&amp;lt;C-u&amp;gt;vsplit&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })

-- tab settings
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;Leader&amp;gt;t&amp;#39;, &amp;#39;:&amp;lt;C-u&amp;gt;tabnew&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;C-t&amp;gt;&amp;#39;, &amp;#39;:tabNext&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })

-- Up and Down Mapping
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;CR&amp;gt;&amp;#39;, &amp;#39;G&amp;#39;, { noremap = true, silent = true })
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;BS&amp;gt;&amp;#39;, &amp;#39;gg&amp;#39;, { noremap = true, silent = true })

keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;C-p&amp;gt;&amp;#39;, &amp;#39;:Telescope find_files&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;C-b&amp;gt;&amp;#39;, &amp;#39;:Telescope buffers&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;C-c&amp;gt;&amp;#39;, &amp;#39;:Telescope git_commits&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;C-e&amp;gt;&amp;#39;, &amp;#39;:Telescope diagnostics bufnr=0&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })
keymap.set(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;C-n&amp;gt;&amp;#39;, &amp;#39;:NvimTreeToggle&amp;lt;CR&amp;gt;&amp;#39;, { noremap = true, silent = true })

vim.opt.clipboard:append { &amp;#39;unnamedplus&amp;#39; }

local nvim_lsp = require(&amp;#39;lspconfig&amp;#39;)

-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
  local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
  local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end

  --Enable completion triggered by &amp;lt;c-x&amp;gt;&amp;lt;c-o&amp;gt;
  buf_set_option(&amp;#39;omnifunc&amp;#39;, &amp;#39;v:lua.vim.lsp.omnifunc&amp;#39;)

  -- Mappings.
  local opts = { noremap=true, silent=true }

  -- See `:help vim.lsp.*` for documentation on any of the below functions
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;gD&amp;#39;, &amp;#39;&amp;lt;Cmd&amp;gt;lua vim.lsp.buf.declaration()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;gd&amp;#39;, &amp;#39;&amp;lt;Cmd&amp;gt;lua vim.lsp.buf.definition()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;K&amp;#39;, &amp;#39;&amp;lt;Cmd&amp;gt;lua vim.lsp.buf.hover()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;gi&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.implementation()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;C-k&amp;gt;&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.signature_help()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;space&amp;gt;wa&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.add_workspace_folder()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;space&amp;gt;wr&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.remove_workspace_folder()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;space&amp;gt;wl&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;space&amp;gt;D&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.type_definition()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;Leader&amp;gt;n&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.rename()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;Leader&amp;gt;ca&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.code_action()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;gr&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.references()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;space&amp;gt;e&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua  vim.diagnostic.open_float()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;[d&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.diagnostic.goto_prev()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;]d&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.diagnostic.goto_next()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;#39;n&amp;#39;, &amp;#39;&amp;lt;space&amp;gt;q&amp;#39;, &amp;#39;&amp;lt;cmd&amp;gt;lua vim.lsp.diagnostic.set_loclist()&amp;lt;CR&amp;gt;&amp;#39;, opts)
  buf_set_keymap(&amp;quot;n&amp;quot;, &amp;quot;&amp;lt;space&amp;gt;f&amp;quot;, &amp;quot;&amp;lt;cmd&amp;gt;lua vim.lsp.buf.formatting()&amp;lt;CR&amp;gt;&amp;quot;, opts)

end


-- Use a loop to conveniently call &amp;#39;setup&amp;#39; on multiple servers and
-- map buffer local keybindings when the language server attaches
local servers = { &amp;quot;pyright&amp;quot;, &amp;quot;tsserver&amp;quot; }
for _, lsp in ipairs(servers) do
  nvim_lsp[lsp].setup {
    on_attach = on_attach,
    flags = {
      debounce_text_changes = 150,
    }
  }
end

require&amp;#39;lspconfig&amp;#39;.pyright.setup{}


local status, null_ls = pcall(require, &amp;quot;null-ls&amp;quot;)
if (not status) then return end

null_ls.setup({
  sources = {
    null_ls.builtins.diagnostics.eslint_d.with({
      diagnostics_format = &amp;#39;[eslint] #{m}\n(#{c})&amp;#39;
    }),
    null_ls.builtins.diagnostics.fish
  }
})


function StripTrailingWhitespace()
  if not vim.bo.binary and vim.bo.filetype ~= &amp;#39;diff&amp;#39; then
    vim.cmd(&amp;#39;normal! mz&amp;#39;)
    vim.cmd(&amp;#39;normal! Hmy&amp;#39;)
    if vim.bo.filetype == &amp;#39;mail&amp;#39; then
      -- Preserve space after e-mail signature separator
      vim.cmd(&amp;#39;%s/\\(^--\\)\\@&amp;lt;!\\s\\+$//e&amp;#39;)
    else
      vim.cmd(&amp;#39;%s/\\s\\+$//e&amp;#39;)
    end
    vim.cmd(&amp;#39;normal! \&amp;#39;yz&amp;lt;Enter&amp;gt;&amp;#39;)
    vim.cmd(&amp;#39;normal! `z&amp;#39;)
  end
end

vim.cmd(&amp;#39;autocmd BufWritePre * lua StripTrailingWhitespace()&amp;#39;)
-- Show space and tab characters
vim.o.list = true
vim.o.listchars = &amp;#39;tab:› ,eol:¬,trail:⋅,nbsp:␣&amp;#39;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This config is inspired by the &lt;a href=&quot;https://arslan.io/2023/05/10/the-benefits-of-using-a-single-init-lua-vimrc-file/&quot;&gt;Single File Nvim Config&lt;/a&gt; post by Fatih Arslan&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Python Performance Optimization: Memory-Efficient Collection Handling]]></title><description><![CDATA[This is a good technique for managing memory when working with large lists or QuerySets. However, there are a few changes that could make…]]></description><link>https://vinitkumar.me/memory-efficient-python/</link><guid isPermaLink="false">https://vinitkumar.me/memory-efficient-python/</guid><pubDate>Thu, 24 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a good technique for managing memory when working with large lists or QuerySets. However, there are a few changes that could make this code more effective.&lt;/p&gt;
&lt;p&gt;First, the batch_qs and batch_list functions could be made more general by using a typing.List or typing.Iterable type hint for the list_arr parameter instead of a list type hint. This would allow them to be used with any iterable type, not just lists.&lt;/p&gt;
&lt;p&gt;Second, the batch_list function could be simplified by using the built-in range function to generate the indices for each batch. Instead of using a for loop with a start and end variable, you could use a range object with a step value equal to the batch size.&lt;/p&gt;
&lt;p&gt;Here’s an example of how this could be implemented:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;from typing import Any, Iterator, List, Iterable

def batch_list(list_arr: Iterable[Any], batch_size: int) -&amp;gt; Iterator[Any]:
    for start in range(0, len(list_arr), batch_size):
        yield list_arr[start:start+batch_size]&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Finally, the batch_qs function could be made more efficient by using the QuerySet’s iterator method to iterate over the queryset in batches. This would avoid loading the entire queryset into memory at once, which can be slow and use a lot of memory for large querysets.&lt;/p&gt;
&lt;p&gt;Here’s an example of how this could be implemented:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;python&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;from django.db.models.query import QuerySet

def batch_qs(qs: QuerySet, batch_size: int) -&amp;gt; Iterator[QuerySet]:
    return qs.iterator(batch_size=batch_size)
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Overall, these changes would make the code more general and efficient, allowing it to be used in a wider range of scenarios.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Remote Work Success Guide: 7 Years of Practical Experience and Best Practices]]></title><description><![CDATA[Covid-19 has forced all Software companies to adopt Remote Work for their workforce.
Anybody who has experience with remote work will tell…]]></description><link>https://vinitkumar.me/how-to-remote/</link><guid isPermaLink="false">https://vinitkumar.me/how-to-remote/</guid><pubDate>Thu, 26 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Covid-19 has forced all Software companies to adopt &lt;strong&gt;Remote Work&lt;/strong&gt; for their workforce.
Anybody who has experience with remote work will tell you that it’s not &lt;em&gt;easy&lt;/em&gt; to be productive working remotely. I have had the opportunity of working remotely (The company that I work for is the Netherlands based) and I have been working remotely from Pune for a period of more than 7 years. I think this experience gives me some sort of authority to speak on this matter.&lt;/p&gt;
&lt;p&gt;The Following are some tips I can give to people who are new to this kind of lifestyle and mode of working:&lt;/p&gt;
&lt;p&gt;The Following are some tips I can give to people who are new to this kind of lifestyle and mode of working:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hardware: The first advice I would give is to invest in good and fast hardware. The companies should give their developers a decently fast machine and also reimburse the Internet connection at the employees’ home. Internet Speed on the upwards of (100 Mbps) should be good. It is also important for calls and meetings over the internet to go smoothly. Imagine someone building their docker containers on a shitty 3g connection. They will lose all hope and motivation from their life. Also, invest in yourself. Buy a good monitor/monitors (I feel 24 inches and higher is good and 27 inches is probably the best bet), a good keyboard and gaming mouse (better ergonomics) and a good chair. Believe me, you will be way more productive when you are not wrestling with back and hand pain because of poor ergonomics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Software: Use software like (rescuetime, wakatime) to track how much of your time is spent and where it is spent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Limit the use of Social Media on your phone or just budget that time, so that you can only use like 15 mins of your time daily on Social Media.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Routine: The most important thing to remember while working remotely is to follow a routine. People think that working remotely can get rid of their 9-5 routine and work at their own time. This might be true but not advisable. You need to stick to a routine and work only during those hours so that office work doesn’t intrude on your time with family. Try to start your workday as early as possible to do work without interruptions. This also helps if your teammates are in a different time zone than you. Also, if you need to step out of the house, let your team know so that they won’t be waiting for a reply from you while you’re away.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Communication: This is the most important thing to remember while you are working remotely. Be explicit and as verbose as possible. Over-communication is better than no communication while working remotely. If something works, update it. If something doesn’t work, make sure you communicate as soon as possible so that team members can help you.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also recently started daily update standups every evening (since all our team is remote because of Covid-19) and I could already see things moving better and clearer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Documentation &amp;#x26; Testing: While working remotely, you need to do better work. To do better and more correct work, you need to write good code that is documented properly and works correctly (tests to enforce that). With remote work, the only thing that shows you did something is your work and not just you coming to the office. This also means at the end of the day, you need to have something to show for what you achieved/solved that day. This is very hard. If you are having a bad/anxiety-filled day, let your managers know. It’s okay to have a bad day when nothing goes your way. Also, to enable async communication, having good docs with the code is very important. If something can be learned by just reading the docs, then it should be that way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, came across this wonderful list of tips by &lt;a href=&quot;https://twitter.com/mitchellh&quot;&gt;Mitchell Hashimoto&lt;/a&gt;. These tips come from real experience and are very nice.&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The force to remote for much of the workforce is going to be very positive but also create a ton of FUD. Lots will &quot;get it&quot; and it&apos;ll work for them and they&apos;ll be forever changed. Many will realize it isn&apos;t as simple as pretending your at-home desk is your in-office desk.&lt;/p&gt;&amp;mdash; Mitchell Hashimoto (@mitchellh) &lt;a href=&quot;https://twitter.com/mitchellh/status/1237532491285577728?ref_src=twsrc%5Etfw&quot;&gt;March 11, 2020&lt;/a&gt;&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[A Somewhat Sane Guide for Software Development]]></title><description><![CDATA[I have been writing code professionally for around 8 years now. In this period, I have acquired some knowledge and formed some opinions on…]]></description><link>https://vinitkumar.me/development-practises/</link><guid isPermaLink="false">https://vinitkumar.me/development-practises/</guid><pubDate>Thu, 06 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been writing code professionally for around 8 years now. In this period, I have acquired some knowledge and formed some opinions on how software should be written and what practices to follow.&lt;/p&gt;
&lt;p&gt;The guide is divided into following sections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git Guidelines&lt;/li&gt;
&lt;li&gt;Backend Development Guidelines&lt;/li&gt;
&lt;li&gt;Frontend Development Guidelines&lt;/li&gt;
&lt;li&gt;DevOps Guidelines&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Git&lt;/h1&gt;
&lt;p&gt;Mastering version control such as Git is very important. Following are some tips and techniques to get better at using Git.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commit early, commit often. There is no shame in committing code that is work in progress. Infact, early commits help spot design issues very early in the development.&lt;/li&gt;
&lt;li&gt;Make a Draft PR as soon as you have a POC(proof of concept) ready and invite one of your peers to review the code. Early feedback helps spot issues, obvious mistakes and even typos early.&lt;/li&gt;
&lt;li&gt;Make atomic commits(meaning the code in the commit is doing one thing). Do not add a diff of 20 files doing all different things. It just make things very noisy and makes hard for reviewer to do their job.&lt;/li&gt;
&lt;li&gt;Avoid doing multiple things and do things in a proper flow.&lt;/li&gt;
&lt;li&gt;Write good commit messages. A good guide is here &lt;a href=&quot;https://chris.beams.io/posts/git-commit/&quot;&gt;https://chris.beams.io/posts/git-commit/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Setup your git properly with correct emails (For eg: your git configuration should be setup to use the work and personal emails depending upon what project you are on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t get high on your own supply&lt;/strong&gt;. Unless absolutely urgent do not merge your own PRs. Ask a coworker to review the code.&lt;/li&gt;
&lt;li&gt;Always &lt;strong&gt;create&lt;/strong&gt; release and tags while doing a production release. No code gets pushed to production without doing this.&lt;/li&gt;
&lt;li&gt;Write good release notes clearly mentioning the fixed bugs and the features built.&lt;/li&gt;
&lt;li&gt;Commit message should contains reference to the github issue.&lt;/li&gt;
&lt;li&gt;Sign git commits using GPG. It helps ensure the authenticity of the person doing the commit. Refer link here. &lt;a href=&quot;https://help.github.com/en/articles/signing-commits&quot;&gt;https://help.github.com/en/articles/signing-commits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Be honest, direct and respectful while reviewing the code. If you think something could be better (give a meaningful &amp;#x26; logical explanation supplemented by suitable code and source)&lt;/li&gt;
&lt;li&gt;Try to use a commit message template for consistent commit messages. You can use something like this:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Save the below as a file named &lt;code&gt;.gitcommitmessage&lt;/code&gt; in your home directory, replace the &lt;code&gt;Authored-by&lt;/code&gt; and &lt;code&gt;Signed-off-by&lt;/code&gt; with your email&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;git&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# build, chore, ci, docs, feat, fix, perf,
# refactor, revert, style, test: subject


# Body


# Any references to tickets, articles etc?
- Github Issue:



Reported-by: team member &amp;lt;teammember@example.com&amp;gt;
Signed-off-by: Vinit Kumar &amp;lt;mail@vinitkumar.me&amp;gt;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;You this template while commiting like this:&lt;/p&gt;
&lt;p&gt;Edit your &lt;code&gt;~/.gitconfig&lt;/code&gt; file&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;git&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;[commit]
  gpgsign = true
  template = ~/.gitcommitmessage&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;The full template could be invoked using &lt;code&gt;git commit&lt;/code&gt;. You can always use the &lt;code&gt;git commit -m &quot;commit message&quot;&lt;/code&gt;.
Just try to prefix the commit with one of these (build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test: subject), so
that the context is clear.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If something needs more explanation that usual, it is a good idea to write detailed commit message. This is better approach than writing a lot of comment on the code, because comments might&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;get outdated or changed, but the commit is immutable for that piece of code and the context is unique.&lt;/p&gt;
&lt;p&gt;Every developer needs to fork the repo from the upstream into their own user account.&lt;/p&gt;
&lt;p&gt;This workflow is based on an important concept. There are two kinds of repos here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upstream Repo (For eg: &lt;a href=&quot;https://github.com/django/django&quot;&gt;https://github.com/django/django&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Developer Repo (For eg: &lt;a href=&quot;https://github.com/vinitkumar/django&quot;&gt;https://github.com/vinitkumar/django&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some ground rules are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use good branch name prefix such as (feature/feat, bugfix/bug/fix, refactor/chore/cleanup) and then a clear branch name.&lt;/li&gt;
&lt;li&gt;No branch is pushed directly(feature/bugfix/refactor) to the upstream directly.&lt;/li&gt;
&lt;li&gt;Upstream contains only three branches at any time. (develop, staging, master)&lt;/li&gt;
&lt;li&gt;Anything on upstream develop is releasable to testing/develop server and is testable for the team other than the dev&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;themselves.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Anything on upstream staging is releasable to staging and is of atleast beta-quality.&lt;/li&gt;
&lt;li&gt;Anything on master is releasable to production.&lt;/li&gt;
&lt;li&gt;The default branch of all projects is develop (on upstream). This means all Pull Requests are made to develop.&lt;/li&gt;
&lt;li&gt;In case any urgent fix(hotfix) needs to be made from staging or master, the branches are made from upstream staging/master and the pull request is made to &lt;strong&gt;master&lt;/strong&gt; or &lt;strong&gt;staging&lt;/strong&gt; and not to to the develop branch. The fixes are then merged downwards from master -&gt; staging -&gt; develop.&lt;/li&gt;
&lt;li&gt;We follow semantic versioning here so vX.Y.Z (X is Major, Y is Minor, Z is Patch version) only.&lt;/li&gt;
&lt;li&gt;Releases can be created from staging and master. With cleary indicating that if it is a stable release or release candidate.&lt;/li&gt;
&lt;li&gt;Always keep your develop in sync with the upstream develop repo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Following are some commands for day to day work:&lt;/p&gt;
&lt;h3&gt;Steps to keep the fork’s develop in sync&lt;/h3&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;git fetch upstream # fetch upstream and all branches
git checkout develop # checkout local or own develop
git merge upstream/develop # get the changes from the upstream and merge to your local.
git push origin develop # push the code to the develop branch of your fork&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Create a bugfix/feature/refactor branch for regular development&lt;/h3&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# first sync the develop
git fetch upstream # fetch upstream and all branches
git checkout develop # checkout local or own develop
git merge upstream/develop # get the changes from the upstream and merge to your local.
git push origin develop # push the code to the develop branch of your fork

# then create a branch from develop

git checkout -b feature/get-user-data
...
...
# get work done, commit code
# push the code to your brach
git push origin HEAD
# make pull request to the upstream develop
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h4&gt;Get the code synced into an existing branch&lt;/h4&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# after getting the branch synced up like this:
git fetch upstream # fetch upstream and all branches
git checkout develop # checkout local or own develop
git merge upstream/develop # get the changes from the upstream and merge to your local.
git push origin develop # push the code to the develop branch of your fork

git checkout feature/existing-branch
git merge develop # merge conflicts may come, resolve them and then commit
git push origin feature/existing-branch
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Hotfix workflow&lt;/h2&gt;
&lt;p&gt;Get the upstream first&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;git fetch upstream # fetch upstream and all branches
# checkout staging/master depending on where the fix needs to be made
git checkout -b hotfix/major-crash-xyz
# implement the fix
# commit the fix
git push origin HEAD
# make a PR to the source branch, so if it is created from staging, it is made to staging or if it is created
# from master it is made to master
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h3&gt;Get the hotfix changes to the branches lower down the upstream master or staging&lt;/h3&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# after the hotfix is merge to master
# do this:

git fetch upstream
git checkout upstream/staging &amp;amp;&amp;amp; git checkout -b staging
git merge upstream/master
git push upstream staging


git checkout develop
git merge upstream/develop
git push origin develop
git merge upstream/staging
git push origin develop
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;deckgo-highlight-code language=&quot;bash&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# after the hotfix is merged to staging
# do this:

git fetch upstream
git checkout upstream/staging &amp;amp;&amp;amp; git checkout -b staging


git checkout develop
git merge upstream/develop
git push origin develop
git merge upstream/staging
git push origin develop
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Doesn’t pollute the upstream repo with not needed branches&lt;/li&gt;
&lt;li&gt;Gives the developer enough freedom to commit code in their own fork for anything experimental/not-ready-for-production.&lt;/li&gt;
&lt;li&gt;It is better when more than one dev is committing to a project. It prevents conflicts and gives more clarity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Back end Development Guidelines&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Write design docs before doing anything major, invite feedback from peers and debug the idea even before a line of code is written. (&lt;a href=&quot;https://dave.cheney.net/2019/02/18/talk-then-code&quot;&gt;https://dave.cheney.net/2019/02/18/talk-then-code&lt;/a&gt;, &lt;a href=&quot;https://medium.com/dropbox-design/how-do-you-design-a-design-doc-d7b2f1fa4a0c&quot;&gt;https://medium.com/dropbox-design/how-do-you-design-a-design-doc-d7b2f1fa4a0c&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Write defensive code. Do not trust user input. Design for failure. The services might go down at the worst time and your system should consider that into account.&lt;/li&gt;
&lt;li&gt;Always use ORM when possible, drop to RAW SQL only when there is a performance issue. Get the RAW SQL audited before putting it live.&lt;/li&gt;
&lt;li&gt;Write terse, clear code that is modular and dry. Do not try to do a lot of things at once.&lt;/li&gt;
&lt;li&gt;Document any gotchas, assumptions, hard coding with as detailed comments as possible. It will help the team save tonnes of time while debugging issues in future.&lt;/li&gt;
&lt;li&gt;Use standard http Status code. Use standard libraries for dealing with http, REST (like DRF, Retrofit). Do not try to reinvent the wheel unless you are 100% sure your implementation is better than these.&lt;/li&gt;
&lt;li&gt;Use stable and popular libraries.&lt;/li&gt;
&lt;li&gt;Focus on performance &amp;#x26; security while writing back end code.&lt;/li&gt;
&lt;li&gt;Write DRY, reusable and testable code.&lt;/li&gt;
&lt;li&gt;The most critical parts of the system must be unit tested. If it is not easy to test a part of code it is indicative of code smell and a refactor must be done.&lt;/li&gt;
&lt;li&gt;Write test with code. Use assertions to enforce correct behaviour. Fail early, fail loudly so that we can figure and fix the errors.&lt;/li&gt;
&lt;li&gt;Use tools like newrelic (for performance) and sentry(for error tracking) so that we are aware of the issues before our customers report them. Really helps when there is not a big QA team in place.&lt;/li&gt;
&lt;li&gt;Version the APIs that you produce &lt;strong&gt;very important&lt;/strong&gt; since we in a SOA architecture, you can’t push an incompatible change that will break other services. If required, they will be done in a separate version (like apiv2/)&lt;/li&gt;
&lt;li&gt;Clear responsibility is enforced within the services. For eg: No two services write to the same table concurrently. This causes deadlocks and is bad for performance.&lt;/li&gt;
&lt;li&gt;Long running processes are delegated to background jobs and are not run on the main thread.&lt;/li&gt;
&lt;li&gt;Timeouts are added to every external services we are interacting with.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Frontend development guidelines&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Focus on accessibility while building UIs.&lt;/li&gt;
&lt;li&gt;Master SASS and modern CSS. It helps write better structured CSS code.&lt;/li&gt;
&lt;li&gt;Focus on learning build tools such as Webpack/Parcel. It is how CSS and JavaScript bundled these days and mastering them will help you modify their configuration as per your taste.&lt;/li&gt;
&lt;li&gt;Read JavaScript basics at Mozilla Developer Network.&lt;/li&gt;
&lt;li&gt;Reads the docs at reactjs.org and their release notes to learn the latest trends and correct patterns.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;eslint&lt;/code&gt; to lint your code and get rid of most of the silly mistakes and syntax errors.&lt;/li&gt;
&lt;li&gt;Write DRY code(DRY = Do not repeat yourself). If you are copy pasting same logic in two places, better make a function out of it.&lt;/li&gt;
&lt;li&gt;Write reasonable and simple code that is easy to reason about. Keeping things simple is helpful in debugging.&lt;/li&gt;
&lt;li&gt;If the component is very large(more than 200 Lines Of Code) and is doing a lot of things at once, try splitting it into smaller components.&lt;/li&gt;
&lt;li&gt;Separate logic from presentation. The presentation components shoulb be dump and just depend on the data for presentation.&lt;/li&gt;
&lt;li&gt;Try not to write a lot of &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;ternary operators&lt;/code&gt; inside the render method. Use a boolean flag for that and keep the logic inside the templating to the minimum.&lt;/li&gt;
&lt;li&gt;Prefer using &lt;code&gt;PureComponent&lt;/code&gt; instead of &lt;code&gt;Component&lt;/code&gt; while using Class based components.&lt;/li&gt;
&lt;li&gt;Cleanup eventhandler set in &lt;code&gt;ComponentDidMount&lt;/code&gt; in &lt;code&gt;ComponentWillUmount&lt;/code&gt; because not doing so can cause memory leaks.&lt;/li&gt;
&lt;li&gt;Type check the components with PropTypes.&lt;/li&gt;
&lt;li&gt;Write simple components that do one thing and only one thing well. Make it composeable so that it can be reused with ease.&lt;/li&gt;
&lt;li&gt;Think about the stability, popularity and trade-offs while using a new library and if you can justify increasing the bundle-size.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;DevOps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use standard, stable and well documented platform.&lt;/li&gt;
&lt;li&gt;Use multi-zone DB to embrace for regional failures and quick failover.&lt;/li&gt;
&lt;li&gt;Have Database scheduled to a different cloud service securely (for example: Use s3 in case the database is hosted on Google Cloud and Vice Versa)&lt;/li&gt;
&lt;li&gt;Test the restore and snapshots. Maintain automatic backups.&lt;/li&gt;
&lt;li&gt;Backup Database, Put apps and services on maintenance while doing major upgrades/migrations.&lt;/li&gt;
&lt;li&gt;The Configuration should definitely be version controlled and tags are maintained. (follow semantic versioning)&lt;/li&gt;
&lt;li&gt;Performance, security and stability of the cluster are the corner stones to live by.&lt;/li&gt;
&lt;li&gt;While evaluating any new service, library refer the above and ask yourself if it is going to make it better or is it going to make it better.&lt;/li&gt;
&lt;li&gt;Trade-offs if any needs to be documented and made very clear.&lt;/li&gt;
&lt;li&gt;Maintain better dev prod parity. Ideally, the apps should checklist all the columns of 12 factor apps. Refer this(&lt;a href=&quot;https://12factor.net&quot;&gt;https://12factor.net&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Test new tech, plugins in local -&gt; staging -&gt; production. Push code to production only when there are no known bugs or issues.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Influential Programmers: A Personal Tribute to 10 Open Source Leaders]]></title><description><![CDATA[Everyone has their heroes. Even programmers have their heroes. This is
a small list of programming heroes I admire. I don’t claim that these…]]></description><link>https://vinitkumar.me/programming-heroes/</link><guid isPermaLink="false">https://vinitkumar.me/programming-heroes/</guid><pubDate>Thu, 23 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Everyone has their heroes. Even programmers have their heroes. This is
a small list of programming heroes I admire. I don’t claim that these are the best, their might be many others but these are the one I know from my limited experience. So takes this list with a grain of salt.&lt;/p&gt;
&lt;h2&gt;Heroes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/bagder&quot;&gt;Daniel Stenberg (C)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Daniel is the lead developer and creator of the CURL project. If you deal with any web-services either as a developer or end-user, you have used his code. He also livestreams some of his coding sessions on stream and they are informative and fun to watch.&lt;/p&gt;
&lt;p&gt;Daniel is excellent at Systems programming, Network, http and ofcourse a master “C” developer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/bradfitz&quot;&gt;Brad FitzPatrick (Go)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Brad currently works with &lt;del&gt;the Go team&lt;/del&gt; TailScale. In a previous life, he founded LiveJournal, wrote Memcached and many other free software. He is probably my favorite of the lot and I really like his personality.&lt;/p&gt;
&lt;p&gt;He is one of the most accomplished programmers of the recent generation, and he just keeps on writing code that matters and gives it away for free.&lt;/p&gt;
&lt;p&gt;Brad also seems like an excellent dad and family man (from his twitter feed) and it is especially inspiring to me as a new Dad.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/antirez&quot;&gt;Salvatore Sanfilippo aka antirez (C)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Antirez is the lead and creator of popular Open Source database Redis. He is a great programmer and very humble in person. I learned so much from him. Just read this blog post and you will understand what I am talking about &lt;a href=&quot;http://antirez.com/news/124&quot;&gt;http://antirez.com/news/124&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;He writes his code in C “that almost reads like poetry” in Vim. He is very strong in networking, data structures, and algorithms. You can learn more by reading his code and blogs than any other book in the field of system programming. He is also a family man and often advocates having a healthy work-life balance and it is almost inspiring to emulate his journey.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/Jonathan_Blow&quot;&gt;Jonathan Blow (Jai, The Witness game)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Game developer of great games like “The Witness”, he is highly opinionated, charismatic and speaks what’s on his mind. He mostly has very good advice about programming and doesn’t hesitate to call a spade a spade. In addition to working on this new game, he has also been writing a new programming language called Jai. It’s a Systems programming language that compiles fast and aims to replace C++ for writing the game engines. He also regularly live-streams his coding sessions, where he sometimes works on the engine and on the compiler.&lt;/p&gt;
&lt;p&gt;Listening and reading to him, inspires me to think deeply and work hard on improving my craft.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/dabeaz&quot;&gt;David Beazely (Python)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;David Beazely is one of the best teachers of Python in the world. He is like this mad Computer Scientist that just keeps on producing great software and resources regularly and every time he surpasses his past standards that are already very high.&lt;/p&gt;
&lt;p&gt;I also relate and learn more from him as he is a Python Guru and Python has been the source of most of my income to date. His enthusiasm and spirit towards programming and Python are infectious and I just love watching his talks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/raymondh&quot;&gt;Raymond hettinger (Python)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Raymond as been a Python Core Developer for over a decade or more and is a fantastic Python educator. His talks show his deep knowledge of Python and programming in general.
Plus, he is a fantastic speaker. He is probably one of my favorite speakers in any programming language community. People like him are a gift for people like me who are self-taught
and can’t afford the costly training materials or courses.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/bcantrill&quot;&gt;Bryan Cantrill (C, Dtrace)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;He is probably one of the most gifted systems programmer. Recently, he has been programming a lot in Rust and his talks are always filled with a lot of useful information.
I have not done a lot of System Programming in my daily work but it always fancies me, and I am sure going to do more of it in the future.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/gvanrossum&quot;&gt;Guido Van Rossum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Guido is simply amazing. His work changed the lives of many people including me. In a world filled with difficult programming languages, he made a simple and powerful programming language
that was welcoming and gave me the confidence of implementing my ideas into code. He is not just very technically strong, but he is also a very nice person and is doing a lot for diversity and inclusiveness. He also gave up his BDFL status last year and Python is being run by an elected group of people (core devs).&lt;/p&gt;
&lt;p&gt;Python has been the key point in my life. It has provided me with a respectable job and has enabled me to provide for my family. I will always thank Guido for that.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/rem&quot;&gt;Remy Sharp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remy is an awesome British programmer and an all-around great guy. He runs his own company and has been one of most influential JavaScript programmers. He writes useful tools and services (like nodemon, jsbin and gives it all for free). His livestreams are also informative and there is a lot you can learn from watching him code and debug. I give him credit for a lot of my JS knowledge. I have been following and learning from him a lot from the start of my professional programming journey since(2012) and remember him using Chrome dev tools as an editor for development. He is also a family man and is a great chap to look up to.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Coding principles every engineer should know]]></title><description><![CDATA[IMPORTANT: Cross posting from this medium article https://medium.com/@sschillace/coding-principles-every-engineer-should-know-b946b48cc94…]]></description><link>https://vinitkumar.me/cross-post-coding-principles-every-engineer-should-know/</link><guid isPermaLink="false">https://vinitkumar.me/cross-post-coding-principles-every-engineer-should-know/</guid><pubDate>Mon, 08 Apr 2019 12:48:00 GMT</pubDate><content:encoded>&lt;h3&gt;IMPORTANT: Cross posting from this medium article &lt;a href=&quot;https://medium.com/@sschillace/coding-principles-every-engineer-should-know-b946b48cc946&quot;&gt;https://medium.com/@sschillace/coding-principles-every-engineer-should-know-b946b48cc946&lt;/a&gt; since I do not like medium as a platform and I do not want to loose this port in matrix:)&lt;/h3&gt;
&lt;h3&gt;The post has been written by &lt;a href=&quot;https://medium.com/@sschillace&quot;&gt;Sam Schillace&lt;/a&gt; and all references to me/I is referenced to Mr. Sam&lt;/h3&gt;
&lt;p&gt;Throughout my engineering career, I’ve had the opportunity work alongside and learn from many incredibly talented people, solve some serious technical challenges, and scale several successful companies. Recently, I was talking with the engineering team at Box about what I’ve learned along this journey, and what came out of that conversation were my personal engineering principals. These aren’t rules or engineering guidelines. They’re simply the principles that I pay attention to when I write and operate code.&lt;/p&gt;
&lt;h2&gt;Be paranoid.&lt;/h2&gt;
&lt;p&gt;This one comes naturally to me. Since I’m mostly self-taught as a programmer, I never trust computers. I never trust that the system I just launched is really up. That the bug I fixed is really fixed. That code really does work the way I think it does without a test. I don’t trust anything. I don’t even trust myself! I never trust that I understand anything as well as I think I do until I check more than once. Paranoia is my friend, and it should be your friend, too. Always try to find a way to test assumptions along some other path, or get a second set of eyes to see what you’ve missed. Most of the time it’s not needed. Sometimes it’s really important.&lt;/p&gt;
&lt;h2&gt;Don’t lie to the computer.&lt;/h2&gt;
&lt;p&gt;Another way to say this is “avoid leaky abstractions.” Don’t use systems in ways they’re not meant to be used. Don’t count on side effects. Don’t do things that won’t be obvious to the next person because the system wasn’t designed for them or they’re undocumented. If usage is three orders of magnitude more than current usage, then you should probably rethink the design. If the contract implies, but doesn’t guarantee, your use, you should change the component and the contract to be aligned. Computers are nasty things. They always bite when lied to, eventually.&lt;/p&gt;
&lt;h2&gt;Keep it simple.&lt;/h2&gt;
&lt;p&gt;We like building things and solving problems. That’s why we do what we do. But a lot of the time, just because we can see a problem that could be solved, doesn’t mean it’s useful to solve it &lt;strong&gt;right now&lt;/strong&gt;. I always think of myself as a fairly dumb programmer — I like clean, simple designs that are easy to understand. And this is a high challenge — anyone can solve a problem in a complex way, but only good programmers can solve problems in simple, understandable ways. It’s much harder to really think through the problem and solve only what needs to be solved in a simple, robust manner. Making yourself understood is the most important thing. Most time in code is spent maintaining, not creating.&lt;/p&gt;
&lt;h2&gt;First rule of optimizing: don’t.&lt;/h2&gt;
&lt;p&gt;This is from a good book by John Bentley called &lt;a href=&quot;http://www.amazon.com/Programming-Pearls-Jon-Bentley/dp/8177588583&quot;&gt;Programming Pearls&lt;/a&gt;. (It’s explicitly meant to help you learn to think like an experienced programmer. It may be an old book but most of the lessons are incredibly relevant today.) Optimization can take many forms: speed, future-proofing, potential scale, possible uses, etc. The problem is, most optimization is ultimately never used, and, more or less by definition, optimization makes designs more complicated. So, first rule of thumb is don’t optimize until it’s really clear that you understand the problem completely. (His second rule: “don’t optimize, yet.” Meaning, even if you do understand it, don’t optimize until you really need to.)&lt;/p&gt;
&lt;h2&gt;Don’t just fix the bug; fix all possibility of it ever happening again.&lt;/h2&gt;
&lt;p&gt;Don’t be sorry if you made a mistake — be angry and make it something you never have to think about again. I hate bugs. I hate systems that let me create bugs. I hate it when my own software lets my fragile human brain down and I create a bug that could have been avoided. And I really, really hate fixing the same bug twice. So I try as much as I can, every single time I fix a bug, to think about the following: where else might this bug be happening now? Where might it happen in the future? What are the adjacent patterns that create similar bugs? And how can I kill all the bastards at once, right now?&lt;/p&gt;
&lt;h2&gt;Question assumptions constantly.&lt;/h2&gt;
&lt;p&gt;Because I have spent most of my time in my own startups, I’ve gotten in the habit of asking myself constantly “Why am I doing this? What problem does it solve? Is there a better way? Is there something else I could do instead that’s more important?” You should have that attitude all the time. Constantly be questioning the assumptions given to you. What’s the real problem you’re solving? Did someone ask you to solve an effect rather than the root cause? Is the solution complete? Over-complete? Is the impact worthwhile?&lt;/p&gt;
&lt;h2&gt;Think long term. Slow down, it goes faster.&lt;/h2&gt;
&lt;p&gt;This might be one of the most important ones. It’s easy to hack things out. As engineers, we like efficiency; we like to build as many things as we can. But if we don’t build for the long term, eventually it gets harder and harder to build anything. Sometimes we don’t understand the problem at first and we write code that we later have to back out. Sometimes we do things that are easy for our local problem, but make things worse or harder for someone else or for a larger problem. Sometimes we rush and don’t finish the design, and this causes much more time later on for someone to fix. Sometimes we don’t bother to write it the right way, we just make a copy or hack something in because we’re under time pressure or don’t want to really think it through. I’ve seen all these things too many times. Others have said this better than I have. But I’ll repeat — the goal is building the largest number of great features, reaching the largest number users &lt;strong&gt;over time&lt;/strong&gt;. The area under the curve for a given day doesn’t add much, no matter how much gets done on that day, relative to all the days added together. Think long term.&lt;/p&gt;
&lt;h2&gt;Care about your code.&lt;/h2&gt;
&lt;p&gt;I guess this one doesn’t need much explanation, but it’s still something I see people missing from time to time. Take pride in your work! Care about the code you produce! I usually think of my poor future self, having to deal with my crappy code, when I’m tempted to be lazy and cut a corner. You don’t have to take this to an extreme — I used to joke at Google that other engineers treated their code like a pet, where my relationship with mine was more like a ranchers — pragmatic, not sentimental. But even still, I always hate it if my code isn’t well designed, doesn’t work well, isn’t readable, all that stuff.&lt;/p&gt;
&lt;h2&gt;Cheap, fast, right — pick two.&lt;/h2&gt;
&lt;p&gt;This is the iron triangle of software. This is the way the world of software engineering works. But it’s not an excuse for complacency. In fact, this is your opponent every single day. The difference between good and great programmers is often measured in how well they navigate the iron triangle. And really great ones find ways to bend it and get some of all three, more often than not. Try to be that kind of programmer — can you find a more elegant design that’s faster to build and is still right? Can you relax some constraint in the spec to get to the goal more quickly? You might not always be able to do that; in fact, you won’t beat the triangle. But if nothing else, make sure you understand what compromise you are choosing, and why, and that it’s the right one for the current situation.&lt;/p&gt;
&lt;h2&gt;Conclusion: Be curious. Learn as much as you can, all the time.&lt;/h2&gt;
&lt;p&gt;Okay, this one is more career advice than anything else. But if you’re not curious and don’t really care that much about learning new things as an engineer and don’t care about new tech or new languages or new ideas, then why are you here? By no means are my principles perfect or an absolute representation of thinking/acting like a successful engineer, but I’m willing to bet there’s a fair amount of overlap with what others might be thinking. I’d love to hear your thoughts.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How To Manage Infra in 2019]]></title><description><![CDATA[Infrastructure is one of the most hotly discussed topics in Software development these days. There are so many tools,
so much to learn that…]]></description><link>https://vinitkumar.me/how-to-manage-infra-in-2019/</link><guid isPermaLink="false">https://vinitkumar.me/how-to-manage-infra-in-2019/</guid><pubDate>Fri, 05 Apr 2019 07:19:00 GMT</pubDate><content:encoded>&lt;p&gt;Infrastructure is one of the most hotly discussed topics in Software development these days. There are so many tools,
so much to learn that very few people actually know what to do and what the best practices are. Everyone wants
to jump on the microservice bandwagon. However, it’s not as easy as it seems. I’ve meditated quite a bit on this
and have come up with these points that I think are good tips to follow: - Use standard, stable and well documented platform. - Use multi-zone DB to embrace for regional failures and quick failovers. - Have DB backups scheduled to a different cloud service securely (for e.g., s3 in case the db is hosted on GCE/GKE)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test the restore and snapshots. Maintain automatic backups.&lt;/li&gt;
&lt;li&gt;Backup Database, put apps and services on maintenance while doing major upgrades/migrations. - The Config should definitely be version controlled and tags are maintained. (follow semantic versioning) - Performance, security and stability of the cluster are the corner stones to live by. - While evaluating any new service or library, refer to the above and ask yourself if it is going to make it better.&lt;/li&gt;
&lt;li&gt;Tradeoffs, if any, need to be documented and made very clear.&lt;/li&gt;
&lt;li&gt;Maintain better dev/prod parity. Ideally, the apps should satisfy all the principles of 12 factor apps. Refer to &lt;a href=&quot;https://12factor.net&quot;&gt;https://12factor.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Test new tech and plugins in local → staging → production. Push code to production only when there are no known bugs or issues.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[The Minimalist Developer: Maximizing Productivity with Fewer Tools]]></title><description><![CDATA[We are a big fan of tools. We use them daily in almost everything, but at one point in time, they pollute our mental space so much that we…]]></description><link>https://vinitkumar.me/tooling-considered-harmful/</link><guid isPermaLink="false">https://vinitkumar.me/tooling-considered-harmful/</guid><pubDate>Wed, 06 Mar 2019 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are a big fan of tools. We use them daily in almost everything, but at one point in time, they pollute our mental space so much that we just forget to think and do as the tools dictate. A common example could be smart-phone. It was meant to keep us mobile and connected but now, it has become so dominant and addictive that it is more of a bane than boon. Similarly, in programming, we use so many tools and IDEs, but we rarely master a subset of these. It is a sad situation in my opinion. I was one of those guys who will try every tool or software that comes out. But now, my thinking has totally changed. Right now, only three things matter to me while selecting a tool: - Stability: is the tool stable enough and has a good stable ecosystem? - Performance: is the tool performant enough, or is it going to eat away my RAM and CPU cycles? - Speed: is fast enough so as to match my thoughts and do not block me while I am working? Keeping these in mind, only one tool that I use passes all these tests and that is [Vim](&lt;a href=&quot;https://www&quot;&gt;https://www&lt;/a&gt;. Vim. org)![screenshot](&lt;a href=&quot;https://cldup&quot;&gt;https://cldup&lt;/a&gt;. com/A35GFuVx77.png) My Vim is configured to be fast, functional and as a mere extension to my thoughts. My muscle memory in Vim is strong enough now so that I do not have to remember keybindings to edit text, replace or write good code. The core of the plugins I use is &lt;code&gt;YouCompleteMe&lt;/code&gt;, &lt;code&gt;Ale&lt;/code&gt;, and &lt;code&gt;Fugitive&lt;/code&gt;. Also, I have gone cold turkey with Vim so there is no fallback editor in case I struggle to do something in Vim. It has helped me learn a lot of good shortcuts and tricks for editing code in Vim. Also, watching the live stream of experience Vim veterans like Armin and Gary has helped a lot. This post is not about IDE bashing or anything like that. It is mostly about what works for me and why? If you use ann IDE, spend some time mastering it and learning as much as you can about it. In my opinion, the goal should be to get better at the tool you use and get very good at that. So good that the tool becomes an extension of your mind and you do not have to have an overhead while using that tool. Life and time are both limited commodities, and we should optimize our tooling to make sure we enjoy them to the fullest and without wasting time on bloated tools.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[6 years of full time job]]></title><description><![CDATA[Today, I am completing 6 years of my full time employment with [Socialschools](https://socialschools. nl). It has been an incredibly long…]]></description><link>https://vinitkumar.me/6-years-of-full-time-job/</link><guid isPermaLink="false">https://vinitkumar.me/6-years-of-full-time-job/</guid><pubDate>Fri, 01 Feb 2019 06:31:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, I am completing 6 years of my full time employment with [Socialschools](&lt;a href=&quot;https://socialschools&quot;&gt;https://socialschools&lt;/a&gt;. nl). It has been an incredibly long time and there has been highs and lows but mostly it has been a great experience writing code and having fun while doing it. I am very proud of the product I have helped build and make it succeed. There are various factor that led me stay with this company for this long: - &lt;strong&gt;People&lt;/strong&gt;: I was lucky enough to be working with the best people who are friendly, empathetic and have impeccable professionalism. - &lt;strong&gt;Work Life Balance&lt;/strong&gt;: People realize that everyone has a life outside the work and respect that. - &lt;strong&gt;Quality of Work&lt;/strong&gt;: I have been very lucky in being able to work on very hard problems and solve them. This doesn’t happen too often with many companies. - &lt;strong&gt;Trust&lt;/strong&gt;: You are more motivated to do things in the best possible way when your teammates trust you. - &lt;strong&gt;Ownership&lt;/strong&gt;: You are given ownership of a part of product and people trust you that you will make the best possible decision for it and the team. Nobody can look very far in the future and say what they are going to do but at this point of time, I feel incredibly lucky and full of gratitude to everyone who has played a part in my journey. Some past posts about the same: - [Four years of full time job](&lt;a href=&quot;https://vinitkumar&quot;&gt;https://vinitkumar&lt;/a&gt;. me/articles/2017/03/01/Four-years-of-full-time-job. HTML) - [One year at job](&lt;a href=&quot;https://vinitkumar&quot;&gt;https://vinitkumar&lt;/a&gt;. me/articles/2014/02/08/One-year-on-job. HTML)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How To Convert LaTex to PDF on macOS]]></title><description><![CDATA[I have been writing my resume in LaTeX for more than a decade now. Writing your resume in LaTex has it’s own benefits.
You can check it out…]]></description><link>https://vinitkumar.me/2019-01-16-Converting-Latex-to-PDF-on-macOS/</link><guid isPermaLink="false">https://vinitkumar.me/2019-01-16-Converting-Latex-to-PDF-on-macOS/</guid><pubDate>Wed, 16 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been writing my resume in LaTeX for more than a decade now. Writing your resume in LaTex has it’s own benefits.
You can check it out here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tex.stackexchange.com/questions/11955/what-are-the-benefits-of-writing-resumes-in-tex-latex&quot;&gt;benefits of doing the resume in latex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, writing your resume in all LaTex is all well and good but converting it into pdf on macOS is a task on it’s own. The MacTeX package is a BIG download of around 6GB and it’s not worth spending so much time and energy for only trying to convert your resume from LaTex to PDF. Well, you can ofcourse use one of the online latex-to-pdf converter or you can install the &lt;code&gt;basictex&lt;/code&gt; package and set your local mac environment capable of converting to PDF.&lt;/p&gt;
&lt;p&gt;Follow these steps to get it working:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# install basictex using brew #NOTE your password might be required
brew cask install basictex
# try to install texlivefly, it complains about tlmgr outdated
sudo tlmgr install texliveonfly
# update tlmgr
sudo tlmgr update --self
# now install textliveonfly
sudo tlmgr install texliveonfly

# use the commands using sudo.
# for eg: if your resume file name is vinit_kumar.tex

sudo texliveonfly vinit_kumar.tex

# this outputs a file named vinit_kumar.pdf in the same directory
# now, open this file like this to check if all your changes made it through.

open vinit_kumar.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Credits where it’s due: &lt;a href=&quot;https://www.apptic.me/blog/get-mactex-faster-easily-using-basictex.php&quot;&gt;Get Mactex Faster&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The idea came from this website, though the issue was it was not working without &lt;code&gt;sudo&lt;/code&gt;. Hence, wrote this post more of an reminder of how to get LaTex to PDF working on macOS&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Lightweight LaTeX to PDF Conversion on macOS: A Minimal Setup Guide]]></title><description><![CDATA[I have been writing my resume in LaTeX for more than a decade now. Writing your resume in LaTeX has its own benefits.
You can check it out…]]></description><link>https://vinitkumar.me/converting-latex-to-pdf-on-macos/</link><guid isPermaLink="false">https://vinitkumar.me/converting-latex-to-pdf-on-macos/</guid><pubDate>Wed, 16 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been writing my resume in LaTeX for more than a decade now. Writing your resume in LaTeX has its own benefits.
You can check it out here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tex.stackexchange.com/questions/11955/what-are-the-benefits-of-writing-resumes-in-tex-latex&quot;&gt;benefits of doing the resume in latex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, writing your resume in all LaTeX is all well and good but converting it into PDF on macOS is a task on its own. The MacTeX package is a BIG download of around 6GB and it’s not worth spending so much time and energy for only trying to convert your resume from LaTeX to PDF. Well, you can of course use one of the online latex-to-PDF converter or you can install the &lt;code&gt;basictex&lt;/code&gt; package and set your local Mac environment capable of converting to PDF.&lt;/p&gt;
&lt;p&gt;Follow these steps to get it working:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;# install basictex using brew #NOTE your password might be required
brew cask install basictex
# try to install texlivefly, it complains about tlmgr outdated
sudo tlmgr install texliveonfly
# update tlmgr
sudo tlmgr update --self
# now install textliveonfly
sudo tlmgr install texliveonfly

# use the commands using sudo.
# for eg: if your resume file name is vinit_kumar.tex

sudo texliveonfly vinit_kumar.tex

# this outputs a file named vinit_kumar.pdf in the same directory
# now, open this file like this to check if all your changes made it through.

open vinit_kumar.pdf&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Credits where it’s due: &lt;a href=&quot;https://www.apptic.me/blog/get-mactex-faster-easily-using-basictex.php&quot;&gt;Get Mactex Faster&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The idea came from this website, though the issue was it was not working without &lt;code&gt;sudo&lt;/code&gt;. Hence, wrote this post more of a reminder of how to get LaTeX to PDF working on macOS&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to Use React with djangoCMS 3.5.2 and above?]]></title><description><![CDATA[React is one of the most useful frontend library out there. At Socialschools, we use React to render some content using our API from App…]]></description><link>https://vinitkumar.me/2018-05-24-React-With-Django-CMS/</link><guid isPermaLink="false">https://vinitkumar.me/2018-05-24-React-With-Django-CMS/</guid><pubDate>Thu, 24 May 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;React is one of the most useful frontend library out there. At Socialschools, we use React to render some content using our API from App server. It has been in production since June last year and it is really amazing building neat stuff using both React and djangoCMS.&lt;/p&gt;
&lt;p&gt;djangoCMS provides us the best Hybrid experience possible, we render say 70% of the content from server rendered pages and it provides us good support for even running React et. al without any hiccups. The latest version of djangoCMS 3.5.x series came up with a neat feature that allows the content to be refreshed as you edit without need of a reload.&lt;/p&gt;
&lt;p&gt;This is from the &lt;a href=&quot;http://docs.django-cms.org/en/latest/topics/frontend-integration.html&quot;&gt;djangoCMS documentation&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Generally speaking, django CMS is wholly frontend-agnostic. It doesn’t care what your site’s frontend is built on or uses.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The exception to this is when editing your site, as the django CMS toolbar and editing controls use their own frontend code, and this can sometimes affect or be affected by your site’s code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The content reloading introduced in django CMS 3.5 for plugin operations (when moving/adding/deleting etc) pull markup changes from the server. This may require a JS widget to be reinitialised, or additional CSS to be loaded, depending on your own frontend set-up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So even though the functionality is very nice and is very good UX for our end users it introduces a serious issue with the frontend frameworks like React. Let me explain:&lt;/p&gt;
&lt;p&gt;Let’s say you have a simple React application that looks something like this:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;jsx&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;import React, {Component} from &amp;#39;react&amp;#39;;
import ReactDOM from &amp;#39;react-dom&amp;#39;;


class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: null
    }
  }


  componentDidMount() {
    // do a fetch to the API resources and set the data in the state
    this.setState({data: data })

  }

  render() {
    return(
      &amp;lt;div className=&amp;quot;container&amp;quot;&amp;gt;
      { this.state.data &amp;amp;&amp;amp;  this.state.data.map((element, key) =&amp;gt; (
          &amp;lt;span key={key}&amp;gt;{element}&amp;lt;/span&amp;gt;
      ))}
      &amp;lt;/div&amp;gt;
    )

  }
}

ReactDOM.render(&amp;lt;App/&amp;gt;, document.getElementByID(&amp;quot;root&amp;quot;))&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This used to work perfectly with the old djangoCMS since everytime you edit a content, there would be a reload and because of that the &lt;code&gt;componentDidMount()&lt;/code&gt; will be called and hence there would be an API call and the React app would be rendered.&lt;/p&gt;
&lt;p&gt;However, due to the change in the way frontend editing works now, this is no longer the case by default and it cause strange behaviour to occur.&lt;/p&gt;
&lt;p&gt;For eg: You filled up the djangoCMS plugin that implemented this React Plugin and it is rendered properly. Now, you wanted to do change in other plugin like Text Plugin. So as a result, as soon as you submit save button for the text plugin after doing the change, the CMS javascript sends a request for the server rendered HTML and replace it in place for the page. The problem here is that there was no page reload, so the react app was never triggered and mounted, so you properly working filled up React app just vanishes from the site.&lt;/p&gt;
&lt;p&gt;In case if it’s not clear, the reason for this is: &lt;strong&gt;React needs to mount the component to do the API request&lt;/strong&gt;. Since, the HTML was hot swapped, it never for the opportunity to do so and hence the React plugin gets empty after the edit.&lt;/p&gt;
&lt;p&gt;Now, the good folks at djangoCMS are kind enough to make a note of it in their documentation but somehow I missed it before while reading the release notes for djangoCMS 3.5.x&lt;/p&gt;
&lt;p&gt;This is their suggested solution:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;js&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// catch the cms-content-refresh event and use it
// to trigger actions that are not done due to to Hot SWAP of the HTML
CMS.$(window).on(&amp;#39;cms-content-refresh&amp;#39;, function () {
  // Render React Again?
});&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Now, though this solution gives us the first clue of how to go about fixing it, the code is not just drop-in replacement and won’t work right away in the React and similar apps. You will need to do following to get it working on your React app and similar frameworks.&lt;/p&gt;
&lt;p&gt;Here is a more complete solution to get it done.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;js&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, function() {
  // Handler when the DOM is fully loaded
  window.CMS.$(window).on(&amp;#39;cms-content-refresh&amp;#39;, function () {
    // render react or call for actions that were skipped because of the
    // change in how djangoCMS behaves now.
  });
});&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;So if you look at the above piece of code, notice that I used plain JS to look for &lt;code&gt;document.ready&lt;/code&gt; event of jQuery, since in most the React apps we do not use jQuery and also, it doesn’t make sense to add more files to your App bundle size when you can get away with it.&lt;/p&gt;
&lt;p&gt;The logic to look for “DomContentLoaded” event is that the global variable &lt;code&gt;CMS&lt;/code&gt; won’t be available unless all content is loaded and we require it to watch for the &lt;code&gt;cms-content-refresh&lt;/code&gt; event. So as a solution we &lt;strong&gt;hook up the ReactDOM render method whenever we get catch a refresh event from the CMS.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Following is the updated React App code after accomodating changes for this event handling.&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;jsx&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;import React, {Component} from &amp;#39;react&amp;#39;;
import ReactDOM from &amp;#39;react-dom&amp;#39;;


class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: null
    }
  }


  componentDidMount() {
    // do a fetch to the API resources and set the data in the state
    this.setState({data: data })

  }

  render() {
    return(
      &amp;lt;div className=&amp;quot;container&amp;quot;&amp;gt;
      { this.state.data &amp;amp;&amp;amp;  this.state.data.map((element, key) =&amp;gt; (
          &amp;lt;span key={key}&amp;gt;{element}&amp;lt;/span&amp;gt;
      ))}
      &amp;lt;/div&amp;gt;
    )

  }
}

ReactDOM.render(&amp;lt;App/&amp;gt;, document.getElementByID(&amp;quot;root&amp;quot;))


document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, function() {
  // Handler when the DOM is fully loaded
  if (window.CMS !== undefined) {
    window.CMS.$(window).on(&amp;#39;cms-content-refresh&amp;#39;, function () {
      // render react or call for actions that were skipped because of the
      // change in how djangoCMS behaves now.
      ReactDOM.render(&amp;lt;App/&amp;gt;, document.getElementByID(&amp;quot;root&amp;quot;))
    });
  }
});
&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Now, you can just compile your React app and change the files in your template for djangoCMS app and it would not have disappearing content during frontend editing.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Integrating React with Django CMS: Solving Content Refresh Challenges]]></title><description><![CDATA[React is one of the most useful frontend libraries out there. At Socialschools, we use React to render some content using our API from App…]]></description><link>https://vinitkumar.me/react-with-django-cms/</link><guid isPermaLink="false">https://vinitkumar.me/react-with-django-cms/</guid><pubDate>Thu, 24 May 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;React is one of the most useful frontend libraries out there. At Socialschools, we use React to render some content using our API from App server. It has been in production since June last year and it is really amazing building neat stuff using both React and djangoCMS. djangoCMS provides us the best hybrid experience possible, we render say 70% of the content from server rendered pages and it provides us good support for even running React et al. without any hiccups.&lt;/p&gt;
&lt;p&gt;The latest version of djangoCMS 3.5.x series came up with a neat feature that allows the content to be refreshed as you edit without need of a reload. This is from the &lt;a href=&quot;https://docs.django-cms.org/en/latest/topics/frontend-integration.html&quot;&gt;djangoCMS documentation&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Generally speaking, Django CMS is wholly frontend-agnostic. It doesn’t care what your site’s frontend is built on or uses.&lt;/p&gt;
&lt;p&gt;The exception to this is when editing your site, as the Django CMS toolbar and editing controls use their own frontend code, and this can sometimes affect or be affected by your site’s code.&lt;/p&gt;
&lt;p&gt;The content reloading introduced in Django CMS 3.5 for plugin operations (when moving/adding/deleting etc) pull markup changes from the server. This may require a JS widget to be reinitialised, or additional CSS to be loaded, depending on your own frontend set-up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So even though the functionality is very nice and is very good UX for our end users it introduces a serious issue with the frontend frameworks like React. Let me explain:&lt;/p&gt;
&lt;p&gt;Let’s say you have a simple React application that looks something like this:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;jsx&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;import React, { Component } from &amp;#39;react&amp;#39;;
import ReactDOM from &amp;#39;react-dom&amp;#39;;

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            data: null
        }
    }

    componentDidMount() {
        // do a fetch to the API resources and set the data in the state
        this.setState({ data: data })
    }

    render() {
        return (
            &amp;lt;div className=&amp;quot;container&amp;quot;&amp;gt;
                {this.state.data &amp;amp;&amp;amp; this.state.data.map((element, key) =&amp;gt; (
                    &amp;lt;span key={key}&amp;gt;{element}&amp;lt;/span&amp;gt;
                ))}
            &amp;lt;/div&amp;gt;
        )
    }
}

ReactDOM.render(&amp;lt;App/&amp;gt;, document.getElementById(&amp;quot;root&amp;quot;))&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This used to work perfectly with the old djangoCMS since everytime you edit a content, there would be a reload and because of that the &lt;code&gt;componentDidMount()&lt;/code&gt; will be called and hence there would be an API call and the React app would be rendered.&lt;/p&gt;
&lt;p&gt;However, due to the change in the way frontend editing works now, this is no longer the case by default and it causes strange behaviour to occur. For example: You filled up the djangoCMS plugin that implemented this React Plugin and it is rendered properly. Now, you wanted to do change in other plugin like Text Plugin. So as a result, as soon as you submit save button for the text plugin after doing the change, the CMS JavaScript sends a request for the server rendered HTML and replaces it in place for the page.&lt;/p&gt;
&lt;p&gt;The problem here is that there was no page reload, so the react app was never triggered and mounted, so your properly working filled up React app just vanishes from the site. In case if it’s not clear, the reason for this is: &lt;strong&gt;React needs to mount the component to do the API request&lt;/strong&gt;. Since the HTML was hot swapped, it never got the opportunity to do so and hence the React plugin gets empty after the edit.&lt;/p&gt;
&lt;p&gt;Now, the good folks at djangoCMS are kind enough to make a note of it in their documentation but somehow I missed it before while reading the release notes for djangoCMS 3.5.x. This is their suggested solution:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;javascript&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;// catch the cms-content-refresh event and use it
// to trigger actions that are not done due to to Hot SWAP of the HTML
CMS.$(window).on(&amp;#39;cms-content-refresh&amp;#39;, function () {
    // Render React Again?
});&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Now, though this solution gives us the first clue of how to go about fixing it, the code is not just drop-in replacement and won’t work right away in the React and similar apps. You will need to do following to get it working on your React app and similar frameworks. Here is a more complete solution to get it done:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;javascript&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, function() {
    // Handler when the DOM is fully loaded
    window.CMS.$(window).on(&amp;#39;cms-content-refresh&amp;#39;, function () {
        // render react or call for actions that were skipped because of the
        // change in how djangoCMS behaves now.
    });
});&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;So if you look at the above piece of code, notice that I used plain JS to look for &lt;code&gt;document.ready&lt;/code&gt; event of jQuery, since in most React apps we do not use jQuery and also, it doesn’t make sense to add more files to your App bundle size when you can get away with it. The logic to look for “DOMContentLoaded” event is that the global variable &lt;code&gt;CMS&lt;/code&gt; won’t be available unless all content is loaded and we require it to watch for the &lt;code&gt;cms-content-refresh&lt;/code&gt; event.&lt;/p&gt;
&lt;p&gt;So as a solution we &lt;strong&gt;hook up the ReactDOM render method whenever we catch a refresh event from the CMS.&lt;/strong&gt; Following is the updated React App code after accommodating changes for this event handling:&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;jsx&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;import React, { Component } from &amp;#39;react&amp;#39;;
import ReactDOM from &amp;#39;react-dom&amp;#39;;

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            data: null
        }
    }

    componentDidMount() {
        // do a fetch to the API resources and set the data in the state
        this.setState({ data: data })
    }

    render() {
        return (
            &amp;lt;div className=&amp;quot;container&amp;quot;&amp;gt;
                {this.state.data &amp;amp;&amp;amp; this.state.data.map((element, key) =&amp;gt; (
                    &amp;lt;span key={key}&amp;gt;{element}&amp;lt;/span&amp;gt;
                ))}
            &amp;lt;/div&amp;gt;
        )
    }
}

ReactDOM.render(&amp;lt;App/&amp;gt;, document.getElementById(&amp;quot;root&amp;quot;))

document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, function() {
    // Handler when the DOM is fully loaded
    if (window.CMS !== undefined) {
        window.CMS.$(window).on(&amp;#39;cms-content-refresh&amp;#39;, function () {
            // render react or call for actions that were skipped because of the
            // change in how djangoCMS behaves now.
            ReactDOM.render(&amp;lt;App/&amp;gt;, document.getElementById(&amp;quot;root&amp;quot;))
        });
    }
});&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Now, you can just compile your React app and change the files in your template for djangoCMS app and it would not have disappearing content during frontend editing.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Important Values]]></title><description><![CDATA[As humans, I think it is pretty important that we sometimes look deep into the soul and see what defines us
and what is the value-system we…]]></description><link>https://vinitkumar.me/value-system/</link><guid isPermaLink="false">https://vinitkumar.me/value-system/</guid><pubDate>Sat, 19 May 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As humans, I think it is pretty important that we sometimes look deep into the soul and see what defines us
and what is the value-system we believe in. Here are values I believe in. Remember this is not an all exhaustive list and I might update it later. - Spread love, not hate. - Empathy is a very important quality. - Do not engage in useless arguments, name calling, trolling. - Life is too short to stay angry on anyone or anything for too long. - Be punctual and respect other’s time as well. - Do not reply in haste, especially when you are angry. - Be easy on yourself. - Life is one of the greatest gifts, value it, cherish it. - Smile often, care about those around you. - Never leave an opportunity for a random act of kindness. - Surround yourself with what you love and block all negativity that bothers you.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Four years of Full time job]]></title><description><![CDATA[So on 1st February 2017, I completed my fourth year working for Socialschools. Today I complete my 4th year at my full time job. Thankful to…]]></description><link>https://vinitkumar.me/four-years-of-full-time-job/</link><guid isPermaLink="false">https://vinitkumar.me/four-years-of-full-time-job/</guid><pubDate>Wed, 01 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So on 1st February 2017, I completed my fourth year working for Socialschools. &lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Today I complete my 4th year at my full time job. Thankful to everyone I worked with. cc: &lt;a href=&quot;https://twitter. com/stolker&quot;&gt;@stolker&lt;/a&gt; &lt;a href=&quot;https://twitter. com/changer&quot;&gt;@changer&lt;/a&gt; &lt;a href=&quot;https://twitter. com/SocialSchools&quot;&gt;@SocialSchools&lt;/a&gt;&lt;/p&gt;— Vinit Kumar (@vinitkme) &lt;a href=&quot;https://twitter. com/vinitkme/status/826694838456303616&quot;&gt;February 1, 2017&lt;/a&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;script async src=&quot;//platform. twitter. com/widgets. JS&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt; I joined Socialschools(then Changer) at the same date in 2013. It&apos;s has been quite an honor working with many awesome people.
&lt;p&gt;Then, I was only a fresh graduate dreaming of making a dent in the universe. Today, I am writing code for one of the fastest
growing Communication platform for Education in The Netherlands. First, I would like to thank Ruben, Jonathan, and Jos for giving me the chance to work at Changer. Next, the four years at Socialschools would have never been possible without my colleagues. I worked with Robert for most of the time during this journey. He has always been the most friendly person and shares the same passion and fire to do amazing work for Socialschools. Aashish has been a great mentor, friend, and guide and we have spent countless hours building new features, fixing nasty bugs and coffee. Bert has been a great part of Socialschools and has been a driving force is growing us to the next level. Marieke has been pretty amazing at implementation and putting users interest and perspective in the product. I And of course, Jos has been an amazing mentor and technical guide in my growth as an Engineer. The newer team members like Edwin, Harry, Shanice &amp;#x26; Trui have been great too and are doing a great job in their field. I would also like to thanks to my Ma, Moma, Papa, Baba, Jhunu and especially my wife Rituparna who have supported me at each and every step and shared the joys and difficulties together. I wouldn’t be here if it wasn’t for them. I would also like to summarize the core of what I have learned during this four years: - Any work you do, You do it with pride. This is something I learn from Ruben early on in my career. We sometimes run after big achievements and stop enjoying small jobs that are always there. Never shy away from work, however small and do it with utmost pride. Even a small CSS change that brings joy to your customer is worth it and you should be happy to do it.
Thanks, Ruben:) - Think of users perspective and build for your users and use what you build. - Writing clean, maintainable, testable code requires thinking and it is a very good investment. - You need to have passion and vision when building a product. It will have its lows too and you need someone to motivate, innovate and think out of the box for the product. - You need to be pragmatic while writing code and it’s not only the quantity of code that matters but what you deliver as a product is what really matters. - Enjoy what you do and do what you enjoy!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Some New Learnings]]></title><description><![CDATA[Software Engineering comes with a lot of good learning opportunities. First you learn how to write something by reading tutorials, watching…]]></description><link>https://vinitkumar.me/some-new-learnings/</link><guid isPermaLink="false">https://vinitkumar.me/some-new-learnings/</guid><pubDate>Wed, 22 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Software Engineering comes with a lot of good learning opportunities. First you learn how to write something by reading tutorials, watching videos etc. Then down the time you learn some new ways to do the same thing and you are blown by it. But only after some days you actually encounter the real hard problems in Computer Science.&lt;/p&gt;
&lt;p&gt;Some of them are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Race conditions&lt;/li&gt;
&lt;li&gt;Caching&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have had some very nasty experiences with race conditions. But it opened my eyes to a new set of bugs that could be introduced. Your code might work fine 99% of the time but that remaining 1% could only happen under very rare circumstances. I think being aware and looking out for ways where race conditions might occur could be a good way to minimize if not totally prevent race conditions.&lt;/p&gt;
&lt;p&gt;About Caching, it is very important that you understand what you are caching, why you are caching and how exactly your caching is going to work. Just setting up memcached and using a plugin will not help when you encounter a nasty bug caused by caching and you only realize after wasting hours debugging the issue.&lt;/p&gt;
&lt;p&gt;Lately, I have been hacking a lot on new things and writing some Go and Node.js. I mostly do that in my late evenings after dinner and it is good fun. I am thinking of documenting my learning process as I learn these new things in a better way. I think it works best for me.&lt;/p&gt;
&lt;p&gt;I will probably do a 15 or 30 day challenge, pick up a language and learn as much as I could about that language. The goal here is to learn it deeply and clearly.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Open Source]]></title><description><![CDATA[I joined GitHub in 2010 and it has been my primary source for reading and writing code. I took my baby steps doing open source programming…]]></description><link>https://vinitkumar.me/open-source/</link><guid isPermaLink="false">https://vinitkumar.me/open-source/</guid><pubDate>Sun, 03 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I joined GitHub in 2010 and it has been my primary source for reading and writing code. I took my baby steps doing open source programming reading others code and it has been a good source of knowledge for me. Since then I have written quite some open source software. I have written some JavaScript, Python and go code and shared those projects in GitHub. Open Source has quite some good benefits as it gives you a nice place to hack on things that fancy your imagination. But there is certain downside to this as well. Sometimes your primary work(paid job) takes up all the time and you don’t have any time and energy left to spend on side projects. This is something that has happened to me since last 1.5-2 years. I have tackled very nice hard and challenging problems at work. I worked on complex scaling issues, performance tuning and lots of new features that really added value to the product. But I hardly found any time for myself. I have struggled for properly managing my time and it makes me a bit sad. But these days, I am writing some amount of code regularly. I hope to write some more open source code in the coming time.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Why I Write Code]]></title><description><![CDATA[I think I was hardly 10 years old when I wrote my first line of code. It was probably some IBM PC and the language was LOGO. It was so much…]]></description><link>https://vinitkumar.me/why-i-write-code/</link><guid isPermaLink="false">https://vinitkumar.me/why-i-write-code/</guid><pubDate>Thu, 06 Aug 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I think I was hardly 10 years old when I wrote my first line of code. It was probably some IBM PC and the language was LOGO. It was so much fun. Next, It was GW Basic, then Java and then C/C++/Python. I have been writing code professionally for 5 years now and I still enjoy writing code. I enjoy solving tough problems with code. It gives such a great high when I solve something that seems very difficult at the moment. Last year has been very hectic and I haven’t given much time on writing code on things I enjoy personally the most(side projects). Well, I am still figuring out my dreams at the moment but very soon I will have a clear idea of how and what I want to become in future. But there is one thing that is sure, I would change the world for better than how I found it.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GPS Tracking on Android]]></title><description><![CDATA[Like everybody else, I have an Android phone too. If you are a developer you must have noticed a file called as GPS. LOG. It is the one file…]]></description><link>https://vinitkumar.me/being-tracked-on-android/</link><guid isPermaLink="false">https://vinitkumar.me/being-tracked-on-android/</guid><pubDate>Thu, 16 Apr 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Like everybody else, I have an Android phone too. If you are a developer you must have noticed a file called as GPS. LOG. It is the one file which has all your GPS logs in it. This weekend I spend couple of hours hacking with it. He is the outcome. ## How you get tracked First of all, connect your Android device to your computer and copy the gps. log file into your desktop: ```sh
cp /Volumes/NO\ NAME/GPS. LOG ~/projects/gps. log&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;Now,we need to find the good data that contain gps coordinates:&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;```sh
cat ~/projects/gps. log | grep &amp;#39;position&amp;#39; &amp;gt; ~/cleangps. log
``` The cleangps. log file contains only data that has coordinates on it. Now, create a log file that only contains coordinates: ```sh
cat ~/cleangps. log | awk &amp;#39;{print $3, $4}&amp;#39; &amp;gt; ~/gpscord. log
# notice the new file is nothing but values seperated by commas, hence write them as csv
cat ~/gpscord. log &amp;gt; ~/gps. csv&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;This csv file is the basis we use to find that location the GPS log was taken. Prepare virtualenv and install googlemaps: &lt;code&gt;sh mkvirtualenv maps pip install -U googlemaps &lt;/code&gt; Also, follow the clear instructions at &lt;a href=&quot;https://GitHub&quot;&gt;https://GitHub&lt;/a&gt;. com/googlemaps/google-maps-services-Python#API-keys to find your API key. Here is the Python file &lt;code&gt;track. py&lt;/code&gt; that would find what these coordinate means and how they related to your daily life and place you are frequent to. &lt;code&gt;Python #! /usr/bin/Python import googlemaps import csv gmaps_client = googlemaps. Client(key=&apos;&amp;#x3C;Your Server Key Here&gt;&apos;) with open(&apos;~/gps. csv&apos;) as csvfile: gps = csv. reader(csvfile, delimiter=&apos;,&apos;) for row in gps: lat = float(row[0]) longit = float(row[1]) reverse_geocode_result = gmaps_client. reverse_geocode((lat, longit)) formatted_address = reverse_geocode_result[0][&apos;formatted_address&apos;] print row[0], row[1], formatted_address print &quot;=&quot; * 150 &lt;/code&gt; Run this file in your terminal by and check out the output, you will get freaked out for some moment. ```
Python track. py&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;</content:encoded></item><item><title><![CDATA[Advanced Mac Storage Cleanup: Command Line Guide for Power Users]]></title><description><![CDATA[screenshot Sometimes, your Mac is filled up with files and you can’t seem to
understand what really is taking much space. Here is how you…]]></description><link>https://vinitkumar.me/clean-up-mac-from-other-files/</link><guid isPermaLink="false">https://vinitkumar.me/clean-up-mac-from-other-files/</guid><pubDate>Thu, 16 Apr 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cldup.com/-iOX0p9Ob8-3000x3000.png&quot; alt=&quot;screenshot&quot;&gt; Sometimes, your Mac is filled up with files and you can’t seem to
understand what really is taking much space. Here is how you can find out. - First of all find disk usage and save it to a log file. Also, find all
big files that are there. Grepping using ‘G’ would find all files that are in
GB. Also, save the second list to another file so that we are only doing it once. &lt;code&gt;sh du -h &gt; ~/space. log cat ~/space. log | awk &apos;{print $1}&apos; | grep &apos;G&apos; &gt; ~/highspace. log &lt;/code&gt; Next, open a split window and do &lt;code&gt;sh cat ~/highspace. log &lt;/code&gt; And Now, start finding the ones which are big one by one. Let’s say one of the entry was 5.6G, Let’s find which one was it. ```sh cat ~/space. log | fgrep -f highspace. log #It will give something like this: 1.2G./.Android/avd/Nexus_6_API_21.avd
2.7G./.Android/avd
2.7G./.Android&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;Now,if you feel the file is not needed and you want to delete it. Do the&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;following: ```sh
sudo rm -rf Documents/Movie. avi
``` Voila! Repeat this process and remove all files and directories that you no
longer need. # Disclaimer: Do it very patiently and backup everything that&amp;#39;s important. This guide is for
very advanced users and you should only do it if you know what you are doing.
I am not responsible for any data loss. Do it at your own risk.&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;</content:encoded></item><item><title><![CDATA[How it went?]]></title><description><![CDATA[Hello People! It has indeed been very long since I last wrote a blog post. It sure feels good to start it again. Firstly, if you
enjoy my…]]></description><link>https://vinitkumar.me/on-current-times/</link><guid isPermaLink="false">https://vinitkumar.me/on-current-times/</guid><pubDate>Wed, 11 Mar 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello People! It has indeed been very long since I last wrote a blog post. It sure feels good to start it again. Firstly, if you
enjoy my writing, I am sorry for this big gap. I was very busy in writing code at my work. Here are some important updates about what happened: - I got married! Yay:) I got married in December with my lovely girlfriend. It has been pretty amazing last three months
with her. - I wrote various features for my product and there are more than 20k users using those features right now and the feedback
has been quite good actually. - I write less code these days and spend more time thinking. I think it is better this way. I felt burnout with my previous lifestyle. Now,
I wait to write code every morning. - I feel less annoyed with stupidity around me and have a better coping mechanism. I have decided to be more consistent with my reading habits. I hope to be more sincere this time.
That’s it for now. Will write another post soon.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Developer's Guide to Time Management: An 8-Hour Workday Breakdown]]></title><description><![CDATA[Time management is a key quality of any successful person. I have been working
pretty hard these days to improve me efficiency. Today, I…]]></description><link>https://vinitkumar.me/better-time-management-at-work/</link><guid isPermaLink="false">https://vinitkumar.me/better-time-management-at-work/</guid><pubDate>Sat, 16 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Time management is a key quality of any successful person. I have been working
pretty hard these days to improve me efficiency. Today, I have decided to
follow this pattern while at work. Here is the breakdown. Let’s assume the net hour spent at work is 8. - 50% Time (4 hrs) - Writing Code. - 5% Time (24 min) - documentation of the Code I wrote. - 5% time (24 min) - Writing test on the Code I wrote. - 10% time (48 min) - QA and testing the work I produced. - 20% time (96 min) - Planning and Studying about the topic I need to work on. - 5% Time (24 mins) - Working with colleagues and helping out in case they need
any assistance. I felt the need to this timetable because it is really necessary to control
the time when you are on tight deadlines. I like giving my all to the work and
definitely have very limited time to execute that. So only if my planning and
time management is solid I would be able to produce quality work on time. I will produce a analysis of how this goes and how much success I achieve using
this methodology. Also, today I have completed my 41 day streak at GitHub.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[7 Essential Practices for Writing Better Code: A Developer's Journey]]></title><description><![CDATA[Whether you are working for a big software company or a small sized startup, writing good code is pretty much critical to your success. But…]]></description><link>https://vinitkumar.me/on-writing-good-code/</link><guid isPermaLink="false">https://vinitkumar.me/on-writing-good-code/</guid><pubDate>Sun, 20 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Whether you are working for a big software company or a small sized startup, writing good code is pretty much critical to your success. But the catch is it is not very easy to achieve without proper motivation from your side. I have been coding professionally for almost 4 years now. First two years were as a freelancer and I mostly followed Get Things Done mode during that time. It was okay then because it was mostly a one-time gig and once done, you didn’t have to do anything with it. Though I never wrote really bad code even at that time, the amount of maturity and knowledge required to write code that is maintainable, DRY, and well-documented was clearly not there. While I joined my first company back in 2013, I really struggled against my bad habits. I was able to solve tough technical problems as problem solving is always close to my heart but there were serious issues with my code quality. Sometimes there was some indentation issue and something there were some code repetition. I was lucky to have my Mentor “Ruben” to closely look at my code and review it sharply and give his most honest feedback. Upon pondering about the review I realized most of the issues were coming because a certain amount of thinking and carefulness that was missing from my workflow. I didn’t had my editor configured properly. Mix of tabs and spaces will obviously come back to bite you and code will look ugly on browser even though it looked fine on your editor. (Sublime Text, I am looking at you). Now, after almost an year later I am a improved and mature programmer than what I was at this point of time last year. So what changed? Here is a short summary of things I did in order to get better at writing code: - I started reading classic books on programming. Understanding programming and computer science is pretty much vital to your growth as a software developer. Dreaming about making big in this field without having solid basics is a fools errand. - Read a lot of good code. Discuss about it, blog about it and finally incorporate those into your own code. This is pretty much most important to improve the code you are writing. I started reading a lot of good code, on an average of 1 hour daily. With loads of Open Source projects available on GitHub and bitbucket it is pretty easy to do so. - Follow strict mode in almost every language your code on. Use Pep-8, JSHINT, CSSLint, Grunt. This might be painful at beginning but it would cover a lot of ground that you might not know as you are not an experienced developer. - Learn and use Travis CI and Jenkins system that would automate a lot of these things in your code. - Write a lot of code and open source it. Also, contribute to a good number of OSS projects. I have done a lot of this in the past year and believe me it has really helped in improving. - Read the f**king documentation - This is kind of most important if you want to really use the power the language or the framework provides. Otherwise, you will keep writing shitty code because you were never aware better way exists. - Use version control- Version control gives you an opportunity to look at your code before committing. Use this powerful feature. Always review your code before your commit. Always review a pull request and merge.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Implementing Read-Only Access in Django Admin: A Complete Guide]]></title><description><![CDATA[Last week, I came across an interesting problem at work. The problem was: > To get read only users in a Django based application. But doing…]]></description><link>https://vinitkumar.me/get-readonly-mode-in-django/</link><guid isPermaLink="false">https://vinitkumar.me/get-readonly-mode-in-django/</guid><pubDate>Sun, 18 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week, I came across an interesting problem at work. The problem was: &gt; To get read only users in a Django based application. But doing so was not very simple because there is no read only mode for users
in Django. In order to solve this, I first started reading answers on stack
overflow. Some of those links did pointed me to a correct route. Here, I will
document the whole process so that it could help others and serve as a reminder
for me as well. First of all, the whole system of authentication in any system originates from
permissions. The basis permissions are. Read, Write, Execute. in Unix (chmod is
used to set permissions). Django has a cool way of adding the permissions in the meta class. Let’s say we
have a model class named Cars. ```Python
class Cars(model. Model): name = models. Charfield() year = models. DateField() class Meta: permissions = ( (‘readonly’, ‘Can Read Only Cars’) )&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;Justlike this, Any permission could be added to the Model. Now in order to get&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;these permissions in the database. You need to run syncdb management command. ```sh
Python manage. py syncdb --all
``` So this just sets the background in place. The real job is getting this
permissions to work. Now, I began to wonder what all things were required to develop this complete
functionality? The first thing that came to my mind naturally was to override templates and
hack ground admin. py. So, I created a new class in Admin. py that was inherited from the admin class
I was earlier using: ```Python
from model import Cars class CarAdmin(admin. ModelAdmin): date_hierarchy = &amp;#39;date&amp;#39; list_filter = (&amp;#39;status&amp;#39;, &amp;#39;event_instance&amp;#39;,) actions = [&amp;#39;accept&amp;#39;, &amp;#39;reject&amp;#39;, &amp;#39;pending&amp;#39;] class ReadonlyCarAdmin(CarAdmin): def __init__(self, model, admin_site): super(ReadonlyCarAdmin, self).__init__(model, admin_site) self. model = model def has_delete_permission(self, request, obj=None): if request. user. has_perm(&amp;#39;car. readonly&amp;#39;) and not request. user. is_superuser: return False else: return True def has_add_permission(self, request, obj=None): if request. user. has_perm(&amp;#39;car. readonly&amp;#39;) and not request. user. is_superuser: return False else: return True def has_change_permission(self, request, obj=None): if request. user. is_superuser: self. readonly_fields = () # make sure to remove caching. return True elif request. user. has_perm(&amp;#39;car. readonly&amp;#39;): # make the fields readonly for only users with readonly permissions. self. readonly_fields = [field. name for field in filter(lambda f: not f. auto_created, self. model._meta. fields)] return True else: return False def get_actions(self, request): actions = super(ReadOnlyCarAdmin, self).get_actions(request) if request. user. has_perm(&amp;#39;car. readonly&amp;#39;) and not request. user. is_superuser: # This ensures that that user doesn&amp;#39;t not have any actions if &amp;#39;delete_selected&amp;#39; in actions: del actions[&amp;#39;delete_selected&amp;#39;] del actions[&amp;#39;accept&amp;#39;] del actions[&amp;#39;reject&amp;#39;] del actions[&amp;#39;pending&amp;#39;] return actions else: return actions admin_site. register(Car, ReadonlyCarAdmin)
``` Okay, so now we have a robust system in place to ensure whichever user has
readonly permission on Cars Model would only be able to see the model data in
Readonly mode. But this is not it. Here is the part where templates are overridden. First of all save and cancel button on buttom needs to go as we don&amp;#39;t need
them. For that, create a new template in templates folder. The templates name is ` change_form. HTML`.
Hence the full pathname is ` carapp/templates/admin/change_form. HTML`. Copy the content from the default Django template (/admin/change_form. HTML) in Django project
add replace this content with this gist: &amp;lt;script src=&amp;quot;https://gist. GitHub. com/vinitkumar/48a9cd0c2e35e033659c. JS&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; This will ensure that the selected user with this readonly only permissions won&amp;#39;t be able
get the submit button on his admin page. Now, you have a fully functioning Django Admin with readonly mode. The main effort was to make it
very easy to use and ensure that this feature could run across future versions. Hope this post help anyone else who has to implement something similar. &lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;</content:encoded></item><item><title><![CDATA[Complete Guide to Emacs: Setting Up a Modern Development Environment]]></title><description><![CDATA[I always wanted to use Emacs. Yesterday, I wanted to have a good JavaScript/Node REPL in my editor. Though I had always used Vim for the…]]></description><link>https://vinitkumar.me/setting-up-emacs-for-development/</link><guid isPermaLink="false">https://vinitkumar.me/setting-up-emacs-for-development/</guid><pubDate>Sun, 04 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I always wanted to use Emacs. Yesterday, I wanted to have a good JavaScript/Node REPL in my editor. Though I had always used Vim for the last 5 years, setting up a REPL in Vim is not very easy. So I decided to give Emacs a try, and so far I am enjoying using Emacs.&lt;/p&gt;
&lt;p&gt;Here is a guide that would help you set up Emacs.&lt;/p&gt;
&lt;p&gt;First of all, if you are on Mac, install Emacs for OSX from &lt;a href=&quot;http://emacsformacosx.com/&quot;&gt;here&lt;/a&gt;. You could easily install the GUI version of Emacs for other platforms too.&lt;/p&gt;
&lt;h1&gt;My Emacs Config&lt;/h1&gt;
&lt;p&gt;This is my Emacs config which can be used for development in the following technologies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ruby / Ruby on Rails&lt;/li&gt;
&lt;li&gt;CSS / LESS / SASS / SCSS&lt;/li&gt;
&lt;li&gt;HAML / Markdown / Textile / ERB&lt;/li&gt;
&lt;li&gt;Clojure (via nrepl)&lt;/li&gt;
&lt;li&gt;JavaScript / CoffeeScript&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;Haskell&lt;/li&gt;
&lt;li&gt;Erlang&lt;/li&gt;
&lt;li&gt;Common Lisp (with Slime)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In particular, there’s a nice config for &lt;em&gt;tab autocompletion&lt;/em&gt;, and
flycheck is used to immediately highlight syntax errors in Ruby, HAML,
Python, JavaScript, PHP, and a number of other languages.&lt;/p&gt;
&lt;h2&gt;Demo&lt;/h2&gt;
&lt;p&gt;This is my Emacs live in action:&lt;/p&gt;
&lt;img src=&quot;https://i.cloudup.com/WbWR5pblgM.gif&quot;&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Emacs 23 or greater (note that Emacs 24 is required for some
functionality, and will likely become the minimum required version
some time soon.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install, clone this repo to &lt;code&gt;~/.emacs.d&lt;/code&gt;, i.e., ensure that the
&lt;code&gt;init.el&lt;/code&gt; contained in this repo ends up at &lt;code&gt;~/.emacs.d/init.el&lt;/code&gt;:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;git clone https://github.com/vinitkumar/.emacs.d.git ~/.emacs.d&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;p&gt;Upon starting up Emacs for the first time, further third-party
packages will be automatically downloaded and installed.&lt;/p&gt;
&lt;h2&gt;Adding Your Own Customization&lt;/h2&gt;
&lt;p&gt;To add your own customization, use &lt;kbd&gt;M-x customize&lt;/kbd&gt; and/or
create a file &lt;code&gt;~/.emacs.d/lisp/init-local.el&lt;/code&gt; which looks like this:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;... your code here ...

(provide &amp;#39;init-local)&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;
&lt;h2&gt;Tips for Using These Emacs Settings&lt;/h2&gt;
&lt;p&gt;If you want to use my settings straight out of the box, here are some things to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I recommend starting with a blank Emacs +
&lt;a href=&quot;https://github.com/technomancy/better-defaults&quot;&gt;Technomancy’s better-defaults package&lt;/a&gt;,
and then dig through this repo for useful nuggets, instead of forking it directly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The key bindings are optimized for a Norwegian keyboard layout.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start by reading up on all the cool stuff in key-bindings.el.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You quit Emacs with &lt;code&gt;C-x r q&lt;/code&gt;, mnemonic &lt;em&gt;Really Quit&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find file in project with &lt;code&gt;C-x o&lt;/code&gt;, in dir with &lt;code&gt;C-x C-f&lt;/code&gt;, recent with &lt;code&gt;C-x f&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your user- and project-specific stuff in .emacs.d/users/[machine name]/*.el&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;C-h&lt;/code&gt; is rebound to backspace, like in the shell. Get help on &lt;code&gt;F1&lt;/code&gt; instead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Autocomplete with &lt;code&gt;C-.&lt;/code&gt; (autocomplete entire lines with &lt;code&gt;C-:&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;expand-region is your friend. Find its bound key by doing &lt;code&gt;F1 f er/expand-region&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Undo with &lt;code&gt;C-_&lt;/code&gt; and redo with &lt;code&gt;M-_&lt;/code&gt;. Watch the undo-tree with &lt;code&gt;C-x u&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quickly jump anywhere in the buffer with &lt;code&gt;C-ø&lt;/code&gt; then the starting letter of a word.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Indent and clean up white space in the entire buffer with &lt;code&gt;C-c n&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On a Mac, the Meta key &lt;code&gt;M&lt;/code&gt; is bound to Command.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I recommend rebinding Caps Lock to Ctrl and use that instead of the often badly placed Ctrl key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watch &lt;a href=&quot;http://emacsrocks.com&quot;&gt;emacsrocks.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Survival Guide for the First Week of Emacs&lt;/h2&gt;
&lt;p&gt;When you start using Emacs for the first time, your habits fight you every inch
of the way. Your fingers long for the good old familiar keybindings. Here’s an
overview of the most commonly used shortcuts to get you through this pain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;C      &lt;/code&gt; Shorthand for the Ctrl key&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M      &lt;/code&gt; Shorthand for the Meta key (bound to Cmd on my Mac settings)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;S      &lt;/code&gt; Shorthand for the Shift key&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Files&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;C-x C-f&lt;/code&gt; Open a file. Starts in the current directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x f  &lt;/code&gt; Open a recently visited file&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x o  &lt;/code&gt; Open a file in the current project (based on .git ++)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x C-s&lt;/code&gt; Save this file&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x C-w&lt;/code&gt; Save as …&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x C-j&lt;/code&gt; Jump to this file’s current directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x b  &lt;/code&gt; Switch to another open file (buffer)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x C-b&lt;/code&gt; List all open files (buffers)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cut, Copy, and Paste&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;C-space&lt;/code&gt; Start marking stuff. C-g to cancel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-w    &lt;/code&gt; Cut (aka kill)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-k    &lt;/code&gt; Cut till end of line&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-w    &lt;/code&gt; Copy&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-y    &lt;/code&gt; Paste (aka yank)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-y    &lt;/code&gt; Cycle last paste through previous kills&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x C-y&lt;/code&gt; Choose what to paste from previous kills&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-@    &lt;/code&gt; Mark stuff quickly. Press multiple times&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;General&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;C-g    &lt;/code&gt; Quit out of whatever mess you’ve gotten yourself into&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-x    &lt;/code&gt; Run a command by name&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-.    &lt;/code&gt; Autocomplete&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-_    &lt;/code&gt; Undo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-_    &lt;/code&gt; Redo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x u  &lt;/code&gt; Show the undo-tree&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x m  &lt;/code&gt; Open magit. It’s a magical git interface for Emacs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Navigation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;C-arrow&lt;/code&gt; Move past words/paragraphs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-a    &lt;/code&gt; Go to start of line&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-e    &lt;/code&gt; Go to end of line&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-g M-g&lt;/code&gt; Go to line number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x C-i&lt;/code&gt; Go to symbol&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-s    &lt;/code&gt; Search forward. Press &lt;code&gt;C-s&lt;/code&gt; again to go further.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-r    &lt;/code&gt; Search backward. Press &lt;code&gt;C-r&lt;/code&gt; again to go further.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Window Management&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;C-x 0  &lt;/code&gt; Close this window&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x 1  &lt;/code&gt; Close other windows&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x 2  &lt;/code&gt; Split window horizontally&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x 3  &lt;/code&gt; Split window vertically&lt;/li&gt;
&lt;li&gt;&lt;code&gt;S-arrow&lt;/code&gt; Jump to window to the left/right/up/down&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Help&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;F1 t   &lt;/code&gt; Basic tutorial&lt;/li&gt;
&lt;li&gt;&lt;code&gt;F1 k   &lt;/code&gt; Help for a keybinding&lt;/li&gt;
&lt;li&gt;&lt;code&gt;F1 r   &lt;/code&gt; Emacs’ extensive documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Credits &amp;#x26; Inspiration&lt;/h2&gt;
&lt;p&gt;This config is totally based on this &lt;a href=&quot;https://github.com/purcell/emacs.d.git&quot;&gt;repo&lt;/a&gt; by &lt;a href=&quot;https://github.com/purcell&quot;&gt;Mr. Steve Purcell&lt;/a&gt;. But this might diverge with time and my personal taste.&lt;/p&gt;
&lt;p&gt;The Survival guide has been taken from the .emacs.d project of &lt;a href=&quot;https://github.com/magnars&quot;&gt;Mr. Magnar Sveen&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Be Awesome]]></title><description><![CDATA[I write a lot about technical jargon even on my personal blog. For a change, this post is nowhere close to it. As time passes by my thinking…]]></description><link>https://vinitkumar.me/be-awesome/</link><guid isPermaLink="false">https://vinitkumar.me/be-awesome/</guid><pubDate>Thu, 27 Mar 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I write a lot about technical jargon even on my personal blog. For a change, this post is nowhere close to it. As time passes by my thinking and maturity level has improved. I am able to see things that were invisible to me before. I have learned to control my anger and frustration over things I should not have been upset about in the first place. Control over our actions and anger is important. These two things are very easy to loose but
with practise these can become your strength. These days I have realized the worth of good health and fit body. Since the day, I started going to gym I could really
feel the difference in my energy level and awareness. Software development is a really hard profession. There are numerous possibility of getting burnout. After working for three direct months from October, somewhere around January it hit me hard. I was shying away form hard issues, felt tired very soon. Then I realized that all I did in past three months is just code, code and code.
Nothing else at all. Even on weekends I was busy with my personal projects. It gives a kick when you immerse yourself in programming.
But if you ignore your body and mental health. It will come to bite you. Since then I started paying more attention to my health and hence started making full use of my Gym Membership. Another thing
that I am trying to work on these days is to work only 9-5 on normal days. It might sound strange but if I want to maintain a healthy
work life balance, this is a must. Wake up early, commute to office, give solid 8 hours of disciplined work, come back up home, relax, go to gym, watch some TV. These are simple things, but with Good impact.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[One Year at Job]]></title><description><![CDATA[I joined Changer on Feb 2013. Today I completed my first year at full time employment. It has been nothing but amazing. As I get to…]]></description><link>https://vinitkumar.me/one-year-on-job/</link><guid isPermaLink="false">https://vinitkumar.me/one-year-on-job/</guid><pubDate>Sat, 08 Feb 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I joined Changer on Feb 2013. Today I completed my first year at full time employment. It has been nothing but amazing. As I get to understand, first year is the toughest. It is hard to adjust working with people, communicating properly and keeping your mind sane
in lows and highs. I am very proud of the hard work I put in my projects. I did some mistakes, improved a lot as a person and a programmer. I am totally committed to try harder and do things right in the first time. Last but not the least, I would like to thank my parents, my girlfriend and my colleagues for being super supportive and nice during this time. I promise, I will make everyone very proud soon.:):satisfied: @vinitkumar&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Setup Macvim for Maximum awesomeness]]></title><description><![CDATA[I have been using Vim for almost 5 years now. For some time, I even
switched to Sublime text2 but I am finally back home. Well, the…]]></description><link>https://vinitkumar.me/setup-macvim-for-maximum-awesomeness/</link><guid isPermaLink="false">https://vinitkumar.me/setup-macvim-for-maximum-awesomeness/</guid><pubDate>Fri, 03 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have been using Vim for almost 5 years now. For some time, I even
switched to Sublime text2 but I am finally back home. Well, the
following guide is only for macs. Sorry GVIM users!
Here is the latest screenshot of my macvim:![Macvim](/public/img/Vim. png) As you can see, it has a nice Filebrowser that is way more clean and
intuitive than NERDTree. ## installation First and foremost down this build of Macvim from alloy’s fork:
&lt;a href=&quot;https://github.com/alloy/macvim/releases/download/snapshot-71/MacVim-71-20130920.zip&quot;&gt;Macvim&lt;/a&gt;
Unzip it and then put the &lt;code&gt;Macvim. app&lt;/code&gt; into your &lt;code&gt;applications&lt;/code&gt;. Follow these instructions to have the same in your Mac. First of all do this: ```sh
Git clone Git@GitHub. com: vinitkumar/.Vim. Git
git clone &lt;a href=&quot;https://github.com/gmarik/vundle.git&quot;&gt;https://github.com/gmarik/vundle.git&lt;/a&gt; ~/.vim/bundle/vundle
cd. Vim
cp vimrc ~/.vimrc
cp vimrc. before ~/.vimrc. before
cp vimrc. bundles ~/.vimrc. bundles
Vim +BundleInstall +qall&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;Install the peepopen app from here: [Peepopen](http://topfunky. GitHub. io/PeepOpen/).
When installed open peepopen and set MacVim as your default editor. Once you are done with these steps you have a super awesome development
IDE optimised for Python/JS/Ruby development. ##Credits Credit must be given to [@alloy](http://GitHub. com/alloy) and
[@topfunky](http://twitter. com/topfunky) for creating these wonderful
addons to Vim. Happy hacking!&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;</content:encoded></item><item><title><![CDATA[2013 Year In Review]]></title><description><![CDATA[2013 is easily one of the most amazing year of my life. In January I
interviewed for my current company and was offered to join them in Feb…]]></description><link>https://vinitkumar.me/2013-year-in-review/</link><guid isPermaLink="false">https://vinitkumar.me/2013-year-in-review/</guid><pubDate>Wed, 01 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2013 is easily one of the most amazing year of my life. In January I
interviewed for my current company and was offered to join them in Feb
which I did. Well a lot did happen after that. It was my first Full Time
job. I used to freelance as a Web/App Developer before which was fun.
But I didn’t wanted to just sit alone at home and work. So I joined
Changer precisely 11 months and the journey is nothing short of
extraordinary. Well, I did a lot of things first time in my life last year: - Went home on a flight. Had never done it before, It’s an amazing experience. Got my B. E. degree in Civil Engineering in the same trip.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Travelled to Mumbai. Such an amazing and vibrant city. - Owned a MacBook Pro, HTC Android phone, Steelseries Headphones, Dell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;monitor before the year’s end. I am a gadget freak so these things mean
a lot to me.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learnt a lot about Software development process and programming in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;general. Courtesy these amazingly talented people at Office.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bought some classic CS books such as SICP, AOCP. Even reading a couple&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;of chapters gives you so much insight. It is an amazing feeling.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;With all the happy and not so happy moments last year, I have learnt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to appreciate life, time and importance of hard work.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I was always an optimist but now I have matured as hard working person. Well, in the technological field. This year was an amazinging one. I did&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;learnt a lot and grown as a developer. I am a big supporter of OSS
and luckily my company has the same outlook. Here is a small lists of the projects I opened Sourced on GitHub: - Simple - Jekyll theme for hackers. Simple yet very features rich, SEO
friendly, Developer oriented theme. - ldb. JS - Thin wrapper on HTML5 localStorage.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pagination. JS - jQuery Pagination plugin that is used in SocialSchools.&lt;/li&gt;
&lt;li&gt;Node. JS-modular-demo	- A sample demo out of TJ’s video that shows the way&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;of doing modular nodejs development.
angular-team-profile - A nice team profile viewer built on AngularJS. It
uses GitHub’s API as backend. Also, built an Android app for the same
using Phonegap.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node. JS-twitter: A twitter clone written with Node. JS, express and mongodb.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was one of the nice project I did. Looking forward to refactor and
rewrite this app in this month.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;offline-sync: This again helps you to build HTML5 apps with offline&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;sync capability. - cmsplugin-fbalbum: This was my first attempt at writing Django CMS
plugin. This plugin helps you to use Facebook as your media source and
image upload service. So you save your valueable money and time.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;crawler: Rewrote a crawler in Python, that I have written earlier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Much cleaner and maintainable.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;project boilerplate: Nodejs project boilerplate&lt;/li&gt;
&lt;li&gt;todoapp: Todoapp built with angularjs in the beginning of year. - JSON2XML: A very handy, lightweight and efficient module written in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;in Python to convery JSON data to XML. You can check all of them on my GitHub profile.
[@vinitkumar](&lt;a href=&quot;http://GitHub&quot;&gt;http://GitHub&lt;/a&gt;. com/vinitkumar) During the course of their development, collaborated with a lot of
people across the globe and made some nice friendship. In everyway this
year has been a really nice and special one for me and I would thank
every single person for being nice to me.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Simplicity in things]]></title><description><![CDATA[I have always been a great fan of things around me that are simple to use and understand. In fact, each one of us appreciates things when…]]></description><link>https://vinitkumar.me/simplicity-in-things/</link><guid isPermaLink="false">https://vinitkumar.me/simplicity-in-things/</guid><pubDate>Sat, 28 Dec 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have always been a great fan of things around me that are simple to use and understand. In fact, each one of us appreciates things when they are simple. But life isn’t so simple. So what should be done?&lt;/p&gt;
&lt;p&gt;Well, we could reduce a lot of clutter on a personal level that is invading our life.&lt;/p&gt;
&lt;h2&gt;Social Networks and Information Overload&lt;/h2&gt;
&lt;p&gt;These days I am getting upset or even irritated seeing some people posting crap on their social networks. Social networks were a great thing to share knowledge and information, but their overuse has just destroyed their true purpose. Don’t get me wrong, I have nothing against them, just that I don’t appreciate them polluting my life and making it more and more complex.&lt;/p&gt;
&lt;p&gt;I started experiencing these things about a year ago. After using Facebook for almost 5 years (joined in 2007) I finally stopped using it actively and these days mostly use it for work purposes or social compulsion. But I don’t enjoy using them a bit. Not even a bit.&lt;/p&gt;
&lt;h2&gt;Life’s Higher Purpose&lt;/h2&gt;
&lt;p&gt;I feel life has a much higher purpose. We are here to solve problems and create a better life. Not to make it depressing or distasteful. I like meeting my friends in person, having a beer or grabbing some dinner. I don’t just want to keep liking their photos and exuberant display of their life and get bored. Hell no.&lt;/p&gt;
&lt;h2&gt;Technology Should Serve Us&lt;/h2&gt;
&lt;p&gt;I was meditating about the fact that technology is here to serve us and make our life easier. Not that we are meant to be hopeless people taking whatever technology is making us do. It really upsets me seeing that people respond so emotionally to all the PR stunts by different sets of people and do things that any sensible person wouldn’t even think about doing.&lt;/p&gt;
&lt;p&gt;I realize a lot of people from our generation have lost touch with reality and never think deeply about anything. A political party sets up a page on Facebook and everyone goes madly running after them. Why? Because it’s the latest fad to do so? Do most of the people even understand anything about their agenda? Well, mostly they don’t even have a clue.&lt;/p&gt;
&lt;h2&gt;Moving Forward&lt;/h2&gt;
&lt;p&gt;Well, I don’t really have any hope for these people who don’t see these things, but I would be glad if anyone ponders about these things by reading this post.&lt;/p&gt;
&lt;p&gt;Also, I would continue to take measures to stop this information overload and would strive to make my life simple, purposeful and happy to live.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Understanding JavaScript Classes: A Practical Guide to Prototypal Inheritance]]></title><description><![CDATA[Here is an interesting example for Classes in JS. Classes in JS don’t have a class keyword. ```JavaScript
function Range(from, to) { this…]]></description><link>https://vinitkumar.me/classes-in-js/</link><guid isPermaLink="false">https://vinitkumar.me/classes-in-js/</guid><pubDate>Sat, 07 Dec 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here is an interesting example for Classes in JS. Classes in JS don’t have a class keyword. ```JavaScript
function Range(from, to) { this. from = from; this. to = to;
} Range. prototype = { includes: function (x) { return this. from &amp;#x3C;=x &amp;#x26;&amp;#x26; x &amp;#x3C;= this. to; }, foreach: function (f) { for(var x= Math. ceil(this. from); x &amp;#x3C; this. to; x++)f(x); }, toString: function () { return ’(‘+this. from+’.’+this. to+’)’; }
}; var r = new Range(4,20);
r. includes(5);
r. foreach(console. log);
console. log(r);&lt;/p&gt;
&lt;deckgo-highlight-code language=&quot;Itis pretty simple and clean way to create a class&quot; terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;</content:encoded></item><item><title><![CDATA[Buying New Books ]]></title><description><![CDATA[In the span of two days I have ordered three books: - The Art of Computer Programming (Volume 1, 2 and 3) SICP The Art of Readable code…]]></description><link>https://vinitkumar.me/buying-some-new-books/</link><guid isPermaLink="false">https://vinitkumar.me/buying-some-new-books/</guid><pubDate>Tue, 03 Dec 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the span of two days I have ordered three books: - The Art of Computer Programming (Volume 1, 2 and 3)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SICP&lt;/li&gt;
&lt;li&gt;The Art of Readable code These are considered best book in Computer Science and I am waiting eagerly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;to lay my hands on them. I will also need to brush up my mathematics. Well, AOCP is considered the toughest book to understand so my plan is
to keep reading it slowly and steadily. But I would like to complete
TARC and SICP in the coming 6 months. For solving the exercise in SICP, I would use Clojure since it is the
new hotness and runs on JVM. For TARC, I would be using my main
programming language I code at work and work( Python and JavaScript). I hope the coming months to be exciting and informative. It is said that
some decisions impact your life in a great manner and I would like this
to be one of them.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[One Month Hacking]]></title><description><![CDATA[After a lot of reflection on what I have achieved in the last year, I have stumbled upon one fact: I need to hack
a lot more on Python and…]]></description><link>https://vinitkumar.me/one-month-hacking-excercise/</link><guid isPermaLink="false">https://vinitkumar.me/one-month-hacking-excercise/</guid><pubDate>Sun, 01 Dec 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After a lot of reflection on what I have achieved in the last year, I have stumbled upon one fact: I need to hack
a lot more on Python and JavaScript. These are the two main languages I am comfortable with, and almost all my projects
and official work are done with them.&lt;/p&gt;
&lt;p&gt;Well, here are some small ideas about how I am going to achieve this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read a lot of good code. I will spend at least 1 hour every day reading some really awesome Python code.&lt;/li&gt;
&lt;li&gt;Write a lot of commonly used utilities in Python. For example: Automate at least one of the tasks I do daily using Python.&lt;/li&gt;
&lt;li&gt;Read Django documentation and toy with it.&lt;/li&gt;
&lt;li&gt;Write PEP8-compliant code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These were the ideas for Python. Now for JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give a solid foundation to my understanding of prototypical inheritance in JavaScript.&lt;/li&gt;
&lt;li&gt;Write a lot of Backbone and some really good jQuery code.&lt;/li&gt;
&lt;li&gt;Read some really good code and write some CoffeeScript as well.&lt;/li&gt;
&lt;li&gt;Learn to write good unit tests in Jasmine and Mocha.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[New Theme For My Blog]]></title><description><![CDATA[So this week, I wrote a new theme for my blog. One big reason was that
using theme created by others were not fitting my needs and I was not…]]></description><link>https://vinitkumar.me/new-theme-for-my-blog/</link><guid isPermaLink="false">https://vinitkumar.me/new-theme-for-my-blog/</guid><pubDate>Sat, 30 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So this week, I wrote a new theme for my blog. One big reason was that
using theme created by others were not fitting my needs and I was not
inspired to write anymore. This was odd because in general I love
writing posts on my blog. I felt the design was taking too much attention and the content has
taken a back seat. There are few good things about this new theme I created: - More emphasis is given to the content - Good fonts has been applied and it looks pretty on all devices. - The structure is pretty simple and there are mainly three tabs. I like it the way it has come up, though some more improvements such as
better responsive navbar and more SEO fields would make it way soon.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[I Have Grown]]></title><description><![CDATA[Last few months has been really great for me. I think I am starting to grow as a developer and I know now how important is to keep…]]></description><link>https://vinitkumar.me/i-have-grown/</link><guid isPermaLink="false">https://vinitkumar.me/i-have-grown/</guid><pubDate>Fri, 15 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last few months has been really great for me. I think I am starting to grow as a developer and I know now how important is to keep performing at a certain level. The change started occurring when I gave up my comfort zone and started doing front-end mainly. It was a bit difficult in beginning to understand a design
from a designer’s perspective and to convert it into running efficient code. I also know now that everything is important and every contribution you do in a company is worthwhile and it is worth putting all your energy in doing whatever you are doing. Now, I am looking forward to get expert level knowledge in whatever stack/technology I get to work on.
One need to be always learning and improving. I am definitely more focussed now and my goal is to do some really nice work on the products I work on. Recently, I made the main website of your product [Socialschools](&lt;a href=&quot;http://www&quot;&gt;http://www&lt;/a&gt;. socialschools. nl/en/) with my very talented designer colleague Robert. It was real fun converting his great design into pixel perfect and functional website.
I enjoy writing every line of code that I get to code because this is what I love to code. P. S. I am a Civil Engineer by education, but have always loved computer so naturally was inclined to write softwares. That’s it for now. Will post more about it later sometimes. You can follow the latest on twitter
if you like my posts or what I say. [@vinitkme](&lt;a href=&quot;http://twitter&quot;&gt;http://twitter&lt;/a&gt;. com/vinitkme).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Life At A Startup]]></title><description><![CDATA[Last few months has been really exciting for me. Since, I joined [Changer](http://changer. nl) on 1st February.
Here are some things I…]]></description><link>https://vinitkumar.me/life-at-a-startup/</link><guid isPermaLink="false">https://vinitkumar.me/life-at-a-startup/</guid><pubDate>Tue, 02 Jul 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last few months has been really exciting for me. Since, I joined [Changer](&lt;a href=&quot;http://changer&quot;&gt;http://changer&lt;/a&gt;. nl) on 1st February.
Here are some things I learnt in these 5 months: - I should try to learn and own the stack I am working on. Trying to do a lot of things at a time is not going to help much.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contributing a lot to open source is a good thing and I am lucky my company encourages me to do so.&lt;/li&gt;
&lt;li&gt;I should write a lot of code and read a lot more. I should invest time in learning and understanding my product. - I should think about code quality and maintainability before I write a single line of code. It is tough things to get right at first, but with hard work I could achieve this.&lt;/li&gt;
&lt;li&gt;Having good understanding and relationship with the people I daily work with is important. It is must to have a smile on my face.&lt;/li&gt;
&lt;li&gt;I must have fun with what I do. Period!&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[This Could Be Some Plan]]></title><description><![CDATA[I recently read a blog by Jeff Atwood that there is no such thing as a “Rock-star programmer.” These are people who can write cleaner code…]]></description><link>https://vinitkumar.me/this-could-be-some-plan/</link><guid isPermaLink="false">https://vinitkumar.me/this-could-be-some-plan/</guid><pubDate>Fri, 21 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently read a blog by Jeff Atwood that there is no such thing as a “Rock-star programmer.” These are people who can write cleaner code, refactor faster than anyone else, write a lot of tested code and follow good methodology. This means each one of us has scope to get better as a developer.&lt;/p&gt;
&lt;p&gt;I am in my first software development job and there is a lot of scope for me to improve and get better. Obviously this is not going to happen overnight and I need to work hard to achieve this.&lt;/p&gt;
&lt;p&gt;Here is my plan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For JavaScript server side, read Madhu’s code and learn&lt;/li&gt;
&lt;li&gt;For JavaScript client side, read Ruben’s code and learn&lt;/li&gt;
&lt;li&gt;For Python, read code from good projects like Django&lt;/li&gt;
&lt;li&gt;Write loads of code in NoSQL goodness (MongoDB)&lt;/li&gt;
&lt;li&gt;Incorporate good software development practices&lt;/li&gt;
&lt;li&gt;Have a good foundation with algorithms and space-time complexity&lt;/li&gt;
&lt;li&gt;Acquire a good grasp of the theoretical aspects of JavaScript and Python&lt;/li&gt;
&lt;li&gt;Write a lot of tested and RESTful APIs&lt;/li&gt;
&lt;li&gt;Write tons of open source software&lt;/li&gt;
&lt;li&gt;Spend an hour on IRC everyday&lt;/li&gt;
&lt;li&gt;Work on a crazy project that is impossible to achieve&lt;/li&gt;
&lt;li&gt;Work more on automation and deployments&lt;/li&gt;
&lt;li&gt;Estimate, organize and plan my work well in advance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, these are kind of my strict TODO list. At this moment, I think I have a decent understanding of technology and software development process. But, I am far from being a really good developer. There are loads of things to learn and I am really excited about the process.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Professional Ethics: 15 Principles for Success in Work and Life]]></title><description><![CDATA[Work has a really important role in anyone’s life. I feel there are some things that really help us
do our work nicely. - Arrive on time…]]></description><link>https://vinitkumar.me/ethics-at-work-and-life/</link><guid isPermaLink="false">https://vinitkumar.me/ethics-at-work-and-life/</guid><pubDate>Sun, 16 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Work has a really important role in anyone’s life. I feel there are some things that really help us
do our work nicely. - Arrive on time. Don’t be late without giving a heads up to the other party. - Think logically before making any decision. - Keep the communication lines open. - If you are facing a difficulty admit it, don’t let your ego come in between. - There are always things that could be difficult, persistent hard work is the only way to crack them. - Don’t fall victim of easy goals, work with full passion on whatever you have decided. - Don’t think much about other things, just concentrate on your work. ## Most important things: - No work is too small, everything teaches you something new. - Life is too small to waste on useless arguments. - Keep your mouth shut when you don’t have something useful to contribute. - Read books, improve your skills. - Challenge your limits. - Read well, write well.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Maximizing Productivity: A Developer's Guide to Time Management and Focus]]></title><description><![CDATA[These days I had a great time working on some pretty good projects in both office and home. I will talk about my personal projects for…]]></description><link>https://vinitkumar.me/what-is-on-my-mind/</link><guid isPermaLink="false">https://vinitkumar.me/what-is-on-my-mind/</guid><pubDate>Sat, 15 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;These days I had a great time working on some pretty good projects in both office and home. I will talk about my personal projects for obvious reasons.
Well, the primary goal currently is to fix the existing projects, test them and add CI support for all of them. This is single most important thing as of now as these measures improve the code quality. Also, I am working on different projects and languages so it might be little tough to adapt and plan my work. Here is what I have planned. ## How to get things done?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Work in sprint of 30 min + 3 minutes break. ( No distractions+ no phone calls+ no messaging) Do all those in this 3 min break. ## How many of these sprints? - 16 of them in a 9 hours office time. with 18 breaks in between.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Be religious about the count. ## When to plan a day and how to plan?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plan one night before the day and also give priorities to new issues or request from Bitbucket, GitHub. ## What shouldn’t be done? - Useless arguments. - Dart Games. - Facebook. - Twitter - Time-pass stuff in Skype. # How to track my day and goals: - Use toggle religiously and also Use Omnifocus. - Omnifocus ## For Goals as Projects: - Milestones as an abstraction of the the strict todolists:&lt;/li&gt;
&lt;li&gt;Todo Lists could be the GitHub Issues. Such links could be passed in the omnifocus App. ##Home schedule: - Morning: Gym + Breakfast - Evening: Dinner + 3 hours of self study in the same time + break as work. - Learn something new or re learn something that you forgot. - Experiment as much as you, Think, brainstorm. Write every idea that comes in your mind. Create an issue of the idea. Learn, Work, Debug, Iterate!&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[My Current Projects]]></title><description><![CDATA[These days I was busy working on an a project called as Node. JS Twitter.
As the name suggest it is a twitter clone written on Node. JS…]]></description><link>https://vinitkumar.me/current-projects/</link><guid isPermaLink="false">https://vinitkumar.me/current-projects/</guid><pubDate>Tue, 04 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;These days I was busy working on an a project called as Node. JS Twitter.
As the name suggest it is a twitter clone written on Node. JS. Right now it has following functionalities: * Login via Facebook and GitHub&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tweet Add, Modify, Delete&lt;/li&gt;
&lt;li&gt;Comment on Tweet&lt;/li&gt;
&lt;li&gt;Favorite a Tweet&lt;/li&gt;
&lt;li&gt;See own and another user’s profile&lt;/li&gt;
&lt;li&gt;Follow another User ###Here are some screen-shots: &lt;figure&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;http://vinitkumar.me/images/twitter. png&quot; height=&quot;400&quot; width=&quot;640&quot;&gt;
 &lt;figure&gt; &lt;img src=&quot;http://vinitkumar. me/images/twitter2.png&quot; height=&quot;400&quot; width=&quot;640&quot;&gt;
&lt;/figure&gt; &lt;figure&gt; &lt;img src=&quot;http://vinitkumar. me/images/twitter3.png&quot; height=&quot;400&quot; width=&quot;640&quot;&gt;
&lt;/figure&gt; &lt;figure&gt; &lt;img src=&quot;http://vinitkumar. me/images/twitter4.png&quot; height=&quot;400&quot; width=&quot;640&quot;&gt;
&lt;/figure&gt; &lt;figure&gt; &lt;img src=&quot;http://vinitkumar. me/images/twitter5.png&quot; height=&quot;400&quot; width=&quot;640&quot;&gt;
&lt;/figure&gt; I am also planning to add all other features present on twitter one by one. Next would be dashboard(timeline), personal profile, retweet and hashtags. These features might seem simple but most of them are not that simple and requires some good effort.
Anyways, you can test it here:
``` sh
$ npm install nwitter
$ npm start
```
Then open your browser and open `http://localhost:3000`.</content:encoded></item><item><title><![CDATA[My Setup]]></title><description><![CDATA[I am doing The Setup interview for myself. It is basically based on these four questions: - Who are you and what do you do? What hardware do…]]></description><link>https://vinitkumar.me/my-setup/</link><guid isPermaLink="false">https://vinitkumar.me/my-setup/</guid><pubDate>Sun, 26 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I am doing The Setup interview for myself. It is basically based on these four questions: - Who are you and what do you do?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What hardware do you use?&lt;/li&gt;
&lt;li&gt;And what software?&lt;/li&gt;
&lt;li&gt;What would be your dream setup? So here it goes: ### Who are you and what do you do? Hello, I am Vinit and work as a software developer at this awesome Dutch startup,[Changer](&lt;a href=&quot;http://changer&quot;&gt;http://changer&lt;/a&gt;. nl). I mostly write code in JavaScript and Python. ### What hardware do you use? I use a MacBook Pro, Mid 2009, with 8 GB RAM and 256 GB SSD. I use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;30-inch BenQ Monitors, apple wired keyboard, Logitech GT400 at work. At home, I have a 22-inch Dell monitor with same keyboard and mouse. I
use Steelseries Headphones for listening to Music.
For storage and backups, I use a Western Digital 512GB Hard disk. I also have an old Dell laptop with Windows7 and Ubuntu on it. I have an HTC Desire X as my mobile phone with Android Jelly Bean. I like
this phone a lot and it does almost everything I require without burning
a hole in my pocket. ### And What Software? I use OS X Mavericks as my primary operating system. Well here is the list of Software I use: For writing code, I only use Macvim. For browsing I use Chrome, firefox,
safari and IE (for testing mostly on VM). For running other OSes I use
Virtualbox. I love [Dash](&lt;a href=&quot;http://kapeli&quot;&gt;http://kapeli&lt;/a&gt;. com/dash). They are really awesome way to
read documentation of various stacks. For tweeting I use default twitter client on both Mac and Android. I
think they are pretty good. For music, iTunes suffices though I do listen to Winamp too. My shell consists of a highly optimised Zsh configuration. For Django
related work I use PG Commander to view databases. For time tracking I
like toggl(&lt;a href=&quot;https://www.toggl.com/&quot;&gt;https://www.toggl.com/&lt;/a&gt;). ### What would be your dream setup? My dream setup would be couple of Big 30-inch monitors. I would also
love a room with library and a nice dark corner to work.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Single Machine Work-flow]]></title><description><![CDATA[Benefits More focus, less distraction Personal productivity improvement Skill developed for handling a lot of things with fewer resources…]]></description><link>https://vinitkumar.me/single-machine-workflow/</link><guid isPermaLink="false">https://vinitkumar.me/single-machine-workflow/</guid><pubDate>Tue, 07 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;More focus, less distraction&lt;/li&gt;
&lt;li&gt;Personal productivity improvement&lt;/li&gt;
&lt;li&gt;Skill developed for handling a lot of things with fewer resources effectively&lt;/li&gt;
&lt;li&gt;Get better at typing and using Mac more productively&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Use 75% to 100% code window in Sublime when needed&lt;/li&gt;
&lt;li&gt;Use full browser window&lt;/li&gt;
&lt;li&gt;Music and everything else is minimized&lt;/li&gt;
&lt;li&gt;Distraction free mode in Sublime when required&lt;/li&gt;
&lt;li&gt;Use different desktops for coding, shell and browser&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Refrain from these:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Don’t use a monitor to break this rhythm&lt;/li&gt;
&lt;li&gt;Don’t use a monitor unless you need to show something that can be shown on laptop&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Best Practices for Managing Open Source Projects on GitHub]]></title><description><![CDATA[In last couple of days, I noticed there was no good planning for my personal projects and there were lots of loose ends. So I finally…]]></description><link>https://vinitkumar.me/new-project-planning/</link><guid isPermaLink="false">https://vinitkumar.me/new-project-planning/</guid><pubDate>Tue, 30 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In last couple of days, I noticed there was no good planning for my personal projects and there were lots of loose ends. So I finally cleaned up my GitHub. Here are some of ground rules for projects on GitHub: - Don’t open source a project until the project has got unit test, wikis and sample application (if it is a application project) hosted. - Integrate CI like travis and jenkins with all of them. - Do all the immature, experimental projects on Bitbucket. - Write good, clean, pragmatic code in the projects on GitHub. - Look for bugs and spend more time on projects seriously. - Strictly follow Git-Flow on all your projects. Blog about your latest work or maintain the wiki for the project every work. At the end of week review your work.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Django plugin open sourced]]></title><description><![CDATA[There are lot of useful plugins for Django CMS.
Well, this plugin let you use the images from a Facebook Album. Currently it supports…]]></description><link>https://vinitkumar.me/django-plugin-open-sourced/</link><guid isPermaLink="false">https://vinitkumar.me/django-plugin-open-sourced/</guid><pubDate>Mon, 29 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There are lot of useful plugins for Django CMS.
Well, this plugin let you use the images from a Facebook Album. Currently it supports fetching images from Photo Album of a Facebook Page. All you need to do is to put Facebook Album URL, Access-token and the album name in the plugin fields and you will get a nice thumbnail in the intended place and once clicked big images will open in carousel effects. Sounds nice, take a look at the screen-shots below. - Entering the details in plugin form:![Admin Page](&lt;a href=&quot;http://vinitcool76.GitHub&quot;&gt;http://vinitcool76.GitHub&lt;/a&gt;. io/images/admin. png) - Thumbnail view of plugin:![Small View] (&lt;a href=&quot;http://vinitcool76.GitHub&quot;&gt;http://vinitcool76.GitHub&lt;/a&gt;. io/imagessmallview. png) - Image slideshow in carousel![Carousel](&lt;a href=&quot;http://vinitcool76.GitHub&quot;&gt;http://vinitcool76.GitHub&lt;/a&gt;. io/images/bigview. png) #installation installation is dead simple. First start your virtualenv $ workon sample (sample)$ pip install cmsplugin-fbalbum You might need to do this if you are getting some sort of database error. Python manage. py syncdb Python manage. py migrate In case you face any problems, file issues and if you want to contribute take a look at the existing issues and send a pull request.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Django plugin and Google command line project open sourced]]></title><description><![CDATA[Maintaining and contributing to an Open Source Project is a very important part of a developers life. Luckily, I am in a Company that gives…]]></description><link>https://vinitkumar.me/new-open-source-projects/</link><guid isPermaLink="false">https://vinitkumar.me/new-open-source-projects/</guid><pubDate>Sat, 27 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Maintaining and contributing to an Open Source Project is a very important part of a developers life. Luckily, I am in a Company that gives me full liberty to contribute and in fact we have a Open Source day(Friday) where we could open source reusable components of project we have been working on to the open source audience. This is plain awesome, because not only it encourages a healthy culture of giving back to the community, also it improves the overall quality of the project as you just do not open source anything without getting it better. With that said, I have open sourced two of my projects: [cmsplugin-fbalbum](&lt;a href=&quot;https://GitHub&quot;&gt;https://GitHub&lt;/a&gt;. com/vinitcool76/cmsplugin-fbalbum): This is a Django-cms plugin that gives the end user to showcase the photos from their Facebook album without going through any code. Just enter the album
name, album URL and access-token and you are good to go.
It is also available to everyone on pypi, In order to install just do:&lt;/p&gt;
&lt;deckgo-highlight-code  terminal=&quot;carbon&quot; theme=&quot;blackboard&quot;  &gt;
          &lt;code slot=&quot;code&quot;&gt;pip install cmsplugin-fbalbum
``` It is under heavy development and still in beta, but can be used. Any sort of contribution is welcome. [googlecl](https://GitHub. com/vinitcool76/googlecl): It is another dear project of mine, it was previously being developed by Google Engineer, Tom. H.Miller. Since he is quite busy nowadays and could not contribute actively, I have decided to maintain this project on GitHub and add features/bugfixes and refactoring. I am happy to have these two projects in progress and will open source
more of my stuff in future. Though I regret not blogging that often these days.&lt;/code&gt;
        &lt;/deckgo-highlight-code&gt;</content:encoded></item><item><title><![CDATA[My First Flight]]></title><description><![CDATA[So finally, I am going on a week-long vacation, and it has finally begun. On an Air India flight to Delhi and from Delhi to Ranchi. Well…]]></description><link>https://vinitkumar.me/first-flight-and-vacation-after-months/</link><guid isPermaLink="false">https://vinitkumar.me/first-flight-and-vacation-after-months/</guid><pubDate>Sun, 07 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So finally, I am going on a week-long vacation, and it has finally begun. On an Air India flight to Delhi and from Delhi to Ranchi. Well, this vacation is special for a lot of good reasons. First of all, this is my first flight. Also, this is my first vacation since I started working at Changer Technologies, Pune.&lt;/p&gt;
&lt;p&gt;I have never been to Mumbai and Delhi before, so on this trip I will be visiting both of these places. It has been so long since I have been at home, and out of everything, I miss my home’s food and family the most.&lt;/p&gt;
&lt;p&gt;Well, according to me, there is just one way to live life, and that is to live life to the fullest. Work hard and go on vacations. Spend good time with family and friends. There are not many chances we get to do those in a lifetime. So, live it to the fullest while it lasts.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building a Twitter Clone with Node.js: A Learning Project]]></title><description><![CDATA[I am thinking of making a Twitter-like application as a learning exercise
to get better at Node.js. It will be on the usual Node.js-based…]]></description><link>https://vinitkumar.me/twitter-like-app-in-nodejs/</link><guid isPermaLink="false">https://vinitkumar.me/twitter-like-app-in-nodejs/</guid><pubDate>Wed, 27 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I am thinking of making a Twitter-like application as a learning exercise
to get better at Node.js. It will be on the usual Node.js-based stack, since I am actively
learning that now. More details will be blogged as I progress.&lt;/p&gt;
&lt;p&gt;If you are interested in collaborating or discussing, contact me here.&lt;/p&gt;
&lt;p&gt;Edit: I completed the Node app for Twitter. It is on my GitHub. You can check it out on my GitHub.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/vinitkme&quot;&gt;@vinitkme&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux to Mac]]></title><description><![CDATA[A lot of things have changed recently. I converted from a hardcore Linux user
to Mac lover. I got a high-end MacBook from the office. There…]]></description><link>https://vinitkumar.me/life-has-changed/</link><guid isPermaLink="false">https://vinitkumar.me/life-has-changed/</guid><pubDate>Sun, 24 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A lot of things have changed recently. I converted from a hardcore Linux user
to Mac lover. I got a high-end MacBook from the office.&lt;/p&gt;
&lt;p&gt;There are quite a few reasons for my fondness for Mac:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The OS X is quite good and amazingly stable.&lt;/li&gt;
&lt;li&gt;UI and UX are quite good once you get used to them.&lt;/li&gt;
&lt;li&gt;Almost every application and tool under the sun is available to you.&lt;/li&gt;
&lt;li&gt;No messing up with hardware, just connect and play.&lt;/li&gt;
&lt;li&gt;Awesome battery life—I could easily get 8 hours of battery backup with this sweet machine.&lt;/li&gt;
&lt;li&gt;13-inch is an awesome form factor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, I recently got myself an HTC Desire X Android smartphone.
It is a lovely piece of hardware. Not big or bulky. At 4 inches, the screen
gives me enough screen real estate to do whatever I need to do. The camera is good as well.
All together, I am quite satisfied with my phone. Did I mention Beats Audio?
It is an excellent addition to my phone. I spend quite some time traveling
to the office, and it feels great to listen to music while traveling.&lt;/p&gt;
&lt;p&gt;Though I still love my 2-year-old Dell and Nokia E5.
Some repair and polishing are required, and I will surely give them their due at the right time.&lt;/p&gt;
&lt;p&gt;I love my hardware, and doesn’t everyone else too?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[From Chrome Extensions to Career: My JavaScript Journey]]></title><description><![CDATA[I started programming JavaScript seriously in September 2012, and
I never wondered that it would affect my life so much.
Well, it started…]]></description><link>https://vinitkumar.me/my-javascript-love/</link><guid isPermaLink="false">https://vinitkumar.me/my-javascript-love/</guid><pubDate>Sun, 24 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I started programming JavaScript seriously in September 2012, and
I never wondered that it would affect my life so much.
Well, it started with me working on developing a Chrome Extension for an
e-commerce/social media app. Chrome is quite different for development.
There are lots of APIs to learn, and there are quite a few security restrictions.
Also, there is only one language that you can use to develop it: JavaScript.&lt;/p&gt;
&lt;p&gt;There are quite a few things I learned programming JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Think before you code; think about the whole problem at once.&lt;/li&gt;
&lt;li&gt;Keep code clean and use a modular structure.&lt;/li&gt;
&lt;li&gt;Use linting and follow good guidelines given by experts.&lt;/li&gt;
&lt;li&gt;Read some good books and be aware of what you are getting into.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Today I work as a Software Developer at an awesome Dutch startup &lt;a href=&quot;http://changer.nl&quot;&gt;Changer&lt;/a&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>