<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rich Steinmetz</title>
    <description>The latest articles on DEV Community by Rich Steinmetz (@richstoneio).</description>
    <link>https://dev.to/richstoneio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F201879%2Fbadacd51-882b-4624-8e4a-4c632e26be5a.png</url>
      <title>DEV Community: Rich Steinmetz</title>
      <link>https://dev.to/richstoneio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/richstoneio"/>
    <language>en</language>
    <item>
      <title>Ruby's not keyword is not not but ! (not)</title>
      <dc:creator>Rich Steinmetz</dc:creator>
      <pubDate>Sat, 20 Feb 2021 15:05:11 +0000</pubDate>
      <link>https://dev.to/richstoneio/ruby-s-not-keyword-is-not-not-but-not-3394</link>
      <guid>https://dev.to/richstoneio/ruby-s-not-keyword-is-not-not-but-not-3394</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---h-vnB8v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/rubys-not-keyword.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---h-vnB8v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/rubys-not-keyword.PNG" alt="Ruby's not keyword is not not but ! (not)" width="880" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The title is confusing enough, so I don't want to bore you you with words today, let's better listen to some deep-sounding &lt;code&gt;Rspec&lt;/code&gt; code... 🎵🎶&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ~/code/ruby/rubys_not_is_not_not_but_!_(not)_spec.rb&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'./rubys_not_is_not_not_but_!_(not)'&lt;/span&gt;

&lt;span class="no"&gt;RSpec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt; &lt;span class="s1"&gt;'Ruby\'s not keyword'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:banger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Banger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:naysayer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Naysayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s1"&gt;'when ! is overriden'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'returns whatever value is returned by !'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;banger&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt; &lt;span class="n"&gt;eq&lt;/span&gt; &lt;span class="ss"&gt;:bang&lt;/span&gt;
      &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;banger&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt; &lt;span class="n"&gt;eq&lt;/span&gt; &lt;span class="ss"&gt;:bang&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'also returns the overriding\'s return value when called on the instance'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;banger&lt;/span&gt;&lt;span class="o"&gt;.!&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt; &lt;span class="n"&gt;eq&lt;/span&gt; &lt;span class="ss"&gt;:bang&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s1"&gt;'when not is overriden'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'returns the overriding\'s return value when called on the instance'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;naysayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;not&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt; &lt;span class="n"&gt;eq&lt;/span&gt; &lt;span class="ss"&gt;:nay&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s1"&gt;'but when used in the classical way before the message'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'evaluates a truthy value to false (as it always does)'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;naysayer&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt; &lt;span class="n"&gt;eq&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

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

&lt;/div&gt;
Live test-driven, read tests first





&lt;p&gt;Which gives us this result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XEltXf1q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/Screenshot-from-2021-02-20-15-35-42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XEltXf1q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/Screenshot-from-2021-02-20-15-35-42.png" alt="Ruby's not keyword is not not but ! (not)" width="611" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And of course you are curious how it's implemented:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ~/code/ruby/rubys_not_is_not_not_but_!_(not).rb&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Banger&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;
    &lt;span class="ss"&gt;:bang&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Naysayer&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;not&lt;/span&gt;
    &lt;span class="ss"&gt;:nay&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
Check this &lt;a href="https://github.com/RichStone/ruby-3-playground"&gt;masterful code on GitHub&lt;/a&gt; if you don't believe





&lt;h3&gt;
  
  
  The Moral
&lt;/h3&gt;

