<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dev Diaries</title>
    <description>The latest articles on Forem by Dev Diaries (@devdiaries).</description>
    <link>https://forem.com/devdiaries</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%2F161574%2F66c19c0b-5ffa-4d1a-b555-e417464d81a0.jpg</url>
      <title>Forem: Dev Diaries</title>
      <link>https://forem.com/devdiaries</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devdiaries"/>
    <language>en</language>
    <item>
      <title>My Senior Dev - AI-Powered Code Reviews Built for Power Users</title>
      <dc:creator>Dev Diaries</dc:creator>
      <pubDate>Tue, 09 Dec 2025 22:27:35 +0000</pubDate>
      <link>https://forem.com/devdiaries/my-senior-dev-ai-powered-code-reviews-built-for-power-users-mb3</link>
      <guid>https://forem.com/devdiaries/my-senior-dev-ai-powered-code-reviews-built-for-power-users-mb3</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mux"&gt;https://dev.to/challenges/mux&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What I Built
&lt;/h1&gt;

&lt;p&gt;My Senior Dev is a webapp App that provides deep, multi-perspective &lt;br&gt;
code reviews using specialized AI agents. It optimizes for efficiency, thoroughness and insight&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;designed specifically for power users who need comprehensive
analysis of critical code changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It uses three specialized AI agents working in concert:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude for security vulnerability analysis&lt;/li&gt;
&lt;li&gt;GPT-4 for code quality and architectural review&lt;/li&gt;
&lt;li&gt;GPT-4 synthesis for combining perspectives into actionable insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of surface-level suggestions, you get the kind of thorough,&lt;br&gt;
multi-angle code review that senior developers provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional tools:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Consider using const instead of let on line 42"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;My Senior Dev:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Security: This endpoint lacks rate limiting (DoS 
risk) 
# Code Quality: Database transaction isn't properly scoped (race 
conditions)  
# Architecture: Violates repository pattern from auth-service.ts
# Recommendation: Add rate limiting, wrap in transaction, move to 
UserRepository"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;My Pitch Video&lt;/p&gt;

&lt;p&gt;

&lt;iframe src="https://player.mux.com/7BE4xAgQL02eHoFZjqM00GCmnVhuofRE8hllrHlp99Qcs" width="710" height="399"&gt;
&lt;/iframe&gt;



&lt;/p&gt;

&lt;p&gt;Demo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://myseniordev.com/demo/" rel="noopener noreferrer"&gt;https://myseniordev.com/demo/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Full experience: &lt;a href="https://myseniordev.com/?token=msd-beta-2024-invite" rel="noopener noreferrer"&gt;https://myseniordev.com/?token=msd-beta-2024-invite&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Story Behind It
&lt;/h2&gt;

&lt;p&gt;As a senior developer, I spent hours on thorough reviews for complex&lt;br&gt;
PRs - checking security, architecture, performance, and&lt;br&gt;
maintainability. While AI tools were getting good at surface&lt;br&gt;
suggestions, none provided the multi-perspective, comprehensive &lt;br&gt;
analysis that complex changes actually need.&lt;/p&gt;

&lt;p&gt;My Senior Dev fills this gap. When you have a critical database&lt;br&gt;
migration, security-sensitive auth flow, or complex algorithm, you want&lt;br&gt;
more than "use const instead of let." You want to be able to chat with an AI persona&lt;br&gt;
on a file by file, line by line basis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Highlights
&lt;/h2&gt;

&lt;p&gt;Multi-Agent Architecture: Specialized agents with specific expertise&lt;br&gt;
rather than one general-purpose AI.&lt;/p&gt;

&lt;p&gt;Configurable Depth: Teams can tune intensity - staff_engineer for deep&lt;br&gt;
architectural review, junior_engineer for standard checks,&lt;br&gt;
product_manager for business impact.&lt;/p&gt;

&lt;p&gt;GitHub-Native: Seamless webhook integration, bi-directional comment&lt;br&gt;
sync, three feedback types (line-specific, file-level, PR-wide).&lt;/p&gt;

&lt;p&gt;Power User Features: Chat interface with agents, historical trend&lt;br&gt;
analysis, custom per-repo instructions, selective triggering for&lt;br&gt;
critical PRs only.&lt;/p&gt;

&lt;p&gt;Tech Stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: Node.js, TypeScript, Hono, Drizzle ORM, PostgreSQL&lt;/li&gt;
&lt;li&gt;Frontend: React, TypeScript, Tailwind CSS&lt;/li&gt;
&lt;li&gt;AI: Anthropic API (Claude), OpenAI API (GPT-4)&lt;/li&gt;
&lt;li&gt;Infrastructure: GitHub Actions, Pulumi IaC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What Makes It Unique&lt;/p&gt;