&lt;p&gt;As you can &lt;a href="https://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-not"&gt;read from the docs&lt;/a&gt;, Ruby's &lt;code&gt;!&lt;/code&gt; can be overriden so that it will even return the overriding's value when used in front of a message (like &lt;code&gt;! message()&lt;/code&gt;, but the &lt;code&gt;not&lt;/code&gt; keyword overridings only have effect on the instance's return value (e.g. &lt;code&gt;instance.not()&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;So the moral of the story is that &lt;code&gt;not&lt;/code&gt; uses &lt;code&gt;!&lt;/code&gt; somehow under the hood because when &lt;code&gt;!&lt;/code&gt; is overriden it has also an effect on &lt;code&gt;not&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This being said, they still are not aliases since they differ a tad in functionality (namely, &lt;a href="https://stackoverflow.com/a/27429722/5925094"&gt;in precedence&lt;/a&gt;).&lt;/p&gt;




&lt;p&gt;Comments or questions? Just tweet it out to me! &lt;br&gt;
&lt;a href="https://twitter.com/intent/tweet?hashtags=rubychunk&amp;amp;original_referer=https%3A%2F%2Frichstone.io" id="b"&gt;&lt;span id="l"&gt;Tweet&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to get new chunks in your inbox? Hit the evanescent Subscribe button somewhere here 👇👉&lt;/p&gt;

</description>
      <category>ruby</category>
    </item>
    <item>
      <title>Your Hidden Assets to Get Your First Developer Job</title>
      <dc:creator>Rich Steinmetz</dc:creator>
      <pubDate>Sun, 14 Feb 2021 09:13:25 +0000</pubDate>
      <link>https://dev.to/richstoneio/your-hidden-assets-to-get-your-first-developer-job-1169</link>
      <guid>https://dev.to/richstoneio/your-hidden-assets-to-get-your-first-developer-job-1169</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1LXyfJ0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/developer-job-mindset-banner.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1LXyfJ0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/developer-job-mindset-banner.PNG" alt="Your Hidden Assets to Get Your First Developer Job" width="880" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In August 2015 I decided to give programming a shot. In March 2016 I got into my first job in software development. I had no idea what software development is. But I was there. And you can do this too.&lt;/p&gt;

&lt;p&gt;My first job was more of an internship at a web dev agency but I also have friends and colleagues who were Bootcamp graduates and dove into a junior position right after the Bootcamp.&lt;/p&gt;

&lt;p&gt;What I've learned from my friends, colleagues and from my own experiences is that it's always about what you can show to your potential employer. If you reach out with nothing, most of the time you will get nothing. However, "something" that you can show is not always only a full-fledged web application or a beautiful static website that you've built.&lt;/p&gt;

&lt;p&gt;Let's assume you are at zero. You don't have a portfolio yet, just the burning desire to get hands-on experience. Good, welcome to the club of everyone, there are tons of people like this, you are the 99% of people starting out. I think, though, there's a common misconception about what you really need for your first job and what you actually have at this point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l2P0BxaU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/soft-assets-fantasy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l2P0BxaU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/soft-assets-fantasy.png" alt="Your Hidden Assets to Get Your First Developer Job" width="880" height="660"&gt;&lt;/a&gt;Your Constant State of Being&lt;/p&gt;

&lt;p&gt;This is your conception of yourself before applying or before even thinking to apply for a job in IT. No wonder you are terrified through to the bones to get any applications out there.&lt;/p&gt;

&lt;p&gt;You need to ask yourself the right questions before applying. Everything you've asked yourself so far is: "Have I learned enough coding yet?" or "Will they like my code?" (by the way, the answer is no ;) or "Will I even pass a coding challenge?"&lt;/p&gt;

&lt;p&gt;Asking yourself &lt;strong&gt;the right questions&lt;/strong&gt; can reveal hidden assets and give you a confidence boost.&lt;/p&gt;

&lt;p&gt;Without a nice portfolio of previous tech job gigs, web applications, static websites, nor blog posts, you don't have a lot of &lt;strong&gt;hard assets&lt;/strong&gt; to show off yet.&lt;/p&gt;

&lt;p&gt;Nevertheless, every single person has this portfolio of &lt;strong&gt;soft assets&lt;/strong&gt; in their sleeves already to some degree:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Motivation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Personality&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communication&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Luck&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C0gx8Uxb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/soft-assets.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C0gx8Uxb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/soft-assets.png" alt="Your Hidden Assets to Get Your First Developer Job" width="880" height="660"&gt;&lt;/a&gt;Your actual M.P.B.A.C.L. attributes&lt;/p&gt;

&lt;p&gt;Skill levels vary and additional soft assets may be there.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Main Quest's Plot&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With no experience in the field, your application is merely a promise that you will build the skill and give 110% to help the company where you can. Getting the job is a gamble for both sides. Neither the employer, nor you really know if you’ll perform well.&lt;/p&gt;

&lt;p&gt;If you build your personal story that shows off all the points above, you’ll create a position for you and for the employer to believe that you can do it.&lt;/p&gt;

&lt;p&gt;So your guiding questions when applying for entry positions and showing up to tech interviews could be something along these lines:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why am I eager to get into software development? What drives me to the company's industry? ( &lt;strong&gt;Motivation&lt;/strong&gt; )&lt;/li&gt;
&lt;li&gt;How does my personality integrate with the company? How do I learn? How do I structure my work processes? ( &lt;strong&gt;Personality&lt;/strong&gt; )&lt;/li&gt;
&lt;li&gt;How can my background contribute to the company's mission? What have I done in the past that's similar to the company's goals or activities? ( &lt;strong&gt;Background&lt;/strong&gt; )&lt;/li&gt;
&lt;li&gt;What do I currently already do to become a software engineer? Where do I hang out with people from the field? What's my current side project? ( &lt;strong&gt;Activity&lt;/strong&gt; ; This is also where you already build hard assets along the way)&lt;/li&gt;
&lt;li&gt;What makes me a team player? Why is it fun working with me? How can I improve the communication at the new company? ( &lt;strong&gt;Communication&lt;/strong&gt; )&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Additionally, ask yourself what you can do to increase your &lt;strong&gt;Luck&lt;/strong&gt; factor, basically by working towards.&lt;/p&gt;

&lt;p&gt;Finally, it'd be great, if you can actually show some of those skills. For example, you could show GitHub profile activity, a few posts on things you've learned in your journey so far, social media profiles, knowledge of the local community scene, and so on. Work with what you already have here and improve on the hard assets as you go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;p&gt;Now take these questions and your first job becomes an inevitable near-future event with this favorite quote of mine:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Sigue, insiste, persiste...”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Create yourself an application game plan and get into applying right away. If you made up your mind to be a part of the software world then it's never the right time to start applying, other than yesterday.&lt;/p&gt;




&lt;p&gt;Comments or questions? Just tweet it out to me! &lt;br&gt;
&lt;a href="https://twitter.com/intent/tweet?hashtags=careerchunk&amp;amp;original_referer=https%3A%2F%2Frichstone.io%2Fyour-hidden-assets-to-get-your-first-developer-job%2F&amp;amp;ref_src=twsrc%5Etfw&amp;amp;text=Your%20Hidden%20Assets%20to%20Get%20Your%20First%20Developer%20Job&amp;amp;tw_p=tweetbutton&amp;amp;url=https%3A%2F%2Frichstone.io%2Fyour-hidden-assets-to-get-your-first-developer-job%2F&amp;amp;via=richstoneio" id="b"&gt;&lt;span id="l"&gt;Tweet&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to get new chunks and visuals in your inbox? Subscribe to the newsletter at &lt;a href="https://richstone.io"&gt;richstone.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>careertips</category>
      <category>beginners</category>
      <category>career</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Recognize Single Responsibilities for more Practical Object-Oriented Design</title>
      <dc:creator>Rich Steinmetz</dc:creator>
      <pubDate>Wed, 10 Feb 2021 19:16:13 +0000</pubDate>
      <link>https://dev.to/richstoneio/recognize-single-responsibilities-for-more-practical-object-oriented-design-ch4</link>
      <guid>https://dev.to/richstoneio/recognize-single-responsibilities-for-more-practical-object-oriented-design-ch4</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MFcjNJJh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/image-5-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MFcjNJJh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/image-5-1.png" alt="Recognize Single Responsibilities for more Practical Object-Oriented Design" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are like most developers, this is your guy ☝&lt;/p&gt;

&lt;p&gt;He's supposed to make your code easy to change, easy to understand and easy to reuse.&lt;/p&gt;

&lt;p&gt;But all he does is to confuse everyone and touch everything around him. To make things worse, he's not alone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DTJZpqxG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/image-6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DTJZpqxG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/image-6.png" alt="Recognize Single Responsibilities for more Practical Object-Oriented Design" width="880" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's see how we can tame these fellas by recognizing single responsibilities.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Following below is a loose summary of chapter 2 from &lt;a href="https://www.amazon.com/-/es/Metz-Sandi-ebook-dp-B07F88LY9M/dp/B07F88LY9M/ref=mt_other?_encoding=UTF8&amp;amp;me=&amp;amp;qid=1612980852"&gt;one of the greatest books on practical object-oriented design&lt;/a&gt; (don't miss out, whatever programming language background you have, these are pure fundamentals explained awesomely).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cohesion and Single Responsibility Principle
&lt;/h2&gt;

&lt;p&gt;Highly cohesive classes are said to be easy to change and reuse. They do just one small thing, i.e. they have a Single Responsibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interrogate your classes
&lt;/h3&gt;

&lt;p&gt;You will like this technique, especially if you are a rubber duck programmer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xh5AQJ6o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/image-13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xh5AQJ6o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://digitalpress.fra1.cdn.digitaloceanspaces.com/xhtzjbw/2021/02/image-13.png" alt="Recognize Single Responsibilities for more Practical Object-Oriented Design" width="880" height="880"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Really, try talking to them. It's said to nurture your creative energy and problem-solving.&lt;/p&gt;

&lt;p&gt;Listen closely. If you hear alarming signal words like &lt;strong&gt;"and"&lt;/strong&gt; sprinkled with &lt;strong&gt;"or"&lt;/strong&gt; , you have your hint on where to look next.&lt;/p&gt;

&lt;p&gt;If you don't get an answer yet, shoot that guy and move on to check your code for more hints.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start even smaller
&lt;/h3&gt;

&lt;p&gt;Classes should have a Single Responsibility, yes. But to make sense out of your classes you'll need to take a look at the methods, those are actually the folks that take action. Classes are more obvious in nature, that's why everyone's talking about them. But what really makes your design are messages that you pass around your classes and objects by using methods.&lt;/p&gt;

&lt;p&gt;Often methods do more than one thing, so here can be a good place to start debunking your class. If you gave up on interrogating your class (🔫), then you can move on to the methods.&lt;/p&gt;

&lt;p&gt;When you reform your class to consist of small cohesive methods, oftentimes you end up getting to understand which single responsibility your class should have and what's redundant or in the wrong place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hide data structures
&lt;/h2&gt;

&lt;p&gt;Using raw data structures in your classes can lead to headaches when changing code.&lt;/p&gt;

&lt;p&gt;When you create classes that have a single responsibility, every tiny bit of behavior lives in &lt;strong&gt;one place&lt;/strong&gt;. This should also be true when you work with data. If you see yourself doing a lot of accessing Arrays in many places then most probably it's time to hide the structure of your data object because you are not following the DRY principle.&lt;/p&gt;

&lt;p&gt;Take this as an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Videogame&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:data&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;analytics_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analytics_data&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;game_price&lt;/span&gt;
    &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;game_popularity&lt;/span&gt;
    &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the &lt;code&gt;analytics_data&lt;/code&gt; has the relevant data stored in a variable for us hidden somewhere in a 2-dimensional array. You can wrap your data structures inside a method that will serve as a single point of truth of how to extract that data.&lt;/p&gt;

&lt;p&gt;In our game example you could do something like...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Videogame&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:metrics&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;analytics_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deconstruct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;analytics_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;game_price&lt;/span&gt;
    &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;game_popularity&lt;/span&gt;
    &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deconstruct&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now, if the definition of how to retrieve the metrics ever changes (it probably has already changed 😉), you will only have to change the &lt;code&gt;deconstruct&lt;/code&gt; method and not the 100 definitions of &lt;code&gt;data[0][0]&lt;/code&gt; that are all over the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice
&lt;/h2&gt;

&lt;p&gt;Now you can start practicing the curiosity described above to handle questions like...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what to put in an individual class?&lt;/li&gt;
&lt;li&gt;what extract from a class?&lt;/li&gt;
&lt;li&gt;what other classes to have along with it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But don't get too bugged down by &lt;a href="https://richstone.io/single-responsibility-principle-srp/the-fear-of-not-designing-your-code"&gt;The Fear of Not Designing&lt;/a&gt; while coding.&lt;/p&gt;

&lt;p&gt;With SRP in mind, these questions become more intuitive with time.&lt;/p&gt;

&lt;p&gt;In the next part, we'll look at how to tackle dependent classes and dependencies in general.&lt;/p&gt;




&lt;p&gt;Comments or questions? Just tweet it out to me! &lt;br&gt;
&lt;a href="https://twitter.com/intent/tweet?screen_name=RichStoneIO&amp;amp;ref_src=twsrc%5Etfw" data-lang="en"&gt;Tweet to @RichStoneIO&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to get new chunks and visuals in your inbox? Subscribe to the newsletter at &lt;a href="https://richstone.io"&gt;richstone.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>codequality</category>
      <category>architecture</category>
      <category>oop</category>
    </item>
    <item>
      <title>Where to host your images forever and ever?</title>
      <dc:creator>Rich Steinmetz</dc:creator>
      <pubDate>Thu, 27 Aug 2020 09:01:53 +0000</pubDate>
      <link>https://dev.to/richstoneio/where-to-host-your-images-forever-and-ever-2hf9</link>
      <guid>https://dev.to/richstoneio/where-to-host-your-images-forever-and-ever-2hf9</guid>
      <description>&lt;p&gt;Hey folks,&lt;/p&gt;

&lt;p&gt;Hosting images is something you don't think about when you start your first or second content project, but with time it can get interesting especially if you want to decouple yourself from third-party platforms as much as possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fullstack.coach/post/how-to-write-and-cross-post-your-markdown-content"&gt;In my post&lt;/a&gt; about how to write your content in markdown and open-source your blog I propose as one possibility to host your images on GitHub as part of your Integrated Writer Environment (IWE).&lt;/p&gt;

&lt;p&gt;Just push your images to GitHub and get the permalink of this file's particular commit state. As I understand, the only ways your image URLs will be lost are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You remove the according repository or branch&lt;/li&gt;
&lt;li&gt;You remove the repository&lt;/li&gt;
&lt;li&gt;GitHub dies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the same time, cloudinary seems a great place to have your stuff on too, given their API and general capabilities.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What do you think of the GitHub hosting approach?&lt;/li&gt;
&lt;li&gt;Where do you host your images forever and ever?&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>discuss</category>
      <category>writing</category>
    </item>
    <item>
      <title>How to Write &amp; Cross Post your Markdown Content</title>
      <dc:creator>Rich Steinmetz</dc:creator>
      <pubDate>Tue, 25 Aug 2020 17:57:15 +0000</pubDate>
      <link>https://dev.to/richstoneio/how-to-write-cross-post-your-markdown-content-pno</link>
      <guid>https://dev.to/richstoneio/how-to-write-cross-post-your-markdown-content-pno</guid>
      <description>&lt;p&gt;This is your &lt;em&gt;Ultimate Guide&lt;/em&gt; that proposes a solution to write your blog in markdown and to cross post it to different platforms. Here you will find tips on how to set up your IWE (Integrated Writer's Environment) and even a few goodies on marketing as well as on content creation.&lt;/p&gt;

&lt;p&gt;I warn you, this is a monstrous piece of content, so here's the rough outline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Some cross posting, SEO &amp;amp; hosting theory&lt;/li&gt;
&lt;li&gt;Markdown writing tips (Integrated Writer Environment)&lt;/li&gt;
&lt;li&gt;Content distribution
GitHub
Webflow
dev.to
Medium
codementor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By the way, the original title of this post was:&lt;/p&gt;

&lt;h2&gt;
  
  
  The Perfect Setup to Write your Software Developer Blog Content in Markdown and CrossPost it to Webflow, dev.to, GitHub, Medium &amp;amp; codementor
&lt;/h2&gt;

&lt;p&gt;However, this one was a bit over the &lt;a href="https://www.mheroes.com/that-blog-title-is-too-long-are-you-counting/"&gt;recommended 60 max. chars&lt;/a&gt; for blog titles...&lt;/p&gt;

&lt;p&gt;From this longer title, you'll see that this post will be of special interest to you if you use webflow to host your blog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And&lt;/strong&gt; if you have some sort of a software developer or technical blog content since we go deeply into things like code syntax highlighting proper hosting, and developer-focused content platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Or&lt;/strong&gt; maybe you just ❤️ markdown?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Or&lt;/strong&gt; you'd like to open source your blog on GitHub too?&lt;/p&gt;

&lt;p&gt;By the way, I just always wanted to write that something's an &lt;em&gt;"Ultimate Guide"&lt;/em&gt;, but actually, it's just a bunch of paragraphs. It will be probably an eternal WIP, considering all the platforms and different tastes involved. If you are a happy person, i.e. you are reading this on its original place of spawning (&lt;a href="https://fullstack.coach/post/how-to-write-and-cross-post-your-markdown-content"&gt;fullstack.coach&lt;/a&gt;) or in the post's very core root on &lt;a href="https://github.com/RichStone/content/blob/content/fullstack.coach/write-markdown-distribute-everywhere.md"&gt;Github&lt;/a&gt; (YOU NERD!) or on dev.to, then you will always have the most up to date version of it. Congrats!🎉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In case you start to wonder now: This article is published on all the mentioned platforms with as much automation as currently possible. The original article was published on &lt;a href="https://fullstack.coach/post/how-to-write-and-cross-post-your-markdown-content"&gt;fullstack.coach&lt;/a&gt; and then a few days later, after Google has done its dirty indexing stuff, on all the other platforms including some best practices and canonical URLs. Here you will find out how in fullest of detail!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why cross post your content at all
&lt;/h2&gt;

&lt;p&gt;If you are in the beginning with your blog, writing can feel lonely. Especially if you took the hard route and decided to self-host your blog, as opposed to using a blogging platform like dev.to or Medium, you will lack essential engagement and feedback which are crucial to nurturing your writing and motivation. Additionally, potential readers won't ever get to know about the useful things you are talking about :/&lt;/p&gt;

&lt;p&gt;This is why I propose to go out there and make your content as visible as possible on different platforms, especially in the beginning.&lt;/p&gt;

&lt;p&gt;But how do you keep your posts &lt;strong&gt;consistent on the different platforms&lt;/strong&gt;? What if you have a badass blog post that you want to &lt;strong&gt;extend or update over time&lt;/strong&gt;? What if you want to make your blog &lt;strong&gt;open source&lt;/strong&gt; so that your content becomes a community effort? How do you keep SEO happy? And probably the most important question, how do you keep your &lt;strong&gt;writing in the beloved markdown&lt;/strong&gt;??&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter CrossPost 🔮
&lt;/h2&gt;

&lt;p&gt;CrossPost is a tool that I wrote on some occasional free time slots. Like a magic ball, it's intended to mystically solve some of the issues above. At the moment, it has great capabilities to let you write markdown in your favorite editor and then (almost) automatically publish your articles on webflow as well as dev.to.&lt;/p&gt;

&lt;p&gt;Medium and codementor don't have public APIs for publishing articles but I will outline how to make your life easier if you decide to go the extra mile to publish there too. In the end, you can't be sure where your best audience will be unless you try them all out.&lt;/p&gt;

&lt;p&gt;I am open to integrating new platforms with CrossPost or describing them here in more depth, feel free to suggest anything or fire up a pull request!&lt;/p&gt;

&lt;h2&gt;
  
  
  Theoretical Prerequisites
&lt;/h2&gt;

&lt;p&gt;Let's talk some serious stuff first so that we have a common standpoint when we speak about systematic cross-posting.&lt;/p&gt;

&lt;h3&gt;
  
  
  content consistency
&lt;/h3&gt;

&lt;p&gt;Unless you are a daily news agency, you'll probably want to write so-called pillar content. That is to say, content that stays relevant over long periods. This type of content, your guides and tutorials and evergreen stories, sometimes, needs updates and upgrades!&lt;/p&gt;

&lt;p&gt;That's very painful if you always have to do it manually on all platforms. Those magic platforms that offer a public API are the good guys who give you the possibility to automate your content updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  canonical URLs
&lt;/h3&gt;

&lt;p&gt;Google &amp;amp; Co. do not like the same content on different platforms and hosts. The canonical URL is one way to tell Google the original source of the content. You set it once, e.g. in the head of the HTML page where your duplicate content lives and everyone's happy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fullstack.coach/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But I guess Google will be able to &lt;a href="https://support.google.com/webmasters/answer/139066?hl=en&amp;amp;ref_topic=6080547"&gt;explain it in more detail&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  self-hosting a blog
&lt;/h3&gt;

&lt;p&gt;With self-hosting, I don't mean you need to deploy your blog on a Linux server. I mean owning your content more than you would do at dev.to or Medium.&lt;/p&gt;

&lt;p&gt;You own your content more, as soon as you use a platform that allows you to provide additional content in other formats that could interest your readers and if you can place a newsletter subscription somewhere.&lt;/p&gt;

&lt;p&gt;Ultimately, if you "own" your content space, at least for a bit, you'll be able to turn on some ads in case you become a traffic magnet at some point (although I wouldn't go with anything else than a trusted platform like &lt;a href="https://www.carbonads.net/"&gt;carbonads&lt;/a&gt;, especially with a developer blog).&lt;/p&gt;

&lt;p&gt;You might find dev.to, Medium and codementor handy now but you won't be able to do any of the above with them later.&lt;/p&gt;

&lt;p&gt;In this context, we can consider platforms like WordPress already self-hosted, because you own it enough. I can't cope with the plugin environment of WordPress which is also the reason why I actively advise for a &lt;a href="https://www.alioned.com/post/webflow-for-developers-my-personal-experience-building-our-agency-website-on-webflow"&gt;developer-friendly alternative that I use myself&lt;/a&gt;: Webflow (&lt;a href="https://webflow.com/?rfsn=4246649.252ab0&amp;amp;utm_medium=affiliate"&gt;affiliate 🤩 link&lt;/a&gt;).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Congratulations 🎉 We've learned a ton about what I think I understand about some blog marketing topics, so now it's time for dirty hands-on work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  IWE - Integrated Writer Environment
&lt;/h2&gt;

&lt;p&gt;Every piece of art starts with an atelier or workshop. This is how my optimal writer atelier looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;as distraction-free as possible&lt;/li&gt;
&lt;li&gt;... but simultaneously supportive with grammar and style&lt;/li&gt;
&lt;li&gt;markdown-friendly&lt;/li&gt;
&lt;li&gt;format-friendly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Writing directly in Grammarly will probably make you the Hemingway of developer blogs, but actually, it won't. I find it very destructive when the all-knowing and all-mighty Grammarly is throwing grammar and orthography errors at me on every third word that I'm bringing to life...&lt;/p&gt;

&lt;p&gt;It's not a secret that especially the first draft should be written in some kind of flow that reflects your own thoughts and style. That's why my writing and editing routine looks something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;write the &lt;a href="http://www.debbiereberwritingcoach.com/the-art-of-the-shitty-first-draft-why-and-how-to-write-it-2/"&gt;shitty first draft&lt;/a&gt; in VSCode
Completely distraction-free&lt;/li&gt;
&lt;li&gt;full proof-read and edit not earlier as the next day
Now, turn on the Grammarly plugin inside VSCode&lt;/li&gt;
&lt;li&gt;Another edit sometime later on the target platform
You'll have another fresh look at the final format of your writing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Checking your spelling and grammar with Grammarly can be tricky, especially if you are writing in rich text formats since copy/pasting &lt;del&gt;can&lt;/del&gt; will mess up your format.&lt;/p&gt;

&lt;p&gt;The Grammarly app seems to work fine with copy-pasting markdown. But there is also a plugin for VSCode so that you don't have to leave your editor ever 🤓. You've got to be a bit patient with this plugin sometimes, though. Try it out!&lt;/p&gt;

&lt;p&gt;You will also install the markdownlint plugin so that you are always kept up to date about any issues you introduce to your beautiful markdown files by chaotically typing things.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OMYRTgLx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://raw.githubusercontent.com/RichStone/content/0d2fd292c648ab85c7504ab08ba4574cf67d4450/fullstack.coach/images/write-markdown-distribute-everywhere/typing-cat.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OMYRTgLx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://raw.githubusercontent.com/RichStone/content/0d2fd292c648ab85c7504ab08ba4574cf67d4450/fullstack.coach/images/write-markdown-distribute-everywhere/typing-cat.gif" alt="typing cat gif" width="220" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A super cool feature of blogging in VSCode with markdownlint are links and images.&lt;/p&gt;

&lt;p&gt;I would hate to interrupt... (Wow that's scary, as I wrote the word "interrupt" my wife called to ask me about whether I've bought some corn 🌽) ...interrupt the writing flow to search for some links or to upload some images into the cloud. You can just write your markdown like this in markdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Never know where that damn (&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;affiliate 🤩 link&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;)&lt;/span&gt; is,
so, I just procrastinate with it, until the final edit.

Sometimes, I also don't like adding pictures on the fly,
especially if I have to upload them first, so,
in all agility, I do this:

IMAGE TITLE - markdownlint does not appreciate this:
&lt;span class="p"&gt;![](&lt;/span&gt;&lt;span class="sx"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So that in the end, it looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--szThLNQ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/RichStone/content/blob/content/fullstack.coach/images/write-markdown-distribute-everywhere/MARKDOWNLINT%2520VALIDATION.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--szThLNQ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/RichStone/content/blob/content/fullstack.coach/images/write-markdown-distribute-everywhere/MARKDOWNLINT%2520VALIDATION.png%3Fraw%3Dtrue" alt="markdownlint validation example" width="880" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is impossible to miss on your final edit, no matter how late or early it is that I'm writing this stuff (and yeah, I missed lots of them in the past). It's a fail-safe system :troll: (even better: For the next version of CrossPost, I plan an automation where you will only need to add the local path to VSCode. WIN-WIN.)&lt;/p&gt;

&lt;p&gt;Or even better, use some HTML in your markdown, like: &lt;code&gt;&amp;lt;img alt="I'll add this picture after the 'holidays'🤭"&amp;gt;&lt;/code&gt;. If you ever publish your content before the holidays, there will be the classic broken picture image with your alt description.&lt;/p&gt;

&lt;p&gt;Take whatever you prefer.&lt;/p&gt;

&lt;p&gt;Another thing I like is the 80 character max limit for my writing in markdown but I need the process automated. I tried the VSCode Rewrap plugin, but it created some weird newlines that were displayed in dev.to and webflow in an ugly way. So for now, I'm OK writing everything strung together. VSCode's soft wrap still lets me write and watch the content conveniently.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Huh, this was a wild IWE ride. Since you are all set up with your markdown and Integrated Writer Environment now, let's bash your content out to the different spaces and places 🚀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  GitHub
&lt;/h2&gt;

&lt;p&gt;Especially if you are a developer, GitHub might be a very interesting platform for your content. I use GitHub for various reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;it makes collaboration on content potentially easier&lt;/li&gt;
&lt;li&gt;it lets me open-source my content to share the authorship with others&lt;/li&gt;
&lt;li&gt;it lets me version control my content&lt;/li&gt;
&lt;li&gt;it supports markdown&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Make sure you don't have your content in the master branch of your repository since these are indexed by Google and there is no technical possibility, that I'm aware of, to set a canonical URL in GitHub for the master repo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How I did it for this post: I wrote the post in a separate branch and went through the well-known developer process:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~ git add &lt;span class="nb"&gt;.&lt;/span&gt;
~ git commit &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="s2"&gt;"Add awesome post"&lt;/span&gt;
~ git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I have a &lt;a href="https://github.com/RichStone/content"&gt;GitHub repository&lt;/a&gt; where I store all my published content in the &lt;code&gt;content&lt;/code&gt; branch. As mentioned, you shouldn't have it in the &lt;code&gt;master&lt;/code&gt; branch. Otherwise, you risk getting ranked down by Google &amp;amp; Co. because of duplicate content.&lt;/p&gt;

&lt;p&gt;By the way, using GitHub for your content, could also be a way to host your pictures (which is always a big issue: How and where do you keep your pictures? IN ONE PLACE... FOREVER!?!?). Just make sure you use the &lt;a href="https://docs.github.com/en/github/managing-files-in-a-repository/getting-permanent-links-to-files"&gt;permalink to the image&lt;/a&gt; after you've uploaded it to GitHub! As I understand it, the image links will only break in one case: if, somewhen, you'll decide to get rid of your &lt;code&gt;content&lt;/code&gt; branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  .github.io
&lt;/h2&gt;

&lt;p&gt;Maybe you'd like to host your blog completely on &lt;code&gt;bloggo.github.io&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;There are many different approaches and I don't host on &lt;code&gt;.github.io&lt;/code&gt; at the moment myself, so there are no concrete CrossPost automations for now. But let me know if you'd be interested in something like this and I will see if I can build a solution there :)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How I did it for this post: I don't use .github.io for hosting yet...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Webflow
&lt;/h2&gt;

&lt;p&gt;When it comes to a full stack developer portfolio or blog, my take is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't fiddle too much with your portfolio - Your resources are better spent on real web applications!&lt;/li&gt;
&lt;li&gt;It has still to look well-designed - By default!&lt;/li&gt;
&lt;li&gt;It has to be low maintenance - And still fully controllable!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is what I get from webflow (except, if you don't count the times when I build custom integrations for it 😅).&lt;/p&gt;

&lt;p&gt;I'm writing blogs since 2011 and I've used tons of different approaches and platforms already(WordPress, Wix, Jimdo, a public forum, and Jekyll on my own server). Webflow just gets the best parts of all of them for me at this stage of my technical understanding. However, you should not touch it, if you are afraid of learning curves or pricing. For no-budget blogs go with a &lt;code&gt;.github.io&lt;/code&gt; hosting. For low learning curves go to WordPress (but don't tell afterward that I haven't warned about the off-turn plugin ecosystem!)&lt;/p&gt;

&lt;p&gt;There are some more tips in the pipeline on how webflow was useful to my portfolio page, so keep tuned! 📻&lt;/p&gt;

&lt;p&gt;If you like the idea of webflow already, make sure to register &lt;a href="https://webflow.com/?rfsn=4246649.252ab0&amp;amp;utm_medium=affiliate"&gt;via my link&lt;/a&gt;: and let me know if you did so (You'll be honored with big kudos :))). At the very least, being a developer, you should like this slogan:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Design and develop at the same time."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🚀
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;How I did it for this article: I wrote the article in markdown and sent it to webflow via CrossPost&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anyway, webflow does not support markdown by default. That's a major issue if you are a badass developer who uses code to write code about code 💪. There are workarounds and hacks to make it work. I tried some of them and they all came with major drawbacks that made it unusable for me in the end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This was one of the reasons for me to create &lt;a href="https://github.com/RichStone/crosspost-markdown"&gt;CrossPost&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The basic idea of CrossPost is to have a CLI tool to &lt;strong&gt;send and update your markdown content&lt;/strong&gt; to your webflow blog (and other platforms) with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# go to your article's location
~ cd content/
# send your markdown to webflow
~ crosspost article your-amazing-writing.md --to webflow

your-amazing-writing.md found in your current directory! 👍
✅ webflow API key is present
✅ webflow collection ID is present
✅ webflow Articles URL is configured👍
✅ devto is configured👍
   ____                              ____                  _               
  / ___|  _ __    ___    ___   ___  |  _ \    ___    ___  | |_             
 | |     | '__|  / _ \  / __| / __| | |_) |  / _ \  / __| | __|            
 | |___  | |    | (_) | \__ \ \__ \ |  __/  | (_) | \__ \ | |_   _   _   _ 
  \____| |_|     \___/  |___/ |___/ |_|      \___/  |___/  \__| (_) (_) (_)

...to all configured platforms!🚀
Could not find your-amazing-writing.md.json
Creating your-amazing-writing.md.json...
Your article's individual configurations will now be stored in the your-amazing-writing.md.json ✅
You will need to keep them together for consistency.
Published a new article on webflow! 🎉🎉🎉
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to update your article on all platforms, you can just do again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~ crosspost article your-amazing-writing.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All you need to do is to install CrossPost it on your computer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You will need NPM installed on your computer.&lt;/span&gt;
~ npm &lt;span class="nb"&gt;install &lt;/span&gt;crosspost &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to configure CrossPost once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~ crosspost configure &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration steps &amp;amp; caveats with Webflow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before publishing on webflow&lt;/strong&gt;, you'll need to set up CrossPost with webflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~ crosspost configure &lt;span class="nt"&gt;--only&lt;/span&gt; webflow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's just a few steps actually if you make use of the &lt;a href="https://developers.webflow.com/#authentication"&gt;webflow CMS&lt;br&gt;
API&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ Get webflow API key&lt;/li&gt;
&lt;li&gt;✅ Get site ID
With the API key, you can get your site IDs&lt;/li&gt;
&lt;li&gt;✅ Get collection ID of your content CMS collection
With your site ID, you can get the collection ID of your blog content&lt;/li&gt;
&lt;li&gt;✅ Add the full URL to your webflow articles
E.g. the base URL of the &lt;a href="https://fullstack.coach"&gt;fullstack.coach&lt;/a&gt; content is &lt;code&gt;https://fullstack.coach/post&lt;/code&gt;(don't ask why 😅)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After everything went fine, your &lt;code&gt;crosspost configure&lt;/code&gt; output should look something like this:&lt;br&gt;
&lt;/p&gt;

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

✅ webflow API key is present
✅ webflow collection ID is present
✅ webflow Articles URL is configured👍
✅ devto is configured👍

ℹ️ run &lt;span class="sb"&gt;`&lt;/span&gt;crosspost configure &lt;span class="nt"&gt;--help&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; to see all the specific options ℹ️
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add syntax highlighting to webflow
&lt;/h3&gt;

&lt;p&gt;You will need to add something like prism to enable syntax highlighting. This is how I quickly did it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a stylesheet your collection's custom head code:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/prismjs@1.20.0/themes/prism.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add the prism javascript and autoloader to your end of body collection's custom code:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/prismjs@1.20.0/components/prism-core.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/prismjs@1.20.0/plugins/autoloader/prism-autoloader.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can have a different theme, by simply checking out the different default themes on jsdeliver.net or configure your own theme over at &lt;a href="https://prismjs.com/download.html"&gt;prismjs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To figure this out, I used the &lt;a href="https://prismjs.com/#basic-usage-cdn"&gt;instructions provided by prism&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All the Prerequisites are now fixed, let's look at what to do after you've successfully run &lt;code&gt;crosspost article&lt;/code&gt;. Let me know if you get stuck on any of the configuration steps!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;After publishing on webflow&lt;/strong&gt; for the first time, your articles will be in Staged mode. You will still need to make adjustments like setting your custom fields, images, a post summary, etc. (integrations for that are on the &lt;a href="https://github.com/RichStone/crosspost-markdown/issues"&gt;wishlist in GitHub&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;When you update your posts, CrossPost will only update your article body and your title (if you changed any of them). If you'd like to have more granular control, we'll need to issue some Pull Requests to CrossPost ;)&lt;/p&gt;

&lt;p&gt;Other than that, if you update an existing post, it will be in staged mode first. This way you can still review your changes before publishing them to your live environment (a &lt;code&gt;--live&lt;/code&gt; tag to publish directly to production is on the wishlist too).&lt;/p&gt;

&lt;p&gt;If you click inside the webflow editor of your published blog post text and then the "Save" button, &lt;strong&gt;webflow will mess up the formatting&lt;/strong&gt; because it will delete the HTML metadata that we've sent over with CrossPost. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't click inside your webflow blog post editor and then "Save"

&lt;ul&gt;
&lt;li&gt;If you publish with CrossPost, you can't make use of the webflow editor anymore to change your Rich Text blog post content (you still will be able to change other data inside the CMS view, like images, summary, authors, etc.)&lt;/li&gt;
&lt;li&gt;If you still did it by mistake, just republish from CrossPost, this will update the content with the correct HTML again (e.g. &lt;code&gt;~ crosspost article test.md&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;If you still make changes to your article content inside webflow, CrossPost will overwrite them with the contents of your markdown file on the next publish.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Once your article is on webflow, you might encounter weird behavior inside the webflow editor.

&lt;ul&gt;
&lt;li&gt;For example, I can't see the ordered list and unordered list items inside the editor, but it displays correctly in the published version. Since you want to keep your article writing outside of webflow anyway, it shouldn't be too big of a deal.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;The integration relies on you keeping to make updates to your articles via CrossPost.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;It's lots of stuff to keep in your head for the aftermath, but actually, it's simple: If you publish content with CrossPost, you don't touch the Rich Text Field inside webflow anymore and do all your future changes to the content via CrossPost. If you still do, it might mess up the format and you'd need to republish with CrossPost again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Add additional CSS to your content collection
&lt;/h3&gt;

&lt;p&gt;You may also want to add some extra CSS to your blog posts collection, e.g. to add some extra margins on headings and paragraphs (h1, h2, p tags, etc.). In my experience, the raw HTML headings looked a bit pressed together but adding CSS to a collection is done quickly in webflow so that you can add that premium whitespace that everyone's longing for so hard.&lt;/p&gt;

&lt;p&gt;Make sure your changes don't conflict with existing posts (if you have any).&lt;/p&gt;

&lt;p&gt;This is how my collection CSS kind of looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.heading-h1&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.heading-jumbo&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.heading-h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.heading-h3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.heading-h4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;overflow-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;break-word&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;word-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;break-word&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;-webkit-hyphens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;-ms-hyphens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;-moz-hyphens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;hyphens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;.8em&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ol&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;blockquote&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basically, I've just added some margins to the HTML elements. If you have a content-heavy site, you'd be doing this anyway. The word-wrap/hyphen stuff is, I think, webflow-specific: It's so that your layout does not get broken, especially on mobile, with big long heading titles...&lt;/p&gt;

&lt;p&gt;I also center images as a default, if you need anything vastly different, you can write HTML in your markdown file, give it a special class and then write the CSS class for it inside webflow. Dev.to will center them for you automatically, though.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wow, this was a lot of webflow stuff! The setup is not a pony ride, but after it's done there will be a new milestone in your writing productivity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  dev.to
&lt;/h2&gt;

&lt;p&gt;There is no place like dev.to for software developers and technical bloggers!&lt;/p&gt;

&lt;p&gt;Now, I could just copy-paste my beautiful markdown to dev.to and it would work. But that's very burdensome, especially considering that in VSCode I am so close to the terminal.&lt;/p&gt;

&lt;p&gt;But even more importantly, &lt;strong&gt;what happens if you want to update your content&lt;/strong&gt;? I don't know about you, but I want to write long-living content, guides, and tutorials. If they get outdated or corrected by your readers and reviewers, you'd probably want to make the changes as quickly as possible. For some articles, this can become a frequent thing to do. And now copy-pasta becomes really annoying, boring, untasty, and even dangerous.&lt;/p&gt;

&lt;p&gt;Your solution, again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# go to your article's location&lt;/span&gt;
~ &lt;span class="nb"&gt;cd &lt;/span&gt;content/
&lt;span class="c"&gt;# get your content out there&lt;/span&gt;
~ crosspost article your-amazing-writing.md &lt;span class="nt"&gt;--to&lt;/span&gt; devto
&lt;span class="c"&gt;# ... lots of cool output ...&lt;/span&gt;
CrossPost...
...to dev.to!🚀

Successfully updated your dev.to article.👍
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And again, to update your existing article on all platforms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~ crosspost article your-amazing-writing.md
&lt;span class="c"&gt;# ... lots of cool output ...&lt;/span&gt;
CrossPost...
...to all configured platforms!🚀

Updated your article 👍
Successfully updated your dev.to article.👍
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configurations and Caveats with dev.to
&lt;/h3&gt;

&lt;p&gt;As of now, with CrossPost your article will be published as a Draft. You will still need to log in and perform some additional configurations, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adding tags&lt;/li&gt;
&lt;li&gt;adding a header image&lt;/li&gt;
&lt;li&gt;switching the article from Draft to Published&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After that, CrossPost will update your content on every &lt;code&gt;~ crosspost article your-writing.md&lt;/code&gt; leaving any other meta information untouched.&lt;/p&gt;

&lt;p&gt;Please let me know if you'd like us to add more automated configurations like this inside CrossPost or feel free to issue a Pull Request, so we'd never have to leave the terminal again 😅&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How I did it on dev.to for this post: I already had my article up there for a while and used &lt;code&gt;~ crosspost article write-markdown-distribute-everywhere.md&lt;/code&gt; to update it together with the webflow article. When I felt good and ready about the webflow article I went up to dev.to and clicked that cool "Publish" button! 💪 Updates are easy, just doing &lt;code&gt;~ crosspost article write-markdown-distribute-everywhere.md&lt;/code&gt; again and again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  General CrossPost Caveats &amp;amp; Fun Facts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CrossPost will overwrite everything if you should ever add anything manually inside dev.to's or webflow's editor.&lt;/li&gt;
&lt;li&gt;When you publish with CrossPost, an additional configuration file gets created.

&lt;ul&gt;
&lt;li&gt;You'll need to store this file together with your posts to keep using CrossPost. Consistency can only be achieved if CrossPost knows about the article IDs on different platforms.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your post has to start with an h1 markdown title ('#') in the very first line of your .md file&lt;/strong&gt;. 

&lt;ul&gt;
&lt;li&gt;It's a useful markdownlint convention and CrossPost also relies on it to set the title of the posts correctly.&lt;/li&gt;
&lt;li&gt;The titles from the first line of your file will be automatically before sending them to webflow or dev.to. &lt;/li&gt;
&lt;li&gt;Those titles will be set via the API so that you don't have the title duplicated as an h1 element inside your article's body!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Your markdown files will be converted with &lt;a href="https://github.com/showdownjs/showdown"&gt;showdown&lt;/a&gt; to &lt;a href="https://docs.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax"&gt;GitHub flavored markdown&lt;/a&gt; before pushing up to space 🚀.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more technical details on how CrossPost works, current issues and planned features, check out the &lt;a href="https://github.com/RichStone/crosspost-markdown"&gt;GitHub repo&lt;/a&gt; or ping me with any doubts :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Medium
&lt;/h2&gt;

&lt;p&gt;I wouldn't say I despise Medium. But so many developers gave their lives to Medium. And still, in 2020, there is no syntax highlighting possible for code? Really?&lt;/p&gt;

&lt;p&gt;And that's just the bird crap on the tip of the iceberg of Medium's crimes. 🐧&lt;/p&gt;

&lt;p&gt;But they do allow for a canonical URL and article imports which did positively surprise me, really. And they have users, tons of readers, potentially even people that might find usefulness or joy in your content.&lt;/p&gt;

&lt;p&gt;So, if you still want to be seen there, we'll need to add some additional steps to our ignorance and do some manual cross posting work:&lt;/p&gt;

&lt;p&gt;...first, you'll need to import your post via &lt;a href="https://medium.com/p/import"&gt;Medium's import function&lt;/a&gt;...&lt;/p&gt;

&lt;p&gt;...next, go through your article and watch out for formatting issues...&lt;/p&gt;

&lt;p&gt;...and lastly, you might want to make your code syntax highlighted with something like this &lt;a href="https://medium.com/@Maluen0/how-to-add-code-highlighting-in-medium-articles-without-leaving-the-editor-8f24f5a88d28"&gt;tool&lt;/a&gt;. (Which I obviously haven't tried yet...)&lt;/p&gt;

&lt;p&gt;Medium will set the &lt;a href="https://help.medium.com/hc/en-us/articles/360033930293-Set-a-canonical-link"&gt;canonical link for imported articles automatically&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How I did it for this post: I struggled, as any other developer does too… First it looked good and I just saw some redundant newlines. But then all the code blocks were messed up completely, some codeblocks were missing, some lists (when they contained links) were missing too. Wow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  codementor
&lt;/h2&gt;

&lt;p&gt;Codementor - last and probably &lt;strong&gt;least&lt;/strong&gt;, since the codementor blogging space has not won any popularity awards yet. Please, correct me if I'm wrong.&lt;/p&gt;

&lt;p&gt;It has a nice markdown editor, but I don't have the feeling of big blogging activity on the platform yet. In any case, an additional pair of eyes at your content won't hurt, and you will find that you are in the right place if you have some fitting coaching, mentoring, or problem-solving articles going down! With the right content, a codementor article will go kind of viral too!&lt;/p&gt;

&lt;p&gt;As of now, codementor's API doesn't give a damn about POSTing your article's there in an automated way so that you will actually (even at this developer-focused place) need to take the mouse in your hands and click around (sad and boring, I know).&lt;/p&gt;

&lt;p&gt;I've had an email chat with the nice codementor in-charge folks, and these are your options:&lt;/p&gt;

&lt;h3&gt;
  
  
  codementor option 1
&lt;/h3&gt;

&lt;p&gt;Codementor has an &lt;a href="https://www.codementor.io/posts/import"&gt;import feature&lt;/a&gt;, which will set the canonical URL automatically but could theoretically mess up your format.&lt;/p&gt;

&lt;h3&gt;
  
  
  codementor option 2
&lt;/h3&gt;

&lt;p&gt;Having written your blog in markdown already, you could copy it and then paste it into codementor's markdown editor. The only issue is that you'd need to go the extra mile and hit up the codementor support, so that they add the canonical URL manually, which is not only weird but can also take a few days... (Thus, if you have more than 1 article, they recommend sending them over all your articles at once so that their workload and your waiting time goes down ;)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How I did it for this post: I went the import route, and the content looks fine. Like Medium, it looks at first as if there were redundant newlines, but the endresult seems actually to be perfect out-of-the-box. And guess what, code syntax is included! Good work codementors!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Your Custom Platform
&lt;/h2&gt;

&lt;p&gt;Are you using WordPress, strapi, GitLab, or other platforms with APIs for your content?&lt;/p&gt;

&lt;p&gt;Let me know if you'd like them integrated with the IWE or with CrossPost and I can look into it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/RichStone/crosspost-markdown"&gt;CrossPost repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/RichStone/crosspost-markdown/issues"&gt;CrossPost wishlist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And now go let your content be seen! 🚀🚀🚀&lt;/p&gt;




&lt;p&gt;Images Attribution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Header Illustration by &lt;a href="https://stories.freepik.com/design"&gt;Freepik Stories&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Typing cat gif by &lt;a href="https://tenor.com/view/typing-laptop-cat-gif-5822667"&gt;tenor&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>writing</category>
      <category>tutorial</category>
      <category>showdev</category>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>Creating a Webflow &lt;-&gt; dev.to &lt;-&gt; GitHub cross-post integration tool 🚀</title>
      <dc:creator>Rich Steinmetz</dc:creator>
      <pubDate>Sat, 25 Jul 2020 13:51:26 +0000</pubDate>
      <link>https://dev.to/richstoneio/hello-world23-18kd</link>
      <guid>https://dev.to/richstoneio/hello-world23-18kd</guid>
      <description>&lt;h1&gt;
  
  
  Webflow Blog Integration
&lt;/h1&gt;

&lt;p&gt;Ease the creation of webflow blog posts for developers and cross&lt;br&gt;
posting across different channels.&lt;/p&gt;

&lt;h2&gt;
  
  
  We are testing 🔭 🧪 🔬
&lt;/h2&gt;

&lt;p&gt;I'm sorry you are seeing that because you shouldn't see this top-secret creation! With a bit of patience, you will have your integration at your fingertips soon ;)&lt;/p&gt;

&lt;p&gt;This test document is used to check the rendering on the different platforms. If you are seeing it, we most likely pushed it somewhere public&lt;br&gt;
by mistake 😬 Fail hard, fail fast, but fail!&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Have the source of truth in your own space at &lt;strong&gt;webflow&lt;/strong&gt;. Then automate or make&lt;br&gt;
it easier to cross-post at:&lt;/p&gt;

&lt;h2&gt;
  
  
  lists
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;dev.to&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;li&gt;codementor&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Minimal&lt;/li&gt;
&lt;li&gt;Viable&lt;/li&gt;
&lt;li&gt;Product
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;this is awezzzommme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And of course, the &lt;code&gt;inline code&lt;/code&gt; is not different.&lt;/p&gt;

&lt;p&gt;We will manage it, though!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sigue, insist, persist!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's not a coincidence that we are &lt;a href="https://fullstack.coach/post/what-is-a-full-stack-developer-or-how-to-become-an-egg-laying-wool-milk-pig" rel="noopener noreferrer"&gt;Egg Laying Wool Milk Pigs&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F5ea830d684c5067b65e3cef4%2F5ee2543a19eb834da989837a_fpAh6_ClAjFU2GRv5ccwVZKPmHK5vs1Cggn78r_Gz898kv6zsV5--sdnVIATtN5la92fWAC4Dv5eZkheCGrKSOx7qiQ-5piHqNx-GaFYJDQLT1N5WHQhXYKIcD5eQNkufafsdslj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads-ssl.webflow.com%2F5ea830d684c5067b65e3cef4%2F5ee2543a19eb834da989837a_fpAh6_ClAjFU2GRv5ccwVZKPmHK5vs1Cggn78r_Gz898kv6zsV5--sdnVIATtN5la92fWAC4Dv5eZkheCGrKSOx7qiQ-5piHqNx-GaFYJDQLT1N5WHQhXYKIcD5eQNkufafsdslj.png" alt="Eierlegendewollmilchsau by Claire Adele"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>help</category>
    </item>
    <item>
      <title>Cross post to dev.to from Webflow or Google Docs - How to handle formatting?</title>
      <dc:creator>Rich Steinmetz</dc:creator>
      <pubDate>Mon, 29 Jun 2020 21:15:34 +0000</pubDate>
      <link>https://dev.to/richstoneio/cross-post-to-dev-to-from-webflow-or-google-docs-how-to-handle-formatting-3ikc</link>
      <guid>https://dev.to/richstoneio/cross-post-to-dev-to-from-webflow-or-google-docs-how-to-handle-formatting-3ikc</guid>
      <description>&lt;p&gt;Hey folks! &lt;/p&gt;

&lt;p&gt;I really would like to share my work with the dev.to community because I think I can solve a problem someone has here or there ;) &lt;/p&gt;

&lt;p&gt;However, after quite some research, I'm kind of stuck with how to painlessly cross post my articles to dev.to.&lt;/p&gt;

&lt;p&gt;I host my developer blog on webflow and write my stuff in Google Docs.&lt;/p&gt;

&lt;p&gt;Don't get me wrong, I love markdown, but that's not my flow as of now.&lt;/p&gt;

&lt;p&gt;Things I've tried and/or thought of:&lt;/p&gt;

&lt;h2&gt;
  
  
  RSS importer
&lt;/h2&gt;

&lt;p&gt;The RSS importer does not work properly (just article snippets and formatting wrong).&lt;/p&gt;

&lt;h2&gt;
  
  
  Copy Pasta
&lt;/h2&gt;

&lt;p&gt;From the Gdocs and the webflow editors I can flawlessly copy-paste to Medium(🍵). But on dev.to the RTF stuff is kindly ignored, which leaves me with an unbearable task of editing the format, the links, the pictures...&lt;/p&gt;

&lt;h2&gt;
  
  
  Post a short summary of the post with the link
&lt;/h2&gt;

&lt;p&gt;😒&lt;/p&gt;

&lt;h2&gt;
  
  
  Highly Automated Pipeline
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Write everything in markdown in VSCode checked by the VSCode Grammarly plugin. &lt;/li&gt;
&lt;li&gt;Push to GitHub&lt;/li&gt;
&lt;li&gt;GitHub action picks it up and sends it to Webflow/dev.to API (I wouldn't be able to post to Medium then without problems, but I can actually live without Medium TBH)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, there are many wonderous questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How well will the platforms handle the markdown body? &lt;/li&gt;
&lt;li&gt;How to handle the pain of having to pre-upload all pictures?&lt;/li&gt;
&lt;li&gt;How do I handle updating the posts? (different GitHub actions with different requests?)&lt;/li&gt;
&lt;li&gt;etc etc&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scraping
&lt;/h2&gt;

&lt;p&gt;I mean, the HTML is up there: &lt;a href="https://fullstack.coach/content-hub"&gt;fullstack.coach&lt;/a&gt;...&lt;/p&gt;

&lt;p&gt;Maybe then... &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scrape it&lt;/li&gt;
&lt;li&gt;Push it through a markdown parser &lt;/li&gt;
&lt;li&gt;Send it to dev.to&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(but again all the questions from the previous section... and probably even more...)&lt;/p&gt;




&lt;p&gt;Before I throw myself into &lt;strong&gt;highly automated pipelines&lt;/strong&gt; or &lt;em&gt;scraping&lt;/em&gt;, which both sound like fun and time consumption: &lt;/p&gt;

&lt;p&gt;Am I overthinking or is there maybe a better path that I am missing?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>meta</category>
    </item>
  </channel>
</rss>