&lt;p&gt;It is intended to work with other AI review tools but is optimized for the human&lt;br&gt;
to review, making it fast and fun to review code. With all of the AI code being produced&lt;br&gt;
engineers time will be spent more and more reviewing AI produced code. The tools&lt;br&gt;
to review code should be optimized for a human to be able to understand the code&lt;br&gt;
and leverage AI in a complimentary way to assist in that understanding. &lt;/p&gt;

&lt;p&gt;In addition the interface should make it dead simple and fast to go through&lt;br&gt;
the files of a pull request.&lt;/p&gt;

&lt;p&gt;The future isn't replacing human judgment - it's augmenting &lt;br&gt;
expert-level analysis and making senior engineer insights consistently&lt;br&gt;
available for every critical code change.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>muxchallenge</category>
      <category>showandtell</category>
      <category>video</category>
    </item>
    <item>
      <title>PRPM - The Universal Package Manager for AI Prompts</title>
      <dc:creator>Dev Diaries</dc:creator>
      <pubDate>Tue, 09 Dec 2025 22:05:42 +0000</pubDate>
      <link>https://forem.com/devdiaries/prpm-the-universal-package-manager-for-ai-prompts-36cf</link>
      <guid>https://forem.com/devdiaries/prpm-the-universal-package-manager-for-ai-prompts-36cf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mux"&gt;DEV's Worldwide Show and Tell Challenge Presented by &lt;br&gt;
Mux&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  What I Built
&lt;/h1&gt;

&lt;p&gt;PRPM (Prompt Package Manager) is npm for AI coding assistants. It's a universal package manager that lets developers install, share, and convert AI prompts, rules, skills, and agents across different AI coding tools like Claude Code, Cursor, Windsurf, GitHub Copilot, Continue, Kiro, and more.&lt;/p&gt;

&lt;p&gt;Instead of manually copying prompt files between projects or being locked into one AI tool's ecosystem, PRPM&lt;br&gt;
provides a single command to install packages that work everywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx prpm &lt;span class="nb"&gt;install&lt;/span&gt; @anthropic/typescript-best-practices &lt;span class="nt"&gt;--as&lt;/span&gt; cursor
npx prpm &lt;span class="nb"&gt;install&lt;/span&gt; @vercel/nextjs-expert &lt;span class="nt"&gt;--as&lt;/span&gt; claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  My Pitch Video
&lt;/h1&gt;

&lt;p&gt;

&lt;iframe src="https://player.mux.com/GrdHj5JAPQqOtODxd5rm012rTRW7bmNfZ5DgTXraaJAE" width="710" height="399"&gt;
&lt;/iframe&gt;



&lt;/p&gt;

&lt;h1&gt;
  
  
  Demo
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Registry: &lt;a href="https://prpm.dev" rel="noopener noreferrer"&gt;https://prpm.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://docs.prpm.dev" rel="noopener noreferrer"&gt;https://docs.prpm.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/pr-pm/prpm" rel="noopener noreferrer"&gt;https://github.com/pr-pm/prpm&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it now without installing:&lt;br&gt;
npx prpm search typescript&lt;br&gt;
npx prpm install @sanjeed5/typescript&lt;/p&gt;

&lt;h1&gt;
  
  
  The Story Behind It
&lt;/h1&gt;

&lt;p&gt;Every AI coding assistant has its own format for rules and instructions - Cursor uses .cursorrules, Claude Code uses&lt;br&gt;
 .claude/ directories, Windsurf uses .windsurfrules, Copilot uses .github/copilot-instructions.md. Developers were&lt;br&gt;
copy-pasting the same best practices between tools and projects, with no way to share or version them.&lt;/p&gt;

&lt;p&gt;I built PRPM because prompts are becoming as important as code dependencies. Just like npm revolutionized JavaScript&lt;br&gt;
 package sharing, PRPM creates an ecosystem where the community can publish, discover, and reuse AI coding&lt;br&gt;
knowledge.&lt;/p&gt;

&lt;p&gt;The "aha moment" was realizing that all these formats are fundamentally similar - they're just markdown with&lt;br&gt;
metadata. A universal converter could translate between them losslessly, letting one package work everywhere.&lt;/p&gt;

&lt;h1&gt;
  
  
  Technical Highlights
&lt;/h1&gt;

&lt;p&gt;Cross-Format Conversion Engine: PRPM parses each format into a canonical intermediate representation, then converts&lt;br&gt;
to any target format. This handles nuances like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursor's MDC frontmatter vs Claude's YAML frontmatter&lt;/li&gt;
&lt;li&gt;Different directory structures (.cursor/rules/ vs .claude/skills/)&lt;/li&gt;
&lt;li&gt;Format-specific features (Kiro's fileMatch patterns, Copilot's applyTo globs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Progressive Disclosure: When a target format doesn't natively support a package type (e.g., Cursor doesn't have&lt;br&gt;
"skills"), PRPM uses the emerging AGENTS.md standard to install packages in a format-agnostic way that still works.&lt;/p&gt;

&lt;p&gt;Integrity Verification: Packages are checksummed in prpm.lock to detect tampering, similar to npm's lockfile&lt;br&gt;
approach.&lt;/p&gt;

&lt;p&gt;Tech Stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript monorepo with Turborepo&lt;/li&gt;
&lt;li&gt;CLI built with Commander.js&lt;/li&gt;
&lt;li&gt;Registry API on Fastify + PostgreSQL&lt;/li&gt;
&lt;li&gt;Webapp on Next.js 15&lt;/li&gt;
&lt;li&gt;Deployed on AWS Elastic Beanstalk via Pulumi IaC&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>muxchallenge</category>
      <category>showandtell</category>
      <category>video</category>
    </item>
    <item>
      <title>Why and how to use collections in jekyll</title>
      <dc:creator>Dev Diaries</dc:creator>
      <pubDate>Wed, 05 Jun 2019 08:05:41 +0000</pubDate>
      <link>https://forem.com/devdiaries/why-and-how-to-use-collections-in-jekyll-4b89</link>
      <guid>https://forem.com/devdiaries/why-and-how-to-use-collections-in-jekyll-4b89</guid>
      <description>&lt;h2&gt;
  
  
  Why Use Collections?
&lt;/h2&gt;

&lt;p&gt;This site is built on Jekyll which we'll write more about later but essentially&lt;br&gt;
this site is built as a blog. We also have quite a few social media posts&lt;br&gt;
that we want to provide more content about on our website. This way, we can share some content on social media and send readers to our site for more information. Since we have long form blog posts already that is our &lt;a href="https://jekyllrb.com/docs/posts/"&gt;posts&lt;/a&gt; type. We wanted another way to provide another type of content but didn't want it to be a full post. Enter what we call &lt;a href="https://github.com/dev-diaries/web/tree/master/_social-posts"&gt;_social posts&lt;/a&gt;. These are a &lt;code&gt;collection&lt;/code&gt; (see what we did there?) of all the social media posts on the site. This way to display them we can avoid any needless filtering of the blog post by a certain tag or category. Jekyll collections give us an easy way out of the box to create a subtype on our blog 🙌.&lt;/p&gt;
&lt;h2&gt;
  
  
  How
&lt;/h2&gt;

&lt;p&gt;The first thing we needed to do was update our config to "register" the new &lt;br&gt;
collection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;collections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;social-posts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here we name the collection &lt;code&gt;social-posts&lt;/code&gt; and declare that we want it to output a page for each document. This way each social post will have it's own dedicated page so when users go to our site to learn more information they can see an entire page dedicated to &lt;a href="https://dev.to/social-posts/text-navigation/"&gt;Text navigation: jumping between words&lt;/a&gt; for example.&lt;/p&gt;

&lt;p&gt;Now that we have that, we need to make the directory so Jekyll knows to grab the social posts. So, in the root of our project we make the directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;_social_posts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then create our post within that directory. We change directory (cd) into&lt;br&gt;
the directory (folder) we just made and then create (touch) the first post:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;_social__posts
&lt;span class="nb"&gt;touch &lt;/span&gt;text-navigation.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And bingo! We have a new collection of social media posts with one post (text-navigation). Want to see how we integrated it on this site? Check out our &lt;a href="https://github.com/dev-diaries/web/commit/3176105dac2f421246512f4dd0946627ef2ec47a"&gt;commit&lt;/a&gt; because &lt;i&gt;don't talk about it, code about it&lt;/i&gt;. We'll be posting much more about how this site was built and as we add in more features we'll of course blog about it, because &lt;i&gt;sharing is caring&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dev-diaries.com/blog/why-and-how-to-use-collections-in-jekyll/"&gt;Original Post on Dev Diaries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>jekyll</category>
      <category>beginners</category>
      <category>staticsites</category>
    </item>
    <item>
      <title>SCSS: Ampersand Rules</title>
      <dc:creator>Dev Diaries</dc:creator>
      <pubDate>Sat, 11 May 2019 12:53:47 +0000</pubDate>
      <link>https://forem.com/devdiaries/scss-ampersand-rules-4jg0</link>
      <guid>https://forem.com/devdiaries/scss-ampersand-rules-4jg0</guid>
      <description>&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;Using the &lt;code&gt;&amp;amp;&lt;/code&gt; after a declaration you can set a css rule to apply given that the &lt;br&gt;
selector that has the &amp;amp; after actually applies when it is the parent of the element it is nested under. 🤔? So basically, you read the rule inside out. So in the first example you read if &lt;code&gt;.parent-in-this-case&lt;/code&gt; &amp;amp; is the parent of &lt;code&gt;.some-class&lt;/code&gt;, then apply this rule.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why? 🧐
&lt;/h2&gt;

&lt;p&gt;So why might you do this? One example is to affect a style for only ie-9 for &lt;br&gt;
example and if you apply a class when a browser is ie-9 or below you can set specific styles within a block that only apply when ie-9 is the parent class on the html tag. Check the docs &lt;a href="https://sass-lang.com/documentation/file.SASS_REFERENCE.html#parent-script"&gt;here&lt;/a&gt;.The &lt;code&gt;&amp;amp;&lt;/code&gt; in scss offers a lot of power, but can also be a bit confusing so be mindful of your usage! Let's check out some examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nn"&gt;#&lt;/span&gt; &lt;span class="nt"&gt;scss&lt;/span&gt;
&lt;span class="nc"&gt;.some-class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;.parent-in-this-case&lt;/span&gt; &lt;span class="k"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;font-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That compiles to this css:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.some-class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.parent-in-this-case&lt;/span&gt; &lt;span class="nc"&gt;.some-class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here is some other useful ampersand usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.el&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;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nc"&gt;.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nt"&gt;--larger&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;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That compiles to this css:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.el&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;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.el&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.el.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.el--larger&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;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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



&lt;p&gt;Here you can see the convenience and power of the ampersand. If you're using something like &lt;a href="http://getbem.com/introduction/"&gt;BEM&lt;/a&gt; it makes it very easy and quick too add in custom elements and modifier classes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dev-diaries.com/social-posts/scss-ampersand-rule/"&gt;Original Post on Dev Diaries&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.instagram.com/p/BvGkv6DgDr4"&gt;Instagram Post On Dev Diaries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>scss</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Creating Symlinks in Linux</title>
      <dc:creator>Dev Diaries</dc:creator>
      <pubDate>Wed, 01 May 2019 12:18:15 +0000</pubDate>
      <link>https://forem.com/devdiaries/creating-symlinks-in-linux-576j</link>
      <guid>https://forem.com/devdiaries/creating-symlinks-in-linux-576j</guid>
      <description>&lt;p&gt;A SymLink in Linux is a special kind of file that points to an actual file or directory, basically a shortcut, but a little different as a symlink is an actual pointer to the source file or directory. Symlinks can be very useful for example if you want to version files you can bump a version app_v2 but just have a symlink that refers app_latest that just references the latest version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /path/to/source /path/to/symlink
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Some useful SymLink options are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;   If the target file already exists, &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;unlink &lt;/span&gt;it and force the &lt;span class="nb"&gt;link&lt;/span&gt;

&lt;span class="nt"&gt;-n&lt;/span&gt;   Useful with the &lt;span class="nt"&gt;-f&lt;/span&gt; option, replace the symlink that might point to a directory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;One important thing to remember is that you must use the full path when creating symlinks and not the relative paths. For example if you have this as your filesystem&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;ls
&lt;/span&gt;image.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We want to create another directory (folder) called pics that contains a symlink&lt;br&gt;
to image.png within it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;mkdir &lt;/span&gt;pics

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;ls
&lt;/span&gt;image.png
pics
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If we tried to symlink just using relative paths the symlink would be broken:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; image.png ./pics/image.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Instead, we should use the full path and in our case we can use the &lt;code&gt;$PWD&lt;/code&gt; value which expands to our present working directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$PWD&lt;/span&gt;/image.png &lt;span class="nv"&gt;$PWD&lt;/span&gt;/pics/image.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Another option is to actually change directories into the pics directory and create the symlink from there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;pics
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; ../image.png image.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.dev-diaries.com/social-posts/sym-link/"&gt;Original Post on Dev Diaries&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.instagram.com/p/Bw2eNhIBAiv/"&gt;Instagram Post On Dev Diaries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>webdev</category>
      <category>bash</category>
      <category>devtips</category>
    </item>
    <item>
      <title>SCSS in three minutes</title>
      <dc:creator>Dev Diaries</dc:creator>
      <pubDate>Sun, 28 Apr 2019 15:43:35 +0000</pubDate>
      <link>https://forem.com/devdiaries/scss-in-three-minutes-5hmg</link>
      <guid>https://forem.com/devdiaries/scss-in-three-minutes-5hmg</guid>
      <description>&lt;h2&gt;
  
  
  Our favorite resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sass-lang.com/documentation/file.SASS_REFERENCE.html" rel="noopener noreferrer"&gt;Official Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.freecodecamp.org/the-complete-guide-to-scss-sass-30053c266b23" rel="noopener noreferrer"&gt;The complete guide to SCSS/SASS&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wait, wait, what is it?
&lt;/h2&gt;

&lt;p&gt;Before we go racing off, it might be good to talk about what is SASS/SCSS. SCSS is a preprocessor which means it needs to be processed down to another format (css) and is a superset of CSS. That just means we get to use features that aren't part of the CSS standard and move a bit faster when writing css. Since SCSS is a superset of CSS it also means that regular old CSS is valid SCSS, and that makes transitioning from CSS to SCSS that much easier and just requires you to rename some files. We've been throwing around SCSS and then linking to SASS so you might be wondering what the difference between the two is...This &lt;a href="https://stackoverflow.com/questions/5654447/whats-the-difference-between-scss-and-sass" rel="noopener noreferrer"&gt;Stackoverflow&lt;/a&gt; answer sums it up nicely, but basically SCSS is the newer version and the two are just two different syntaxes. We recommend you use SCSS. Want to learn more about what exactly SCSS is? Check this &lt;a href="https://www.dailysmarty.com/posts/what-is-scss" rel="noopener noreferrer"&gt;article&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's do this
&lt;/h2&gt;

&lt;p&gt;We're a fan of keeping things as light weight as possible so we're just going&lt;br&gt;
to opt for a npm script to coordinate the scss compilation process. This could&lt;br&gt;
easily be changed to integrate with &lt;a href="https://webpack.js.org/" rel="noopener noreferrer"&gt;webpack&lt;/a&gt;, &lt;a href="https://gulpjs.com/" rel="noopener noreferrer"&gt;gulp&lt;/a&gt;, &lt;a href="https://gruntjs.com/" rel="noopener noreferrer"&gt;grunt&lt;/a&gt;, &lt;a href="https://github.com/broccolijs/broccoli" rel="noopener noreferrer"&gt;broccoli&lt;/a&gt;, &lt;a href="https://brunch.io/" rel="noopener noreferrer"&gt;brunch&lt;/a&gt; or whatever you're using.&lt;/p&gt;

&lt;p&gt;So let's install &lt;a href="https://github.com/sass/node-sass" rel="noopener noreferrer"&gt;node-sass&lt;/a&gt; which will handle building our scss files. In our project root let's install it via npm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;sass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to add in a script to watch when we edit scss files and compile&lt;br&gt;
them down into valid css files. So we'll add in a npm script to handle that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scss&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;npx node-sass -w scss/app.scss -o assets/css/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Curious what npx is? &lt;a href="https://blog.npmjs.org/post/162869356040/introducing-npx-an-npm-package-runner" rel="noopener noreferrer"&gt;Read about it here.&lt;/a&gt; Basically it allows us a quickly call a node package and in this case call a local package. As noted in the comments, we don't even have to write npx at the beginning since we're calling it via a npm script so could also just write &lt;code&gt;node-sass -w scss/app.scss -o assets/css/&lt;/code&gt;. We then tell node-sass to watch our scss file app.scss and output the result into our assets directory inside the css directory. Let's make some scss files&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="nb"&gt;cd &lt;/span&gt;scss &amp;amp; &lt;span class="nb"&gt;touch &lt;/span&gt;app.scss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's add some scss to our app.scss file:&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="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;black&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#000000&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="err"&gt;&amp;amp;:hover&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if we check what's in our css directory we'll see this:&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="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.container&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cool! It took our scss and outputted valid css that we can use. Let's see a video of all this in action, in under 3 minutes!&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%2Fwww.dev-diaries.com%2Fassets%2Fimages%2Fscss-in-three.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.dev-diaries.com%2Fassets%2Fimages%2Fscss-in-three.gif" alt="gif of process"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dev-diaries.com/blog/scss-in-three-minutes/" rel="noopener noreferrer"&gt;Original Post on Dev Diaries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>scss</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
