DEV Community: Alicia Sykes The latest articles on DEV Community by Alicia Sykes (@lissy93). https://dev.to/lissy93 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%2F44940%2Fc48f6904-fc82-46a3-8ed7-b2baac65cf9c.jpg DEV Community: Alicia Sykes https://dev.to/lissy93 en I built an app in every frontend framework Alicia Sykes Mon, 05 Jan 2026 16:20:00 +0000 https://dev.to/lissy93/i-built-an-app-in-every-frontend-framework-4a9g https://dev.to/lissy93/i-built-an-app-in-every-frontend-framework-4a9g <h2> TL;DR </h2> <p><strong>Which framework should you use?</strong> Well, that depends on what you're developing and your prioritie are. But I made a quick comparison tool to help you find the perfect stack for your project. See: <a href="proxy.php?url=https://stack-match.as93.net/" rel="noopener noreferrer">Stack Match</a>.</p> <p><strong>Just want the numbers?</strong> I also built the same app using 10 different frameworks, and benchmarked them. See the <a href="proxy.php?url=https://github.com/Lissy93/framework-benchmarks" rel="noopener noreferrer">framework-benchmarks</a> repo for source and results.</p> <h2> Methodology </h2> <p>Why am I writing this? Well I see a lot of articles bigging up specific frameworks, or putting down other frameworks. But rarely does the author cut through the hype and provide an unbiased comparison between all* the options.</p> <p>My aim here is to briefly outline each frameworks USP, when you should use them, covering their pros, cons and also mention my thoughts.</p> <p>Talking about unbiased, I need build the same app in each framework to make this a fair test (which I have done!). But that's the first issue, as simple apps do not fully demonstrate a frameworks capabilities in real-world scenarios. As such, I've also included actual / live projects I've built with each. All of these are production ready, with a decent number of active users and/or downloads (actually, a combined 1 million anual users, and 50k github stars).</p> <p>Since there's literally hundreds of frontend frameworks, so to keep this post reasonably, I'm only going to cover on the "top" 10 latest and greatest, and we're mainly focusing on developer experience (but performance benchmarks will also be included).</p> <p>That's enough chat, let's get to it!</p> <h2> React </h2> <p>React is everywhere, powering over 1.3 million websites, and used by many (probably most) large companies. It's been around for over 12 years, backed by Meta, with very mature tooling and a large ecosystem. So it's no wonder it's become the default choice for many teams. It's very stable with excellant backwards compatibility (which is actually also one of it's pitfalls, as there's multiple ways of doing everything).</p> <p>But it's not perfect. It adds a lot of boilerplate making it much more verbose to write than the likes of Svelte or Vue. The virtual DOM also adds quite a significant performance overhead (actually, just the reconciliation, but it's easy to use incorrectly), memoization is often manual, concurrent features are not yet very mature, and bundles tend to be large, even with a lot of tree shaking.</p> <h3> Pros </h3> <ul> <li>Plenty of jobs</li> <li>Ubiquitous, huge ecosystem, good community support, corporate backing</li> <li>Flexibility, build anything from SPAs, emails to mobile apps (kinda)</li> </ul> <h3> Cons </h3> <ul> <li>While quick to get started with, React can be slow to master properly, and there's many things to trip up beginners</li> <li>Less performant out of the box, and the virtual DOM adds an overhead</li> <li>Quite boilerplate heavy, especially when compared to Svelte or Solid</li> </ul> <h3> My Thoughts </h3> <p>If you're vibe coding, React has a huge advantage, since there's just so much code out there for the AIs to consume. Likewise, if you're looking for a job, you can't go wrong with learning React as it's been the dominant framework for most companies for quite a while now.</p> <p>That said, I personally do not like React: it's slow, heavy, boring and sometimes a bit more complex than other frameworks. </p> <p>I find it frustrating that I need to do so much manual work to improve performance of an app. It makes the code verbose and prone to mistakes. Even though developer tooling is very good, inspecting the compiled output can still be quite painful. I spend a lot more time with the docs open, as the React spec is quite large and broad. </p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/lissy93/web-check" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2jglebyxph1ozbudz12x.png" alt="Web Check" width="800" height="330"></a></p> <h2> Vue </h2> <p>Vue is a progressive framework, meaning it can be used for all app types, from just a drop-in script from enhancing HTML all the way up to a full SPA with SSR. Like Svelte, it uses SFCs (single file components) where each <code>.vue</code> file bundles template, logic and scoped CSS together. For reactivity, Vue uses ES2015 Proxies to track dependencies and update only what’s needed, without manually memoizing.</p> <h3> Pros </h3> <ul> <li>Really easy, intuitive and quick to learn and use</li> <li>Nice Single-file components with scoped styles</li> <li>Easy, fine-grained reactivity and efficient dependency tracking</li> <li>Official tools for routing, state, and SSR (bundled separately)</li> </ul> <h3> Cons </h3> <ul> <li>While Vue can scale very well, a lot of thought is needed when using it for a very large project</li> <li>There's some inconsistencies (such as the two competing Options vs Composition APIs)</li> <li>Some reactivity caveats (e.g. .value on refs, destructuring loses reactivity)</li> </ul> <h3> My Thoughts </h3> <p>Vue could be seen as the Goldilocks framework, sitting comfortably between React's flexibility and Angular's structure. Vue is fast enough, fun enough and battle-tested enough, but doesn't really excel amazingly in any of these areas.</p> <p>The reactivity system using Proxies is genuinely impressive. Change a data property and everything dependent on it updates automatically. And, the ecosystem is much stronger than people realize.</p> <p>I chose Vue for Dashy, because it both has everything I needed, but also is incredbily easy, so contributors could add their own widgets and features, with out a steep learning curve.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/dashy/" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7xke364b435bf4vjgr0.png" alt="Dashy" width="800" height="334"></a></p> <h2> Svelte </h2> <p>Svelte has consistently ranked as one of the most loved frameworks, and for good reason. It's simple, fast, lightweight and really fun. Reactivity is built directly into the language, no hooks, proxies or <code>useEffect</code> weirdness; just assign to a variable and it reacts.</p> <p>Unlike many other frameworks, it does not ship a runtime or use a virtual DOM. Instead, components get compiled into highly optimized vanilla JS at build-time. So, there's no runtime overhead, no framework code in your bundle and you get near-native performance in the browser. Oh, and the compiled output is surprisingly human readable.</p> <h3> Pros </h3> <ul> <li>Smaller, faster bundles than React or Vue</li> <li>Really simple reactivity model</li> <li>Less boilerplate than any other framework</li> <li>Animations are built in</li> </ul> <h3> Cons </h3> <ul> <li>Ecosystem is still smaller than React/Vue</li> <li>SvelteKit still maturing, and could be slightly less stable than Next/Nuxt</li> <li>For large teams or huge projects, the tooling is not as robust </li> </ul> <h3> My Thoughts </h3> <p>Building in Svelte makes me happy. I like that it's both modern, intuitive and fast, but also that it's SFCs are very aligned with the core web technologies: just HTML, CSS and JS.</p> <p>Svelte has been my go-to for building things quickly and beautifully, while shipping a performant result. But I have found that if I don't pay attention to structure, a large project can quickly get messy.</p> <p>I wouldn’t necessarily use it for a huge enterprise dashboard where you have 15 teams working on the same codebase, React or Angular still offer more predictability, stability and tooling in those scenarios.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/networking-toolbox/" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslur4m05atjc26veiblp.png" alt="Networking Toolbox" width="800" height="336"></a></p> <h2> Angular </h2> <p>You're probably thinking Angular is an old-school framework, only used in legacy apps and corporate environments. And yes, the latter is correct, but recent releases (yes, it's still very active) have some awesome features, that make it a very viable choice in 2025.</p> <p>Unlike other frameworks, Angular ships with everything batteries-included: routing, forms, HTTP, testing, internationalization, animations, SSR, and more - all officially maintained and deeply integrated. No need to cobble together a stack.</p> <p>But it can be verbose to write with. </p> <h3> Pros </h3> <ul> <li>TypeScript from the start</li> <li>Very stable nowadays</li> <li>Everything needed for large apps is included</li> <li>AOT compilation of templates, making it faster than some</li> <li>Plenty of jobs in the corporate world</li> </ul> <h3> Cons </h3> <ul> <li>Steeper learning curve (RxJS, DI, modules, zones)</li> <li>Verbose compared to frameworks like Svelte or Vue</li> <li>Smaller community than React/Vue in open-source or tutorials</li> <li>Less flexible — you build the Angular way</li> </ul> <h3> My Thoughts </h3> <p>Angular isn't cool, but it is consistent, powerful, and scalable. There isn't really anything missing, so you don't need to npm install a ton of third-party deps just to do common tasks. </p> <p>I didn't find it complicated to get up to speed with, but there was a lot I needed to learn from the docs, especially with the template syntax, component definitions, directives, injections, etc. The only thing I struggled with, was initially getting hydration working for my SSR routes. Everything else was smooth sailing.</p> <p>I'd consider Angular again for large apps, where stability, structure and long-term support matter, but not so much for smaller apps.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/lissy93/domain-locker" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw98cgucvl97gqgu2fegr.png" alt="Domain Locker" width="800" height="365"></a></p> <h2> Lit </h2> <p>Lit is a super lightweight framework for building standards-based Web Components, built around modern browser APIs (like Custom Elements and Shadow DOM) and is great when you want framework-agnostic, reusable UI components.</p> <h3> Pros </h3> <ul> <li>Uses native Web Components and common standards</li> <li>Performant, as no virtual DOM, and updates are minimal and direct</li> <li>Works with any framework (or none)</li> </ul> <h3> Cons </h3> <ul> <li>Verbose syntax: <a class="mentioned-user" href="proxy.php?url=https://dev.to/click">@click</a>, ?disabled, .value, etc.</li> <li>Class-based components feel outdated</li> <li>SSR is experimental and hard to set up</li> <li>Ecosystem and learning resources are niche</li> </ul> <h3> My Thoughts </h3> <p>I personally found that writing Lit components was a bit like stepping back into the old days of React. Components are class-based, and even the simplest of components are quite verbose, with a fair amount of boilerplate code.</p> <p>The funny expression syntax (for attributes), caught me up a few times, forgetting to precede properties with a <code>.</code>, booleans with a <code>?</code>, event listeners with an <code>@</code> and all values with a <code>$</code></p> <p>Server-rendering is still experimental, and was such a pain to get working in a standalone Vite + Lit project.</p> <p>Because it's web-components, and using the shadow DOM, each component is totally isolated. Which has it's pros and cons, but if you're not used to this, you might notice that things like your global CSS reset or styles do not work the way you'd expect.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/email-comparison" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz9bzeqhi5dt10cy4vtz.png" alt="Email Comparison" width="800" height="373"></a></p> <h2> Marko </h2> <p>Marko is a declarative language and high-performance web framework, built and maintained by eBay.</p> <h3> Pros </h3> <ul> <li>Concise syntax, with short-hand options for markup, no need to import components/custom tags</li> <li>Quite easy SSR and isomorphic UI components</li> <li>Easy routing with Marko run</li> </ul> <h3> Cons </h3> <ul> <li>Very niche and limited support - you definitely could not vibe code with Marko!</li> <li>Amazing when it works, but if you face an issue, you'll be delving into Marko's source and resolving it yourself</li> <li>Missing docs (e.g. <a href="proxy.php?url=https://github.com/marko-js/website-next/blob/main/docs/guide/low-level-apis.md" rel="noopener noreferrer">Low level APIs</a> is just empty)</li> </ul> <h3> My Thoughts </h3> <p>I actually really liked what Marko was going for, the templating made a lot of sense. But it slightly feels like using a framework from the future, but in the past, it's both futuristic and out-dated at the same time.</p> <p>The main drawback, and it's a big one - was that there's very limited info online. The docs are sparce, you cannot just grep github to find examples, AI tools have no idea of Marko basics, there's limited community support and even intelisense is very limited. So, if you face issues, you'll be delving into Marko's source yourself. And it does have a few quirks, which are often undocumented (e.g. if you use <code>class {}</code> in a top-level view or layout, all interactivity will just break, without an error message). </p> <p>So as much as I loved working with Marko, I don't feel I can recommend it for any serious project, just because the community is so small. I also don't think it's going to be actively maintained for much longer, as repo activity as been slowing down for the past few years, and ebay seems to be the only core maintainers.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/permissionator" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2jprhez3y605tr5yva4.png" alt="Permissionator" width="800" height="321"></a></p> <h2> jQuery </h2> <p>Did you think I'd forget about our old friend jQuery?! Nearly 20 years since it's first release, and jQuery is still present on over 70% of the top 100k websites (that's largely correlated with WordPress usage).</p> <p>That number is now starting to decline, and with good reason - for simple apps, many of the features of jQuery can now be done nativity with modern JavaScript, and for more complex apps modern frameworks just do the job far better.</p> <p>...but earlier this year, and for the first time since 2016, a new major version, <a href="proxy.php?url=https://blog.jquery.com/2024/02/06/jquery-4-0-0-beta/" rel="noopener noreferrer">jQuery 4</a> has been published.</p> <h3> Pros </h3> <ul> <li>No build tools, dependency managers, transpilers etc</li> <li>It's very much battle-tested</li> <li>Useful for supporting (very) old browsers which don't have the newer JavaScript features</li> </ul> <h3> Cons </h3> <ul> <li>Not much that jQuery can do, which can't be done with vanilla JS</li> </ul> <p>That said, I couldn't quite bring myself to build a modern app using jQuery. Though I have used it (many years ago) for <a href="proxy.php?url=https://github.com/Lissy93/revision-quizzes" rel="noopener noreferrer">revision-quizzes</a>, <a href="proxy.php?url=https://github.com/Lissy93/intern-magnet" rel="noopener noreferrer">intern-magnet</a> and <a href="proxy.php?url=https://github.com/Lissy93/usermonkey" rel="noopener noreferrer">user-monkey</a>.</p> <h2> Alpine </h2> <p>Enables you to easily sprinkle reactivity into server-rendered HTML (no SPAs, no hydration, no SSR). It's ideal for simple UI enhancements without a full build setup.</p> <p>What's clever is how Alpine stays out of your way. The HTML is still readable, the JavaScript is minimal, and everything degrades gracefully if Alpine doesn't load. It's progressive enhancement done right - the page works without JavaScript, but becomes interactive when it loads.</p> <p>The syntax reads naturally: <code>x-on:click="searchWeather()"</code>, <code>x-text="temperature"</code>, <code>x-bind:class="{'active': isExpanded}"</code>. It's declarative like Vue templates but lives right in the HTML. The reactive updates happen automatically when you modify the data.</p> <h3> Pros </h3> <ul> <li>Zero setup — works with just a <code>&lt;script&gt;</code> tag</li> <li> Ideal for small enhancements in SSR or static sites</li> <li>Easy, declarative syntax inspired by Vue <ul> <li>Progressive enhancement by default</li> </ul> </li> </ul> <h3> Cons </h3> <ul> <li> Not meant for large apps — lacks routing, state management, SSR, etc </li> <li> Limited tooling and structure for big teams</li> <li> Can get messy if you cram lots of logic into HTML attributes</li> </ul> <h3> My Thoughs </h3> <p>Alpine hits a really sweet spot for simple interactivity. When you don't want a full framework and just need modals, dropdowns, toggles, or light client-side behaviour then Alpine is perfect.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/who-dat" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t6z8ggo1r5zgeozch87.png" alt="Who Dat" width="800" height="385"></a></p> <h2> Solid </h2> <p>Solid looks a lot like React at first glance, but under the hood it's completely different, and much faster. Instead of a virtual DOM, Solid uses fine-grained reactivity (similar to Svelte and Vue's internals) to update only what actually changed. The result is tiny bundles, almost no runtime overhead, and great performance.</p> <p>You still write JSX, still define components, still use hooks - but everything is reactive by default. Signals (<code>createSignal</code>) replace <code>useState</code>, computations run automatically when their dependencies change, and nothing re-renders unnecessarily. It feels familiar, but without the awkward parts of React.</p> <h3> Pros </h3> <ul> <li> Extremely fast: no virtual DOM, fine-grained reactivity, tiny bundle</li> <li> Feels familiar, if you're from a React background</li> <li> Very scalable, for large, highly interactive interfaces</li> </ul> <h3> Cons </h3> <ul> <li>Much smaller ecosystem and community</li> <li>SSR is strong, but full-stack frameworks like SolidStart are still maturing</li> <li>JSX.</li> </ul> <h3> My Thoughts </h3> <p>Solid feels like "what React could have been" if it were designed today. You get the React ergonomics without the re-rendering dance, memoization hacks, or performance footguns. It genuinely feels snappy to build with. But because it's still relatively niche, you won’t find as many libraries, tutorials, or job listings.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/cso/" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkiyqf6lpkderz5t2klo6.png" alt="Chief Snack Officer" width="800" height="302"></a></p> <h2> Astro </h2> <p>Astro is less of a framework, and more of a content-first site builder. </p> <p>Astro statically builds your site, and uses barley no JavaScript by default. Interactivity comes from "islands", which are tiny isolated components, writen with any framework of your choice (like React, Svelte, Vue, Solid, etc), and are used to sprinkle in interactivity which get hydrated on client-side, only when needed.</p> <h3> Pros </h3> <ul> <li>Best option for SEO (SSG,SSR), plus all the benefits of interactivity only when you need it.</li> <li>First-class MD/MDX support</li> </ul> <h3> Cons </h3> <ul> <li>It's good for content-heavy sites, but definetly not a good choice for SPA/interactive apps</li> </ul> <h3> My Thoughts </h3> <p>For a blog, docs, a marketing site, or a “mostly static with a few interactive bits” project, it’s honestly hard to beat. I love Astro, it's DX and flexibility, but it does have very specific use-case.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/awesome-privacy/" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pg8po8zhen99n6aj026.png" alt="Awesome Privacy" width="800" height="379"></a></p> <h2> Van.js </h2> <p>Van is a tiny (like seriously tiny - under 1kb) Grab 'n Go reactive UI framework with no virtual DOM, no build tools, no dependencies and no heavy abstractions. It works with entirely with plain DOM nodes, using simple reactive primitives (<code>van.state</code>, <code>van.derive</code>) to update the UI when data changes. It feels closer to "reactive vanilla JS" than a traditional framework.</p> <p>The API is intentionally minimal. You create components as functions that return DOM elements, bind state directly in your markup-like calls, and that’s… pretty much it. No JSX, no compiler, no bundler, no fancy lifecycle hooks. Just JavaScript and DOM APIs with a sprinkling of reactivity.</p> <h3> Pros </h3> <ul> <li> Extremely small and fast, perfect for tiny widgets or embedded components</li> <li> No build step; works in a <code>&lt;script&gt;</code> tag</li> <li> Very simple reactivity model</li> <li> Easy to learn if you’re comfortable with vanilla JS</li> </ul> <h3> Cons </h3> <ul> <li>Definetly not suitable for larger applications</li> <li>No component abstraction beyond functions, no templating system, no event system</li> <li>Awesome for simple reactivity, but gets unwieldy fast for anything larger</li> </ul> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/raid-calculator" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc6n3kec86aeuedckn1ln.png" alt="RAID Calculator" width="800" height="355"></a></p> <h2> Qwik </h2> <p>Qwik is kinda wild. It completely rethinks how web apps work by doing something called "resumability" - your page loads instantly with zero JavaScript, then individual components wake up only when you interact with them. It's like having a webpage that's asleep until you poke it.</p> <h3> Pros </h3> <ul> <li>Super low TTFB, with &lt;1KB JS on initial load</li> <li>Scales really well for large apps with complex routes or dynamic content</li> <li>Familiar developer ergonomics, with JSX + Vite + signals + file-based routing</li> </ul> <h3> Cons </h3> <ul> <li>SSR is required, it cannot work purley client side</li> <li>Steeper learning curve, and some concepts (like resumability and serialization) may seem alien to devs at first</li> <li>Debugging can be complex, because logic is split across server boundaries</li> </ul> <h3> My Thoughts </h3> <p>If you're working on a very large or complex app, which also needs to be highly performant, then Qwik is a natural option. Sure it has a smaller community, steeper learning curve, and is more complex than other options, but when every byte matters then this is just the price to pay.</p> <h3> What I built </h3> <p><a href="proxy.php?url=https://github.com/Lissy93/personal-security-checklist/" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy5pdqnxw0l9agh9hvyky.png" alt="Digital Defense" width="800" height="436"></a></p> <h2> Hol' Up - It's not a fair test if you built different apps! </h2> <p>That's a very fair point, but don't worry - I got you!</p> <p>In order to more impartially compare these frameworks, I've also built an identical mini-app in each of them, and benchmarked each to compare performance.<br> You can check this out here: <a href="proxy.php?url=https://github.com/Lissy93/framework-benchmarks" rel="noopener noreferrer">https://github.com/Lissy93/framework-benchmarks</a>.</p> <p>There's a shared test suite to confirm that each app meets identical requirements, each app uses all the same shared assets and styles, and then I have a set of performance benchmarking scripts which run all the actual performance tests. These results then get processed and put into the <a href="proxy.php?url=https://github.com/Lissy93/framework-benchmarks/tree/results" rel="noopener noreferrer"><code>results</code></a> branch, along with some charts and summaries which are in the main readme and on the <a href="proxy.php?url=https://framework-benchmarks.as93.net/" rel="noopener noreferrer">framework-benchmarks homepage</a>.</p> <h2> Conclusion </h2> <p>So there we go, 12 frameworks, 12 apps (and 12 years of pain). If you're trying to choose a framework for your next project, check out <a href="proxy.php?url=https://stack-match.as93.net/" rel="noopener noreferrer">Stack Match</a> the framework comparison tool.</p> <p>And if you like this kind of content, consider dropping me a follow 🩷<br> I'm <a href="proxy.php?url=https://github.com/lissy93/" rel="noopener noreferrer">@Lissy93</a> on GitHub, and <a class="mentioned-user" href="proxy.php?url=https://dev.to/lissy93">@lissy93</a> here on DEV. I build a lot of developer tools, security and privacy apps and self-hostable stuff for Linux, which you can check out on my site <a href="proxy.php?url=https://010000010110110001101001011000110110100101100001.com" rel="noopener noreferrer">https://010000010110110001101001011000110110100101100001.com</a> (yeah, really memorable domain name!)</p> <p>Anyway, thanks for reading, happy coding, and happy new year!! </p> <p>Oh, and almost forgot - which framework is truly the best? Well that would have to obviously be [character limit reached]</p> performance webdev javascript frontend 50 ways to bring in extra cash as a developer 💰 Alicia Sykes Mon, 20 Nov 2023 10:00:00 +0000 https://dev.to/lissy93/50-ways-to-bring-in-extra-cash-as-a-developer-19b6 https://dev.to/lissy93/50-ways-to-bring-in-extra-cash-as-a-developer-19b6 <p>Times are tough at the moment (cozzie livs), but as developers we've got a unique set of skills which are in high-demand, if you know where to look!</p> <p>This post briefly outlines 50 side hustles you can use to bring in some extra cash as a developer</p> <p>Too long? <small>Skip to Conclusion</small></p> <h3> 1. Attention </h3> <p>Engagement-based earnings are where you'll receive a share of revenue, based on the amount of time a user has spent on your site, profile or consuming your content. It's typically a small amount, at least for smaller sites or creators, but adds up over time, and anyone can enable this- so you've got nothing to lose.</p> <ul> <li> <a href="proxy.php?url=https://creators.brave.com/" rel="noopener noreferrer">Brave</a> - Pays you for the users who visit your site, profile or view your content while using the Brave browser. Funds are paid as <a href="proxy.php?url=https://basicattentiontoken.org/" rel="noopener noreferrer">BAT</a> into your Uphold account, where they can then be withdrawn as USD, GBP or EUR to your bank account</li> <li> <a href="proxy.php?url=https://flattr.com/" rel="noopener noreferrer">Flattr</a> - Users who pay to use Flattr have their funds distributed among creators whose content the user has visited</li> </ul> <blockquote> <p>I personally signed up for Brave Rewards a couple of years ago. And after verifying ownership of my domains + profiles, I've consistently been making a couple of quid a month - about £200+ so far (despite being a Firefox user!). It's not much, but for very little effort, it's worth it.</p> </blockquote> <p>For more info on how this works, take a look at the <a href="proxy.php?url=https://webmonetization.org/" rel="noopener noreferrer">webmonetization.org</a> spec, a proposal which makes use of <a href="proxy.php?url=https://paymentpointers.org/" rel="noopener noreferrer">payment pointers</a> via <a href="proxy.php?url=https://interledger.org/" rel="noopener noreferrer">ILP</a> to stream income from WM-enabled visitors, via the use of a simple <code>&lt;link rel="monetization" href="proxy.php?url=your-pointer-here" /&gt;</code> tag.</p> <h3> 2. API as a Service </h3> <p>Platforms like RapidAPI make it possible to <a href="proxy.php?url=https://rapidapi.com/guides/earn-a-passive-income-by-monetizing-apis-as-a-developer" rel="noopener noreferrer">earn passive income</a> from your API.</p> <p>After you've built and deployed a simple API, you're then able to import it into RapidAPI Hub, select usage and pricing plans, and hit publish. Your API can be as big or small as you desire.</p> <p>If you're looking for inspiration for an easy first project, consider turning an open dataset into an API. And for beginners, RapidAPI have a <a href="proxy.php?url=https://rapidapi.com/courses/build-and-sell-your-own-api" rel="noopener noreferrer">video series</a> on how to get started. Other ideas could include wrapping an existing package up as an API, adding features to another service (like OpenAI), or building an endpoint that does some simple calculations.</p> <h3> 3. Issue Bounties </h3> <p>These are in-demand feature requests for open source projects. Users can put up "bounties" where they pledge a certain amount, which will then be paid to the first developer who gets that feature completed and merged.</p> <ul> <li> <a href="proxy.php?url=https://www.boss.dev/" rel="noopener noreferrer">BOSS.dev</a> - Feature requests and bug fixes to complete, with bounties ranging from $30 to $1000.</li> </ul> <h3> 4. Sponsors </h3> <p>If you've got a presence on GitHub, or another platform, then enabling sponsorships is a rewarding way to bring in some money for your work.</p> <p>Don't forget to <a href="proxy.php?url=https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository" rel="noopener noreferrer">enable the Sponsor button</a> for your GitHub projects, by creating a <code>.github/FUNDING.yml</code>. This works for a variety of platforms, as well as GitHub Sponsors </p> <ul> <li> <a href="proxy.php?url=https://github.com/sponsors" rel="noopener noreferrer">GitHub Sponsors</a> - A great option for developers however big or small. Zero fees, and low barrier to entry for supporters if they're already on GitHub</li> <li> <a href="proxy.php?url=https://www.patreon.com/" rel="noopener noreferrer">Patreon</a> - Allows for providing perks and exclusive content to your supporters. A good option if you've got a presence on other platforms beyond GitHub</li> <li> <a href="proxy.php?url=https://liberapay.com/" rel="noopener noreferrer">LibrePay</a> - Aimed at those creating open source content</li> <li> <a href="proxy.php?url=https://opencollective.com/" rel="noopener noreferrer">Open Collective</a> - Good option if you're collecting funding for a specific project, and are using proceeds to support that project (rather than personally)</li> <li><a href="proxy.php?url=https://steadyhq.com/en" rel="noopener noreferrer">Steady</a></li> <li> <a href="proxy.php?url=https://tidelift.com" rel="noopener noreferrer">TideLift</a> - Aimed more at those developing enterprise-grade open source projects, larger potential income but only for the biggest projects</li> <li> <a href="proxy.php?url=https://lfx.linuxfoundation.org/" rel="noopener noreferrer">LFX</a> - By the Linux Foundation</li> </ul> <blockquote> <p>Sponsorship (specifically GitHub Sponsors) is one of my personal favorite methods, as since paying is optional, you're not preventing access to people who cannot afford it, and those who support you already know what they're getting up-front, so you'll never have disappointed customers. </p> </blockquote> <h3> 5. Tips </h3> <p>You've probably been in the situation, where you've found a certain blog post, SO answer, GitHub repo or forum reply so helpful, that you've wished you could buy the author a beer to say thanks.</p> <p>Platforms which enable these small, one-off payments are free to sign up for, and you've got nothing to lose by including a Tip button in your profile or at the end of a blog post.</p> <ul> <li><a href="proxy.php?url=https://ko-fi.com/" rel="noopener noreferrer">Ko-fi</a></li> <li><a href="proxy.php?url=https://www.buymeacoffee.com/" rel="noopener noreferrer">Buy Me a Coffee</a></li> <li><a href="proxy.php?url=https://en.tipeee.com/" rel="noopener noreferrer">Tipeee</a></li> <li><a href="proxy.php?url=https://www.paypal.com/paypalme/" rel="noopener noreferrer">PayPal Me</a></li> </ul> <p>Tip: Don't beg. Create something useful, and drop your Tip link at the bottom.</p> <h3> 6. Corporate Funding </h3> <p>Many open source projects with a certain number of downloads / recurring users will start to be approached by companies wishing to sponsor the creators work, in return for their company logo + link being included near the top of the readme. Unlike sponsorship from individuals, these usually start at $100-500/month, rising the more usage your project sees.</p> <h3> 7. Hackathons </h3> <p>There are coding competitions happening remotely all the time. These are usually sponsored by companies who pay out cash prizes to the winners.</p> <ul> <li> <a href="proxy.php?url=https://summerofcode.withgoogle.com/" rel="noopener noreferrer">Summer of Code</a> - Run by Google, you'll receive a <a href="proxy.php?url=https://developers.google.com/open-source/gsoc/help/student-stipends" rel="noopener noreferrer">contributor stipend</a> ranging from $750 to $6000 upon successful acceptance, the amount depends on your country and project size</li> <li> <a href="proxy.php?url=https://codeheat.org/" rel="noopener noreferrer">CodeHeat</a> - Run by FOSS Asia, 100 SGD every 2 weeks plus smaller prizes</li> <li><a href="proxy.php?url=https://www.hackerearth.com/challenges/hackathon/" rel="noopener noreferrer">HackerEarth</a></li> <li><a href="proxy.php?url=https://www.hackathon.com/online" rel="noopener noreferrer">Hackathon.com</a></li> <li><a href="proxy.php?url=https://devfolio.co/hackathons/upcoming" rel="noopener noreferrer">Devfolio Hackathons</a></li> </ul> <blockquote> <p>When I was a student, I <a href="proxy.php?url=https://alicia.omg.lol/hackathons" rel="noopener noreferrer">used to do a lot</a> of hackathons (mostly in-person), and was often able to fund my Summers just by going to various events! It's also a great way of meeting people, learning new stuff, plus they're just a lot of fun!</p> </blockquote> <h3> 8. Dependency Funding </h3> <p>If you've got a package (such as an NPM module), then enabling sponsorship in your config file will let users of your code help contribute financially.</p> <ul> <li>NPM Funding - You're probably familiar with running <code>npm fund</code>, and seeing a list of the packages you're using which are looking for funding. The <a href="proxy.php?url=https://docs.npmjs.com/cli/v6/commands/npm-fund" rel="noopener noreferrer">npm fund</a> was added to make donating to the maintainers of the dependencies your project relies upon easier. If you maintain an NPM package, simply include the <code>funding</code> field in your package.json, and users will be able to support you more easily.</li> <li> <a href="proxy.php?url=https://www.stackaid.us/" rel="noopener noreferrer">StackAid</a> - Just install the StackAid GitHub app and link your Stripe account, and a share of funds donated by supporters who are either directly or indirectly using your project will be allocated to you each month</li> <li>GitHub Sponsors - Again GitHub Sponsors comes in again, as it <a href="proxy.php?url=https://github.com/sponsors/explore" rel="noopener noreferrer">lets users give to their most-used dependencies</a> - although this is a manual process, and not automatic.</li> </ul> <h3> 9. Reporting Issues </h3> <p>If you've got an eye for security, or enjoy finding bugs and exploits in applications, this one is for you. The most popular platform for this is <a href="proxy.php?url=https://hackerone.com/opportunities/all/search?ordering=Highest+bounties" rel="noopener noreferrer">HackerOne</a>, where you can earn anywhere from $20 to $200,000 per responsibly disclosed bug.</p> <p>Many other websites also offer a responsible disclosure policy directly, where they'll reward you for your work. If this is something which interests you, I maintain a list of 1000+ bounty programs at: <a href="proxy.php?url=https://bug-bounties.as93.net" rel="noopener noreferrer">https://bug-bounties.as93.net</a></p> <blockquote> <p>I've personally had a lot of success with this approach, it's also a lot of fun - so I highly recommend it!</p> </blockquote> <p>Other platforms to check out include:</p> <ul> <li> <a href="proxy.php?url=https://www.hackerone.com/" rel="noopener noreferrer">HackerOne</a> - Number 1 platform, most bounties and good protection and payout rate</li> <li> <a href="proxy.php?url=https://immunefi.com/" rel="noopener noreferrer">Immunefi</a> - Specifically for Web3</li> <li><a href="proxy.php?url=https://www.bugcrowd.com/bug-bounty-list/" rel="noopener noreferrer">BugCrowd</a></li> <li><a href="proxy.php?url=https://www.intigriti.com/" rel="noopener noreferrer">Intigriti</a></li> <li><a href="proxy.php?url=https://issuehunt.io/" rel="noopener noreferrer">Issue Hunt</a></li> </ul> <h3> 10. Open-Core model </h3> <p>This is where the majority of your code is open source, but certain extensions or add-ons (specifically those aimed at enterprise customers) are licensed as proprietary.</p> <p>Therefore, developers can freely use the software in other open source projects. However, companies have to pay for using enterprise-specific modules or integrations. </p> <p>Bear in mind, this is often easier said than done. You'll need to be able to separate proprietary features, and large companies will often do anything (including disobeying license restrictions) to avoid paying.</p> <h3> 11. Premium Packages </h3> <p>These are services that make it easy to offer premium / paid-for packages for common registries. It may be a good option, if you wish to distribute a premium version of an NPM module for example, or charge for specific package features.</p> <ul> <li> <a href="proxy.php?url=https://www.privjs.com/" rel="noopener noreferrer">PrivJS</a> - Distribute premium versions of your Node packages</li> <li> <a href="proxy.php?url=https://codecodeship.com/" rel="noopener noreferrer">CodeShip</a> - Private registry, where users need to pay to use your package</li> </ul> <h3> 12. Support </h3> <p>Adding the option for professional support plans to an open source project enables customers to pay for one-off or ongoing help and support with getting things up and running.</p> <p>This can be enabled either via your own system, or using an existing sponsorship platforms, like Patreon and GitHub Sponsors, or with a dedicated service, such as <a href="proxy.php?url=https://otechie.com/" rel="noopener noreferrer">Otechie</a> which adds paid features + support via embedded an chat dialog. Tools like <a href="proxy.php?url=https://calendly.com/" rel="noopener noreferrer">Calendly</a> can enable clients to put time into your calendar, or for larger projects, investing in a dedicated customer support platform, like <a href="proxy.php?url=https://www.helpscout.com/" rel="noopener noreferrer">HelpScout</a> may make this easier.</p> <h3> 13. Documentation </h3> <ul> <li> <a href="proxy.php?url=https://www.writethedocs.org/" rel="noopener noreferrer">Write the Docs</a> is the go-to place for all things documentation.</li> <li> <a href="proxy.php?url=https://developers.google.com/season-of-docs" rel="noopener noreferrer">Season of Docs</a> - Supported by Google, each year technical writers contribute to open source projects. Participating projects receive between $5,000 and $15,000 grant which is then distributed to contributors, usually via Open Collective.</li> <li>If you look around, there's also plenty of products looking for technical writers. Julia make a <a href="proxy.php?url=https://dev.to/juliafmorgado/get-paid-to-write-technical-articles-16cl">good list</a> of companies who will pay you to write tech content</li> <li>Copyrighting also fits into this category. Services like <a href="proxy.php?url=https://www.scripted.com/" rel="noopener noreferrer">scripted</a> let you make money by proof-reading or editing others text content.</li> </ul> <p>Even just documenting your own, and other developers repos is a good place to start.<br> A projects value increases massively if it's documented. Without docs, potential users, clients or developers won't know what it does, how to use it, how to build on top of it, or how to contribute.</p> <blockquote> <p>I might be the only one, but I personally love writing docs. <a href="proxy.php?url=https://github.com/Lissy93?tab=repositories" rel="noopener noreferrer">All my projects</a> include thorough usage, developing and contributing documentation. And this has contributed to their success and adoption. I feel like there's no point spending hours building something awesome, if you don't put a tiny bit of time showing people how they can use it. </p> </blockquote> <h3> 14. Advertising </h3> <p>Before you skip past this one - I hate ads too. They're annoying, and often involve some form of tracking which compromises the privacy of your users. But, for open source projects, there are some other options which don't have these drawbacks.</p> <ul> <li><a href="proxy.php?url=https://www.ethicalads.io/" rel="noopener noreferrer">Ethical Ads</a></li> <li><a href="proxy.php?url=https://www.carbonads.net/open-source" rel="noopener noreferrer">Carbon Ads</a></li> </ul> <p>This is a great option if you're maintaining a GitHub repo, website, blog or service that gets consistent traffic. Usually a minimum of about 10k users/month is required, but you'll get much better returns if you're getting 50k+ monthly users.</p> <h3> 15. Selling your Code </h3> <blockquote> <p>I personally disagree with this approach, just because a lot of the code being sold is poorly re-skinned versions of open source software, and proper credit isn't always given to the original author. That said, some developers do manage to make it work, building out simple projects then selling them on.</p> </blockquote> <ul> <li> <a href="proxy.php?url=https://indiemaker.co/" rel="noopener noreferrer">IndieMaker</a> - Sell your entire project</li> <li> <a href="proxy.php?url=https://www.piecex.com/" rel="noopener noreferrer">PieceX</a> - Sell ready-to-go source code</li> <li> <a href="proxy.php?url=https://www.codester.com/info/seller" rel="noopener noreferrer">Codester</a> - Aimed at PHP and Wordpress</li> </ul> <h3> 16. Selling Content </h3> <p>This is a commonly suggested one, when you look at side hustles for developers. But for good reason - if you're able to create high-quality content, there is good money to be made. Especially if you have an in-depth knowledge of an emerging field.</p> <p>Popular sites for selling content include:</p> <ul> <li> <a href="proxy.php?url=https://gumroad.com/" rel="noopener noreferrer">GumRoad</a> - Code, courses, posts, art, design, media (10% fee)</li> <li> <a href="proxy.php?url=https://sell.appsumo.com/" rel="noopener noreferrer">AppSumo</a> - Code, apps, extensions, courses, templates, etc</li> </ul> <h3> 17. Writing </h3> <p>This is a unique skill set. Either you're very good at writing engaging content, or you've got in-depth knowledge on a specific in-demand field. Otherwise if this is something that interests you, consider e-book publishing, where nothing is lost if your book is not a success.</p> <ul> <li> <a href="proxy.php?url=https://leanpub.com/" rel="noopener noreferrer">LeanPub</a> - A platform for self-publishing technology / development e-books and courses, with a generous revenue model (you keep 70%)</li> <li> <a href="proxy.php?url=https://kdp.amazon.com/en_US/" rel="noopener noreferrer">Amazon KDP</a> - Publish to Amazon Kindle, and make it immediately available to millions of users world-wide (Amazon will take at lease 30% cut, likely more for small publishers)</li> <li> <a href="proxy.php?url=https://www.smashwords.com/" rel="noopener noreferrer">SmashWords</a> and <a href="proxy.php?url=https://draft2digital.com/sw/" rel="noopener noreferrer">Draft2Digital</a> - Distribute to other e-book sellers around the globe, so an easy way to start publishing. They take less commission that Amazon, but more than LeanPub.</li> </ul> <h3> 18. Grants </h3> <p>Grants and corporate sponsorships are available in a number of fields, from open source, innovation, DeFi, AI, etc. They're usually paid to help you fund your living costs for a short period of time, while your working on something specific.</p> <ul> <li> <a href="proxy.php?url=https://github.com/sponsors" rel="noopener noreferrer">GitHub Sponsors</a> - Platform for individuals and organizations to financially support open source developers. Amount varies based on sponsorships.</li> <li> <a href="proxy.php?url=https://summerofcode.withgoogle.com/" rel="noopener noreferrer">Google Summer of Code (GSoC)</a> - Global program for student developers to contribute to open source projects, with stipends typically ranging from $1500 to $3300.</li> <li> <a href="proxy.php?url=https://www.mozilla.org/en-US/moss/" rel="noopener noreferrer">Mozilla Open Source Support (MOSS)</a> - Grants for open source software development, particularly for projects that align with Mozilla's mission.</li> <li> <a href="proxy.php?url=https://www.linuxfoundation.org/" rel="noopener noreferrer">The Linux Foundation Grants</a> - Offers various grants and fellowships for developers working on Linux Foundation projects.</li> <li> <a href="proxy.php?url=https://numfocus.org/programs/small-development-grants" rel="noopener noreferrer">NumFOCUS Small Development Grants</a> - Supports small projects in data science and scientific computing. Grant amounts vary ($285k split between all applicants).</li> <li> <a href="proxy.php?url=https://www.apache.org/foundation/sponsorship.html" rel="noopener noreferrer">Apache Software Foundation Sponsorship</a> - Financial support for Apache software projects, focusing on the Apache software ecosystem.</li> <li> <a href="proxy.php?url=https://www.outreachy.org/" rel="noopener noreferrer">Outreachy</a> - Provides three-month internships for underrepresented groups in technology, with stipends typically around $5,500.</li> <li> <a href="proxy.php?url=https://knightfoundation.org/grants/" rel="noopener noreferrer">Knight Foundation</a> - Offers grants for tech projects that promote quality journalism. Grant amounts vary widely based on project scope.</li> <li> <a href="proxy.php?url=https://prototypefund.de/" rel="noopener noreferrer">Prototype Fund</a> - Supports open source prototypes with up to 47,500 euros over six months, focusing on software developers in Germany.</li> <li> <a href="proxy.php?url=https://sloan.org/programs/digital-technology" rel="noopener noreferrer">The Sloan Foundation</a> - Offers grants for open science community projects, especially those enhancing open source software in research.</li> <li> <a href="proxy.php?url=https://chanzuckerberg.com/rfa/" rel="noopener noreferrer">Chan Zuckerberg Initiative Open Source Software Projects</a> - Focuses on supporting open source software essential to biomedical research. Funding amounts vary.</li> <li> <a href="proxy.php?url=https://www.raspberrypi.org/grants/" rel="noopener noreferrer">Raspberry Pi Foundation</a> - Provides grants for educational projects involving Raspberry Pi and computing education.</li> <li> <a href="proxy.php?url=https://gitcoin.co/" rel="noopener noreferrer">GitCoin</a> - A crowdfunding platform that funds open source projects, particularly in Ethereum and Web3. Funding varies based on community support.</li> <li> <a href="proxy.php?url=https://nlnet.nl/foundation/" rel="noopener noreferrer">NLnet Foundation</a> - Supports projects in Internet technology and network research. Grant amounts vary.</li> <li> <a href="proxy.php?url=https://www.opentech.fund/" rel="noopener noreferrer">Open Technology Fund</a> - Supports projects developing open technologies that promote human rights and open societies. Funding varies.</li> </ul> <h3> 19. Hosting Events </h3> <p>The events space is a lucrative industry, especially if you're able to put on a good event and land yourself a large sponsor. It's not for everyone, but here are 10 potential revenue streams that hosting events can bring:</p> <ul> <li> <strong>Ticket Sales</strong>: Generate revenue by charging an entry fee. Use platforms like <a href="proxy.php?url=https://www.eventbrite.co.uk/" rel="noopener noreferrer">Eventbrite</a>, <a href="proxy.php?url=https://meetup.com/" rel="noopener noreferrer">Meetup</a>, or <a href="proxy.php?url=https://ticketmaster.com" rel="noopener noreferrer">Ticketmaster</a> for ticket management.</li> <li> <strong>Sponsorships</strong>: Secure financial contributions from tech companies in exchange for promotional opportunities at your event.</li> <li> <strong>Workshops and Training Sessions</strong>: Offer specialized, hands-on learning experiences on specific technologies or programming languages, charging a premium fee.</li> <li> <strong>Virtual Events</strong>: Organize and charge for webinars, online workshops, or virtual conferences using platforms like <a href="proxy.php?url=https://zoom.us/" rel="noopener noreferrer">Zoom</a>, <a href="proxy.php?url=https://www.webex.com/" rel="noopener noreferrer">WebEx</a>, or <a href="proxy.php?url=https://hopin.com/" rel="noopener noreferrer">Hopin</a>.</li> <li> <strong>Hackathons</strong>: Host coding competitions with entry fees or find sponsors for covering costs and providing prize money.</li> <li> <strong>Networking Events</strong>: Charge for networking events targeting tech professionals, potentially attracting sponsorships from hiring companies.</li> <li> <strong>Speaking Engagements</strong>: Organize and charge for speaking events or panels, leveraging your expertise in a particular tech area.</li> <li> <strong>Corporate Training and Retreats</strong>: Provide event organizing services for companies' internal training or team-building events.</li> <li> <strong>Affiliate Marketing</strong>: Utilize affiliate marketing for tech products or services during your events for additional revenue.</li> <li> <strong>Product Launches</strong>: Partner with tech companies to host product launch events, offering your organizing services for a fee.</li> </ul> <h3> 20. Research </h3> <p>Your opinions are worth something, especially as a developer. There are researchers who will pay you money to take part in their study, survey or think tank. Typically good research opportunities are few and far between, OR will pay quite poorly.</p> <p>Popular platforms for this kind of work, include: <a href="proxy.php?url=https://minds.testable.org/" rel="noopener noreferrer">Testable Minds</a>, <a href="proxy.php?url=https://app.respondent.io/signup" rel="noopener noreferrer">Respondent</a></p> <h3> 21. Creating Courses </h3> <ul> <li> <a href="proxy.php?url=https://www.skillshare.com/teach" rel="noopener noreferrer">Skillshare</a> - Offers payment based on the number of minutes watched in your classes, along with referral bonuses.</li> <li> <a href="proxy.php?url=https://www.coursera.org/for-universities" rel="noopener noreferrer">Coursera</a> - Partner with institutions to offer courses; payments are typically based on revenue-sharing agreements.</li> <li> <a href="proxy.php?url=https://www.linkedin.com/learning/instructors" rel="noopener noreferrer">LinkedIn Learning</a> - Instructors can create courses for professionals; compensation details are arranged with LinkedIn.</li> <li> <a href="proxy.php?url=https://www.thinkific.com/" rel="noopener noreferrer">Thinkific</a> - Provides tools to create, market, and sell online courses, with various pricing plans including a free option.</li> <li> <a href="proxy.php?url=https://kajabi.com/" rel="noopener noreferrer">Kajabi</a> - All-in-one platform for online courses, marketing, payments, and website building.</li> <li> <a href="proxy.php?url=https://www.podia.com/" rel="noopener noreferrer">Podia</a> - Offers a platform for hosting courses, webinars, and digital downloads with direct sales to your audience.</li> <li> <a href="proxy.php?url=https://www.pluralsight.com/teach" rel="noopener noreferrer">Pluralsight</a> - Focused on tech and creative courses; pays instructors through royalties based on the popularity of their courses.</li> <li> <a href="proxy.php?url=https://www.masterclass.com/teach" rel="noopener noreferrer">MasterClass</a> - High-quality, celebrity-led courses; instructors are typically established experts or celebrities in their field.</li> <li><a href="proxy.php?url=https://uteach.io/" rel="noopener noreferrer">uTeach</a></li> <li><a href="proxy.php?url=https://www.newline.co/" rel="noopener noreferrer">NewLine</a></li> </ul> <h3> 22. Newsletters </h3> <p>Email newsletters and subscription-based RSS feeds are slowly making a comeback, as popular social media channels are becoming more centralized and controlled.</p> <p>This model works either by offering valuable insights into tech topics or news and building up a large (and hence valuable) subscriber base, or by charging a smaller number of users to receive your updates.</p> <p>Popular platforms that offer this functionality inclide:</p> <ul> <li><a href="proxy.php?url=https://substack.com" rel="noopener noreferrer">Substack</a></li> <li><a href="proxy.php?url=https://buttondown.email/" rel="noopener noreferrer">ButtonDown</a></li> <li><a href="proxy.php?url=https://convertkit.com/" rel="noopener noreferrer">ConvertKit</a></li> <li><a href="proxy.php?url=https://steadyhq.com" rel="noopener noreferrer">Steady</a></li> <li> <a href="proxy.php?url=https://ghost.org/" rel="noopener noreferrer">Ghost</a> </li> </ul> <h3> 23. Member-only Sites </h3> <ul> <li> <a href="proxy.php?url=https://www.memberspace.com/" rel="noopener noreferrer">MemberSpace</a> - Enables you to paywall certain parts of your website, for members-only</li> <li> <a href="proxy.php?url=https://www.patreon.com/" rel="noopener noreferrer">Patreon</a> - Popular for setting up membership tiers with exclusive content and perks.</li> <li> <a href="proxy.php?url=https://substack.com/" rel="noopener noreferrer">Substack</a> - Ideal for newsletters; offers the ability to have paid subscribers for exclusive content.</li> <li> <a href="proxy.php?url=https://ghost.org/" rel="noopener noreferrer">Ghost</a> - A professional publishing platform with built-in membership and subscription features.</li> <li> <a href="proxy.php?url=https://www.podia.com/" rel="noopener noreferrer">Podia</a> - Enables the sale of memberships, online courses, and digital downloads.</li> <li>WordPress with <a href="proxy.php?url=https://memberpress.com/" rel="noopener noreferrer">MemberPress Plugin</a> - A plugin for WP users to create membership sites.</li> <li> <a href="proxy.php?url=https://www.wildapricot.com/" rel="noopener noreferrer">Wild Apricot</a> - Membership management software that integrates with your website.</li> <li> <a href="proxy.php?url=https://kajabi.com/" rel="noopener noreferrer">Kajabi</a> - Offers tools for creating online courses, membership sites, and more, with a focus on marketing.</li> <li> <a href="proxy.php?url=https://www.mightynetworks.com/" rel="noopener noreferrer">Mighty Networks</a> - Build a community with memberships, subscriptions, and courses.</li> </ul> <h3> 24. Guest Posts </h3> <p>There's also many companies which will pay you for quality posts shared to their platform. This both increases your visibility (helping you grow your network, and gain future work), as well as bringing in some short-term income.</p> <p>If you're struggling to get accepted into any of these programs, start by writing your own posts and publishing them to popular dev-based social networks (like here on DEV.to!). This will build up your writing skills, and help you demonstrate your knowledge to potential companies. </p> <p>For example, the following sites will pay for quality guest posts:</p> <ul> <li><a href="proxy.php?url=https://www.linode.com/lp/write-for-linode/" rel="noopener noreferrer">Linode</a></li> <li><a href="proxy.php?url=https://blog.logrocket.com/become-a-logrocket-guest-author/" rel="noopener noreferrer">Log Rocket</a></li> <li><a href="proxy.php?url=https://www.smashingmagazine.com/contact/?Becoming%20an%20Author/Reviewer%20(Autoresponder)" rel="noopener noreferrer">Smashing Magazine</a></li> <li><a href="proxy.php?url=https://auth0.com/apollo-program" rel="noopener noreferrer">Auth0</a></li> <li><a href="proxy.php?url=https://css-tricks.com/guest-writing-for-css-tricks/" rel="noopener noreferrer">CSS Tricks</a></li> <li><a href="proxy.php?url=https://www.delftstack.com/write-for-us/" rel="noopener noreferrer">DelftStack</a></li> <li><a href="proxy.php?url=https://www.digitalocean.com/community/pages/write-for-digitalocean" rel="noopener noreferrer">DigitialOcean</a></li> <li><a href="proxy.php?url=https://infatica.io/contribute/" rel="noopener noreferrer">Infatica</a></li> <li><a href="proxy.php?url=https://blog.honeypot.io/write-for-honeypot/" rel="noopener noreferrer">HoneyPot</a></li> <li><a href="proxy.php?url=https://premiumcoding.com/write-for-us-premiumcoding/" rel="noopener noreferrer">Premium Coding</a></li> <li><a href="proxy.php?url=https://reflectoring.io/contribute/become-an-author/" rel="noopener noreferrer">Reflectoring</a></li> <li><a href="proxy.php?url=https://strapi.io/write-for-the-community" rel="noopener noreferrer">Strapi</a></li> <li><a href="proxy.php?url=https://www.authoritymedia.com/jobs" rel="noopener noreferrer">Android Authority</a></li> <li><a href="proxy.php?url=https://www.sitepoint.com/write-for-us/" rel="noopener noreferrer">SitePoint</a></li> <li><a href="proxy.php?url=https://www.tutorialspoint.com/about/tutorials_writing.htm" rel="noopener noreferrer">TutorialsPoint</a></li> <li><a href="proxy.php?url=https://realpython.com/jobs/tutorial-writer/" rel="noopener noreferrer">Real Python</a></li> <li><a href="proxy.php?url=https://www.dart-creations.com/about-us/write-for-us.html" rel="noopener noreferrer">Dart Creations</a></li> </ul> <p>Dmytro Spilka compiled a great list of 300+ <a href="proxy.php?url=https://solvid.co.uk/180-websites-that-accept-guest-posts/" rel="noopener noreferrer">sites accepting guest posts</a>. Another great list was put together <a href="proxy.php?url=https://dev.to/juliafmorgado/get-paid-to-write-technical-articles-16cl">here by Julia here on Dev.to</a>.</p> <h3> 25. Consulting </h3> <p>You may not realize it, but the skills and experience you've built up from your day job can be hugely valuable to many companies. Especially startups and small businesses who cannot yet afford a full-time expert. There's very high demand for professionals who can provide insights into the latest trends, tools, and best practices.</p> <p>Tips:</p> <ul> <li>The best way to get started at a decent rate, is through networking and word of mouth. But failing that there's always freelancing websites to help you build up experience.</li> <li>Keep a log of the experience you've gained, or build up a portfolio as you go, as this will help you get better gigs in the future.</li> <li>Be clear about your availability, terms, day-rate and the scope of work before getting started with any project.</li> <li>Never dismiss a potential contact. You'll be surprised who might re-connect with you even years down the line asking for consulting support.</li> </ul> <h3> 26. Mentoring </h3> <p>Whatever your level, you're experience as a developer can really help others who are less experienced. Mentoring is a really rewarding way to help others while also bringing in some extra money.</p> <ul> <li> <a href="proxy.php?url=https://mentorcruise.com/" rel="noopener noreferrer">MentorCruise</a> - Primarily long-term, with monthly rate paid, great for building up professional relationships (earn $50-$500/month per mentee)</li> <li> <a href="proxy.php?url=https://www.codementor.io/" rel="noopener noreferrer">CodeMentor</a> - Better for short-term, charged hourly-rate, great for tackling specific problems (earn $60-$300/hour)</li> </ul> <h3> 27. Tutoring </h3> <p>With CompSci now being part of the national curriculum (at least in the UK and much or Eurpoe), there's an influx of students (from 11-18+) looking for tutors to help them gain coding skills and prepare for exams. Income can range from $15 to $150+ per hour, depending on level, experience and background.</p> <ul> <li> <a href="proxy.php?url=https://www.superprof.co.uk/" rel="noopener noreferrer">Super Prof</a> - List your services, world-wide ($30-300/hour)</li> <li> <a href="proxy.php?url=https://www.theprofs.co.uk/become-a-private-tutor/" rel="noopener noreferrer">The Profs</a> - Verified tutors (income unknown)</li> <li> <a href="proxy.php?url=https://www.mytutor.co.uk/" rel="noopener noreferrer">My Tutor</a> - UK only, (£22-£55/hour)</li> <li> <a href="proxy.php?url=https://www.tutor.com/" rel="noopener noreferrer">Tutor.com</a> - US-based high-school tuition ($75-$100/hour)</li> </ul> <h3> 28. Social Media </h3> <p>There's a big gap in the market waiting to be filled by genuinely good development-focused influencers on mainstream social media platforms.</p> <p>Many social media platforms allow you to monetize content, where you'll usually be paid per view, with the amount varying depending on content category, region and reputation. But do note that you'll usually have to have a certain number of followers to be eligible, and you'll also be at the mercy "the algorithm".</p> <ul> <li>YouTube - Requires min of 1k subs + 4k watch hours/year</li> <li>X - Requires Twitter Blue subscription, no min following</li> <li>TikTok - Requires min of 10k followers + 100k views/month</li> <li>Instagram - Requires min of 10k followers</li> <li>Snap - 1k followers, 1k views/month, 10+ monthly posts</li> <li>Facebook - 10k followers or 600k video view minutes</li> <li>Twitch - 350 monthly paid subscribers</li> </ul> <h3> 29. Brand Deals </h3> <p>Following on from the social media section above, once you've managed to break through past a few hundred subscribers, you'll likely also be able to start looking into brand deals, which can help bring in extra income. Again, these require a certain proven level of engagement from your audience, and you may also need to agree to the terms of the company offering the sponsorship.</p> <h3> 30. Streaming </h3> <p>A rapidly growing niche is dev streams, don't expect to instantly <a href="proxy.php?url=https://twitch.pages.dev/" rel="noopener noreferrer">join the leaderboard</a>, but it could be a great place to get started, especially if you already have streaming experience (e.g. with video games). Nick Taylor wrote a great article on <a href="proxy.php?url=https://dev.to/nickytonline/getting-started-with-streaming-on-twitch-4im7">Getting Started with Dev Streaming</a>.</p> <h3> 31. SaaS </h3> <p>If you're able to pull this off, it's one of the best revenue models for open source projects. Your code remains 100% free and open source, users are still free to download and self-host it, but you also provide a paid-for / managed plan, where you host the app and take care of all the server management for a small recurring fee.</p> <p>This model keeps with the open source ethos, while also making your application available to a broader variety of users.</p> <p>Services like <a href="proxy.php?url=https://stripe.com/docs/payments" rel="noopener noreferrer">Stripe</a> make accepting payments and adding subscription features to your app surprisingly easy. </p> <h3> 32. Micro SaaS </h3> <p>If building a production-ready application from scratch sounds like a daunting task (because it is!), then another approach would be a Micro-SaaS app. These are smaller apps, which do one very specific task, for example:</p> <ul> <li>Automating repetitive and/or tedious tasks.</li> <li>Performing calculations that are currently calculated manually.</li> <li>Connecting disparate systems.</li> <li>Replacing Excel spreadsheet workarounds.</li> <li>Plugging in gaps of missing functionality in host ecosystems</li> <li>Enhancing reporting</li> </ul> <h3> 33. Extensions </h3> <p>Unlike SaaS apps, once an extension is built and published, there's usually very little ongoing management required. You may also find it easier for your project to pick up traction quickly if it's adding features for an already well-established site.</p> <p>Although web extensions may seem like an out-dated, or fully-saturated market, there's still plenty which can be done, and these are great projects for newer developers.</p> <p>Here's some ideas to get you started:</p> <ul> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/wa-web-plus-by-elbruz-tec/ekcgkejcjdcmonfpmnljobemcbpnkamh" rel="noopener noreferrer">WA Web Plus</a> has had 2 million downloads (22k ratings), and it charges $12/month per user. Why not create something similar for the likes of Telegram, Threema, Wire, Messenger, etc?</li> <li>Runkeeper has 45 million users, but the UI is lacking in terms of how data is displayed. Why not create an extension which adds better reporting, filtering, and combining with related external data? (similar to how <a href="proxy.php?url=https://chrome.google.com/webstore/detail/elevate-for-strava/dhiaggccakkgdfcadnklkbljcgicpckn" rel="noopener noreferrer">Elevate for Strava</a> is, but for RunKeeper)</li> <li>Pick a website which provides an essential service, but has an overly impractical UI (maybe Microsoft Azure?), and create an extension to make navigating easier, surfacing key metrics, or provide a less ugly user experience</li> <li>Augment any existing website using AI. This is much easier than it sounds, your extension could make use of services like OpenAI's API to, for example summerize a webpage, or re-phrase selected content (for copy/pasting into homework!?)</li> <li>If you know of a website with high user count, yet a terrible UI, an easy extension idea could be apply CSS overides to re-style it. For example Amazon, Yahoo, Instagram are all high-traffic sites with huge room for design improvement (dark mode?!)</li> <li>Even simple stand-alone extension apps could have a lot of potential. Like a pomodoro timer, currency converter, IP address widget, or just a web app shortcut.</li> </ul> <h3> 34. Publishing an App </h3> <p>Building a simple app or game, and making it available on platform app stores, gives you the ability to target millions of customers, with an easy monetization model. All mainstream app stores - Google Play, Apple App Store, Windows Store, Steam, etc offer support for paid apps, premium features and in-app purchases.</p> <p>Keep in mind, there is usually a setup fee which needs to be paid before you can publish your first app, the app store will also take a cut of your revenue, and it's not uncommon for small creators to get downloads in the single or double figures.</p> <h3> 35. Developing Websites for Small Businesses </h3> <p>Lots of small businesses are focused on working within their business and don’t have the time or expertise to build their website. As developers, this is something we're able to get done quite quickly, and if you're hosting their site too, you'll be able to charge a recurring payment.</p> <p>Once you've got started in web design and development, and have served a few clients, you'll find it considerably easier to find future work, both through word of mouth and by showcasing your portfolio.</p> <p>To be successful at this, you'll likely also need skills in design, communication and sales.</p> <h3> 36. Domains </h3> <p>With the influx in new TLDs, the domain reseller market is seeing a second wave of popularity. Domain flipping involves registering domain names which could be valuable in the future, then reselling them to a buyer wanting to use that name for a business or project.</p> <p>Although this can be lucrative, it does involves high risk, and requires a good understanding of the market.</p> <p>Tips:</p> <ul> <li>Look into short or memorable domains, or those which might have high keyword potential (you can use tools like Use tools like Google Keyword Planner to help with this research)</li> <li>Park domains which you're not currently using, so you can receive a bit of ad-revenue in the meantime</li> <li>Look at recently expired domains, specifically those which were in use, as these will likely either receive traffic</li> <li>A domain receiving traffic is much more valuable. So consider building out a website, app or landing page for the domain while you're holding it</li> </ul> <h3> 37. User Testing </h3> <p>Companies who develop apps often need to get feedback from users. This is where user testing services come in. You spend 10-30 minutes trying out a given website or app, then either give feedback of fill in a survey, and get paid!</p> <p>Although not specific to developers, with your tech background you'll find that you're uniquely positioned to get these done quickly and offer good feedback, enabling you to earn much faster than the average user. You'll also gain valuable insight into how the user testing process works, which will likely be useful to you when you come to commission testing on your own app.</p> <ul> <li> <a href="proxy.php?url=https://www.trymyui.com/" rel="noopener noreferrer">Try My UI</a> - Averages on $10 per website or app test</li> <li> <a href="proxy.php?url=https://www.userlytics.com/user-experience-research/paid-ux-testing/" rel="noopener noreferrer">Userlytics</a> - Earn between $5 and $50 depending on complexity and length of testing session</li> <li> <a href="proxy.php?url=https://www.usertesting.com/get-paid-to-test" rel="noopener noreferrer">User Testing</a> - Pays via PayPal, requires screenshare and/or webcam access during test session. Earn about $10 / test, with longer or live sessions paying up to $50 for some tests</li> <li> <a href="proxy.php?url=https://www.testingtime.com/en/become-a-paid-testuser/" rel="noopener noreferrer">TestingTime</a> - Option for in-person or video call tests. Less regular, but longer testing sessions. Lower paying than alternatives, when you take account for the delay between sessions</li> <li> <a href="proxy.php?url=https://www.intellizoom.com/" rel="noopener noreferrer">IntelliZoom</a> - Earn between $2 and $10 per 10 minute study. Paid via PayPal with a 3-5 day delay</li> </ul> <h3> 38. Micro Tasking </h3> <p>Less relevant to developers specifically, but if you're coming from a technical background, you'll likely find these gigs more lucrative than those without development skills.</p> <ul> <li> <a href="proxy.php?url=https://www.mturk.com/" rel="noopener noreferrer">Amazon Mechanical Turk</a> - Crowd sourcing marketplace for outsourcing virtual micro-tasks </li> <li> <a href="proxy.php?url=https://sequence.work/contributors/" rel="noopener noreferrer">Sequence Works</a> - Image annotation, data labeling and clasification</li> <li> <a href="proxy.php?url=https://en.appjobber.com/" rel="noopener noreferrer">App Jobber</a> - Market research, go to the shops and take photos of specific product placements</li> <li> <a href="proxy.php?url=https://www.gigwalk.com/gigwalkers/" rel="noopener noreferrer">GigWalk</a> - App-based micro-tasks on the go</li> <li>Take a look at <a href="proxy.php?url=https://gigworker.com/" rel="noopener noreferrer">GigWorker.com</a> for more micro-tasking and gig-based jobs</li> </ul> <h3> 39. Surveys </h3> <p>Surveys tend to pay very poorly, although participants with certain skill sets (like software engineering) are in higher demand, so can earn a little more. Even still, this likely won't be a good option unless you have a lot of time on your hands, or use a currency that's much weaker than the USD.</p> <p>These typically involve either testing out new products or services, and giving feedback - or answering questions to aid in market research campaigns.</p> <p>There's a lot of different survey-based companies, so I won't link to them all. But <a href="proxy.php?url=https://www.swagbucks.com/" rel="noopener noreferrer">Swagbucks</a>, <a href="proxy.php?url=https://20cogs.co.uk/" rel="noopener noreferrer">20Cogs</a>, <a href="proxy.php?url=https://www.testingtime.com/en/become-a-paid-testuser" rel="noopener noreferrer">TestingTime</a> are some prominent ones.</p> <h3> 40. Decentralized Nodes </h3> <p>This might not be for everyone, as proceeds are usually paid in crypto which is very volatile. But there are many Web3 projects which you can volunteer to run a node for (usually either on a Rasperry Pi, cloud server or spare laptop), which will pay you for either uptime, bandwidth, diskspace, compute, IP/proxy or some other compute resource.</p> <p>As developers, managing infrastructure is something we're good at, so if you've got any spare resources lying around, you might be able to put them to work, and earn some extra cash while you sleep.</p> <ul> <li> <a href="proxy.php?url=https://www.storj.io/node" rel="noopener noreferrer">Storj</a>: Run a Storj node, for decentralized cloud computing</li> <li> <a href="proxy.php?url=https://network3.io/" rel="noopener noreferrer">Network3</a>: AIoT layer 2 for training and validating models</li> <li> <a href="proxy.php?url=https://runonflux.io/" rel="noopener noreferrer">Flux</a>: Decentralized infra</li> <li> <a href="proxy.php?url=https://mystnodes.com/" rel="noopener noreferrer">Mysterium</a>: P2P VPN node</li> <li><p><a href="proxy.php?url=https://www.koii.network/node" rel="noopener noreferrer">Koii</a>: Distributed cloud</p></li> <li><p><a href="proxy.php?url=https://www.helium.com/mine" rel="noopener noreferrer">Helium</a>: Provide wireless connectivity for long-range IoT devices</p></li> <li><p><a href="proxy.php?url=https://filecoin.io/" rel="noopener noreferrer">Filecoin</a>: It is a decentralized storage network that turns cloud storage into an algorithmic market. Users can rent out their spare storage space and earn Filecoin tokens.</p></li> <li><p><a href="proxy.php?url=https://sia.tech/host" rel="noopener noreferrer">Sia Network</a>: This is a decentralized storage platform secured by blockchain technology. Sia stores and encrypts your files across a decentralized network. You earn Siacoins by renting out your unused hard drive space.</p></li> <li><p><a href="proxy.php?url=https://wiki.crust.network/docs/en/nodeOverview" rel="noopener noreferrer">Crust Network</a>: Similar to Filecoin and Sia, Crust supports multiple storage layer protocols such as IPFS, and provides storage interfaces for the application layer.</p></li> <li><p><a href="proxy.php?url=https://www.arweave.org/" rel="noopener noreferrer">Arweave</a>: A blockchain-based platform that offers data storage in a permanent and decentralized manner. By hosting data, users can earn rewards in the Arweave token.</p></li> <li><p><a href="proxy.php?url=https://docs.btfs.io/v2.0/docs/install-run-btfs20-node" rel="noopener noreferrer">BitTorrent</a>: This platform tokenizes the world’s largest file-sharing protocol, enabling users to earn BTT for sharing files on the network.</p></li> <li><p><a href="proxy.php?url=https://holo.host/" rel="noopener noreferrer">HOLO</a>: A peer-to-peer hosting platform for Holochain apps (hApps). Users who host hApps on their computers are rewarded with HOT tokens.</p></li> </ul> <h3> 41. Other Web3 Methods </h3> <p>The crypto sector has many other ways of earning passive income, from PoS staking, holding interest-bearing digital assets, lending, yield farming, cloud mining, dividend-earning tokens, yield farming, trading, local / PoW minding, NFTs to name a few.</p> <p>I shan't link to any specifics here, as it's a very high-risk industry so it's important you do your own research. But as technologists we're in a good position to be able to understand the fundamental concepts behind any given protocol or Web3 asset, and determine it's viability.</p> <p>My advice would be to read the white paper, and if you cannot immediately understand it, then stay away from it! It's the wild west out there, and so unless the fundamentals of a project are solid you should be prepared to loose any money you invest into it.</p> <h3> 42. Affiliate Marketing </h3> <p>Affiliate marketing is notoriously un-lucrative for those just getting started, but I've included it here because as developers, there is some scope for automating a lot of the process. Also, the more niche of a service you are marketing, the higher the the commission paid usually is. So if you're embedded in a tech community, you may be in a good position to sell low-volume high-return services.</p> <p>Again, if you've already got a following (social, blog, YouTube channel..) then affiliate marketing might make more sense, as the fractions of a penny you earn from each click are able to add up if you're getting a lot of clicks.</p> <p>It's worth noting that you should probably not share an affiliate link, without disclosing that it's an affiliate link. And try to avoid advertising products that you have either have not used yourself, or would not recommend to a friend. </p> <blockquote> <p>As an example, <a href="proxy.php?url=https://notes.aliciasykes.com/p/3Ia4JzPw43" rel="noopener noreferrer">here</a> are some of the services I have used nd have affiliate accounts with. I've never made any meaningful amount from any of them.</p> </blockquote> <h3> 43. Reseller </h3> <p>This involves building an application to wrap an existing service, while adding on a USP - either a technological one, customer support, UI, or additional features. If you're from a marketing or sales background, this might be for you. If you want to add on features, or automate the process then there will be a fair amount of up-front work, but you'll then be in a better position to collect revenue.</p> <p>You can find service providers in most major industries which offer reseller programs.<br> Some examples include:</p> <ul> <li> <a href="proxy.php?url=https://supermetrics.com/" rel="noopener noreferrer">Supermetrics</a>: Marketing reporting, analytics, data integration, 20% recurring commission.</li> <li> <a href="proxy.php?url=https://keap.com/" rel="noopener noreferrer">Keap</a>: CRM, sales and marketing automation, 20–30% recurring commissions.</li> <li> <a href="proxy.php?url=https://www.klaviyo.com/" rel="noopener noreferrer">Klaviyo</a>: Email and SMS marketing, 5–15% one-time payouts, 10–20% revenue shares.</li> <li> <a href="proxy.php?url=https://www.drift.com/" rel="noopener noreferrer">Drift</a>: Live chat software, 20% revenue share.</li> <li> <a href="proxy.php?url=https://www.activecampaign.com/" rel="noopener noreferrer">ActiveCampaign</a>: Email marketing, CRM, 20–30% commission or discount model.</li> <li> <a href="proxy.php?url=https://www.hubspot.com/" rel="noopener noreferrer">HubSpot</a>: CRM, inbound marketing, sales, 20% revenue share.</li> <li> <a href="proxy.php?url=https://www.gorgias.com/" rel="noopener noreferrer">Gorgias</a>: Ecommerce helpdesk, 20% revenue share.</li> <li> <a href="proxy.php?url=https://www.shopify.com/" rel="noopener noreferrer">Shopify</a>: E-commerce platform, 20% commission, 10% for Shopify Plus.</li> <li> <a href="proxy.php?url=https://partners.livechat.com/" rel="noopener noreferrer">LiveChat</a>: Customer service platform, live chat, 20% commission.</li> <li> <a href="proxy.php?url=https://www.getresponse.com/" rel="noopener noreferrer">GetResponse</a>: Email marketing, online campaign management, 35% discount on sub-accounts, 35% recurring commission.</li> </ul> <h3> 44. Trials </h3> <p>This doesn't relate to tech at all. But as programmers we're usually able to work from anywhere - so why not code from somewhere you're paid to be at?</p> <p>You'll usually earn between $2,000 and $10,000 depending on the trial, then length, whether it's residential and specific circumstances.</p> <p>Places like <a href="proxy.php?url=https://flucamp.com/" rel="noopener noreferrer">Flu Camp</a> will pay you £4,000 for a 2-week stay in a comfortable hotel-like suite, while they test new treatments. Those who have a specific condition, like asthma might be able to earn more by participating in a more specialist trial - if you're in the UK you can search on the <a href="proxy.php?url=https://bepartofresearch.nihr.ac.uk/" rel="noopener noreferrer">NIHR Be Part of Research</a> website</p> <h3> 45. Freelancing </h3> <p>Freelancing can vary depending on your skills, experience and the niche your operating in. Rates for some areas, like web development tend to be very low for new freelancers, yet the more experience and happy clients you have, the more you'll be able to charge.</p> <p>Three of the main platforms for developer gig work are:</p> <ul> <li> <a href="proxy.php?url=https://www.fiverr.com/" rel="noopener noreferrer">Fiverr</a>: Known for its diverse marketplace, Fiverr is great for developers who are just starting out in freelancing</li> <li> <a href="proxy.php?url=https://www.upwork.com/work" rel="noopener noreferrer">Upwork</a>: Upwork caters to a wide range of professionals, but it's particularly beneficial for experienced developers. It offers the potential for long-term contracts and higher-paying jobs. The platform is suitable for those who prefer to work on more substantial projects.</li> <li> <a href="proxy.php?url=https://www.peopleperhour.com/" rel="noopener noreferrer">People per Hour</a>: This platform is good for developers in the European market. It emphasizes local business connections and offers a good balance between short-term and long-term projects. </li> </ul> <h3> 46. Speaking </h3> <p>Both in-person and remove dev meetups and events are happening all the time around the globe. These events need speakers, and many will pay to get good talks. The amount paid varies hugely depending on the size, the audience, the topic, the speaker (you!) and other factors. Usually you'll have to start out by volunteering to do a talk at a small local tech meetup, then gradually work your way up.</p> <h3> 47. Remote Tech Support </h3> <p>It's not the most glamorous role, but smaller companies often cannot afford to hire dedicated tech support full-time, therefore there's plenty of part-time gigs that you can pick up. The pay grade for these go up considerably if you've got cloud experience or certifications. Just take a look at any job board (e.g. <a href="proxy.php?url=https://weworkremotely.com/" rel="noopener noreferrer">WeWorkRemotley</a>) and you'll see plenty of roles.</p> <p>Note that you'll usually need to be available during certain hours, with the expectation that you can reply within a given period of time. Be sure this is something you can work around before applying.</p> <h3> 49. Investing </h3> <p>Yes, it's not a side hustle - but hear me out...</p> <p>If you're earning a modest $60k/year, and have $40k living costs, then after 5 years you could have $100k in savings. If you were to invest that in the S&amp;P 500 which has an average return of 10 - 15%/year - you could be receiving upwards of an extra $1,000 / month in income from your investment, with that rising cumulatively the more you're able to save (of course, investments can go down as well as up). That's already a better return than many of the side hustles listed here!</p> <h3> 50. Employment </h3> <p>Let's not forget, that as tough as things may seem at the moment, as developers, with even just a year or 2 of experience, we're in the very fortunate position to be well paid compared to the average earner.</p> <p>If you're job isn't cutting it - switching companies is usually a sure way to jump up a salary band, and if you're not enjoying your current gig, it could be something worth considering.</p> <p>Maybe after all of this, it's not a side hustle you're after, but just a better "main hustle"?</p> <h2> Real Speak </h2> <p>Despite what you might see on IndieHackers and Instagram - having a side hustle is not the bee all and end all. It's usually something which takes considerable amount of work, for very limited returns. So before jumping into anything here or elsewhere - take a step back, and think "Why am I doing this?". If you're doing it to build experience, learn new skills and have fun - that's great. If you're doing it to get rich quick - you'll likely be very disappointed. </p> <p>Something else to note, is that as unfair as it may seem, those who already have a strong following or several successful open source projects will be in a much better position to take advantage of opportunities compared to those who are just starting out.</p> <p>Therefore, in the short-term your time may be better spent bettering yourself as a developer. If you're not sure where to start with this, here are 5 key tips:</p> <ul> <li> <strong>Networks</strong> - Build out your networks, go to meetups, hackathons and dev events, join communities, make friends</li> <li> <strong>Open Source</strong> - Put your work out there, learn in public, create mini projects which interest you and don't be afraid to fail</li> <li> <strong>Experience</strong> - Get hands-on experience, apply for internships, offer your services as a freelance developer</li> <li> <strong>Fundamentals</strong> - Ensure you've got a solid understanding of computer science fundamentals, and the rest will be much easier</li> <li> <strong>Have fun!</strong> - You'll naturally do so much better in a field that you have a genuine passion for. If you're not enjoying what you're doing, take a step back, and consider if a different approach would work better for you</li> </ul> <p> Disclaimer <ul> <li>The above list is intended only to give you ideas for starting points.</li> <li>I've not personally tested out all services listed here. <ul> <li>If you have - I would love to hear your feedback. Likewise, if there's anything which you should be added or removed, let me know below.</li> </ul> </li> <li>Not all services are available in all countries/territories (this list is primarily focusing on UK/Europe and the USA 🇬🇧🇪🇺🇺🇸)</li> <li>Some platforms take a cut of your revenue. This is usually a small amount, but important that you take account for</li> <li>Earning is generally much easier if you already have either a large following or a popular open source project</li> <li>Some methods involve risk. Although I've done my best to highlight this where possible, keep in mind that your investments may fall rather than rise</li> <li>Your results may vary</li> <li>No guarantees</li> </ul> </p> <div class="table-wrapper-paragraph"><table> <thead> <tr> <th> <small>If you like this kind of stuff</small>,<br><small>consider following for more :)<br>Thank you for reading, <a href="proxy.php?url=https://aliciasykes.com" rel="noopener noreferrer">Alicia</a> 🥰</small> </th> <th> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-Lissy93-3a3a3a%3Fstyle%3Dflat%26logo%3DGitHub%26logoColor%3Dwhite" alt="Follow Lissy93 on GitHub"></a><a href="proxy.php?url=https://mastodon.social/@lissy93" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-%40Lissy93-6364ff%3Fstyle%3Dflat%26logo%3Dmastodon%26logoColor%3Dwhite" alt="Mastodon"></a> <a href="proxy.php?url=https://twitter.com/Lissy_Sykes" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-%40Lissy_Sykes-00acee%3Fstyle%3Dflat%26logo%3Dx%26logoColor%3Dwhite" alt="Follow Lissy_Sykes on X"></a> </th> </tr> </thead> <tbody> </tbody> </table></div> opensource motivation automation beginners SvelteKit 1.0 - Building a personal blog, that shows your DEV posts 🦄 Alicia Sykes Mon, 20 Feb 2023 21:58:07 +0000 https://dev.to/lissy93/sveltekit-10-build-an-blog-fetching-posts-from-your-dev-profile-29f https://dev.to/lissy93/sveltekit-10-build-an-blog-fetching-posts-from-your-dev-profile-29f <blockquote> <p>The aim of this post is to provide a whistle-stop tour of the latest version of SvelteKit. We're going to build a developer portfolio and blog website, that fetches data from your RSS feed, as well as the GitHub API.</p> </blockquote> <p><strong>Contents</strong></p> <ul> <li>Intro to SvelteKit</li> <li>What we're going to build</li> <li> Let's get Started! <ul> <li>Step #0 - Prerequisites</li> <li>Step #1 - Project Setup</li> <li>Step #2 - Finish Setup</li> <li>Step #3 - Components</li> <li>Step #4 - Creating a Route</li> <li>Step #5 - Special Routes</li> <li>Step #6 - Fetching Data</li> <li>Step #7 - Render Results</li> <li>Step #8 - Server-Side</li> <li>Step #9 - The Post Route</li> <li>Step #10 - Deploy!</li> </ul> </li> <li> The Final Project <ul> <li>Blog Page (fetched from RSS)</li> <li>Projects Page (fetched from GitHub)</li> <li>Social Media Links (stats fetched from APIs)</li> </ul> </li> </ul> <h2> Intro to SvelteKit </h2> <p>Svelte has pretty quickly taken the top spot for most loved web framework <sup><a href="proxy.php?url=https://insights.stackoverflow.com/survey/2021#web-frameworks" rel="noopener noreferrer">[SO Survey]</a></sup>, and with the recent release of SvelteKit 1.0, you should expect to see demand for Svelte + SvelteKit developers increase, as more projects adopt it.</p> <p>SvelteKit to Svelte, is sort of like what Next.js is to React - it handles routing, layouts, server-side rendering, deployment and makes developing quality web apps quicker, easier and much more fun.</p> <p>But why SvekteKit? ... You'll see! It's just so easy to get a fully-featured dynamic web application up and running, with all the quality metrics which would usually take days, or even weeks to implement in traditional frameworks. Think great performance, simple deployments, easy code structures and a sweet sweet developer experience.</p> <h2> What we're going to build </h2> <p>Most of us have a blog, weather it's here on Dev.to, or on another platform. Today we're going to build and deploy you a personal blog, that aggregates all your posts from other platforms, into a single site.</p> <p>Since I don't know what blogging platforms you're using, I don't want to rely on individual APIs. But thankfully there's a simple solution to this - RSS! Almost all modern (and old) providers support RSS, and it'll let us easily fetch all your posts from a single URL. (For example, here on DEV: <code>https://dev.to/feed/[your-username]</code>).</p> <p>Here's a live demo: <strong><a href="proxy.php?url=https://devolio.netlify.app/blog" rel="noopener noreferrer">devolio.netlify.app/blog</a></strong></p> <p>And here's the full source: <strong><a href="proxy.php?url=https://github.com/Lissy93/devolio" rel="noopener noreferrer">@Lissy93/Devolio</a></strong></p> <div class="ltag-github-readme-tag"> <div class="readme-overview"> <h2> <img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"> Lissy93 </a> / <a href="proxy.php?url=https://github.com/Lissy93/my-website" rel="noopener noreferrer"> my-website </a> </h2> <h3> ✨ My personal homepage. A developer portfolio site that aggregates all your projects, blog posts, and stats in one place </h3> </div> <div class="ltag-github-body"> <div id="readme" class="md"> <div class="markdown-heading"> <h1 class="heading-element">✨ My Website</h1> </div> <p> <i>A re-usable aggregated portfolio and blog site for developers</i><br> <b><a href="proxy.php?url=https://aliciasykes.com/" rel="nofollow noopener noreferrer">aliciasykes.com</a></b> </p> <p> <a href="proxy.php?url=https://devolio.netlify.app" rel="nofollow noopener noreferrer"> <img width="700" src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FLissy93%2Fmy-website%2Fmaster%2Fstatic%2Fscreenshot.png"> </a> </p> <div class="markdown-heading"> <h2 class="heading-element">Intro</h2> </div> <p>This is my personal website. It's configurable, so feel free to use it, or any parts of it for yourself :)</p> <p><strong>About</strong><br> A self-hosted developer homepage, to showcase your projects, posts, coding stats, and more.<br> Data is fetched from external sources (GitHub, RSS, social platforms...), so no need for a CMS.<br> Crafted with SvelteKit + TypeScript- prioritising SEO, performance, accessibility, and compatibility.<br></p> <p><strong>Contents</strong></p> <ul> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#intro" rel="noopener noreferrer"><strong>Intro</strong></a></li> <li> <a href="proxy.php?url=https://github.com/Lissy93/my-website#developing" rel="noopener noreferrer"><strong>Usage Guides</strong></a> <ul> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#developing" rel="noopener noreferrer">Developing</a></li> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#deploying" rel="noopener noreferrer">Deploying</a></li> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#configuring" rel="noopener noreferrer">Configuring</a></li> </ul> </li> <li> <a href="proxy.php?url=https://github.com/Lissy93/my-website#community" rel="noopener noreferrer"><strong>Community</strong></a> <ul> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#report-an-issue" rel="noopener noreferrer">Report an Issue</a></li> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#contributing" rel="noopener noreferrer">Contributing</a></li> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#support" rel="noopener noreferrer">Support</a></li> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#credits" rel="noopener noreferrer">Credits</a></li> </ul> </li> <li><a href="proxy.php?url=https://github.com/Lissy93/my-website#license" rel="noopener noreferrer"><strong>License</strong></a></li> </ul> <p>A tutorial, for how to build something similar is available on <strong><a href="proxy.php?url=https://dev.to/lissy93/sveltekit-10-build-an-blog-fetching-posts-from-your-dev-profile-29f" rel="nofollow">DEV.to</a></strong></p> <p><sup>A mirror of this repository is available at <strong><a href="proxy.php?url=https://codeberg.org/alicia/devolio" rel="nofollow noopener noreferrer">codeberg.org/alicia/devolio</a></strong></sup></p> <div class="markdown-heading"> <h3 class="heading-element">Pages</h3> </div> <b>Portfolio Page</b> - Displays projects from GitHub <p>The portfolio page displays the projects you've built. Data is fetched from your GitHub profile, with optional extra fields added in the config.</p> <p>Each project can include: name, description, thumbnail…</p> </div> </div> <div class="gh-btn-container"><a class="gh-btn" href="proxy.php?url=https://github.com/Lissy93/my-website" rel="noopener noreferrer">View on GitHub</a></div> </div> <p>To deploy it yourself - just fork it, update the config with your RSS feed URL(s), and use one of the 1-click deploy options.</p> <h2> Let's get Started! </h2> <h3> Step #0 - Prerequisites </h3> <p>You'll need <a href="proxy.php?url=https://nodejs.org/en/" rel="noopener noreferrer">Node.js</a> (LTS or latest) installed. It's also recommended to have <a href="proxy.php?url=https://git-scm.com/" rel="noopener noreferrer">Git</a>, a code editor (like <a href="proxy.php?url=https://code.visualstudio.com/" rel="noopener noreferrer">VS Code</a>), and access to a terminal. Alternatively, you can use a cloud service, like <a href="proxy.php?url=https://github.com/codespaces/" rel="noopener noreferrer">Codespaces</a>.</p> <h3> Step #1 - Project Setup </h3> <p>We can easily create our project by running:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>npm create svelte@latest dev-blog </code></pre> </div> <p>When prompted, select SvelteKit, then decide weather you'd like TypeScript, ESLint, Prettier, Playwright, Vitest.</p> <p>Next, we need to navigate into our project (with <code>cd dev-blog</code>), and install dependencies (with <code>npm install</code>).</p> <p>To launch the app, with live reload enabled, run:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>npm run dev </code></pre> </div> <p>Then open <a href="proxy.php?url=http://localhost:5173/" rel="noopener noreferrer"><code>localhost:5173</code></a></p> <h3> Step #2 - Finish Setup </h3> <p>To avoid the typical ugly <code>../../../</code> in import statements, we're going to add an alias within our <code>svelte.config.js</code> file.</p> <p>This can be done by just adding <code>alias</code> object under <code>config.sveltekit</code>. Here's an example, where I'll map <code>./src/</code> to <code>$src</code>.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="k">import</span> <span class="nx">adapter</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@sveltejs/adapter-auto</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">vitePreprocess</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@sveltejs/kit/vite</span><span class="dl">'</span><span class="p">;</span> <span class="cm">/** @type {import('@sveltejs/kit').Config} */</span> <span class="kd">const</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span> <span class="na">preprocess</span><span class="p">:</span> <span class="nf">vitePreprocess</span><span class="p">(),</span> <span class="na">kit</span><span class="p">:</span> <span class="p">{</span> <span class="na">adapter</span><span class="p">:</span> <span class="nf">adapter</span><span class="p">(),</span> <span class="na">alias</span><span class="p">:</span> <span class="p">{</span> <span class="dl">'</span><span class="s1">$src/*</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">src/*</span><span class="dl">'</span><span class="p">,</span> <span class="p">},</span> <span class="p">},</span> <span class="p">};</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">config</span><span class="p">;</span> </code></pre> </div> <p>We can come back to the svelte.config file later, as it's where we put adaptors to deploy to various platforms, like Netlify.</p> <p>If you'd like to use your own Prettier, ESLint or TypeScript config, you can update <code>.prettierrc</code>, <code>.eslintrc.cjsprett</code> and <code>tsconfig.json</code> respectively. Run <code>npm run format</code> to apply Prettier rules, and <code>npm run check</code> to verify.</p> <h3> Step #3 - Components </h3> <p>Before we proceed, we need to know the basics of components.<br> One of the reason that Svelte (and SvelteKit) is so easy to work with, is because pretty much everything is just a component. And the structure of components are really, really simple. Here's an example:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight html"><code><span class="nt">&lt;script&gt;</span> <span class="c1">// All JavaScript logic and imports go here</span> <span class="c1">// Append lang="ts" to use TypeScript</span> <span class="nt">&lt;/script&gt;</span> <span class="c">&lt;!-- All markup goes here --&gt;</span> <span class="nt">&lt;p&gt;</span>Example Component<span class="nt">&lt;/p&gt;</span> <span class="nt">&lt;style&gt;</span> <span class="o">//</span> <span class="nt">All</span> <span class="nt">styles</span> <span class="nt">go</span> <span class="nt">here</span><span class="o">,</span> <span class="nt">and</span> <span class="nt">are</span> <span class="nt">scoped</span> <span class="nt">to</span> <span class="nt">the</span> <span class="nt">current</span> <span class="nt">component</span> <span class="o">//</span> <span class="nt">Append</span> <span class="nt">lang</span><span class="o">=</span><span class="s1">"scss"</span> <span class="nt">to</span> <span class="nt">use</span> <span class="nt">SCSS</span> <span class="o">(</span><span class="nt">or</span> <span class="nt">another</span> <span class="nt">pre-processor</span><span class="o">)</span> <span class="nt">p</span> <span class="p">{</span> <span class="nl">color</span><span class="p">:</span> <span class="no">hotpink</span><span class="p">;</span> <span class="p">}</span> <span class="nt">&lt;/style&gt;</span> </code></pre> </div> <p>Here's a real-world example, where we're making a re-usable heading component, with optional level (h1, h2, etc), color, size and font.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight html"><code><span class="nt">&lt;script </span><span class="na">lang=</span><span class="s">"ts"</span><span class="nt">&gt;</span> <span class="c1">// Parameters</span> <span class="k">export</span> <span class="kd">let</span> <span class="nx">level</span><span class="p">:</span> <span class="dl">'</span><span class="s1">h1</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">h2</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">h3</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">h4</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">h5</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">h6</span><span class="dl">'</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">h1</span><span class="dl">'</span><span class="p">;</span> <span class="c1">// The semantic heading level</span> <span class="k">export</span> <span class="kd">let</span> <span class="nx">color</span><span class="p">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="kc">undefined</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span> <span class="c1">// An optional override color (defaults to accent)</span> <span class="k">export</span> <span class="kd">let</span> <span class="nx">size</span><span class="p">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="kc">undefined</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span> <span class="c1">// An optional override size (default depends on level)</span> <span class="k">export</span> <span class="kd">let</span> <span class="nx">font</span><span class="p">:</span> <span class="nx">string</span> <span class="o">|</span> <span class="kc">undefined</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span> <span class="c1">// An optional override font (defaults to FiraCode)</span> <span class="c1">// Computed values, for reactivity</span> <span class="nl">$</span><span class="p">:</span> <span class="nx">computedColor</span> <span class="o">=</span> <span class="nx">color</span> <span class="p">?</span> <span class="s2">`--headingColor: </span><span class="p">${</span><span class="nx">color</span><span class="p">}</span><span class="s2">;`</span> <span class="p">:</span> <span class="dl">''</span><span class="p">;</span> <span class="nl">$</span><span class="p">:</span> <span class="nx">computedSize</span> <span class="o">=</span> <span class="nx">size</span> <span class="p">?</span> <span class="s2">`--headingSize: </span><span class="p">${</span><span class="nx">size</span><span class="p">}</span><span class="s2">;`</span> <span class="p">:</span> <span class="dl">''</span><span class="p">;</span> <span class="nl">$</span><span class="p">:</span> <span class="nx">computedFont</span> <span class="o">=</span> <span class="nx">font</span> <span class="p">?</span> <span class="s2">`--headingFont: </span><span class="p">${</span><span class="nx">font</span><span class="p">}</span><span class="s2">;`</span> <span class="p">:</span> <span class="dl">''</span><span class="p">;</span> <span class="nl">$</span><span class="p">:</span> <span class="nx">computedStyles</span> <span class="o">=</span> <span class="s2">`</span><span class="p">${</span><span class="nx">computedColor</span><span class="p">}</span><span class="s2"> </span><span class="p">${</span><span class="nx">computedSize</span><span class="p">}</span><span class="s2"> </span><span class="p">${</span><span class="nx">computedFont</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span> <span class="nt">&lt;/script&gt;</span> <span class="nt">&lt;svelte:element</span> <span class="na">this=</span><span class="s">{level}</span> <span class="na">style=</span><span class="s">{computedStyles}</span><span class="nt">&gt;</span> <span class="nt">&lt;slot&gt;&lt;/slot&gt;</span> <span class="nt">&lt;/svelte:element&gt;</span> <span class="nt">&lt;style </span><span class="na">lang=</span><span class="s">"scss"</span><span class="nt">&gt;</span> <span class="nt">h1</span><span class="o">,</span> <span class="nt">h2</span><span class="o">,</span> <span class="nt">h3</span><span class="o">,</span> <span class="nt">h4</span><span class="o">,</span> <span class="nt">h5</span><span class="o">,</span> <span class="nt">h6</span> <span class="p">{</span> <span class="nl">font-weight</span><span class="p">:</span> <span class="m">700</span><span class="p">;</span> <span class="nl">transition</span><span class="p">:</span> <span class="n">all</span> <span class="m">.25s</span> <span class="n">ease-in-out</span><span class="p">;</span> <span class="nl">font-family</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--headingFont</span><span class="p">);</span> <span class="nl">color</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--headingColor</span><span class="p">);</span> <span class="p">}</span> <span class="nt">h1</span><span class="o">,</span> <span class="nt">h2</span><span class="o">,</span> <span class="nt">h3</span> <span class="p">{</span> <span class="nl">margin</span><span class="p">:</span> <span class="m">1rem</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span> <span class="nt">h4</span><span class="o">,</span> <span class="nt">h5</span><span class="o">,</span> <span class="nt">h6</span> <span class="p">{</span> <span class="nl">margin</span><span class="p">:</span> <span class="m">0.5rem</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span> <span class="nt">h1</span> <span class="p">{</span> <span class="nl">font-size</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--headingSize</span><span class="p">,</span> <span class="m">2.8rem</span><span class="p">);</span> <span class="p">}</span> <span class="nt">h2</span> <span class="p">{</span> <span class="nl">font-size</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--headingSize</span><span class="p">,</span> <span class="m">2rem</span><span class="p">);</span> <span class="p">}</span> <span class="nt">h3</span> <span class="p">{</span> <span class="nl">font-size</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--headingSize</span><span class="p">,</span> <span class="m">1.75rem</span><span class="p">);</span> <span class="p">}</span> <span class="nt">h4</span> <span class="p">{</span> <span class="nl">font-size</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--headingSize</span><span class="p">,</span> <span class="m">1.5rem</span><span class="p">);</span> <span class="p">}</span> <span class="nt">h5</span> <span class="p">{</span> <span class="nl">font-size</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--headingSize</span><span class="p">,</span> <span class="m">1.25rem</span><span class="p">);</span> <span class="p">}</span> <span class="nt">h6</span> <span class="p">{</span> <span class="nl">font-size</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--headingSize</span><span class="p">,</span> <span class="m">1rem</span><span class="p">);</span> <span class="p">}</span> <span class="nt">&lt;/style&gt;</span> </code></pre> </div> <p>Couple of things to note:</p> <ul> <li>We are defining props with <code>export let propName</code> </li> <li>We can make props optional, by giving them a default value</li> <li>We can access any of these variables within our component, just surround them in braces <code>{}</code> </li> <li>If we need attributes to be reactive, we use the <code>$: variabeName</code> syntax</li> <li>We can specify what type of semantic element is used, with <code>&lt;svelte:element this="div"&gt;</code> </li> <li>A method of passing styles from JS into CSS is to define CSS variables, and pass them into the style prop <ul> <li>(This isn't as bad as it sounds, as all styles are scoped only to the current component!)</li> </ul> </li> </ul> <h3> Step #4 - Creating a Route </h3> <p>Next we're going to create a blog page, where all our posts will be displayed. (This could be done on the homepage, in <code>src/routes/+page.svelte</code>, but this is a good opportunity to explain routeing)</p> <p>SvelteKit will automatically create routes based on the directory structure within the <code>routes</code> directory. All you need is a directory named after the route name, containing a Svelte file names <code>+page.svelte</code>. So let's create that route, with: <code>touch src/routes/blog/+page.svelte</code> - the contents of this file will just be a normal Svelte component, like what we saw above.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight html"><code><span class="nt">&lt;script </span><span class="na">lang=</span><span class="s">"ts"</span><span class="nt">&gt;</span> <span class="kd">let</span> <span class="nx">title</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Blog Page</span><span class="dl">'</span><span class="p">;</span> <span class="nt">&lt;/script&gt;</span> <span class="nt">&lt;svelte:head&gt;</span> <span class="nt">&lt;title&gt;</span>{title}<span class="nt">&lt;/title&gt;</span> <span class="nt">&lt;/svelte:head&gt;</span> <span class="nt">&lt;h2&gt;</span>{title}<span class="nt">&lt;/h2&gt;</span> <span class="nt">&lt;style </span><span class="na">lang=</span><span class="s">"scss"</span><span class="nt">&gt;</span> <span class="nt">h2</span> <span class="p">{</span> <span class="nl">color</span><span class="p">:</span> <span class="no">hotpink</span><span class="p">;</span> <span class="p">}</span> <span class="nt">&lt;/style&gt;</span> </code></pre> </div> <p>We'll also need a route that can render individual posts, but we want that URL path to be dynamic, maybe based on the posts title. For this we can create a directory called <code>[slug]</code> that the user will land on when they visit <code>example.com/blog/example-post</code></p> <h3> Step #5 - Special Routes </h3> <p>Now's a good time to mention that we can have our routed inherit certain components that will appear on all pages, like a navbar and footer. For this, we can create a layout file, which needs to be called <code>+layout.svelte</code>, and since we want this on all pages, we'll put it into <code>src/routes</code>.</p> <p>Populate this with something like:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight html"><code><span class="nt">&lt;script </span><span class="na">lang=</span><span class="s">"ts"</span><span class="nt">&gt;</span> <span class="k">import</span> <span class="nx">NavBar</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">$src/components/NavBar.svelte</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Footer</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">$src/components/Footer.svelte</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">fade</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">svelte/transition</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">page</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">$app/stores</span><span class="dl">'</span><span class="p">;</span> <span class="nt">&lt;/script&gt;</span> <span class="nt">&lt;svelte:head&gt;</span> <span class="nt">&lt;title&gt;</span>{$page.url.pathname.replaceAll('-', ' ')}<span class="nt">&lt;/title&gt;</span> <span class="nt">&lt;/svelte:head&gt;</span> <span class="nt">&lt;NavBar</span> <span class="nt">/&gt;</span> <span class="nt">&lt;main</span> <span class="na">in:fade</span><span class="nt">&gt;</span> <span class="nt">&lt;slot</span> <span class="nt">/&gt;</span> <span class="nt">&lt;/main&gt;</span> <span class="nt">&lt;Footer</span> <span class="nt">/&gt;</span> <span class="nt">&lt;style </span><span class="na">lang=</span><span class="s">"scss"</span><span class="nt">&gt;</span> <span class="k">@import</span> <span class="s1">"$src/styles/color-palette.scss"</span><span class="p">;</span> <span class="k">@import</span> <span class="s1">"$src/styles/media-queries.scss"</span><span class="p">;</span> <span class="k">@import</span> <span class="s1">"$src/styles/typography.scss"</span><span class="p">;</span> <span class="k">@import</span> <span class="s1">"$src/styles/dimensions.scss"</span><span class="p">;</span> <span class="nd">:global</span><span class="o">(</span><span class="nt">html</span><span class="o">)</span> <span class="p">{</span> <span class="py">scroll-behavior</span><span class="p">:</span> <span class="n">smooth</span><span class="p">;</span> <span class="p">}</span> <span class="nd">:global</span><span class="o">(</span><span class="nd">::selection</span><span class="o">)</span> <span class="p">{</span> <span class="nl">background-color</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--accent</span><span class="p">);</span> <span class="nl">color</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--background</span><span class="p">);</span> <span class="p">}</span> <span class="nt">&lt;/style&gt;</span> </code></pre> </div> <p>A couple of things to note here:</p> <ul> <li>The main site content will be rendered where <code>&lt;slot /&gt;</code> is placed</li> <li>We're adding a page transition animation, by importing <code>svelte/transition</code> and setting <code>in:fade</code> on the part of the page which will change</li> <li>We can get information about the current page (like path), by using the <code>page</code> object (imported from <code>$app/stores</code>) - precede it with a <code>$</code> to keep the value updated</li> <li>If we need to set any tags within the <code>&lt;head&gt;</code> we can use <code>&lt;svelte:head&gt;</code> to do so</li> <li>We can also pop any global style, like a reset or import CSS variables</li> <li>Global styles can be applied using <code>:global(body)</code> (or whatever selector you're targeting) - but use this sparingly!</li> </ul> <p>Another special route within SvelteKit, is <code>+error.svelte</code>, which will be rendered in place of the current route if an error is thrown within the <code>load()</code> function of any route.</p> <p>Again, let's create that file in <code>src/routes/+error.svelte</code> and populate it with something like this. (Again, we can get info about the current route, including error code from the <code>$page</code> object)<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight html"><code><span class="nt">&lt;script&gt;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">page</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">$app/stores</span><span class="dl">'</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">emojis</span> <span class="o">=</span> <span class="p">{</span> <span class="c1">// TODO add the rest!</span> <span class="mi">404</span><span class="p">:</span> <span class="dl">'</span><span class="s1">🧱</span><span class="dl">'</span><span class="p">,</span> <span class="mi">420</span><span class="p">:</span> <span class="dl">'</span><span class="s1">🫠</span><span class="dl">'</span><span class="p">,</span> <span class="mi">500</span><span class="p">:</span> <span class="dl">'</span><span class="s1">💥</span><span class="dl">'</span> <span class="p">};</span> <span class="nt">&lt;/script&gt;</span> <span class="nt">&lt;h1&gt;</span>{$page.status} {$page.error.message}<span class="nt">&lt;/h1&gt;</span> <span class="nt">&lt;span</span> <span class="na">style=</span><span class="s">"font-size: 10em"</span><span class="nt">&gt;</span> {emojis[$page.status] ?? emojis[500]} <span class="nt">&lt;/span&gt;</span> </code></pre> </div> <p>It's also worth noting, that you can create layout and error pages that are specific to certain routes, by nesting them within the correct route directory. If you need several layout pages, which share characteristics, you can extract those elements out into their own component, to make them more reusable.</p> <p>By now, our routes directory structure should look something like this:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight plaintext"><code>src/routes ├── +error.svelte ├── +layout.svelte ├── +page.svelte ├── about │ └── +page.svelte └── blog ├── +page.svelte ├── +page.ts └── [slug] ├── +page.svelte └── +page.ts </code></pre> </div> <h3> Step #6 - Fetching Data </h3> <p>Now it's time to get into the good stuff! We're going to fetch the list of blog posts, from the users RSS feed.</p> <p>Now is a good time to mention, that within the path directory for each route, we can also have a <code>+page.js</code> / <code>+page.ts</code> file (alongside the <code>+page.svelte</code>). This is where we'll do our data fetching. </p> <p>To keep things simple, we're going to use <a href="proxy.php?url=https://www.npmjs.com/package/fast-xml-parser" rel="noopener noreferrer"><code>fast-xml-parser</code></a> to parse the XML response, into JSON.</p> <p>The following script simply fetches and parses feeds from a given XML RSS feed.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">XMLParser</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">fast-xml-parser</span><span class="dl">'</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">parseXml</span> <span class="o">=</span> <span class="p">(</span><span class="nx">rawRssData</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="kd">const</span> <span class="nx">parser</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">XMLParser</span><span class="p">();</span> <span class="k">return</span> <span class="nx">parser</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="nx">rawRssData</span><span class="p">);</span> <span class="p">};</span> <span class="cm">/** @type {import('./$types').PageLoad} */</span> <span class="k">export</span> <span class="kd">const</span> <span class="nx">load</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="kd">const</span> <span class="nx">RSS_URL</span> <span class="o">=</span> <span class="s2">`https://notes.aliciasykes.com/feed`</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">posts</span> <span class="o">=</span> <span class="nf">fetch</span><span class="p">(</span><span class="nx">RSS_URL</span><span class="p">)</span> <span class="p">.</span><span class="nf">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">response</span><span class="p">.</span><span class="nf">text</span><span class="p">())</span> <span class="p">.</span><span class="nf">then</span><span class="p">((</span><span class="nx">rawXml</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nf">parseXml</span><span class="p">(</span><span class="nx">rawXml</span><span class="p">).</span><span class="nx">rss</span><span class="p">.</span><span class="nx">channel</span><span class="p">.</span><span class="nx">item</span><span class="p">);</span> <span class="k">return</span> <span class="p">{</span> <span class="nx">posts</span> <span class="p">};</span> <span class="p">};</span> </code></pre> </div> <h3> Step #7 - Render Results </h3> <p>Rendering the results from the returned data is really easy. In the <code>blog/+page.svelte</code> component (next to the <code>+page.ts</code> file), simply include <code>export let data</code> - this will be the result returned by our fetch function. We can now reference this data in the markup.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight html"><code><span class="nt">&lt;script </span><span class="na">lang=</span><span class="s">"ts"</span><span class="nt">&gt;</span> <span class="cm">/** @type {import('./$types').PageData} */</span> <span class="k">export</span> <span class="kd">let</span> <span class="nx">data</span><span class="p">;</span> <span class="nt">&lt;/script&gt;</span> Blog {#each data.posts as post} <span class="nt">&lt;li&gt;</span> <span class="nt">&lt;a</span> <span class="na">target=</span><span class="s">"_blank"</span> <span class="na">href=</span><span class="s">{post.link}</span> <span class="na">rel=</span><span class="s">"noreferrer"</span><span class="nt">&gt;</span> {post.title} <span class="nt">&lt;/a&gt;</span> <span class="nt">&lt;/li&gt;</span> {/each} </code></pre> </div> <p>You'll notice we're using <code>{#each data.posts as post}</code> - this is just a for loop, as the data returned is an array.</p> <p>This is part of Svelte's <a href="proxy.php?url=https://svelte.dev/docs#template-syntax" rel="noopener noreferrer">template syntax</a>. There are other properties also, like <code>{#if expression}...{/if}</code> for conditionals, or <code>{#await expression}...{:then name}...{/await}</code> for promises, as well as a whole host of other useful features.</p> <h3> Step #8 - Server-Side </h3> <p>What we've got so far works great, but there are a few issues we may encounter with it:</p> <ul> <li>Load times - RSS feeds are large, and fetching them client-side on each load isn't efficient</li> <li>SEO - Dynamically loaded content isn't going to be crawlable by most search engine bots</li> <li>CORS - Some RSS feeds won't allow client-side requests from cross-origin hosts</li> </ul> <p>Thankfully, there's an easy fix for this. Renaming <code>+page.ts</code> to <code>+page.server.ts</code> will cause it to be rendered server-side, instead of on the users browser. This should fix those issues, and won't require any code changes. </p> <p>Note that for server-side code, we cannot use any of the browser APIs. Since a lot of our code will be capable of being run both server and client-side, we will need to check certain features are available before attempting to use them. We can do this, by importing <code>browser</code> from <code>$app/environment</code>, then using <code>if (browser) { /* Can access browser API here */ }</code></p> <h3> Step #9 - Build the Post Page </h3> <p>Finally, when the user clicks on a post, we'd like to render it. This is pretty straitforward, as the RSS response is already in HTML format, so it's just a case of using the <code>@html</code> directive, then styling it.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight html"><code><span class="nt">&lt;main</span> <span class="na">class=</span><span class="s">"article-content"</span><span class="nt">&gt;</span> {@html content} <span class="nt">&lt;/main&gt;</span> </code></pre> </div> <h3> Step #10 - Deploy! </h3> <p>Now, let's get deploys setup. This is another reason why SvelteKit is so awesome, as deploying to pretty much any provider is just so easy!</p> <ol> <li>Install the adapter for your desired provider <ul> <li>E.g. for Netlify: <code>npm i --save-dev @sveltejs/adapter-netlify</code> </li> </ul> </li> <li>Import said adaptor in your <code>svelte.config.js</code> file <ul> <li>E.g. <code>import netlifyAdapter from '@sveltejs/adapter-netlify';</code> </li> </ul> </li> <li>Initiate the adaptor, within the config object, under <code>kit</code> <ul> <li>kit: <code>{ adapter: netlifyAdapter() }</code> </li> </ul> </li> <li>Deploy! Now just head to your Netlify dashboard, and import the project</li> </ol> <p>If you wish to run your project on a VPS, we can use the <code>@sveltejs/adapter-node</code>. Repeat the process above, then run <code>yarn build</code>, and start the node server by running <code>node build/index.js</code>.</p> <p>We may want to use multiple adapters, so that our project is compatible with several different hosting providers. Here's an example of my config file which does just this:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="k">import</span> <span class="nx">autoAdapter</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@sveltejs/adapter-auto</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="nx">netlifyAdapter</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@sveltejs/adapter-netlify</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="nx">vercelAdapter</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@sveltejs/adapter-vercel</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="nx">nodeAdapter</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@sveltejs/adapter-node</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">vitePreprocess</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@sveltejs/kit/vite</span><span class="dl">'</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">multiAdapter</span> <span class="o">=</span> <span class="p">(</span><span class="nx">adapters</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="k">return</span> <span class="p">{</span> <span class="k">async</span> <span class="nf">adapt</span><span class="p">(</span><span class="nx">argument</span><span class="p">)</span> <span class="p">{</span> <span class="k">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nf">all</span><span class="p">(</span><span class="nx">adapters</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">item</span> <span class="o">=&gt;</span> <span class="nb">Promise</span><span class="p">.</span><span class="nf">resolve</span><span class="p">(</span><span class="nx">item</span><span class="p">).</span><span class="nf">then</span><span class="p">(</span><span class="nx">resolved</span> <span class="o">=&gt;</span> <span class="nx">resolved</span><span class="p">.</span><span class="nf">adapt</span><span class="p">(</span><span class="nx">argument</span><span class="p">))</span> <span class="p">))</span> <span class="p">}</span> <span class="p">};</span> <span class="p">};</span> <span class="cm">/** @type {import('@sveltejs/kit').Config} */</span> <span class="kd">const</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span> <span class="na">preprocess</span><span class="p">:</span> <span class="nf">vitePreprocess</span><span class="p">(),</span> <span class="na">kit</span><span class="p">:</span> <span class="p">{</span> <span class="na">adapter</span><span class="p">:</span> <span class="nf">multiAdapter</span><span class="p">([</span><span class="nf">autoAdapter</span><span class="p">(),</span> <span class="nf">netlifyAdapter</span><span class="p">(),</span> <span class="nf">vercelAdapter</span><span class="p">(),</span> <span class="nf">nodeAdapter</span><span class="p">()]),</span> <span class="na">alias</span><span class="p">:</span> <span class="p">{</span> <span class="dl">'</span><span class="s1">$src/*</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">src/*</span><span class="dl">'</span><span class="p">,</span> <span class="p">},</span> <span class="p">},</span> <span class="p">};</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">config</span><span class="p">;</span> </code></pre> </div> <p>(don't forget to npm i any adapters before using!)</p> <p>Finally, let's talk about Docker. As it's a popular deployment method, here's a multi-arch <strong><a href="proxy.php?url=https://github.com/Lissy93/devolio/blob/master/Dockerfile" rel="noopener noreferrer"><code>Dockerfile</code></a></strong> I've written, with a build stage, deploy stage, and some healthchecks.</p> <p>It's also published to DockerHub (under <a href="proxy.php?url=https://hub.docker.com/r/lissy93/devolio" rel="noopener noreferrer">lissy93/devolio</a>), so you should be able to use it with <code>docker run -p 3000:80 lissy93/devolio</code> - or use the <a href="proxy.php?url=https://github.com/Lissy93/devolio/blob/master/docker-compose.yml" rel="noopener noreferrer"><code>docker-compose.yml</code></a> as an template for your own container.</p> <h2> The Project </h2> <p>I've had to skip over a few details for the sake of brevity, but all <a href="proxy.php?url=https://github.com/Lissy93/devolio" rel="noopener noreferrer">the code is available on GitHub</a>, so that should clear up anything that doesn't yet make sense - if it's still not, feel free to ask below :)</p> <p>There's a few extra features that I also added:</p> <ul> <li>Extracted all data into a config file, for easy usage, and made it stylable with custom colors and themes</li> <li>I used a store to keep track of posts (in <a href="proxy.php?url=https://github.com/Lissy93/devolio/blob/master/src/store/BlogStore.ts" rel="noopener noreferrer">BlogStore.ts</a>)</li> <li>Added functionality for loading and combining multiple RSS feeds, as well as sorting and filtering results</li> <li>Added internationalization functionality (in <a href="proxy.php?url=https://github.com/Lissy93/devolio/blob/master/src/store/Language.ts" rel="noopener noreferrer">Language.ts</a>)</li> <li>I built a page to showcase your projects, with data fetched from your GitHub, via their API</li> <li>And a contact page, with an email form, social media links and GPG keys</li> <li>Added more adapters for deploying to various cloud services, and wrote a Dockerfile</li> </ul> <p>Here's some screenshots (with just the plain theme)</p> <h5> Blog Page (fetched from RSS) </h5> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2ifqk9hfj7akmhaigcp.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv2ifqk9hfj7akmhaigcp.gif" alt="Blog Page" width="720" height="356"></a></p> <h5> Projects Page (fetched from GitHub) </h5> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyexfz30636mj5se5bx7e.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyexfz30636mj5se5bx7e.gif" alt="Projects Page" width="800" height="420"></a></p> <h5> Social Media Links (stats fetched from APIs) </h5> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuiola2i3u4ps96v7wm6d.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuiola2i3u4ps96v7wm6d.gif" alt="Social Media Links" width="573" height="655"></a></p> <p>I do plan on expanding the project, add some features and make it into an easily configurable, themeable developer portfolio website, that anyone can easily use. If you'd like to see the updates, drop the repo a star on GitHub :)</p> <p>And if you'd like to contribute to the source, it's <a href="proxy.php?url=https://github.com/Lissy93/devolio" rel="noopener noreferrer">here</a> (<code>MIT</code>) on GitHub, and I'll drop you a mention in the credits if you're able to submit a PR!</p> <p>Thanks for sticking by this far! I know this post has been quite long, and is a little different from my usual format. If you've got any feedback, questions, suggestions, or comments - drop them below and I'll reply :)</p> <div class="table-wrapper-paragraph"><table> <thead> <tr> <th> <small>If you like this kind of stuff</small>,<br><small>consider following for more :)</small> </th> <th> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-Lissy93-3a3a3a%3Fstyle%3Dflat%26logo%3DGitHub%26logoColor%3Dwhite" alt="Follow Lissy93 on GitHub" width="69" height="20"></a><a href="proxy.php?url=https://twitter.com/Lissy_Sykes" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-%40Lissy_Sykes-00acee%3Fstyle%3Dflat%26logo%3DTwitter%26logoColor%3Dwhite" alt="Follow Lissy_Sykes on Twitter" width="85" height="20"></a> </th> </tr> </thead> <tbody> </tbody> </table></div> svelte tutorial opensource webdev CLI tools you won't be able to live without 🔧 Alicia Sykes Thu, 19 Jan 2023 01:30:42 +0000 https://dev.to/lissy93/cli-tools-you-cant-live-without-57f6 https://dev.to/lissy93/cli-tools-you-cant-live-without-57f6 <p>As developers, we spend a lot of our time in the terminal. There's a lot of helpful CLI tools, which can make your life in the command line easier, faster and generally more fun.</p> <p>This post outlines my top 50 must-have CLI tools, which I've come to rely on. If there's anything I'm missing - do let me know in the comments :)</p> <p>At the end of the article, I've included some scripts to help you automate the installation and updating of these tools on various systems/ distros.</p> <p> ↕️ <strong>Contents</strong> (click to expand) <br> <ul> <li> Utils <ul> <li> <code>thefuck</code> - Auto-correct miss-typed commands</li> <li> <code>zoxide</code> - Easy navigation <em>(better cd)</em> </li> <li> <code>tldr</code> - Community-maintained docs <em>(better <code>man</code>)</em> </li> <li> <code>scc</code> - Count lines of code <em>(better <code>cloc</code>)</em> </li> <li> <code>exa</code> - Listing Files <em>(better <code>ls</code>)</em> </li> <li> <code>duf</code> - Disk Usage <em>(better <code>df</code>)</em> </li> <li> <code>aria2</code> - Download Utility <em>(better <code>wget</code>)</em> </li> <li> <code>bat</code> - Reading Files <em>(better <code>cat</code>)</em> </li> <li> <code>diff-so-fancy</code> - File Comparisons <em>(better <code>diff</code>)</em> </li> <li> <code>entr</code> - Watch for changes</li> <li> <code>exiftool</code> - Reading + writing metadata</li> <li> <code>fdupes</code> - Duplicate file finder</li> <li> <code>fzf</code> - Fuzzy file finder <em>(better <code>find</code>)</em> </li> <li> <code>hyperfine</code> - Command benchmarking</li> <li> <code>just</code> - Modern command runner <em>(better <code>make</code>)</em> </li> <li> <code>jq</code> - JSON processor</li> <li> <code>most</code> - Multi-window scroll pager <em>(better less)</em> </li> <li> <code>procs</code> - Process viewer <em>(better ps)</em> </li> <li> <code>rip</code> - Deletion tool <em>(better rm)</em> </li> <li> <code>ripgrep</code> - Search within files <em>(better <code>grep</code>)</em> </li> <li> <code>rsync</code> - Fast, incremental file transfer</li> <li> <code>sd</code> - Find and replace <em>(better <code>sed</code>)</em> </li> <li> <code>tre</code> - Directory hierarchy <em>(better <code>tree</code>)</em> </li> <li> <code>xsel</code> - Access the clipboard</li> </ul> </li> <li> CLI Monitoring and Performance Apps <ul> <li> <code>bandwhich</code> - Bandwidth utilization monitor</li> <li> <code>ctop</code> - Container metrics and monitoring</li> <li> <code>bpytop</code> - Resource monitoring <em>(better <code>htop</code>)</em> </li> <li> <code>glances</code> - Resource monitor + web and API</li> <li> <code>gping</code> - Interactive ping tool <em>(better <code>ping</code>)</em> </li> <li> <code>dua-cli</code> - Disk usage analyzer and monitor <em>(better <code>du</code>)</em> </li> <li> <code>speedtest-cli</code> - Command line speed test utility</li> <li> <code>dog</code> - DNS lookup client <em>(better <code>dig</code>)</em> </li> </ul> </li> <li> CLI Productivity Apps <ul> <li> <code>browsh</code> - CLI web browser</li> <li> <code>buku</code> - Bookmark manager</li> <li> <code>cmus</code> - Music browser / player</li> <li> <code>cointop</code> - Track crypto prices</li> <li> <code>ddgr</code> - Search the web from the terminal</li> <li> <code>khal</code> - Calendar client</li> <li> <code>mutt</code> - Email client</li> <li> <code>newsboat</code> - RSS / ATOM news reader</li> <li> <code>rclone</code> - Manage cloud storage</li> <li> <code>taskwarrior</code> - Todo + task management</li> <li> <code>tuir</code> - Terminal UI for Reddit</li> </ul> </li> <li> CLI Dev Suits <ul> <li> <code>httpie</code> - HTTP / API testing testing client</li> <li> <code>lazydocker</code> - Full Docker management app</li> <li> <code>lazygit</code> - Full Git management app</li> <li> <code>kdash</code> - Kubernetes dashboard app</li> <li> <code>gdp-dashboard</code> - Visual GDP debugger</li> </ul> </li> <li> CLI External Sercvices <ul> <li> <code>ngrok</code> - Reverse proxy for sharing localhost</li> <li> <code>tmate</code> - Share a terminal session via internet</li> <li> <code>asciinema</code> - Recording + sharing terminal sessions</li> <li> <code>navi</code> - Interactive cheat sheet</li> <li> <code>transfer.sh</code> - Fast file sharing</li> <li> <code>surge</code> - Deploy a site in seconds</li> <li> <code>wttr.in</code> - Check the weather</li> </ul> </li> <li> CLI Fun <ul> <li> <code>cowsay</code> - Have an ASCII cow say your message</li> <li> <code>figlet</code> - Output text as big ASCII art text</li> <li> <code>lolcat</code> - Make console output raibow colored</li> <li> <code>neofetch</code> - Show system data and ditstro info</li> </ul> </li> <li>Installations and Management</li> <li> Conclusion <ul> <li>What wasn't included</li> <li>Credit</li> <li>Feedback</li> <li> Find More </li> </ul> </li> </ul> </p> <h2> Utils </h2> <h3> <a href="proxy.php?url=https://github.com/nvbn/thefuck" rel="noopener noreferrer"><code>thefuck</code></a> - Auto-correct miss-typed commands </h3> <blockquote> <p><code>thefuck</code> is one of those utilities you won't be able to live without once you've tried it. Whenever you mis-type a command and get an error, just run <code>fuck</code> and it'll auto-correct it. Use up/down to choose a correction, or just run <code>fuck --yeah</code> to just execute the most likely immediately.</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd34cab0xeybo4lu2wkf.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsd34cab0xeybo4lu2wkf.gif" alt="the-fuck-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/nvbn/thefuck" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fnvbn%2Fthefuck%3Fcolor%3D232323%26label%3Dthefuck%26logo%3Dgithub%26labelColor%3D232323" alt="View thefuck on GitHub" width="104" height="20"></a> <a href="proxy.php?url=https://github.com/nvbn" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fnvbn-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author nvbn" width="61" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>thefuck <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> thefuck <span class="c"># FreeBSD</span> pkg <span class="nb">install </span>thefuck </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/ajeetdsouza/zoxide" rel="noopener noreferrer"><code>zoxide</code></a> - Easy navigation <em>(better cd)</em> </h3> <blockquote> <p><code>z</code> lets you jump to any directory without needing to remember or specify its full path. It remembers which directories you've visited, so you can jump around quickly - you don't even need to type the full folder name. It also has an interactive selection option, using <code>fzf</code> so you can live-filter directory results</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gvi17q5n2607trw6bnb.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gvi17q5n2607trw6bnb.gif" alt="zoxide-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/ajeetdsouza/zoxide" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fajeetdsouza%2Fzoxide%3Fcolor%3D232323%26label%3Dzoxide%26logo%3Dgithub%26labelColor%3D232323" alt="View zoxide on GitHub" width="96" height="20"></a> <a href="proxy.php?url=https://github.com/ajeetdsouza" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fajeetdsouza-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author ajeetdsouza" width="101" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>zoxide <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> zoxide <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>zoxide <span class="c"># FreeBSD</span> pkg <span class="nb">install </span>zoxide <span class="c"># Other (via Rust Creates)</span> cargo <span class="nb">install </span>zoxide <span class="nt">--locked</span> </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/tldr-pages/tldr" rel="noopener noreferrer"><code>tldr</code></a> - Community-maintained docs <em>(better <code>man</code>)</em> </h3> <blockquote> <p><code>tldr</code> is a huge collection of community-maintained man pages. Unlike traditional man pages, they're summarized, contain useful usage examples and nicely colourized for easy reading</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vbps7vlm9r42qfk69w8.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vbps7vlm9r42qfk69w8.gif" alt="tldr-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/tldr-pages/tldr" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Ftldr-pages%2Ftldr%3Fcolor%3D232323%26label%3Dtldr%26logo%3Dgithub%26labelColor%3D232323" alt="View tldr on GitHub" width="82" height="20"></a> <a href="proxy.php?url=https://github.com/tldr-pages" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Ftldr-pages-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author tldr-pages" width="89" height="20"></a> </p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>tldr <span class="c"># Other (via NPM)</span> npm <span class="nb">install</span> <span class="nt">-g</span> tldr </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/boyter/scc" rel="noopener noreferrer"><code>scc</code></a> - Count lines of code <em>(better <code>cloc</code>)</em> </h3> <blockquote> <p><code>scc</code> gives you a breakdown of number of lines of code written in each language for a specific directory. It also shows some fun stats, like estimated cost to develop and complexity info. It's incredibly fast, very accurate and has support for a wide range of languages</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewcq7bbenleoyy4pztrm.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewcq7bbenleoyy4pztrm.png" alt="scc-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/boyter/scc" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fboyter%2Fscc%3Fcolor%3D232323%26label%3Dscc%26logo%3Dgithub%26labelColor%3D232323" alt="View scc on GitHub" width="82" height="20"></a> <a href="proxy.php?url=https://github.com/boyter" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fboyter-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author boyter" width="69" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>scc <span class="c"># Other (via go)</span> go <span class="nb">install </span>github.com/boyter/scc/v3@latest </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/ogham/exa" rel="noopener noreferrer"><code>exa</code></a> - Listing Files <em>(better <code>ls</code>)</em> </h3> <blockquote> <p><code>exa</code> is a modern Rust-based replacement for the <code>ls</code> command, for listing files. It can display file-type icons, colors, file/folder info and has several output formats - tree, grid or list</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tkddmk9z6vpejnpw5we.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tkddmk9z6vpejnpw5we.png" alt="exa-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/ogham/exa" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fogham%2Fexa%3Fcolor%3D232323%26label%3Dexa%26logo%3Dgithub%26labelColor%3D232323" alt="View exa on GitHub" width="80" height="20"></a> <a href="proxy.php?url=https://github.com/ogham" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fogham-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author ogham" width="71" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>exa <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> exa <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>exa </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/muesli/duf" rel="noopener noreferrer"><code>duf</code></a> - Disk Usage <em>(better <code>df</code>)</em> </h3> <blockquote> <p><code>duf</code> is great for showing info about mounted disks and checking free space. It produces a clear and colorful output, and includes options for sorting and customizing results.</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feaf6xpek2h2nevhmepaa.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feaf6xpek2h2nevhmepaa.png" alt="duf-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/muesli/duf" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fmuesli%2Fduf%3Fcolor%3D232323%26label%3Dduf%26logo%3Dgithub%26labelColor%3D232323" alt="View duf on GitHub" width="80" height="20"></a> <a href="proxy.php?url=https://github.com/muesli" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fmuesli-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author muesli" width="69" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>duf <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> duf <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>duf <span class="c"># FreeBSD</span> pkg <span class="nb">install </span>duf </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/aria2/aria2" rel="noopener noreferrer"><code>aria2</code></a> - Download Utility <em>(better <code>wget</code>)</em> </h3> <blockquote> <p><code>aria2</code> is a lightweight, multi-protocol, resuming download utility for HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink, with support for controlling via an RPC interface. It's incredibly <a href="proxy.php?url=https://aria2.github.io/manual/en/html/README.html" rel="noopener noreferrer">feature rich</a>, and has tons of <a href="proxy.php?url=https://aria2.github.io/manual/en/html/aria2c.html" rel="noopener noreferrer">options</a>. There's also <a href="proxy.php?url=https://github.com/ziahamza/webui-aria2" rel="noopener noreferrer">ziahamza/webui-aria2</a> - a nice web interface companion.</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwgy2nq04kxwbrqdlvgc.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwgy2nq04kxwbrqdlvgc.png" alt="aria2c-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/aria2/aria2" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Faria2%2Faria2%3Fcolor%3D232323%26label%3Daria2%26logo%3Dgithub%26labelColor%3D232323" alt="View aria2 on GitHub" width="88" height="20"></a> <a href="proxy.php?url=https://github.com/aria2" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Faria2-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author aria2" width="61" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%2B%2B%26color%3D00599C%26logo%3Dcplusplus%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%2B%2B%26color%3D00599C%26logo%3Dcplusplus%26logoColor%3DFFFFFF" alt="Written in C++" width="35" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>aria2 <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> aria2 <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>aria2 </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/sharkdp/bat" rel="noopener noreferrer"><code>bat</code></a> - Reading Files <em>(better <code>cat</code>)</em> </h3> <blockquote> <p><code>bat</code> is a clone of <code>cat</code> with syntax highlighting and git integration. Written in Rust, it's very performant, and has several options for customizing output and theming. There's support for automatic piping and file concatenation</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkmu0xst70282uodok8ar.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkmu0xst70282uodok8ar.png" alt="bat-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/sharkdp/bat" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fsharkdp%2Fbat%3Fcolor%3D232323%26label%3Dbat%26logo%3Dgithub%26labelColor%3D232323" alt="View bat on GitHub" width="78" height="20"></a> <a href="proxy.php?url=https://github.com/sharkdp" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fsharkdp-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author sharkdp" width="79" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>bat <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> bat <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>bat </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/so-fancy/diff-so-fancy" rel="noopener noreferrer"><code>diff-so-fancy</code></a> - File Comparisons <em>(better <code>diff</code>)</em> </h3> <blockquote> <p><code>diff-so-fancy</code> gives you better looking diffs for comparing strings, files, directories and git changes. The change highlighting makes spotting changes much easier, and you can customize the output layout and colors</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77uu6c0pqoa8j8ft50u9.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77uu6c0pqoa8j8ft50u9.png" alt="diff-so-fancy-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/so-fancy/diff-so-fancy" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fso-fancy%2Fdiff-so-fancy%3Fcolor%3D232323%26label%3Ddiff-so-fancy%26logo%3Dgithub%26labelColor%3D232323" alt="View diff-so-fancy on GitHub" width="130" height="20"></a> <a href="proxy.php?url=https://github.com/so-fancy" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fso-fancy-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author so-fancy" width="79" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPerl%26color%3D39457E%26logo%3Dperl%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPerl%26color%3D39457E%26logo%3Dperl%26logoColor%3DFFFFFF" alt="Written in Perl" width="49" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>diff-so-fancy <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> diff-so-fancy <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>diff-so-fancy </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/eradman/entr" rel="noopener noreferrer"><code>entr</code></a> - Watch for changes </h3> <blockquote> <p><code>entr</code> lets you run an arbitrary command whenever file changes. You can pass a file, directory, symlink or regex to specify which files it should watch. It's really useful for automatically rebuilding projects, reacting to logs, automated testing, etc. Unlike similar projects, it uses kqueue(2) or inotify(7) to avoid polling, and improve performance</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F414s8q5lrqtpm9lhpwd4.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F414s8q5lrqtpm9lhpwd4.png" alt="entr-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/eradman/entr" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Feradman%2Fentr%3Fcolor%3D232323%26label%3Dentr%26logo%3Dgithub%26labelColor%3D232323" alt="View entr on GitHub" width="84" height="20"></a> <a href="proxy.php?url=https://github.com/eradman" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Feradman-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author eradman" width="83" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>entr <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> entr <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>entr </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/exiftool/exiftool" rel="noopener noreferrer"><code>exiftool</code></a> - Reading + writing metadata </h3> <blockquote> <p>ExifTool is handy utility for reading, writing, stripping and creating meta information for a wide variety of file types. Never accidentally leak your location when sharing a photo again!</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthmzq7zswauycd3rr9ki.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthmzq7zswauycd3rr9ki.png" alt="exiftool-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/exiftool/exiftool" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fexiftool%2Fexiftool%3Fcolor%3D232323%26label%3Dexiftool%26logo%3Dgithub%26labelColor%3D232323" alt="View exiftool on GitHub" width="102" height="20"></a> <a href="proxy.php?url=https://github.com/exiftool" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fexiftool-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author exiftool" width="75" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPerl%26color%3D39457E%26logo%3Dperl%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPerl%26color%3D39457E%26logo%3Dperl%26logoColor%3DFFFFFF" alt="Written in Perl" width="49" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/jbruchon/jdupes" rel="noopener noreferrer"><code>fdupes</code></a> - Duplicate file finder </h3> <blockquote> <p><code>jdupes</code> is used for identifying and/or deleting duplicate files within specified directories. It's useful for freeing up disk space when you've got two or more identical files</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2w432abh09dpel0olro.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2w432abh09dpel0olro.png" alt="fdupes-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/jbruchon/jdupes" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fjbruchon%2Fjdupes%3Fcolor%3D232323%26label%3Djdupes%26logo%3Dgithub%26labelColor%3D232323" alt="View jdupes on GitHub" width="155" height="20"></a> <a href="proxy.php?url=https://github.com/jbruchon" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fjbruchon-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author jbruchon" width="83" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/junegunn/fzf" rel="noopener noreferrer"><code>fzf</code></a> - Fuzzy file finder <em>(better <code>find</code>)</em> </h3> <blockquote> <p><code>fzf</code> is an extremely powerful, and easy to use fuzzy file finder and filtering tool. It lets you search for a string or pattern across files. fzf also has <a href="proxy.php?url=https://github.com/junegunn/fzf/wiki/Related-projects" rel="noopener noreferrer">plugins</a> available for most shells and IDEs, for showing instant results while searching. This <a href="proxy.php?url=https://www.freecodecamp.org/news/fzf-a-command-line-fuzzy-finder-missing-demo-a7de312403ff/" rel="noopener noreferrer">post</a> by Alexey Samoshkin highlights some of it's use cases.</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3mmtc4oero27c4nfwes.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3mmtc4oero27c4nfwes.gif" alt="fzf-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/junegunn/fzf" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fjunegunn%2Ffzf%3Fcolor%3D232323%26label%3Dfzf%26logo%3Dgithub%26labelColor%3D232323" alt="View fzf on GitHub" width="76" height="20"></a> <a href="proxy.php?url=https://github.com/junegunn" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fjunegunn-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author junegunn" width="85" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>fzf <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> fzf <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>fzf </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/sharkdp/hyperfine" rel="noopener noreferrer"><code>hyperfine</code></a> - Command benchmarking </h3> <blockquote> <p><code>hyperfine</code> makes it easy to accurately benchmark and compare arbitrary commands or scripts. It takes care of warm-up runs, clearing the cache for accurate results and preventing interference from other programs. It can also export results as raw data and generate charts.</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7ttudho3xuwtb9v9v6h.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7ttudho3xuwtb9v9v6h.png" alt="hyperfine-example-usage" width="800" height="427"></a></p> <p><a href="proxy.php?url=https://github.com/sharkdp/hyperfine" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fsharkdp%2Fhyperfine%3Fcolor%3D232323%26label%3Dhyperfine%26logo%3Dgithub%26labelColor%3D232323" alt="View hyperfine on GitHub" width="112" height="20"></a> <a href="proxy.php?url=https://github.com/sharkdp" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fsharkdp-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author sharkdp" width="79" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>hyperfine <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> hyperfine <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>hyperfine </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/casey/just" rel="noopener noreferrer"><code>just</code></a> - Modern command runner <em>(better <code>make</code>)</em> </h3> <blockquote> <p><code>just</code> is similar to <code>make</code> but with some nice additions. It let's you group your projects commands together into recopies, which can be easily listed and run. Supports aliases, positional arguments, different shells, dot env integration, string interprulation, and pretty much everything else you could need</p> </blockquote> <p><a href="proxy.php?url=https://github.com/casey/just" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fcasey%2Fjust%3Fcolor%3D232323%26label%3Djust%26logo%3Dgithub%26labelColor%3D232323" alt="View just on GitHub" width="84" height="20"></a> <a href="proxy.php?url=https://github.com/casey" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fcasey-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author casey" width="65" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <p> Install <div class="highlight js-code-highlight"> <pre class="highlight shell"><code> <span class="c"># MacOS (via Homebrew)</span> brew <span class="nb">install </span>just <span class="c"># Arch Linux</span> <span class="nb">sudo </span>pacman <span class="nt">-S</span> just <span class="c"># Debian / Ubuntu</span> <span class="nb">sudo </span>apt <span class="nb">install </span>just </code></pre> </div> </p> <h3> <a href="proxy.php?url=https://github.com/stedolan/jq" rel="noopener noreferrer"><code>jq</code></a> - JSON processor </h3> <blockquote> <p><code>jq</code> is like <code>sed</code>, but for JSON - you can use it to slice and filter and map and transform structured data with ease. It can be used to write complex queries to extract or manipulate JSON data. There's also a <a href="proxy.php?url=https://jqplay.org/" rel="noopener noreferrer">jq playground</a> that you can use to try it out, or formulate queries with live feedback</p> </blockquote> <p><a href="proxy.php?url=https://github.com/stedolan/jq" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fstedolan%2Fjq%3Fcolor%3D232323%26label%3Djq%26logo%3Dgithub%26labelColor%3D232323" alt="View jq on GitHub" width="74" height="20"></a> <a href="proxy.php?url=https://github.com/stedolan" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fstedolan-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author stedolan" width="81" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://www.jedsoft.org/most/" rel="noopener noreferrer"><code>most</code></a> - Multi-window scroll pager <em>(better less)</em> </h3> <blockquote> <p><code>most</code> is a pager, for reading through long files or command outputs. <code>most</code> supports multi-windows and has the option to not wrap text </p> </blockquote> <p><a href="proxy.php?url=https://www.jedsoft.org/aboutme.html" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fjed-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author Jed" width="51" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DS_Lang%26color%3D000000%26logo%3Dsimkl%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DS_Lang%26color%3D000000%26logo%3Dsimkl%26logoColor%3DFFFFFF" alt="Written in S-Lang" width="69" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/dalance/procs" rel="noopener noreferrer"><code>procs</code></a> - Process viewer <em>(better ps)</em> </h3> <blockquote> <p><code>procs</code> is an easy to navigate process viewer, it has colored highlighting, makes sorting and searching for processes easy, has tree view and updates in real-time</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66aux8de5ayqzdjxeu7b.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66aux8de5ayqzdjxeu7b.gif" alt="procs-example-usage" width="800" height="488"></a></p> <p><a href="proxy.php?url=https://github.com/dalance/procs" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fdalance%2Fprocs%3Fcolor%3D232323%26label%3Dprocs%26logo%3Dgithub%26labelColor%3D232323" alt="View procs on GitHub" width="94" height="20"></a> <a href="proxy.php?url=https://github.com/dalance" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fdalance-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author dalance" width="77" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/nivekuil/rip" rel="noopener noreferrer"><code>rip</code></a> - Deletion tool <em>(better rm)</em> </h3> <blockquote> <p><code>rip</code> is a safe, ergonomic and performant deletion tool. It let's you intuitively remove files and directories, and easily restore deleted files</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F10DTvT2%2Frip.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F10DTvT2%2Frip.gif" alt="rip-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/nivekuil/rip" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fnivekuil%2Frip%3Fcolor%3D232323%26label%3Drip%26logo%3Dgithub%26labelColor%3D232323" alt="View rip on GitHub" width="80" height="20"></a> <a href="proxy.php?url=https://github.com/nivekuil" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fnivekuil-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author nivekuil" width="77" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/BurntSushi/ripgrep" rel="noopener noreferrer"><code>ripgrep</code></a> - Search within files <em>(better <code>grep</code>)</em> </h3> <blockquote> <p><code>ripgrep</code> is a line-oriented search tool that recursively searches the current directory for a regex pattern. It can ignore the contents of <code>.gitignore</code> and skip binary files. It's able to search within compressed archives, or only search specific extension, and understands files using various encoding methods</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbmr38l5sfeynfy4yu1l.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbmr38l5sfeynfy4yu1l.png" alt="ripgrep-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/BurntSushi/ripgrep" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2FBurntSushi%2Fripgrep%3Fcolor%3D232323%26label%3Dripgrep%26logo%3Dgithub%26labelColor%3D232323" alt="View ripgrep on GitHub" width="102" height="20"></a> <a href="proxy.php?url=https://github.com/BurntSushi" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FBurntSushi-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author BurntSushi" width="95" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://rsync.samba.org/" rel="noopener noreferrer"><code>rsync</code></a> - Fast, incremental file transfer </h3> <blockquote> <p><code>rsync</code> lets you copy large files locally or to or from remote hosts or external drives. It can be used to keep files across multiple locations synced, and is perfect for creating, updating and restoring backups</p> </blockquote> <p><a href="proxy.php?url=https://github.com/WayneD/rsync" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2FWayneD%2Frsync%3Fcolor%3D232323%26label%3Drsync%26logo%3Dgithub%26labelColor%3D232323" alt="View rsync on GitHub" width="96" height="20"></a> <a href="proxy.php?url=https://github.com/WayneD" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FWayneD-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author WayneD" width="79" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/chmln/sd" rel="noopener noreferrer"><code>sd</code></a> - Find and replace <em>(better <code>sed</code>)</em> </h3> <blockquote> <p><code>sd</code> is an easy, fast and intuitive find and replace tool, based on string literals. It can be executed on a file, an entire directory, or any piped text</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1nd67tliy5l7b34r21r.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1nd67tliy5l7b34r21r.png" alt="sd-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/chmln/sd" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fchmln%2Fsd%3Fcolor%3D232323%26label%3Dsd%26logo%3Dgithub%26labelColor%3D232323" alt="View sd on GitHub" width="76" height="20"></a> <a href="proxy.php?url=https://github.com/chmln" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fchmln-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author chmln" width="67" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/dduan/tre" rel="noopener noreferrer"><code>tre</code></a> - Directory hierarchy <em>(better <code>tree</code>)</em> </h3> <blockquote> <p><code>tre</code> outputs a tree stye list of files for your current or a specified directory, with colors. When running with the <code>-e</code> option, it numbers each item, and creates a temporary alias that you can use to quickly jump to that location</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dl6kxdum67xexkztr8d.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dl6kxdum67xexkztr8d.png" alt="tre-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/dduan/tre" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fdduan%2Ftre%3Fcolor%3D232323%26label%3Dtre%26logo%3Dgithub%26labelColor%3D232323" alt="View tre on GitHub" width="78" height="20"></a> <a href="proxy.php?url=https://github.com/dduan" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fdduan-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author dduan" width="69" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/kfish/xsel" rel="noopener noreferrer"><code>xsel</code></a> - Access the clipboard </h3> <blockquote> <p><code>xsel</code> let's you read and write to the X Selection clipboard via the command line. It's useful for piping command output to the clipboard, or a copied data into a command </p> </blockquote> <p><a href="proxy.php?url=https://github.com/kfish/xsel" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fkfish%2Fxsel%3Fcolor%3D232323%26label%3Dxsel%26logo%3Dgithub%26labelColor%3D232323" alt="View xsel on GitHub" width="84" height="20"></a> <a href="proxy.php?url=https://github.com/kfish" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fkfish-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author kfish" width="61" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <h2> CLI Monitoring and Performance Apps </h2> <h3> <a href="proxy.php?url=https://github.com/imsnif/bandwhich" rel="noopener noreferrer"><code>bandwhich</code></a> - Bandwidth utilization monitor </h3> <blockquote> <p>Show bandwidth usage, connection information, outgoing hosts and DNS queries in real-time</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fps64sac0bije443ql4ba.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fps64sac0bije443ql4ba.png" alt="bandwhich-example-usage" width="800" height="490"></a></p> <p><a href="proxy.php?url=https://github.com/imsnif/bandwhich" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fimsnif%2Fbandwhich%3Fcolor%3D232323%26label%3Dbandwhich%26logo%3Dgithub%26labelColor%3D232323" alt="View bandwhich on GitHub" width="120" height="20"></a> <a href="proxy.php?url=https://github.com/imsnif" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fimsnif-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author imsnif" width="67" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/bcicen/ctop" rel="noopener noreferrer"><code>ctop</code></a> - Container metrics and monitoring </h3> <blockquote> <p>Like <code>top</code>, but for monitoring resource usage for running (Docker and runC) containers. It shows real-time CPU, memory and network bandwidth as well as the name, status and ID of each container. There's also a built-in log viewer, and options to manage (stop, start, exec, etc) containers</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foq52gq649s5tfe6u2snx.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foq52gq649s5tfe6u2snx.gif" alt="ctop-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/bcicen/ctop" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fbcicen%2Fctop%3Fcolor%3D232323%26label%3Dctop%26logo%3Dgithub%26labelColor%3D232323" alt="View ctop on GitHub" width="86" height="20"></a> <a href="proxy.php?url=https://github.com/bcicen" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fbcicen-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author bcicen" width="69" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/aristocratos/bpytop" rel="noopener noreferrer"><code>bpytop</code></a> - Resource monitoring <em>(better <code>htop</code>)</em> </h3> <blockquote> <p><code>bpytop</code> is a fast, interactive, visual resource monitor. It shows top running processes, recent CPU, mem, disk and network history. From the interface you can navigate, sort and search - there's also support for custom color themes</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdp97y4vlwmqstfr0yyg3.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdp97y4vlwmqstfr0yyg3.gif" alt="bpytop-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/aristocratos/bpytop" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Faristocratos%2Fbpytop%3Fcolor%3D232323%26label%3Dbpytop%26logo%3Dgithub%26labelColor%3D232323" alt="View bpytop on GitHub" width="98" height="20"></a> <a href="proxy.php?url=https://github.com/aristocratos" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Faristocratos-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author aristocratos" width="99" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/nicolargo/glances" rel="noopener noreferrer"><code>glances</code></a> - Resource monitor + web and API </h3> <blockquote> <p><code>glances</code> is another resource monitor, but with a different feature set. It includes a fully responsive web view, a REST API and historical monitoring. It's easily extendable, and can be integrated with other services</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77lyqbdf6pcjolhjk0oi.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77lyqbdf6pcjolhjk0oi.gif" alt="glances-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/nicolargo/glances" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fnicolargo%2Fglances%3Fcolor%3D232323%26label%3Dglances%26logo%3Dgithub%26labelColor%3D232323" alt="View glances on GitHub" width="104" height="20"></a> <a href="proxy.php?url=https://github.com/nicolargo" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fnicolargo-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author nicolargo" width="85" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/orf/gping" rel="noopener noreferrer"><code>gping</code></a> - Interactive ping tool <em>(better <code>ping</code>)</em> </h3> <blockquote> <p><code>gping</code> can run ping tests on multiple hosts, while showing results in real-time graph. It can also be used to monitor execution time, when used with the <code>--cmd</code> flag</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpgzre8kagt1j6yzy4uc.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpgzre8kagt1j6yzy4uc.gif" alt="gping-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/orf/gping" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Forf%2Fgping%3Fcolor%3D232323%26label%3Dgping%26logo%3Dgithub%26labelColor%3D232323" alt="View gping on GitHub" width="92" height="20"></a> <a href="proxy.php?url=https://github.com/orf" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Forf-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author orf" width="49" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/Byron/dua-cli" rel="noopener noreferrer"><code>dua-cli</code></a> - Disk usage analyzer and monitor <em>(better <code>du</code>)</em> </h3> <blockquote> <p><code>dua-cli</code> let's you interactively view used and available disk space for each mounted drive, and makes freeing up storage easy</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3c46q1bh8qdfvy5s1sm6.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3c46q1bh8qdfvy5s1sm6.gif" alt="dua-cli-usage-example" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/Byron/dua-cli" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2FByron%2Fdua-cli%3Fcolor%3D232323%26label%3Ddua-cli%26logo%3Dgithub%26labelColor%3D232323" alt="View dua-cli on GitHub" width="92" height="20"></a> <a href="proxy.php?url=https://github.com/Byron" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FByron-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author Byron" width="67" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/sivel/speedtest-cli" rel="noopener noreferrer"><code>speedtest-cli</code></a> - Command line speed test utility </h3> <blockquote> <p><code>speedtest-cli</code> just runs an internet speed test, via speedtest.net - but straight from the terminal :)</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femb2z6s2wovmtywb3lcz.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femb2z6s2wovmtywb3lcz.gif" alt="speedtest-cli-example-usage" width="800" height="400"></a></p> <p><a href="proxy.php?url=https://github.com/sivel/speedtest-cli" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fsivel%2Fspeedtest-cli%3Fcolor%3D232323%26label%3Dspeedtest-cli%26logo%3Dgithub%26labelColor%3D232323" alt="View speedtest-cli on GitHub" width="130" height="20"></a> <a href="proxy.php?url=https://github.com/sivel" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fsivel-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author sivel" width="59" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/ogham/dog" rel="noopener noreferrer"><code>dog</code></a> - DNS lookup client <em>(better <code>dig</code>)</em> </h3> <blockquote> <p><code>dog</code> is an easy-to-use DNS lookup client, with support for DoT and DoH, nicely coloured outputs and the option to emit JSON</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpym49mhc8gsbgx0u89da.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpym49mhc8gsbgx0u89da.png" alt="dog-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/ogham/dog" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fogham%2Fdog%3Fcolor%3D232323%26label%3Ddog%26logo%3Dgithub%26labelColor%3D232323" alt="View dog on GitHub" width="84" height="20"></a> <a href="proxy.php?url=https://github.com/ogham" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fogham-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author ogham" width="71" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h2> CLI Productivity Apps </h2> <blockquote> <p>Surf the web, play music, check emails, manage calendars, read the news and more, all without leaving the terminal!</p> </blockquote> <h3> <a href="proxy.php?url=https://github.com/browsh-org/browsh" rel="noopener noreferrer"><code>browsh</code></a> - CLI web browser </h3> <blockquote> <p><code>browsh</code> is a fully interactive, real-time, and modern text-based browser rendered to TTYs and browsers. It supports both mouse and keyboard navigation, and is surprisingly feature rich for a purely terminal based application. It also mitigates battery drain issues that plague modern browsers, and with support for MoSH, you can experience faster load times due to reduced bandwidth</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wk8p8i33telyx5li3t4.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wk8p8i33telyx5li3t4.gif" alt="browsh-example-usage" width="480" height="270"></a></p> <p><a href="proxy.php?url=https://github.com/browsh-org/browsh" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fbrowsh-org%2Fbrowsh%3Fcolor%3D232323%26label%3Dbrowsh%26logo%3Dgithub%26labelColor%3D232323" alt="View browsh on GitHub" width="102" height="20"></a> <a href="proxy.php?url=https://github.com/browsh-org" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fbrowsh-org-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author browsh-org" width="95" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DJavaScript%26color%3DF7DF1E%26logo%3Djavascript%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DJavaScript%26color%3DF7DF1E%26logo%3Djavascript%26logoColor%3DFFFFFF" alt="Written in JavaScript" width="85" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/jarun/buku" rel="noopener noreferrer"><code>buku</code></a> - Bookmark manager </h3> <blockquote> <p><code>buku</code> is a terminal-based bookmark manager, with tons of configuration, storage and usage options. There's also an optional <a href="proxy.php?url=https://github.com/jarun/buku/tree/master/bukuserver#screenshots" rel="noopener noreferrer">web UI</a> and <a href="proxy.php?url=https://github.com/samhh/bukubrow-webext#installation" rel="noopener noreferrer">browser plugin</a>, for accessing your bookmarks outside of the terminal</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3sdudxkh620u0e19bu3.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3sdudxkh620u0e19bu3.png" alt="buku-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/jarun/buku" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fjarun%2Fbuku%3Fcolor%3D232323%26label%3Dbuku%26logo%3Dgithub%26labelColor%3D232323" alt="View buku on GitHub" width="90" height="20"></a> <a href="proxy.php?url=https://github.com/jarun" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fjarun-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author jarun" width="63" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/cmus/cmus" rel="noopener noreferrer"><code>cmus</code></a> - Music browser / player </h3> <blockquote> <p><code>cmus</code> is terminal music player, controlled with keyboard shortcuts. It has support for a wide range of audio formats and codecs, and allows organising tracks into playlists and applying playback settings</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x53mxo9ynnflesyk6xr.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x53mxo9ynnflesyk6xr.png" alt="cmus-example-usage" width="800" height="560"></a></p> <p><a href="proxy.php?url=https://github.com/cmus/cmus" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fcmus%2Fcmus%3Fcolor%3D232323%26label%3Dcmus%26logo%3Dgithub%26labelColor%3D232323" alt="View cmus on GitHub" width="94" height="20"></a> <a href="proxy.php?url=https://github.com/cmus" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fcmus-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author cmus" width="63" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/cointop-sh/cointop" rel="noopener noreferrer"><code>cointop</code></a> - Track crypto prices </h3> <blockquote> <p><code>cointop</code> show current crypto prices, and track the price history of your portfolio. Supports price alerts, historical charts, currency conversion, fuzzy searching, and much more. You can try the demo via the web at <a href="proxy.php?url=https://cointop.sh/" rel="noopener noreferrer">cointop.sh</a>, or by running <code>ssh cointop.sh</code></p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo58mhjhmw0hzglbsy4tg.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo58mhjhmw0hzglbsy4tg.png" alt="cointop-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/cointop-sh/cointop" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fcointop-sh%2Fcointop%3Fcolor%3D232323%26label%3Dcointop%26logo%3Dgithub%26labelColor%3D232323" alt="View cointop on GitHub" width="96" height="20"></a> <a href="proxy.php?url=https://github.com/cointop-sh" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fcointop-sh-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author cointop-sh" width="91" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/jarun/ddgr" rel="noopener noreferrer"><code>ddgr</code></a> - Search the web from the terminal </h3> <blockquote> <p><code>ddgr</code> is like <a href="proxy.php?url=https://github.com/jarun/googler" rel="noopener noreferrer">googler</a>, but for DuckDuckGo. It's fast, clean and easy, with support for instant answers, search completion, search bangs, and advanced search. It respects your privacy by default, and also has HTTPS proxy support, and works with Tor</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc25z80hclk61z2vrm5sp.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc25z80hclk61z2vrm5sp.png" alt="dggr-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/jarun/ddgr" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fjarun%2Fddgr%3Fcolor%3D232323%26label%3Dddgr%26logo%3Dgithub%26labelColor%3D232323" alt="View ddgr on GitHub" width="88" height="20"></a> <a href="proxy.php?url=https://github.com/jarun" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fjarun-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author jarun" width="63" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/zyedidia/micro" rel="noopener noreferrer"><code>micro</code></a> - Code editor <em>(better <code>nano</code>)</em> </h3> <blockquote> <p><code>micro</code> is an easy to use, fast and extendable code editor with mouse support. Since it's packaged into a single binary, installation is as simple as <code>curl https://getmic.ro | bash</code></p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mqf1nz04pqx9wnr8ivj.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mqf1nz04pqx9wnr8ivj.png" alt="micro-screenshot" width="800" height="583"></a></p> <p><a href="proxy.php?url=https://github.com/zyedidia/micro" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fzyedidia%2Fmicro%3Fcolor%3D232323%26label%3Dmicro%26logo%3Dgithub%26labelColor%3D232323" alt="View micro on GitHub" width="92" height="20"></a> <a href="proxy.php?url=https://github.com/zyedidia" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fzyedidia-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author zyedidia" width="79" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/pimutils/khal" rel="noopener noreferrer"><code>khal</code></a> - Calendar client </h3> <blockquote> <p><code>khal</code> is a terminal calendar app, which shows upcoming events, month and agenda views. You can sync it with any CalDAV calendar, and add, edit and remove events directly</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9rvj3xn074gt3r7wvct.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9rvj3xn074gt3r7wvct.png" alt="khal-example-usage" width="640" height="430"></a></p> <p><a href="proxy.php?url=https://github.com/pimutils/khal" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fpimutils%2Fkhal%3Fcolor%3D232323%26label%3Dkhal%26logo%3Dgithub%26labelColor%3D232323" alt="View khal on GitHub" width="86" height="20"></a> <a href="proxy.php?url=https://github.com/pimutils" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fpimutils-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author pimutils" width="77" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h3> <a href="proxy.php?url=https://gitlab.com/muttmua/mutt" rel="noopener noreferrer"><code>mutt</code></a> - Email client </h3> <blockquote> <p><code>mut</code> is a classic, a terminal based mail client for sending, reading and managing emails. It supports all mainstream email protocols and mailbox formats, allows for attachments, BCC/CC, threads, mailing lists and delivery status notifications</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FzVVsG3s%2Fmutt.webp" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FzVVsG3s%2Fmutt.webp" alt="mutt-example-usage" width="800" height="460"></a></p> <p><a href="proxy.php?url=https://gitlab.com/muttmua/mutt" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fmuttmua%2Fmutt%3Fcolor%3D232323%26label%3Dmutt%26logo%3Dgithub%26labelColor%3D232323" alt="View mutt on GitHub" width="86" height="20"></a> <a href="proxy.php?url=https://github.com/muttmua" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fmuttmua-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author muttmua" width="85" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/newsboat/newsboat" rel="noopener noreferrer"><code>newsboat</code></a> - RSS / ATOM news reader </h3> <blockquote> <p><code>newsboat</code> is an RSS feed reader and aggregator, for reading the news, blogs and following updates directly from the terminal</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdx7nffucs0vgubg1q4p.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdx7nffucs0vgubg1q4p.png" alt="newsboat-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/newsboat/newsboat" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fnewsboat%2Fnewsboat%3Fcolor%3D232323%26label%3Dnewsboat%26logo%3Dgithub%26labelColor%3D232323" alt="View newsboat on GitHub" width="108" height="20"></a> <a href="proxy.php?url=https://github.com/newsboat" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fnewsboat-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author newsboat" width="87" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%2B%2B%26color%3D00599C%26logo%3Dcplusplus%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%2B%2B%26color%3D00599C%26logo%3Dcplusplus%26logoColor%3DFFFFFF" alt="Written in C++" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/rclone/rclone" rel="noopener noreferrer"><code>rclone</code></a> - Manage cloud storage </h3> <blockquote> <p><code>rclone</code> is a handy utility for syncing files and folders to various cloud storage providers. It can be either invoked directly from the command line, or easily integrated into a script as a replacement for heavy desktop sync apps</p> </blockquote> <p><a href="proxy.php?url=https://github.com/rclone/rclone" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Frclone%2Frclone%3Fcolor%3D232323%26label%3Drclone%26logo%3Dgithub%26labelColor%3D232323" alt="View rclone on GitHub" width="98" height="20"></a> <a href="proxy.php?url=https://github.com/rclone" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Frclone-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author rclone" width="67" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/GothenburgBitFactory/taskwarrior" rel="noopener noreferrer"><code>taskwarrior</code></a> - Todo + task management </h3> <blockquote> <p><code>task</code> is a CLI task management/ todo app. It's both simple and unobtrusive, but also incredibly powerful and scalable, with advanced organisation and query features built in. There's also a lot (700+!) of extra <a href="proxy.php?url=https://taskwarrior.org/tools/" rel="noopener noreferrer">plugins</a> for extending it's functionality and integrating with third-party services</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa19870j5shovm8wa0540.jpg" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa19870j5shovm8wa0540.jpg" alt="task-warrior-example-usage" width="800" height="411"></a></p> <p><a href="proxy.php?url=https://github.com/GothenburgBitFactory/taskwarrior" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2FGothenburgBitFactory%2Ftaskwarrior%3Fcolor%3D232323%26label%3Dtaskwarrior%26logo%3Dgithub%26labelColor%3D232323" alt="View taskwarrior on GitHub" width="126" height="20"></a> <a href="proxy.php?url=https://github.com/GothenburgBitFactory" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FGothenburgBitFactory-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author GothenburgBitFactory" width="155" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%2B%2B%26color%3D00599C%26logo%3Dcplusplus%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%2B%2B%26color%3D00599C%26logo%3Dcplusplus%26logoColor%3DFFFFFF" alt="Written in C++" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://gitlab.com/ajak/tuir" rel="noopener noreferrer"><code>tuir</code></a> - Terminal UI for Reddit </h3> <blockquote> <p><code>tuir</code> is a great one if you want to look like you're working, while actually browsing Reddit! It's got intuitive keybindings, custom themes, and can render images and multi-media content too. There's also <a href="proxy.php?url=https://github.com/donnemartin/haxor-news" rel="noopener noreferrer">haxor</a> for hacker news</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynv7v3iubo16pywpz008.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynv7v3iubo16pywpz008.png" alt="tuir-example-usage" width="433" height="407"></a></p> <p><a href="proxy.php?url=https://gitlab.com/ajak/tuir" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgitlab%2Fstars%2Fajak%2Ftuir%3Fcolor%3Dfc6d26%26label%3Dtuir%26logo%3Dgitlab%26labelColor%3D232323" alt="View tuir on GitLab" width="82" height="20"></a> <a href="proxy.php?url=https://github.com/ajak" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fajak-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author ajak" width="57" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h2> CLI Dev Suits </h2> <h3> <a href="proxy.php?url=https://github.com/httpie/httpie" rel="noopener noreferrer"><code>httpie</code></a> - HTTP / API testing testing client </h3> <blockquote> <p><code>httpie</code> is a HTTP client, for testing, debugging and using APIs. It supports everything you'd expect - HTTPS, proxies, authentication, custom headers, persistent sessions, JSON parsing. Usage is simple with an expressive syntax and colourized output. Like other HTTP clients (Postman, Hopscotch, Insomnia, etc) HTTPie also includes a web UI</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf1gdlvo5czinlxl2k8z.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf1gdlvo5czinlxl2k8z.png" alt="httpie-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/httpie/httpie" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fhttpie%2Fhttpie%3Fcolor%3D232323%26label%3Dhttpie%26logo%3Dgithub%26labelColor%3D232323" alt="View httpie on GitHub" width="92" height="20"></a> <a href="proxy.php?url=https://github.com/httpie" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fhttpie-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author httpie" width="67" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/jesseduffield/lazydocker" rel="noopener noreferrer"><code>lazydocker</code></a> - Full Docker management app </h3> <blockquote> <p><code>lazydocker</code> is a Docker management app, that lets you view all containers and images, manage their state, read logs, check resource usage, restart/ rebuild, analyse layers, prune unused containers, images and volumes, and so much more. It saves you from needing remember, type and chain multiple Docker commands.</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcp3b6fc4kzuoj746hmb6.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcp3b6fc4kzuoj746hmb6.png" alt="lazy-docker-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/jesseduffield/lazydocker" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fjesseduffield%2Flazydocker%3Fcolor%3D232323%26label%3Dlazydocker%26logo%3Dgithub%26labelColor%3D232323" alt="View lazydocker on GitHub" width="122" height="20"></a> <a href="proxy.php?url=https://github.com/jesseduffield" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fjesseduffield-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author jesseduffield" width="103" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"><code>lazygit</code></a> - Full Git management app </h3> <blockquote> <p><code>lazygit</code> is a visual git client, on the command line. Easily add, commit and puch files, resolve conflicts, compare diffs, manage logs, and do complex operations like squashes and rewinds. There's keybindings for everything, colors, and it's easily configurable and extenable</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhijyjh8rytgwxcqra8n2.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhijyjh8rytgwxcqra8n2.png" alt="lazy-git-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fjesseduffield%2Flazygit%3Fcolor%3D232323%26label%3Dlazygit%26logo%3Dgithub%26labelColor%3D232323" alt="View lazygit on GitHub" width="98" height="20"></a> <a href="proxy.php?url=https://github.com/jesseduffield" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fjesseduffield-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author jesseduffield" width="103" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/kdash-rs/kdash/" rel="noopener noreferrer"><code>kdash</code></a> - Kubernetes dashboard app </h3> <blockquote> <p><code>kdash</code> is an all-in-one Kubernetes management tool. View node metrics, watch resources, stream container logs, analyse contexts and manage nodes, pods and namespaces</p> </blockquote> <p><a href="proxy.php?url=https://github.com/kdash-rs/kdash/" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fkdash-rs%2Fkdash%3Fcolor%3D232323%26label%3Dkdash%26logo%3Dgithub%26labelColor%3D232323" alt="View kdash on GitHub" width="96" height="20"></a> <a href="proxy.php?url=https://github.com/kdash-rs" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fkdash-rs-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author kdash-rs" width="81" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/cyrus-and/gdb-dashboard" rel="noopener noreferrer"><code>gdp-dashboard</code></a> - Visual GDP debugger </h3> <blockquote> <p><code>gdp-dashboard</code> adds a visual element to the GNU Debugger, for debugging C and C++ programs. Easily analyse memory, step through breakpoints, and view registers</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumijepka2llahumhpub7.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumijepka2llahumhpub7.png" alt="gdp-dashboard-example-usage" width="800" height="1513"></a></p> <p><a href="proxy.php?url=https://github.com/cyrus-and/gdb-dashboard" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fcyrus-and%2Fgdb-dashboard%3Fcolor%3D232323%26label%3Dgdb-dashboard%26logo%3Dgithub%26labelColor%3D232323" alt="View gdb-dashboard on GitHub" width="144" height="20"></a> <a href="proxy.php?url=https://github.com/cyrus-and" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fcyrus-and-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author cyrus-and" width="87" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h2> CLI External Sercvices </h2> <h3> <a href="proxy.php?url=https://ngrok.com/" rel="noopener noreferrer"><code>ngrok</code></a> - Reverse proxy for sharing localhost </h3> <blockquote> <p><code>ngrok</code> safely* exposes your localhost to the internet behind a unique URL. This lets you share what you're working on with you're remote colleagues, in real-time. Usage is <a href="proxy.php?url=https://notes.aliciasykes.com/p/RUi22QSyWe" rel="noopener noreferrer">very simple</a>, but it's also got a lot of advanced features for things like authentication, webhooks, firewalls, traffic inspection, custom/ wildcard domains and much more</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9pomjvv8v7lf6gapw4r.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9pomjvv8v7lf6gapw4r.png" alt="ngrok-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/inconshreveable/ngrok" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Finconshreveable%2Fngrok%3Fcolor%3D232323%26label%3Dngrok%26logo%3Dgithub%26labelColor%3D232323" alt="View ngrok on GitHub" width="94" height="20"></a> <a href="proxy.php?url=https://github.com/inconshreveable" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Finconshreveable-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author inconshreveable" width="123" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <h3> <a href="proxy.php?url=https://tmate.io/" rel="noopener noreferrer"><code>tmate</code></a> - Share a terminal session via internet </h3> <blockquote> <p><code>tmate</code> let's you instantly share a live terminal session with someone elsewhere in the world. It works across different systems, supports access control/ auth, can be self-hosted, and has all the features of Tmux</p> </blockquote> <p><a href="proxy.php?url=https://github.com/tmate-io/tmate" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Ftmate-io%2Ftmate%3Fcolor%3D232323%26label%3Dtmate%26logo%3Dgithub%26labelColor%3D232323" alt="View tmate on GitHub" width="96" height="20"></a> <a href="proxy.php?url=https://github.com/tmate-io" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Ftmate-io-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author tmate-io" width="79" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://asciinema.org/" rel="noopener noreferrer"><code>asciinema</code></a> - Recording + sharing terminal sessions </h3> <blockquote> <p><code>asciinema</code> is very useful for easily recording, sharing and embedding a terminal session. Great to showcase something you've built, or to show the command-line steps for a tutorial. Unlike screenrecording videos, the user can copy-paste the content, change the theme on the fly and control playback</p> </blockquote> <div class="ltag_asciinema"> </div> <p><a href="proxy.php?url=https://github.com/asciinema/asciinema" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fasciinema%2Fasciinema%3Fcolor%3D232323%26label%3Dasciinema%26logo%3Dgithub%26labelColor%3D232323" alt="View asciinema on GitHub" width="116" height="20"></a> <a href="proxy.php?url=https://github.com/asciinema" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fasciinema-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author asciinema" width="89" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/denisidoro/navi" rel="noopener noreferrer"><code>navi</code></a> - Interactive cheat sheet </h3> <blockquote> <p><code>navi</code> allows you to browse through cheatsheets and execute commands. Suggested values for arguments are dynamically displayed in a list. Type less, reduce mistakes and save yourself from having to memorise thousands of commands. It integrates with <a href="proxy.php?url=https://github.com/tldr-pages/tldr" rel="noopener noreferrer">tldr</a> and <a href="proxy.php?url=https://github.com/chubin/cheat.sh" rel="noopener noreferrer">cheat.sh</a> to get content, but you can also import other cheatsheets, or even write your own</p> </blockquote> <div class="ltag_asciinema"> </div> <p><a href="proxy.php?url=https://github.com/denisidoro/navi" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fdenisidoro%2Fnavi%3Fcolor%3D232323%26label%3Dnavi%26logo%3Dgithub%26labelColor%3D232323" alt="View navi on GitHub" width="84" height="20"></a> <a href="proxy.php?url=https://github.com/denisidoro" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fdenisidoro-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author denisidoro" width="91" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRust%26color%3De86243%26logo%3Drust%26logoColor%3DFFFFFF" alt="Written in Rust" width="53" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/dutchcoders/transfer.sh/" rel="noopener noreferrer"><code>transfer.sh</code></a> - Fast file sharing </h3> <blockquote> <p><code>transfer</code> makes uploading and sharing files really easy, directly from the command line. It's free, supports encryption, gives you a unique URL, and can also be self-hosted.<br> I've written a Bash helper function to make usage a bit easier, you can <a href="proxy.php?url=https://github.com/Lissy93/dotfiles/blob/master/utils/transfer.sh" rel="noopener noreferrer">find it here</a> or try it out by running <code>bash &lt;(curl -L -s https://alicia.url.lol/transfer)</code></p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vl1k2i4tgvww87khlz1.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vl1k2i4tgvww87khlz1.png" alt="transfer-sh-example-usage" width="800" height="426"></a></p> <p><a href="proxy.php?url=https://github.com/dutchcoders/transfer.sh" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fdutchcoders%2Ftransfer.sh%3Fcolor%3D232323%26label%3Dtransfer.sh%26logo%3Dgithub%26labelColor%3D232323" alt="View transfer.sh on GitHub" width="120" height="20"></a> <a href="proxy.php?url=https://github.com/dutchcoders" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fdutchcoders-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author dutchcoders" width="101" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DGo%2520Lang%26color%3D00ADD8%26logo%3Dgo%26logoColor%3DFFFFFF" alt="Written in Go" width="73" height="20"></a></p> <h3> <a href="proxy.php?url=https://surge.sh/" rel="noopener noreferrer"><code>surge</code></a> - Deploy a site in seconds </h3> <blockquote> <p><code>surge</code> is a free static hosting provider, that you can deploy to directly from the terminal in a single command, just run <code>surge</code> from within your <code>dist</code> directory! It supports custom domains, auto SSL certs, pushState support, cross-origin resource support - and it's free!</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwmm4qte24btl41amyol.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwmm4qte24btl41amyol.png" alt="surge-sh-example-usage" width="800" height="426"></a></p> <h3> <a href="proxy.php?url=https://github.com/chubin/wttr.in" rel="noopener noreferrer"><code>wttr.in</code></a> - Check the weather </h3> <blockquote> <p><code>wttr.in</code> is a service that displays the weather in a format that's digestible in the command line. Just run <code>curl wttr.in</code> or <code>curl wttr.in/London</code> to try it out. There's URL parameters to customise what data is returned, as well as the format</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xm7lb85oat23vtsj20i.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xm7lb85oat23vtsj20i.png" alt="wrrt-in-example-usage" width="800" height="517"></a></p> <p><a href="proxy.php?url=https://github.com/chubin/wttr.in" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fchubin%2Fwttr.in%3Fcolor%3D232323%26label%3Dwttr.in%26logo%3Dgithub%26labelColor%3D232323" alt="View wttr.in on GitHub" width="96" height="20"></a> <a href="proxy.php?url=https://github.com/chubin" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fchubin-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author chubin" width="71" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DPython%26color%3D3C78A9%26logo%3Dpython%26logoColor%3DFFFFFF" alt="Written in Python" width="67" height="20"></a></p> <h2> CLI Fun </h2> <h3> <a href="proxy.php?url=https://en.wikipedia.org/wiki/Cowsay" rel="noopener noreferrer"><code>cowsay</code></a> - Have an ASCII cow say your message </h3> <blockquote> <p><code>cowsay</code> is a configurable talking cow. It's based off the <a href="proxy.php?url=https://github.com/tnalpgge/rank-amateur-cowsay" rel="noopener noreferrer">original</a> by Tony Monroe</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazoieebcf11io8mhkc45.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazoieebcf11io8mhkc45.png" alt="cowsay-example-usage" width="800" height="324"></a></p> <p><a href="proxy.php?url=https://github.com/piuccio/cowsay" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fpiuccio%2Fcowsay%3Fcolor%3D232323%26label%3Dcowsay%26logo%3Dgithub%26labelColor%3D232323" alt="View cowsay on GitHub" width="104" height="20"></a> <a href="proxy.php?url=https://github.com/piuccio" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fpiuccio-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author piuccio" width="71" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DJavaScript%26color%3DF7DF1E%26logo%3Djavascript%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DJavaScript%26color%3DF7DF1E%26logo%3Djavascript%26logoColor%3DFFFFFF" alt="Written in JavaScript" width="85" height="20"></a></p> <h3> <a href="proxy.php?url=http://www.figlet.org/" rel="noopener noreferrer"><code>figlet</code></a> - Output text as big ASCII art text </h3> <blockquote> <p><code>figlet</code> outputs text as ASCII art</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpaq8ufvoru1ijm8oj2c.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpaq8ufvoru1ijm8oj2c.png" alt="figlet-example-usage" width="800" height="201"></a></p> <p><a href="proxy.php?url=https://github.com/cmatsuoka/figlet" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fcmatsuoka%2Ffiglet%3Fcolor%3D232323%26label%3Dfiglet%26logo%3Dgithub%26labelColor%3D232323" alt="View figlet on GitHub" width="92" height="20"></a> <a href="proxy.php?url=https://github.com/cmatsuoka" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fcmatsuoka-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author cmatsuoka" width="93" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DC%26color%3DA8B9CC%26logo%3Dc%26logoColor%3DFFFFFF" alt="Written in C" width="35" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/busyloop/lolcat" rel="noopener noreferrer"><code>lolcat</code></a> - Make console output raibow colored </h3> <blockquote> <p><code>lolcat</code> makes any text passed to it rainbow coloured</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp719mxeffx3zfecm2hs.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp719mxeffx3zfecm2hs.png" alt="lolcat-example-usage" width="800" height="436"></a></p> <p><a href="proxy.php?url=https://github.com/busyloop/lolcat" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fbusyloop%2Flolcat%3Fcolor%3D232323%26label%3Dlolcat%26logo%3Dgithub%26labelColor%3D232323" alt="View lolcat on GitHub" width="96" height="20"></a> <a href="proxy.php?url=https://github.com/busyloop" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fbusyloop-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author busyloop" width="83" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRuby%26color%3DCC342D%26logo%3Druby%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DRuby%26color%3DCC342D%26logo%3Druby%26logoColor%3DFFFFFF" alt="Written in Ruby" width="55" height="20"></a></p> <h3> <a href="proxy.php?url=https://github.com/dylanaraps/neofetch" rel="noopener noreferrer"><code>neofetch</code></a> - Show system data and ditstro info </h3> <blockquote> <p><code>neofetch</code> prints distro and system info (so you can flex that you use Arch btw on r/unixporn)</p> </blockquote> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2jus0pzbtrz4nc624u0.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2jus0pzbtrz4nc624u0.png" alt="neofetch-example-usage" width="681" height="407"></a></p> <p><a href="proxy.php?url=https://github.com/dylanaraps/neofetch" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fdylanaraps%2Fneofetch%3Fcolor%3D232323%26label%3Dneofetch%26logo%3Dgithub%26labelColor%3D232323" alt="View neofetch on GitHub" width="108" height="20"></a> <a href="proxy.php?url=https://github.com/dylanaraps" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Fdylanaraps-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author dylanaraps" width="95" height="20"></a> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DBash%26color%3Dgreen%26logo%3Dgnubash%26logoColor%3DFFFFFF" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fstatic%2Fv1%3Flabel%3D%26message%3DBash%26color%3Dgreen%26logo%3Dgnubash%26logoColor%3DFFFFFF" alt="Written in Bash" width="55" height="20"></a></p> <p>As an example, I'm using <code>cowsay</code>, <code>figlet</code>, <code>lolcat</code> and <code>neofetch</code> to create a custom time-based MOTD shown to the user when they first log in. It greets them by their name, shows server info and time, date, weather and IP. <a href="proxy.php?url=https://github.com/Lissy93/dotfiles/blob/master/utils/welcome-banner.sh" rel="noopener noreferrer">Here's the source code</a>.</p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobdjwjl5on1mdst6lvkh.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobdjwjl5on1mdst6lvkh.png" alt="welcome" width="628" height="537"></a></p> <h2> Installations and Management </h2> <p>Most of us have a core set of CLI apps and utils that we rely upon. Setting up a new machine, and individually installing each program would get tiresome very quickly. So the task of installing and updating your terminal apps is the perfect candidate for automation. <a href="proxy.php?url=https://github.com/Lissy93/dotfiles/tree/master/scripts/installs" rel="noopener noreferrer">Here</a> are some example scripts I've written, which can be easily dropped into your dotfiles or just run independently to ensure you're never missing an app. </p> <p>For MacOS users, the easiest method is using <a href="proxy.php?url=https://brew.sh/" rel="noopener noreferrer">Homebrew</a>. Just create a Brewfile (with <code>touch ~/.Brewfile</code>), then list each of your apps, and run <code>brew bundle</code>. You can keep your package list backed up, by putting it in a Git repo. Here's an example one, to get you started: <a href="proxy.php?url=https://github.com/Lissy93/Brewfile" rel="noopener noreferrer">https://github.com/Lissy93/Brewfile</a></p> <p>On Linux, you usually want to use the native package manager (e.g. <code>pacman</code>, <code>apt</code>). As an example, <a href="proxy.php?url=https://github.com/Lissy93/dotfiles/blob/master/scripts/installs/arch-pacman.sh" rel="noopener noreferrer">here's a script</a> to install the above apps on Arch Linux systems</p> <p>Desktop apps on Linux can be managed in a similar way, via Flatpak. Again, <a href="proxy.php?url=https://github.com/Lissy93/dotfiles/blob/master/scripts/installs/flatpak.sh" rel="noopener noreferrer">here's an example script</a> :)</p> <h2> Conclusion </h2> <p>... So that's it - a list of handy CLI apps, and a method for installing and keeping them up-to-date across your systems.</p> <p>Hopefully some of these will be useful to some of you :)</p> <p>I'd love to hear what you're favourite CLI apps are, let me know in the comments below!</p> <h3> Additional Info </h3> <h4> What wasn't included </h4> <ul> <li>This list doesn't include the basics, like Vim, Tmux, Ranger, ZSH, Git, etc - which you're likely already using</li> <li>I've also not included anything too niche, or only specific to a small number of users</li> <li>Nothing system-specific, or that isn't cross-platform (Linux/ Unix, MacOS) is included</li> <li>And I've not included apps which relate to the terminal, but are not CLI apps (like terminal emulators)</li> <li>For most of the projects listed, there's a plethora of alternatives that achieve similar things, for brevity those also weren't included</li> </ul> <h4> Credit </h4> <p>Huge kudos to the authors, and communities behind each of these apps. Without them and their hard work, our life in the command line would be much less awesome. Where possible, I've tried to credit the authors, but if I've missed any - let me know below, and I'll push an update</p> <h4> Feedback </h4> <p>What have I missed? I'd love to hear your favourite CLI apps, especially if there's something awesome that I've missed!</p> <p>I'd also like to hear your thoughts and suggestions - I'm always looking to improve :)</p> <h4> Badges </h4> <p>Here's the script that I made to generate the author, language and GitHub star badges: </p> <p> Repo Badge Generator <h2> <a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo" width="800" height="400"></a> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"> Lissy93 </a> / <a href="proxy.php?url=https://github.com/Lissy93/repo-badge-maker" rel="noopener noreferrer"> repo-badge-maker </a> </h2> <h3> 🛡️ Very, very quick script to generate repo badges for blog posts </h3> <h1>🛡️ Repo Badge Generator</h1> <p> Quick script to generate embedable badges for a repository<br> <b><a href="proxy.php?url=https://repo-badges.as93.net" rel="nofollow noopener noreferrer">repo-badges.as93.net</a></b> </p> <p> <a href="proxy.php?url=https://repo-badges.as93.net" rel="nofollow noopener noreferrer"> <img src="proxy.php?url=https://camo.githubusercontent.com/6ba8f5396b5fd68de44b7b6ad495adbce52ef3ed9e572ee5c4d9fb13e2d61940/68747470733a2f2f692e6962622e636f2f3756397837646b2f7265706f2d62616467652d67656e657261746f722d73637265656e73686f742d322e706e67" width="2300" height="1696"> </a> </p> <h2>About</h2> <p>I made this to quickly generate the project links, for this post: <a href="proxy.php?url=https://dev.to/lissy93/cli-tools-you-cant-live-without-57f6" rel="nofollow">CLI tools you won't be able to live without 🔧 </a></p> <p>Just a simple script to quickly generate embedable markdown badges to show repository info.<br> Data is fetched from the GitHub API, and badges are served up using the <a href="proxy.php?url=https://shields.io/" rel="nofollow noopener noreferrer">Shields.io</a> API.<br> Includes a badge for + link to: the author, the repo + star count, and the language used.<br> Paste in the URL to a repo, hit 'Generate', and results will be copied to your clipboard.</p> <h2>Deployment</h2> <p>It's just a static HTML page, so serve it with any web server, CDN or static host.<br> There's a demo hosted on GH Pages, at: <a href="proxy.php?url=https://lissy93.github.io/repo-badge-maker/" rel="nofollow noopener noreferrer">lissy93.github.io/repo-badge-maker</a></p> <h2>Report an Issue</h2> <p>Found something that's not working? <a href="proxy.php?url=https://github.com/Lissy93/repo-badge-maker/issues/new/choose" rel="noopener noreferrer">Open an issue</a>, and describe the problem, steps to reproduce alond with…</p> <a href="proxy.php?url=https://github.com/Lissy93/repo-badge-maker" rel="noopener noreferrer">View on GitHub</a> </p> <p><a href="proxy.php?url=https://github.com/Lissy93/repo-badge-maker" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2FLissy93%2Frepo-badge-maker%3Fcolor%3D232323%26label%3Drepo-badge-maker%26logo%3Dgithub%26labelColor%3D232323" alt="View repo-badge-maker on GitHub" width="158" height="20"></a> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FLissy93-b820f9%3FlabelColor%3Db820f9%26logo%3Dgithubsponsors%26logoColor%3Dfff" alt="Author Lissy93" width="75" height="20"></a></p> <h4> Find More </h4> <p>If you were enjoying this, I recommend also checking out:</p> <ul> <li> <strong><a href="proxy.php?url=https://github.com/k4m4/terminals-are-sexy" rel="noopener noreferrer">terminals-are-sexy</a></strong> by Nikolaos Kamarinakis</li> <li> <strong><a href="proxy.php?url=https://github.com/alebcay/awesome-shell" rel="noopener noreferrer">awesome-shell</a></strong> by Caleb Xu</li> <li> <strong><a href="proxy.php?url=https://github.com/agarrharr/awesome-cli-apps" rel="noopener noreferrer">awesome-cli-apps</a></strong> by Adam Garrett-Harris</li> </ul> <p>If you're new to the command line, then <strong><a href="proxy.php?url=https://github.com/jlevy/the-art-of-command-line" rel="noopener noreferrer">The Art of Command Line</a></strong> by Joshua Levy is an excellent resource, as is the <strong><a href="proxy.php?url=https://github.com/Idnan/bash-guide" rel="noopener noreferrer">Bash Guide</a></strong> by Adnan Ahmed.</p> <p>And if you are looking for inspiration, you'll love <strong><a href="proxy.php?url=https://www.reddit.com/r/unixporn/" rel="noopener noreferrer">r/unixporn</a></strong> ⚡</p> <div class="table-wrapper-paragraph"><table> <thead> <tr> <th> <small>If you like this kind of stuff</small>,<br><small>consider following for more :)</small> </th> <th> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-Lissy93-3a3a3a%3Fstyle%3Dflat%26logo%3DGitHub%26logoColor%3Dwhite" alt="Follow Lissy93 on GitHub" width="69" height="20"></a><a href="proxy.php?url=https://twitter.com/Lissy_Sykes" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-%40Lissy_Sykes-00acee%3Fstyle%3Dflat%26logo%3DTwitter%26logoColor%3Dwhite" alt="Follow Lissy_Sykes on Twitter" width="85" height="20"></a> </th> </tr> </thead> <tbody> </tbody> </table></div> bash rust tooling productivity 20 Git Commands you (probably) didn't know about 🧙‍♂️ Alicia Sykes Sun, 18 Dec 2022 13:32:40 +0000 https://dev.to/lissy93/20-git-commands-you-probably-didnt-know-about-4j4o https://dev.to/lissy93/20-git-commands-you-probably-didnt-know-about-4j4o <p>If you've ever browsed the <a href="proxy.php?url=https://git-scm.com/docs" rel="noopener noreferrer">git manual</a> (or run <code>man git</code>), then you'll have noticed there's a whole lot more to git than what most of us use on a daily basis. A lot of these commands are incredibly powerful and can make your life a lot easier (others are a bit niche, but still good to know).</p> <blockquote> <p>This post outlines 20 of my favourite under-used git features, which you can use to level up your development process, impress your colleagues, help you answer git interview questions, and most importantly - have fun with!</p> </blockquote> <h3> Contents (and TL;DR) </h3> <ul> <li> Git Web - <em>Open builtin GUI</em> </li> <li> Git Notes - <em>Attach extra info to commits</em> </li> <li> Git Bisect - <em>Debug like a pro</em> </li> <li> Git Grep - <em>Search for anything</em> </li> <li> Git Archive - <em>Compress project for sharing</em> </li> <li> Git Submodules - <em>Import other repos into yours</em> </li> <li> Git Bugreport - <em>Compile bug report with system info</em> </li> <li> Git Fsck - <em>Verify and recover unreachable objects</em> </li> <li> Git Stripspace - <em>Remove trailing whitespaces</em> </li> <li> Git Diff - <em>Compare changes between two files</em> </li> <li> Git Hooks - <em>Execute script when a git command is run</em> </li> <li> Git Blame - <em>Show who wrote a given line</em> </li> <li> Git Large File Storage - <em>Store big files in git</em> </li> <li> Git Garbage Collection - <em>Optimize your git repo</em> </li> <li> Git Show - <em>Easily inspect any git object</em> </li> <li> Git Describe - <em>Give readable name based on last tag</em> </li> <li> Git Tag - <em>Create version tags at specific points</em> </li> <li> Git Reflog - <em>List all git actions made on a repo</em> </li> <li> Git Log - <em>View commit log, and branch diagrams</em> </li> <li> Git Cherry Pick - <em>Pull a feature into your branch</em> </li> <li> Git Switch - <em>Quickly jump between branches</em> </li> <li> Bonus - <em>Extend git with more commands!</em> </li> </ul> <h2> Git Web </h2> <blockquote> <p>Run <a href="proxy.php?url=https://git-scm.com/docs/git-instaweb" rel="noopener noreferrer"><code>git instaweb</code></a> to instantly browse your working repository in gitweb</p> </blockquote> <p>Git has a built-in <a href="proxy.php?url=https://git-scm.com/docs/gitweb" rel="noopener noreferrer">web-based visualiser</a> for browsing local repositories, which lets you view and manage your repo via a GUI in the browser. It's packed with useful features, including:</p> <ul> <li>Browsing and stepping through revisions and inspecting diffs, file contents and metadata</li> <li>Viewing commit logs, branches, directories, file history, and attached data visually</li> <li>Generating RSS or Atom feeds of commits and repository activity logs</li> <li>Searching commits, files, changes and diffs</li> </ul> <p>To open it, just run <code>git instaweb</code> from within your repo. Your browser should pop open, and load <code>http://localhost:1234</code>. If you don't have Lighttpd installed, you can specify an alternative web server with the <code>-d</code> flag. Other options can be configured either via flags (like <code>-p</code> for port, <code>-b</code> for the browser to open, etc), or under the <code>[instaweb]</code> block in your git config.</p> <p>There's also the <code>git gui</code> command, which can open up a GUI-based git app</p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F0DrmcWG%2FScreenshot-from-2022-12-17-20-26-30.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F0DrmcWG%2FScreenshot-from-2022-12-17-20-26-30.png" alt="Screenshot of Git GUI"></a></p> <h2> Git Notes </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-notes" rel="noopener noreferrer"><code>git notes</code></a> to add extra info to commits</p> </blockquote> <p>Sometimes you need to attach additional data to a git commit (beyond just the changes, message, date-time and author info).</p> <p>The notes are stored within <code>.git/refs/notes</code>, and since that's separate from the commit object data, you can modify the notes associated with a commit at anytime, without the SHA-1 hash changing.</p> <p>You can view notes with <code>git log</code>, using most git GUI apps, or with the <code>git notes show</code> command. Some git hosts also show notes in the commit view (although <a href="proxy.php?url=https://github.blog/2010-08-25-git-notes-display/" rel="noopener noreferrer">GH no longer displays notes</a>).</p> <h2> Git Bisect </h2> <blockquote> <p>With <a href="proxy.php?url=https://git-scm.com/docs/git-bisect" rel="noopener noreferrer"><code>git bisect</code></a> you can find the commit that introduced a bug using binary search</p> </blockquote> <p>This is one of the most powerful, yet easy to use git commands- bisect is an absolute life saver when it comes to debugging. After starting a bisect, it checks out commits for you, and you tell it weather that commit is <code>good</code> (no bug), or <code>bad</code> (bug introduced), which lets you narrow down the the earliest commit where the bug is present.</p> <p>To get started, run <code>git bisect start</code> then pass it a known good commit with <code>git bisect good &lt;commit-hash&gt;</code> and a known bad one (defaults to current) with <code>git bisect bad &lt;optional-hash&gt;</code>. It will then checkout the commit in-between the good and bad commits, then you specify weather the bug is present with either <code>git bisect good</code> or <code>git bisect bad</code>. It will then repeat the process, checking out a commit in the center of the bad and good, all the way until you've found the exact commit that introduced the bug. Cancel anytime with <code>git bisect reset</code>.</p> <p>There's much more to the bisect command, including replays, viewing commits, skipping, so it's worth checking out the docs next time your debugging.</p> <h2> Git Grep </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-grep" rel="noopener noreferrer"><code>git grep</code></a> to search for code, files, commits or anything else across your repo</p> </blockquote> <p>Ever find yourself needing to search for a string anywhere within a git project? With git grep you can easily search for any string, or RegEx throughout your project, and across branches (like a more powerful Ctrl + F!). </p> <p><code>git grep &lt;regexp&gt; &lt;ref&gt;</code></p> <p>It includes plenty of <a href="proxy.php?url=https://git-scm.com/docs/git-grep#_options" rel="noopener noreferrer">options</a> to narrow down your search, or specify results format. For example, use <code>-l</code> to only return file names, <code>-c</code> to specify number of matches per file to return, <code>-e</code> to exclude results matching a condition, <code>--and</code> to specify multiple conditions, <code>-n</code> to search with line number.</p> <p>Since git grep is regex-compatible, you can get much more advanced with the string your searching for.<br> You can also use it to specify a file extension, like <code>git grep 'console.log' *.js</code> which will show all console.logs from within JavaScript files</p> <p>The second parameter is a ref, and can be a branch name, commit, range of commits, or anything else. E.g. <code>git grep "foo" HEAD~1</code> will search the previous commit.</p> <h2> Git Archive </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-archive" rel="noopener noreferrer"><code>git archive</code></a> to combine an entire repo into a single file</p> </blockquote> <p>When sharing or backing up a repository, it's often preferred to store it as a single file. Using git archive will include all repo history, so it can be easily extracted back to it's original form. The command also includes a lot of additional options, so you can customise exactly what files are and aren't included in the archive.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>git archive <span class="nt">--format</span><span class="o">=</span><span class="nb">tar</span> <span class="nt">--output</span><span class="o">=</span>./my-archive HEAD </code></pre> </div> <h2> Git Submodules </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-submodule" rel="noopener noreferrer"><code>git submodule</code></a> to pull any other repository into yours</p> </blockquote> <p>In git, <a href="proxy.php?url=https://git-scm.com/docs/gitsubmodules" rel="noopener noreferrer">submodules</a> let you mount one repo into another, and is commonly used for core dependencies or splitting components into separate repositories. For more info, see <a href="proxy.php?url=https://notes.aliciasykes.com/17996/quick-tip-git-submodules" rel="noopener noreferrer">this post</a>.</p> <p>Running the following command will pull a module into the specified location, and also create a <code>.gitmodules</code> file so that it's always downloaded when the repo is cloned. Use the <code>--recursive</code> flag to include sub-modules when cloning the repo.<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>git submodule add https://github.com/&lt;user&gt;/&lt;repo&gt; &lt;path/to/save/at&gt; </code></pre> </div> <p>There's also <a href="proxy.php?url=https://www.atlassian.com/git/tutorials/git-subtree" rel="noopener noreferrer"><code>git subtree</code></a>, which does a similar thing, but without the need for metadata files.</p> <h2> Git Bug Report </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-bugreport" rel="noopener noreferrer"><code>git bugreport</code></a> to compose a bug ticket, including git and system info</p> </blockquote> <p>This command will capture system info, and then open up a standard bug template (steps to reproduce, actual + expected output, etc). The completed file should be a very complete bug report, with all necessary info captured.</p> <p>This is very handy if your a maintainer for an open source package and asking a user (developer) to raise a bug report, as it ensures all necessary data is included.</p> <p>And if you are raising a bug report to the core git system, you can also run the <a href="proxy.php?url=https://git-scm.com/docs/git-diagnose" rel="noopener noreferrer"><code>git diagnose</code></a> command, and then raise your issue <a href="proxy.php?url=https://github.com/git/git" rel="noopener noreferrer">here</a>.</p> <h2> Git Fsck </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-fsck" rel="noopener noreferrer"><code>git fsck</code></a> to check all objects, or recover unreachable ones</p> </blockquote> <p>Although not often needed, sometimes you may have to verify the objects stored by git. This is where fsck (or File System ChecK) comes in, it tests the object database and verifies the SHA-1 ID of all objects and the connections they make.</p> <p>It can also be used alongside the <code>--unreachable</code> flag to find objects that are no longer reachable from any named reference (since unlike other commands, it includes everything in <code>.git/objects</code>).</p> <h2> Git Stripspace </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-stripspace" rel="noopener noreferrer"><code>git stripspace</code></a> to format whitespaces within a given file</p> </blockquote> <p>Best practice is to avoid trailing whitespaces at the end of lines, avoid having multiple consecutive blank lines, avoid empty lines from beginning and end of an input, and end each file with a new line. There's plenty of language-specific tools which do this automatically for you (like prettier), but Git also has this functionality builtin.</p> <p>It's intended for metadata (commit messages, tags, branch descriptions, etc), but also works if you pipe a file to it, then pipe the response back to a file. E.g. <code>cat ./path-to-file.txt | git stripspace</code> or <code>git stripspace &lt; dirty-file.txt &gt; clean-file.txt</code></p> <p>You can also use this to remove comments (with <code>--strip-comments</code>), or even comment out lines (with <code>--comment-lines</code>).</p> <h2> Git Diff </h2> <blockquote> <p>With <a href="proxy.php?url=https://git-scm.com/docs/git-diff" rel="noopener noreferrer"><code>git diff</code></a> you can compare the difference between 2 sets of code</p> </blockquote> <p>You're probably aware that you you can run <code>git diff</code> to show all changes since the last commit, or use <code>git diff &lt;commit-sha&gt;</code> to compare either 2 commits, or 1 commit to the HEAD. But there's much more you can do with the diff command.</p> <p>You can also use it to compare any two arbitrary files, with <code>diff file-1.txt file-2.txt</code> (no more visiting <a href="proxy.php?url=https://www.diffchecker.com/compare/" rel="noopener noreferrer">diffchecker.com</a>!)</p> <p>Or compare 2 branches, or refs with each other, using <code>git diff branch1..branch2</code></p> <p>Note that a double dot (<code>..</code>) is the same as a space and indicates the diff input should be the tip of the branches, but you can also use a triple dot (<code>...</code>) to convert the first parameter into a ref of the shared common ancestor commit between the two diff inputs - very useful! If you want to only compare a single file across branches, just pass the files name in as the third argument. </p> <p>You may want to see all changes made within a given date range, for this use <code>git diff HEAD@{7.day.ago} HEAD@{0}</code> (for the last week), again this can be paired up with a filename, branch names, specific commits or any other ref.</p> <p>There's also the <a href="proxy.php?url=https://www.git-scm.com/docs/git-range-diff" rel="noopener noreferrer"><code>git range-diff</code></a> command, which provides a simple interface for comparing commit ranges.</p> <p>There's much more to the git diff tool (as well as the option of using your own diff checker), so I recommend checking out <a href="proxy.php?url=https://git-scm.com/docs/git-diff#_description" rel="noopener noreferrer">the docs</a>.</p> <h2> Git Hooks </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/githooks" rel="noopener noreferrer"><code>hooks</code></a> to execute command or run scripts when a given get action occurs</p> </blockquote> <p>Hooks let you automate pretty much anything. For example: ensuring standards are met (commit message, branch name, patch size), code quality (tests, lint), appending additional info to a commit (user, device, ticket ID), calling a webhook to record an event or run a pipeline, etc.</p> <p>There's pre and post <a href="proxy.php?url=https://git-scm.com/docs/githooks" rel="noopener noreferrer">hooks available</a> for most git events, like commit, rebase, merge, push, update, applypatch, etc.</p> <p>Hooks are stored in <code>.git/hooks</code> (unless you configure them elsewhere with <code>git config core.hooksPath</code>), and can be tested with the <a href="proxy.php?url=https://git-scm.com/docs/git-hook" rel="noopener noreferrer"><code>git hook</code></a> command. Since they're just shell files, they can be used to run any command.</p> <p>Hooks aren't pushed to the remote repository, so to share and manage them across your team, you'll need to use a <a href="proxy.php?url=https://github.com/aitemr/awesome-git-hooks#tools" rel="noopener noreferrer">hook manager</a>, like <a href="proxy.php?url=https://github.com/evilmartians/lefthook" rel="noopener noreferrer">lefthook</a> or <a href="proxy.php?url=https://github.com/typicode/husky" rel="noopener noreferrer">husky</a>. There's also several <a href="proxy.php?url=https://githooks.com/#projects" rel="noopener noreferrer">3rd-party tools</a>, which make managing hooks easier, I recommend <a href="proxy.php?url=https://github.com/sds/overcommit" rel="noopener noreferrer">overcommit</a>.</p> <p>Remember, hooks can always be skipped (with the <code>--no-verify</code> flag), so never rely purely on hooks, especially for anything security related. </p> <h2> Git Blame </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-blame" rel="noopener noreferrer"><code>git blame</code></a> to show author info for a specific revision and line</p> </blockquote> <p>A classic, quickly find out who wrote a specific line of code (aka which of your co-workers to blame for the bug!). But it's also useful to determine at which point in time something changed and inspect that commit and associated metadata.</p> <p>For example, to view author and commit info for line 400 to 420 of index.rs, you'd run:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight shell"><code>git blame <span class="nt">-L</span> 400,420 index.rs </code></pre> </div> <h2> Git LFS </h2> <blockquote> <p>Store large files using <a href="proxy.php?url=https://git-lfs.github.com/" rel="noopener noreferrer"><code>git lfs</code></a> to not bog down your repo</p> </blockquote> <p>Often your project will contain larger files (such as databases, binary assets, archives or media files), which would slow down the git workflow and max out usage limits. That's where <a href="proxy.php?url=https://git-lfs.github.com/" rel="noopener noreferrer">Large File Storage</a> comes in - it enables you to store these large assets elsewhere, while keeping them trackable with git and maintaining the same access controls/ permissions. LFS works by replacing these larger files with text pointers that are tracked within git.</p> <p>To use it, just run <code>git lfs track &lt;file glob&gt;</code>, which will update your <code>.gitattributes</code> file. You can specify files by their extension (e.g. <code>*.psd</code>), directory, or individually. Running <code>git lfs ls-files</code> to view a list of tracked LFS files.</p> <h2> Git GC </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-gc" rel="noopener noreferrer"><code>git gc</code></a> to optimize your repository</p> </blockquote> <p>Over time git repos accumulate various types of garbage, which take up disk space, and slow down actions. That's where the built-in garbage collector comes in. Running <code>git gc</code> will remove orphaned and inaccessible commits (with <a href="proxy.php?url=https://git-scm.com/docs/git-prune" rel="noopener noreferrer"><code>git prune</code></a>), compress file revisions and stored git objects, as well as some other general house keeping tasks like packing refs, pruning reflog, revere metadata or stale working trees and updating indexes.</p> <p>Adding the <code>--aggressive</code> flag will <a href="proxy.php?url=https://git-scm.com/docs/git-gc#_aggressive" rel="noopener noreferrer">aggressively optimize</a> the repository, throwing away any existing deltas and re-computing them, this takes much longer to run but may be needed if you've got a large repository.</p> <h2> Git Show </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-show" rel="noopener noreferrer"><code>git show</code></a> to easily inspect any git object</p> </blockquote> <p>Outputs objects (blobs, treees, tags or commits) in an easily readable form. To use, just run <code>git show &lt;object&gt;</code>. You'll likely also want to append the <code>--pretty</code> flag, for a clearer output, but there's many other options available to customize the output (with <code>--format</code>), so this command can be extremely powerful for displaying exactly what you need.</p> <p>An instance that this is very useful for, is previewing a file in another branch, without switching branches. Just run <code>git show branch:file</code></p> <h2> Git Describe </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-describe" rel="noopener noreferrer"><code>git describe</code></a> to find the latest tag reachable from a commit, and give it a human-readable name</p> </blockquote> <p>Run <code>git describe</code> and you'll see a human-readable string made from combining the last tag name, with the current commit, to generate a string. You can also pass a specific tag to it, </p> <p>Note that you must have created tags for this to work, unless you append the <code>--all</code> flag. Git describe will also only use annotated tags by default, so you must specify the <code>--tags</code> flag to make it use lightweight tags as well.</p> <h2> Git Tag </h2> <blockquote> <p>Tag a specific point in your repo's history using <a href="proxy.php?url=https://git-scm.com/docs/git-tag" rel="noopener noreferrer"><code>git tag</code></a></p> </blockquote> <p>It's often useful to be able to <a href="proxy.php?url=https://git-scm.com/book/en/v2/Git-Basics-Tagging" rel="noopener noreferrer">tag</a> specific, important points in a repository’s history most commonly used to denote versions of releases. Creating a tag is as simple as <code>git tag &lt;tagname&gt;</code>, or you can tag a historical commit with <code>git tag -a v4.2.0 &lt;commit sha&gt;</code>. Like with commits, you can include a message alongside a tag, using <code>-m</code>.</p> <p>Don't forget to push your tag to remote, with <code>git push origin &lt;tagname&gt;</code>.<br> To list all tags, just run <code>git tag</code>, and optionally use <code>-l</code> for a wildcard search.<br> You'll then be able to checkout a specific tag, with <code>git checkout &lt;tagname&gt;</code></p> <h2> Git Reflog </h2> <blockquote> <p>List all updates made on your repo using <a href="proxy.php?url=https://git-scm.com/docs/git-reflog" rel="noopener noreferrer"><code>git reflog</code></a></p> </blockquote> <p>Git keeps track of updates to the tip of branches using a mechanism called reference logs, or "reflogs". Various events are tracked, including: clone, pull, push, commit, checkout and merge. It's often useful to be able to find an events reference, as many commands accept a ref as a parameter. Just run <code>git reflog</code> to view recent events on <code>HEAD</code>.</p> <p>One thing that reflog is really useful for is recovering lost commits. Git never really loses anything, even when rewriting history (like rebasing or commit amending). Reflog allows you to go back to commits even though they are not referenced by any branch or tag. </p> <p>By default reflog uses <code>HEAD</code> (your current branch), but you can run reflog on any ref. For example <code>git reflog show &lt;branch name&gt;</code>, or to see stashed changes with <code>git reflog stash</code>. Or show all references with <code>git reflog show --all</code></p> <h2> Git Log </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-log" rel="noopener noreferrer"><code>git log</code></a> to view a list of commits</p> </blockquote> <p>You're likely already familiar with running <code>git log</code> to view a list of recent commits on your current branch. But there's a few things more you can do with git log.</p> <p>Using <code>git log --graph --decorate --oneline</code> will show a nice neat commit graph along with ref pointers.</p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2Fc1WByg8%2FScreenshot-from-2022-12-17-20-43-56.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2Fc1WByg8%2FScreenshot-from-2022-12-17-20-43-56.png" alt="example git log output"></a></p> <p>You also often need to be able to filter logs based on various parameters, the most useful of which are:</p> <ul> <li> <code>git log --search="&lt;anything&gt;"</code> - Search logs for specific code changes</li> <li> <code>git log --author="&lt;pattern&gt;"</code> - Show log only for specific author(s)</li> <li> <code>git log --grep="&lt;pattern&gt;"</code> - Filter log using search term or regex</li> <li> <code>git log &lt;since&gt;..&lt;until&gt;</code> - Show all commits between two references</li> <li> <code>git log -- &lt;file&gt;</code> - Show all commits made only to a specific file</li> </ul> <p>Or, just run <code>git shortlog</code> for a summerized list of commits.</p> <h2> Git Cherry Pick </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-cherry-pick" rel="noopener noreferrer"><code>git cherry-pick</code></a> to pick specified commit(s) by reference and append them to the working HEAD</p> </blockquote> <p>Sometimes you need to pull a specific commit from elsewhere, into your current branch. This can be very useful for applying hot fixes, undoing changes, restoring lost commits and in certain team collaboration settings. Note that often traditional merges are better practice, since cherry picking commits can cause duplicate commits in the log.</p> <p>Usage is straightforward, just run <code>git cherry-pick &lt;commit-hash&gt;</code>. This will pull the specified commit into your current branch.</p> <h2> Git Switch </h2> <blockquote> <p>Use <a href="proxy.php?url=https://git-scm.com/docs/git-switch" rel="noopener noreferrer"><code>git switch</code></a></p> </blockquote> <p>Moving between branches is something that we do often, the <code>switch</code> command is like a simplified version of <code>git checkout</code>, it can be used to create and navigate between branches, but unlike checkout does not copy modified files when you move between branches.</p> <p>Similar to <code>checkout -b</code>, with the switch command you can append the <code>-c</code> flag to create a new branch, and jump strait into it, e.g. <code>git switch -c &lt;new branch&gt;</code>. And running <code>git switch -</code> will discard any experimental changes you've made, and return you to your previous branch.</p> <h2> Git Standup </h2> <blockquote> <p>Use <a href="proxy.php?url=https://github.com/kamranahmedse/git-standup" rel="noopener noreferrer"><code>git standup</code></a> to recall what you did on the last working day , based on git commits</p> </blockquote> <p>I've put this one at the end, as it's not included with most git clients, but you can <a href="proxy.php?url=https://github.com/kamranahmedse/git-standup#install" rel="noopener noreferrer">easily install it</a> either with your systems package manager, using a 1-line curl script, or by building from source.</p> <p>If your boss requires you do a daily standup, to give updates on yesterdays work, but you can never remember what you actually did - this one is for you! It'll show a nicely formatted list of everything done in a given time frame. Usage is simple, just run <code>git standup</code>, or use <a href="proxy.php?url=https://github.com/kamranahmedse/git-standup#options" rel="noopener noreferrer">these options</a> to specify what data should be shown (author, timeframe, branches, etc.</p> <h2> Bonus </h2> <p>Git can be easily extended with add-ons, to add extra commands that do useful tasks. One of the most complete extensions is <a href="proxy.php?url=https://github.com/tj/git-extras/blob/master/Commands.md" rel="noopener noreferrer">git-extras</a> by <a href="proxy.php?url=https://github.com/tj" rel="noopener noreferrer">@tj</a>. It gives you 70+ <a href="proxy.php?url=https://github.com/tj/git-extras/blob/master/Commands.md" rel="noopener noreferrer">extra commands</a> to automate common git jobs.</p> <p>For a list of more useful git add-ons, see <a href="proxy.php?url=https://github.com/stevemao/awesome-git-addons" rel="noopener noreferrer">stevemao/awesome-git-addons</a>.</p> <p>If you're working with GitHub repos, then the <a href="proxy.php?url=https://cli.github.com/" rel="noopener noreferrer">GitHub CLI</a> let's you do common tasks (managing PRs, issues, code reviews, etc) from the command line.</p> <div class="table-wrapper-paragraph"><table> <thead> <tr> <th> <small>If you like this kind of stuff</small>,<br><small>consider following for more :)</small> </th> <th> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-Lissy93-3a3a3a%3Fstyle%3Dflat%26logo%3DGitHub%26logoColor%3Dwhite" alt="Follow Lissy93 on GitHub"></a><a href="proxy.php?url=https://twitter.com/Lissy_Sykes" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-%40Lissy_Sykes-00acee%3Fstyle%3Dflat%26logo%3DTwitter%26logoColor%3Dwhite" alt="Follow Lissy_Sykes on Twitter"></a> </th> </tr> </thead> <tbody> </tbody> </table></div> git github tooling programming Super Useful CSS Resources 🌈 Alicia Sykes Sat, 03 Dec 2022 18:00:23 +0000 https://dev.to/lissy93/super-useful-css-resources-1ba3 https://dev.to/lissy93/super-useful-css-resources-1ba3 <blockquote> <p>A collection of 70 hand-picked, web-based tools which are actually useful.<br> Each will generate pure CSS without the need for JS or any external libraries.</p> <p><small>Full credit goes to the authors behind each of these apps (where possible I've linked to their GH/ socials)</small></p> </blockquote> <h3> Contents </h3> <ul> <li>Property Generators</li> <li>Animations</li> <li>Backgrounds</li> <li>Color Tools</li> <li>Typography</li> <li>Loaders</li> <li>Layouts</li> <li>Informative</li> </ul> <h2> Property Generators </h2> <h3> 1. <a href="proxy.php?url=https://neumorphism.io" rel="noopener noreferrer">Neumorphism</a> </h3> <blockquote> <p>Generate Soft-UI CSS styles using inset shadows, by <a href="proxy.php?url=https://github.com/adamgiebl" rel="noopener noreferrer">@adamgiebl</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv1dpdij03zeafacjlnd.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv1dpdij03zeafacjlnd.gif" alt="screenshot" width="800" height="468"></a></p> <h3> 2. <a href="proxy.php?url=https://shadows.brumm.af/" rel="noopener noreferrer">Shaddows Brumm</a> </h3> <blockquote> <p>Make and preview beautifully smooth shadows, by <a href="proxy.php?url=https://github.com/brumm" rel="noopener noreferrer">@brumm</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faec5ngwqe9b3k0j78jh6.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faec5ngwqe9b3k0j78jh6.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 3. <a href="proxy.php?url=https://9elements.github.io/fancy-border-radius/" rel="noopener noreferrer">Fancy Border Radius</a> </h3> <blockquote> <p>Generate cool shaped objects with border-radius, by <a href="proxy.php?url=https://github.com/9elements" rel="noopener noreferrer">@9Elements</a>. Similar to <a href="proxy.php?url=https://www.blobmaker.app/" rel="noopener noreferrer">BlobMaker</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmtuv2zz6iip59ii6ebdn.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmtuv2zz6iip59ii6ebdn.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 4. <a href="proxy.php?url=https://cssbud.com/css-generator/css-glow-generator/" rel="noopener noreferrer">Glow Generator</a> </h3> <blockquote> <p>Generate pure CSS, cross-browser glow effects</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wg5bhasaf78yk83dvdr.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wg5bhasaf78yk83dvdr.gif" alt="screenshot" width="800" height="468"></a></p> <h3> 5. <a href="proxy.php?url=https://onotakehiko.dev/clothoid/" rel="noopener noreferrer">Clothoid Corners</a> </h3> <blockquote> <p>Generates clothoid rounded corners by CSS clip-path, by <a href="proxy.php?url=https://onotakehiko.com/" rel="noopener noreferrer">Takehiko Ono</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mjmvwe3yro97qeef98m.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mjmvwe3yro97qeef98m.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 6. <a href="proxy.php?url=https://hype4.academy/tools/glassmorphism-generator" rel="noopener noreferrer">Glassmorphism</a> </h3> <blockquote> <p>Build semi-transparent, blurred glass-like backgrounds. Similar to <a href="proxy.php?url=https://ui.glass/generator/" rel="noopener noreferrer">ui.glass/generator</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qptidmhhs9d8dsr3fx9.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qptidmhhs9d8dsr3fx9.gif" alt="screenshot" width="800" height="468"></a></p> <h3> 7. <a href="proxy.php?url=https://bennettfeely.com/clippy/" rel="noopener noreferrer">Clipy</a> </h3> <blockquote> <p>Generate complex shaped objects using clip-path, by <a href="proxy.php?url=https://github.com/bennettfeely" rel="noopener noreferrer">@bennettfeely</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kd4wi97m5n65woydg7a.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kd4wi97m5n65woydg7a.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 8. <a href="proxy.php?url=https://www.cssfilters.co/" rel="noopener noreferrer">CSS Filters</a> </h3> <blockquote> <p>Generate and preview pure CSS Instagram-style photo filters, by <a href="proxy.php?url=https://github.com/ghosh" rel="noopener noreferrer">@ghosh</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9m0us74hlrunhf1vmso9.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9m0us74hlrunhf1vmso9.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 9. <a href="proxy.php?url=https://www.base64-image.de/" rel="noopener noreferrer">Base64 Image</a> </h3> <blockquote> <p>Encode an image directly in your CSS in Base64</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9m21ps9qfg1ayfnrtahs.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9m21ps9qfg1ayfnrtahs.gif" alt="screenshot" width="800" height="468"></a></p> <h3> 10. <a href="proxy.php?url=https://quantityqueries.com/" rel="noopener noreferrer">Quantity Queries</a> </h3> <blockquote> <p>Generate quantity-based CSS queries, by <a href="proxy.php?url=https://github.com/drewminns" rel="noopener noreferrer">@drewminns</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zv4srcuuxwlvw88qsj3.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zv4srcuuxwlvw88qsj3.png" alt="screenshot" width="800" height="469"></a></p> <h2> Animations </h2> <h3> 11. <a href="proxy.php?url=https://animista.net/play" rel="noopener noreferrer">Animista</a> </h3> <blockquote> <p>CSS animation playground and generator, by <a href="proxy.php?url=https://www.linkedin.com/in/anatravas" rel="noopener noreferrer">Ana T</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5wm14w0a4oe7jxowmu3.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5wm14w0a4oe7jxowmu3.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 12. <a href="proxy.php?url=https://cubic-bezier.com/" rel="noopener noreferrer">Cubic-Bezier</a> </h3> <blockquote> <p>Preview and generate advanced cubic bezier animations, by <a href="proxy.php?url=https://github.com/LeaVerou" rel="noopener noreferrer">@LeaVerou</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40xhhw6g2qsm10v3pbz0.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40xhhw6g2qsm10v3pbz0.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 13. <a href="proxy.php?url=https://keyframes.app/animate" rel="noopener noreferrer">Keyframes</a> </h3> <blockquote> <p>Advanced keyframe animation maker, by <a href="proxy.php?url=https://github.com/mitchas" rel="noopener noreferrer">@mitchas</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhua0ptzpaqbj12kow4z.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhua0ptzpaqbj12kow4z.png" alt="screenshot" width="800" height="469"></a></p> <h3> 14. <a href="proxy.php?url=https://waitanimate.wstone.uk/" rel="noopener noreferrer">Wait Animate</a> </h3> <blockquote> <p>Use animation-delay to simulate delays, by <a href="proxy.php?url=https://github.com/will-stone" rel="noopener noreferrer">@will-stone</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtbyid4tkg1x3aackqlx.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtbyid4tkg1x3aackqlx.png" alt="screenshot" width="800" height="469"></a></p> <h3> 15. <a href="proxy.php?url=https://www.transition.style" rel="noopener noreferrer">Transition.Style</a> </h3> <blockquote> <p>Copy-paste transition animations, by <a href="proxy.php?url=https://github.com/argyleink" rel="noopener noreferrer">@argyleink</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvvth9nys75cinaxu3tp.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvvth9nys75cinaxu3tp.gif" alt="screenshot" width="800" height="400"></a></p> <h2> Backgrounds </h2> <h3> 16. <a href="proxy.php?url=https://heropatterns.com/" rel="noopener noreferrer">Hero Patterns</a> </h3> <blockquote> <p>Find and customize simple pure-CSS patterned backgrounds, by <a href="proxy.php?url=https://twitter.com/steveschoger" rel="noopener noreferrer">@steveschoger</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp520d6fmsez8vdsodxd.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp520d6fmsez8vdsodxd.gif" alt="screenshot" width="800" height="400"></a></p> <h3> 17. <a href="proxy.php?url=https://app.haikei.app/" rel="noopener noreferrer">Haikei</a> </h3> <blockquote> <p>Generate unique organic SVG banners and backgrounds (similar to <a href="proxy.php?url=https://www.shapedivider.app/" rel="noopener noreferrer">Shape Divider</a>)</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ss46o64ljgfxtwrx51c.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ss46o64ljgfxtwrx51c.gif" alt="screenshot" width="800" height="400"></a></p> <h3> 18. <a href="proxy.php?url=https://doodad.dev/pattern-generator/" rel="noopener noreferrer">Pattern Generator</a> </h3> <blockquote> <p>Advanced pattern generator</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kzjhfv7co7p1ibbbgz6.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kzjhfv7co7p1ibbbgz6.gif" alt="screenshot" width="800" height="400"></a></p> <h3> 19. <a href="proxy.php?url=https://css-pattern.com/" rel="noopener noreferrer">CSS Pattern</a> </h3> <blockquote> <p>Collection of pre-made pure CSS patterned backgrounds, by <a href="proxy.php?url=https://github.com/Afif13" rel="noopener noreferrer">@Afif13</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu62i7ujqdnrwtyfkxj7.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu62i7ujqdnrwtyfkxj7.gif" alt="screenshot" width="800" height="400"></a></p> <h3> 20. <a href="proxy.php?url=https://patternizer.com" rel="noopener noreferrer">Patternizer</a> </h3> <blockquote> <p>Build striped backgrounds, by <a href="proxy.php?url=https://twitter.com/matthewlein" rel="noopener noreferrer">@matthewlein</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flb3zeg5b7wshjuxox4p3.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flb3zeg5b7wshjuxox4p3.png" alt="screenshot" width="800" height="469"></a></p> <h3> 21. <a href="proxy.php?url=http://www.patternify.com/" rel="noopener noreferrer">Patternify</a> </h3> <blockquote> <p>Build your own old-school pattern, by <a href="proxy.php?url=https://twitter.com/SachaGreif" rel="noopener noreferrer">@SachaGreif</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fps3cgz7sgzqkylhisbnl.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fps3cgz7sgzqkylhisbnl.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 22. <a href="proxy.php?url=https://wweb.dev/resources/animated-css-background-generator/" rel="noopener noreferrer">Animated BG</a> </h3> <blockquote> <p>Generate blurred animated pure CSS backgrounds, by <a href="proxy.php?url=https://github.com/Vincenius" rel="noopener noreferrer">@Vincenius</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dsti3jdajhp41t75w1n.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dsti3jdajhp41t75w1n.gif" alt="screenshot" width="800" height="468"></a></p> <h3> 23. <a href="proxy.php?url=https://trianglify.io/" rel="noopener noreferrer">Trianglify</a> </h3> <blockquote> <p>Geometric background designer (note: only semmi-free), by <a href="proxy.php?url=https://github.com/qrohlf" rel="noopener noreferrer">@qrohlf</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wj6264cl0w2tbjsf1om.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wj6264cl0w2tbjsf1om.gif" alt="screenshot" width="800" height="468"></a></p> <h3> 24. <a href="proxy.php?url=https://animatedbackgrounds.me" rel="noopener noreferrer">Animated Backgrounds</a> </h3> <blockquote> <p>Collection of pure CSS background animations</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjazxx21dnlevuq461pcs.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjazxx21dnlevuq461pcs.png" alt="screenshot" width="800" height="469"></a></p> <h3> 25. <a href="proxy.php?url=https://www.magicpattern.design/tools/css-backgrounds" rel="noopener noreferrer">Magic Pattern CSS Backgrounds</a> </h3> <blockquote> <p>Collection of reusable SVG-based / pure CSS background patterns, with a visual explorer</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp520d6fmsez8vdsodxd.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp520d6fmsez8vdsodxd.gif" alt="screenshot" width="800" height="400"></a></p> <h2> Colors </h2> <h3> 26. <a href="proxy.php?url=https://cssgradient.io/" rel="noopener noreferrer">CSS Gradient</a> </h3> <blockquote> <p>Advanced CSS gradient builder</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft56zwllzgfv7vuehzusn.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft56zwllzgfv7vuehzusn.png" alt="screenshot" width="800" height="469"></a></p> <h3> 27. <a href="proxy.php?url=https://colormixer.web.app" rel="noopener noreferrer">Parametric Mixer</a> </h3> <blockquote> <p>Equaliser-based CSS color composer. by <a href="proxy.php?url=https://twitter.com/dawidwoldu" rel="noopener noreferrer">@dawidwoldu</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewap0rnx350j6j2o9g15.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewap0rnx350j6j2o9g15.gif" alt="screenshot" width="800" height="400"></a></p> <h3> 28. <a href="proxy.php?url=https://palettte.app/" rel="noopener noreferrer">Palettte.</a> </h3> <blockquote> <p>Develop and tweak color schemes</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqaimbrmfcdjwniwnt0d.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqaimbrmfcdjwniwnt0d.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 29. <a href="proxy.php?url=https://paletton.com" rel="noopener noreferrer">Paletton</a> </h3> <blockquote> <p>Palette builder using opposing or attracting colors</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gf1afqapiurmbq4hw5b.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gf1afqapiurmbq4hw5b.png" alt="screenshot" width="800" height="469"></a></p> <h3> 30. <a href="proxy.php?url=https://www.grabient.com/" rel="noopener noreferrer">Grabient</a> </h3> <blockquote> <p>Sample gradients.<br> Similar to <a href="proxy.php?url=https://webkul.github.io/coolhue/" rel="noopener noreferrer">CoolHue</a>, <a href="proxy.php?url=https://webgradients.com/" rel="noopener noreferrer">WebGradients.com</a>, <a href="proxy.php?url=https://gradienthunt.com/" rel="noopener noreferrer">GradientHunt</a>, <a href="proxy.php?url=https://gradientbuttons.colorion.co/" rel="noopener noreferrer">GradientButtons</a> and <a href="proxy.php?url=https://uigradients.com" rel="noopener noreferrer">UI gradients</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkiq7jzocxodezuxu5v9.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkiq7jzocxodezuxu5v9.png" alt="screenshot" width="800" height="469"></a></p> <h3> 31. <a href="proxy.php?url=https://colorhunt.co/" rel="noopener noreferrer">Color Hunt</a> </h3> <blockquote> <p>Yet another color palette designer</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F21eh9o66p0r8h55ujf17.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F21eh9o66p0r8h55ujf17.png" alt="screenshot" width="800" height="469"></a></p> <h3> 32. <a href="proxy.php?url=https://larsenwork.com/easing-gradients/#editor" rel="noopener noreferrer">Easing Gradients</a> </h3> <blockquote> <p>Cubic-bezier style pure CSS gradients, by <a href="proxy.php?url=https://github.com/larsenwork" rel="noopener noreferrer">@larsenwork</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forh36ztrpdjnmsqcofi7.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forh36ztrpdjnmsqcofi7.png" alt="screenshot" width="800" height="469"></a></p> <h3> 33. <a href="proxy.php?url=https://flatuicolors.com/" rel="noopener noreferrer">Flat UI Colors</a> </h3> <blockquote> <p>Flat-style handpicked color palettes, by <a href="proxy.php?url=https://twitter.com/ahmetsulek" rel="noopener noreferrer">@ahmetsulek</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd11s7dncljpcf3htlkzp.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd11s7dncljpcf3htlkzp.png" alt="screenshot" width="800" height="469"></a></p> <h3> 34. <a href="proxy.php?url=https://colordesigner.io/tools" rel="noopener noreferrer">Color Tools</a> </h3> <blockquote> <p>Mix, extract, convert and generate colors</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flg2f4510hn3n61pho0r8.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flg2f4510hn3n61pho0r8.png" alt="screenshot" width="800" height="469"></a></p> <h3> 35. <a href="proxy.php?url=https://colorpalettes.earth/" rel="noopener noreferrer">ColorPalettes.Earth</a> </h3> <blockquote> <p>Natural color pallets from nature</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgpgxegj8titu423u4g4.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgpgxegj8titu423u4g4.png" alt="screenshot" width="800" height="469"></a></p> <h2> Typography </h2> <h3> 36. <a href="proxy.php?url=https://fontjoy.com/" rel="noopener noreferrer">Font Joy</a> </h3> <blockquote> <p>Discover and preview various font pairings, by <a href="proxy.php?url=https://github.com/Jack000" rel="noopener noreferrer">@Jack000</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffux6zuqeu0fnfc5ddgkw.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffux6zuqeu0fnfc5ddgkw.png" alt="screenshot" width="800" height="469"></a></p> <h3> 37. <a href="proxy.php?url=https://typesetwith.me/" rel="noopener noreferrer">Type set With Me</a> </h3> <blockquote> <p>Typography &amp; legibility sandbox, by <a href="proxy.php?url=https://github.com/tsmith512" rel="noopener noreferrer">@tsmith512</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoof0lazejbmtin5vhd0.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoof0lazejbmtin5vhd0.png" alt="screenshot" width="800" height="469"></a></p> <h3> 38. <a href="proxy.php?url=https://type-scale.com/" rel="noopener noreferrer">Type Scale</a> </h3> <blockquote> <p>Generate heading/ body font sizes, by <a href="proxy.php?url=https://github.com/jeremychurch" rel="noopener noreferrer">@jeremychurch</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjrj62f52vbw9o902m8m.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjrj62f52vbw9o902m8m.png" alt="screenshot" width="800" height="469"></a></p> <h3> 39. <a href="proxy.php?url=https://glyphter.com/" rel="noopener noreferrer">Glyphter</a> </h3> <blockquote> <p>Create icon fonts from SVG graphics</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5m02v11pp2vuzpjl86c.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5m02v11pp2vuzpjl86c.png" alt="screenshot" width="800" height="469"></a></p> <h3> 40. <a href="proxy.php?url=https://katydecorah.com/font-library" rel="noopener noreferrer">Font-Library</a> </h3> <blockquote> <p>Tagged library of Google Fonts, by <a href="proxy.php?url=https://github.com/katydecorah" rel="noopener noreferrer">@katydecorah</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgebcho4fnzhz80iz1xhn.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgebcho4fnzhz80iz1xhn.png" alt="screenshot" width="800" height="469"></a></p> <h3> 41. <a href="proxy.php?url=https://wh0.github.io/glitter/" rel="noopener noreferrer">Glitter</a> </h3> <blockquote> <p>Export 90s-style Glitter text</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9r90k6gpwtqtpmsnfgg.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9r90k6gpwtqtpmsnfgg.png" alt="screenshot" width="800" height="469"></a></p> <h2> Loaders </h2> <h3> 42. <a href="proxy.php?url=https://tobiasahlin.com/spinkit/" rel="noopener noreferrer">Spin Kit</a> </h3> <blockquote> <p>Selection of clean CSS loading animations</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx2wxjkn2e8f0e8zpgt4.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx2wxjkn2e8f0e8zpgt4.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 43. <a href="proxy.php?url=https://whirl.netlify.app/" rel="noopener noreferrer">Whirl</a> </h3> <blockquote> <p>100+ CSS loading animations, for copy-paste</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fey3o20hqdpqgb9i8jut7.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fey3o20hqdpqgb9i8jut7.gif" alt="screenshot" width="1071" height="627"></a></p> <h3> 44. <a href="proxy.php?url=https://www.cssportal.com/css-loader-generator/" rel="noopener noreferrer">Loader Generator</a> </h3> <blockquote> <p>Pre-built and custom pure CSS loaders</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0i5esn7n8g10yvb2zhjn.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0i5esn7n8g10yvb2zhjn.gif" alt="screenshot" width="800" height="468"></a></p> <h3> 45. <a href="proxy.php?url=https://projects.lukehaas.me/css-loaders/" rel="noopener noreferrer">lukehaas - CSS-Loaders</a> </h3> <blockquote> <p>Simple pure CSS loading animations</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2hhiw3hn9b1xjuytgel.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2hhiw3hn9b1xjuytgel.gif" alt="screenshot" width="800" height="468"></a></p> <h3> 46. <a href="proxy.php?url=https://cssloaders.github.io/" rel="noopener noreferrer">CSSLoaders</a> </h3> <blockquote> <p>Complex pure CSS loaders</p> </blockquote> <h3> 47. <a href="proxy.php?url=https://loading.io/css/" rel="noopener noreferrer">loading.io/css</a> </h3> <blockquote> <p>CSS implementations of common loaders</p> </blockquote> <h2> Layouts </h2> <h3> 48. <a href="proxy.php?url=https://cssgridgarden.com/" rel="noopener noreferrer">CSS Grid Garden</a> </h3> <blockquote> <p>Interactive game for learning CSS grid, by <a href="proxy.php?url=https://github.com/thomaspark" rel="noopener noreferrer">@thomaspark</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhxpto2qkfoeuwmogqiv.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhxpto2qkfoeuwmogqiv.png" alt="screenshot" width="800" height="469"></a></p> <h3> 49. <a href="proxy.php?url=https://flexboxfroggy.com/" rel="noopener noreferrer">FlexboxFroggy</a> </h3> <blockquote> <p>Interactive game for learning flexbox, by <a href="proxy.php?url=https://github.com/thomaspark" rel="noopener noreferrer">@thomaspark</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkzrycr9omkbd1afexeb.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkzrycr9omkbd1afexeb.png" alt="screenshot" width="800" height="469"></a></p> <h3> 50. <a href="proxy.php?url=https://bennettfeely.com/flexplorer/" rel="noopener noreferrer">Flexplorer</a> </h3> <blockquote> <p>Visual flexbox demo, by <a href="proxy.php?url=https://twitter.com/bennettfeely" rel="noopener noreferrer">@bennettfeely</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqo3i700r7icibwqocw56.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqo3i700r7icibwqocw56.png" alt="screenshot" width="800" height="469"></a></p> <h3> 51. <a href="proxy.php?url=https://www.flexulator.com/" rel="noopener noreferrer">Flexulator</a> </h3> <blockquote> <p>An interactive CSS Flexbox space distribution calculator, by <a href="proxy.php?url=https://github.com/telagraphic" rel="noopener noreferrer">@telagraphic</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4h5uasumrqaorf2l2aja.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4h5uasumrqaorf2l2aja.png" alt="screenshot" width="800" height="469"></a></p> <h3> 52. <a href="proxy.php?url=https://cssgrid-generator.netlify.app/" rel="noopener noreferrer">Grid Generator</a> </h3> <blockquote> <p>Make grids using the CSS grid-template properties, by <a href="proxy.php?url=https://github.com/sdras" rel="noopener noreferrer">@sdras</a> (similar to <a href="proxy.php?url=https://grid.layoutit.com/" rel="noopener noreferrer">grid.layoutit.com</a>)</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuovirbeo0z9foilocebw.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuovirbeo0z9foilocebw.png" alt="screenshot" width="800" height="469"></a></p> <h3> 53. <a href="proxy.php?url=https://layout.bradwoods.io/" rel="noopener noreferrer">Layout Generator</a> </h3> <blockquote> <p>A modern CSS layout maker</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2bwej4vegbloe7uy95y.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2bwej4vegbloe7uy95y.png" alt="screenshot" width="800" height="469"></a></p> <h3> 54. <a href="proxy.php?url=https://codepen.io/carolineartz/full/ogVXZj" rel="noopener noreferrer">Box Model Diagram</a> </h3> <blockquote> <p>Just a visual box model demo</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpl5cc07xk682numr9tt.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpl5cc07xk682numr9tt.png" alt="screenshot" width="800" height="469"></a></p> <h2> Informative </h2> <h3> 55. <a href="proxy.php?url=https://css-timeline.vercel.app/" rel="noopener noreferrer">CSS Timeline</a> </h3> <blockquote> <p>A history of CSS</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fol5o6aicutk31hhshqz5.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fol5o6aicutk31hhshqz5.png" alt="screenshot" width="800" height="469"></a></p> <h3> 56. <a href="proxy.php?url=https://screensizemap.com/" rel="noopener noreferrer">Screen Size Map</a> </h3> <blockquote> <p>View popular screen sizes for responsive design</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa41vgzoularf2videdju.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa41vgzoularf2videdju.png" alt="screenshot" width="800" height="469"></a></p> <h3> 57. <a href="proxy.php?url=https://katydecorah.com/css-ruler/" rel="noopener noreferrer">CSS Ruler</a> </h3> <blockquote> <p>Preview various CSS units relative to each other</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvv4np70yawulelghs3j.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvv4np70yawulelghs3j.png" alt="screenshot" width="800" height="469"></a></p> <h3> 58. <a href="proxy.php?url=http://bada55.io/" rel="noopener noreferrer">bada55</a> </h3> <blockquote> <p>List of very funny CSS hex color codes<br> See also, <a href="proxy.php?url=https://colors.lol/" rel="noopener noreferrer">colors.lol</a> for some overly-descriptive color pallets</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsf41xtqynxb78zndl5y.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsf41xtqynxb78zndl5y.png" alt="screenshot" width="800" height="469"></a></p> <h3> 59. <a href="proxy.php?url=https://www.whocanuse.com" rel="noopener noreferrer">Who can use?</a> </h3> <blockquote> <p>Checks accessibility grade of a given color combinations, similar to <a href="proxy.php?url=https://colorable.jxnblk.com/" rel="noopener noreferrer">Colorable</a></p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblfjnil2xu1dys9yml6i.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblfjnil2xu1dys9yml6i.png" alt="screenshot" width="800" height="469"></a></p> <h3> 60. <a href="proxy.php?url=https://caniuse.com/" rel="noopener noreferrer">Can I use?</a> </h3> <blockquote> <p>Browser compatibility check of various, CSS, JS, HTML and web features</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F610hldozbosb47ijptaf.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F610hldozbosb47ijptaf.png" alt="screenshot" width="800" height="469"></a></p> <h3> 61. <a href="proxy.php?url=https://www.caniemail.com/" rel="noopener noreferrer">Can I email?</a> </h3> <blockquote> <p>Similar to <a href="proxy.php?url=https://caniuse.com" rel="noopener noreferrer">Can I use?</a>, but checks if a given CSS property (or HTML elem) is compatible with email clients</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrezungu8n03na056el0.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrezungu8n03na056el0.png" alt="screenshot" width="800" height="469"></a></p> <h3> 62. <a href="proxy.php?url=https://codebeautify.org/css-tools" rel="noopener noreferrer">CSS Processing Tools</a> </h3> <blockquote> <p>Convert to and from any other CSS language</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pnzxqoug25zj6idgf7n.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4pnzxqoug25zj6idgf7n.png" alt="screenshot" width="800" height="469"></a></p> <h3> 63. <a href="proxy.php?url=https://unused-css.com/" rel="noopener noreferrer">Unused CSS</a> </h3> <blockquote> <p>Searches your site for unused CSS, and displays stats</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faef7zd0lsmvyjzam13sd.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faef7zd0lsmvyjzam13sd.png" alt="screenshot" width="800" height="469"></a></p> <h3> 64. <a href="proxy.php?url=https://component.gallery" rel="noopener noreferrer">Component.Gallery</a> </h3> <blockquote> <p>Global component search</p> </blockquote> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzq7kcpu0fusegnkewe6.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzq7kcpu0fusegnkewe6.png" alt="screenshot" width="800" height="469"></a></p> <h3> 65. <a href="proxy.php?url=https://designsystemsrepo.com/design-systems-recent/" rel="noopener noreferrer">Design System Gallery</a> </h3> <blockquote> <p>A collection of open design systems, for inspiration</p> </blockquote> <h3> 66. <a href="proxy.php?url=https://www.checklist.design/" rel="noopener noreferrer">Checklist.design</a> </h3> <blockquote> <p>A collection of design best practices organised as checklists</p> </blockquote> <h3> 67. <a href="proxy.php?url=https://css-tricks.com/snippets/html/glyphs/" rel="noopener noreferrer">Glyphs</a> </h3> <blockquote> <p>A list of CSS glyph character codes (see also <a href="proxy.php?url=https://glyphsearch.com" rel="noopener noreferrer">GlyphSearch</a> for library icons)</p> </blockquote> <h3> 68. <a href="proxy.php?url=https://css-tricks.com/" rel="noopener noreferrer">CSS-Tricks.com</a> </h3> <blockquote> <p>The best CSS blog out there</p> </blockquote> <h3> 69. <a href="proxy.php?url=https://github.com/kudapara/curated-design-tools" rel="noopener noreferrer">Curated Design Tools</a> </h3> <blockquote> <p>A curated list of awesome design tools</p> </blockquote> <h3> 70. <a href="proxy.php?url=https://github.com/troxler/awesome-css-frameworks" rel="noopener noreferrer">Awesome-CSS-Frameworks</a> </h3> <blockquote> <p>A list of open source CSS frameworks</p> </blockquote> <h3> 71. <a href="proxy.php?url=https://cssreference.io/" rel="noopener noreferrer">CSS Reference</a> </h3> <blockquote> <p>A visual guide to CSS properties (similar to <a href="proxy.php?url=https://htmlreference.io/" rel="noopener noreferrer">htmlreference.io</a>)</p> </blockquote> <h3> 72. <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/CSS/Reference" rel="noopener noreferrer">MDN CSS Docs</a> </h3> <blockquote> <p>Excellent documentation of all available CSS properties</p> </blockquote> <div class="table-wrapper-paragraph"><table> <thead> <tr> <th> <small>If you like this kind of stuff</small>,<br><small>consider following for more :)</small> </th> <th> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-Lissy93-3a3a3a%3Fstyle%3Dflat%26logo%3DGitHub%26logoColor%3Dwhite" alt="Follow Lissy93 on GitHub" width="69" height="20"></a><a href="proxy.php?url=https://twitter.com/Lissy_Sykes" rel="noopener noreferrer"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-%40Lissy_Sykes-00acee%3Fstyle%3Dflat%26logo%3DTwitter%26logoColor%3Dwhite" alt="Follow Lissy_Sykes on Twitter" width="85" height="20"></a> </th> </tr> </thead> <tbody> </tbody> </table></div> css webdev opensource codenewbie Fun with console.log() 💿 Alicia Sykes Sun, 20 Nov 2022 21:50:01 +0000 https://dev.to/lissy93/fun-with-consolelog-3i59 https://dev.to/lissy93/fun-with-consolelog-3i59 <p>If you've ever developed a web app, you'll be familiar with <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/Console/log" rel="noopener noreferrer"><code>console.log(...)</code></a>, the method which prints data to the developer console; useful for debugging, logging and testing.</p> <p>Run <code>console.log(console)</code>, and you'll see that there's much more to the <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/Console" rel="noopener noreferrer"><code>console</code></a> object.<br> This post briefly outlines the top 10 neat tricks you can use to level up your logging experience.</p> <h4> Contents </h4> <ul> <li>Tables</li> <li>Groups</li> <li>Styles</li> <li>Times</li> <li>Asserts</li> <li>Counts</li> <li>Traces</li> <li>Directory</li> <li>Debugs</li> <li>Log Levels</li> <li>Multi-Values</li> <li>Log Strings</li> <li>Clear</li> <li>Special Browser Methods</li> </ul> <h2> Tables </h2> <p>The <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/Console/table" rel="noopener noreferrer"><code>console.table()</code></a> method prints objects/ arrays as a neatly formatted tables.</p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="nx">console</span><span class="p">.</span><span class="nf">table</span><span class="p">({</span> <span class="dl">'</span><span class="s1">Time Stamp</span><span class="dl">'</span><span class="p">:</span> <span class="k">new</span> <span class="nc">Date</span><span class="p">().</span><span class="nf">getTime</span><span class="p">(),</span> <span class="dl">'</span><span class="s1">OS</span><span class="dl">'</span><span class="p">:</span> <span class="nb">navigator</span><span class="p">[</span><span class="dl">'</span><span class="s1">platform</span><span class="dl">'</span><span class="p">],</span> <span class="dl">'</span><span class="s1">Browser</span><span class="dl">'</span><span class="p">:</span> <span class="nb">navigator</span><span class="p">[</span><span class="dl">'</span><span class="s1">appCodeName</span><span class="dl">'</span><span class="p">],</span> <span class="dl">'</span><span class="s1">Language</span><span class="dl">'</span><span class="p">:</span> <span class="nb">navigator</span><span class="p">[</span><span class="dl">'</span><span class="s1">language</span><span class="dl">'</span><span class="p">],</span> <span class="p">});</span> </code></pre> </div> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FHDmBv62%2Fconsole-table.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FHDmBv62%2Fconsole-table.png" title="Example output of console.table" alt="Screenshot showing an example output of console.table"></a></p> <h2> Groups </h2> <p>Group related console statements together with collapsible sections, using <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/Console/group" rel="noopener noreferrer"><code>console.group()</code></a>.</p> <p>You can optionally give a section a title, by passing a string as the parameter. Sections can be collapsed and expanded in the console, but you can also have a section collapsed by default, by using <code>groupCollapsed</code> instead of <code>group</code>. You can also nest sub-sections within sections but be sure to remember to close out each group with <code>groupEnd</code>.</p> <p>The following example will output an open section, containing some info</p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="nx">console</span><span class="p">.</span><span class="nf">group</span><span class="p">(</span><span class="dl">'</span><span class="s1">URL Info</span><span class="dl">'</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Protocol</span><span class="dl">'</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">protocol</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Host</span><span class="dl">'</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">origin</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Path</span><span class="dl">'</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">pathname</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">groupCollapsed</span><span class="p">(</span><span class="dl">'</span><span class="s1">Meta Info</span><span class="dl">'</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Date Fetched</span><span class="dl">'</span><span class="p">,</span> <span class="k">new</span> <span class="nc">Date</span><span class="p">().</span><span class="nf">getTime</span><span class="p">());</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">OS</span><span class="dl">'</span><span class="p">,</span> <span class="nb">navigator</span><span class="p">[</span><span class="dl">'</span><span class="s1">platform</span><span class="dl">'</span><span class="p">]);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Browser</span><span class="dl">'</span><span class="p">,</span> <span class="nb">navigator</span><span class="p">[</span><span class="dl">'</span><span class="s1">appCodeName</span><span class="dl">'</span><span class="p">]);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Language</span><span class="dl">'</span><span class="p">,</span> <span class="nb">navigator</span><span class="p">[</span><span class="dl">'</span><span class="s1">language</span><span class="dl">'</span><span class="p">]);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">groupEnd</span><span class="p">();</span> <span class="nx">console</span><span class="p">.</span><span class="nf">groupEnd</span><span class="p">();</span> </code></pre> </div> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FjMhk8KM%2Fconsole-group.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FjMhk8KM%2Fconsole-group.png" title="Example output of console.group" alt="Screenshot showing an example output of console.group"></a></p> <h2> Styled Logs </h2> <p>It's possible to style your log outputs with some basic CSS, such as colors, fonts, text styles and sizes. Note that browser support for this is quite variable.</p> <p>For example, try running the following:</p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span> <span class="dl">'</span><span class="s1">%cHello World!</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">color: #f709bb; font-family: sans-serif; text-decoration: underline;</span><span class="dl">'</span> <span class="p">);</span> </code></pre> </div> <p>You should get the following output:</p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F0Zyw4TF%2Fconsole-styles-1.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F0Zyw4TF%2Fconsole-styles-1.png" title="Example output of console styles" alt="Screenshot showing an example using CSS in the console"></a></p> <p>Pretty cool, huh? Well there's a lot more you can do too!<br> Maybe change the font, style, background color, add some shadows and some curves...</p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FL6P26CL%2Fconsole-styles-2.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FL6P26CL%2Fconsole-styles-2.png" title="Example output of console styles" alt="Screenshot showing an example using CSS in the console"></a></p> <p>Here's something similar I'm using in a developer dashboard, the code is <a href="proxy.php?url=https://github.com/Lissy93/dashy/blob/master/src/utils/CoolConsole.js" rel="noopener noreferrer">here</a></p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F7jgSC8p%2Fconsole-styles-3.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F7jgSC8p%2Fconsole-styles-3.png" title="Example output of console styles" alt="Screenshot showing an example using CSS in the console"></a></p> <h2> Time </h2> <p>Another common debugging technique is measuring execution time, to track how long an operation takes. This can be achieved by starting a timer using <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/Console/time" rel="noopener noreferrer"><code>console.time()</code></a> and passing in a label, then ending the timer using <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/timeEnd" rel="noopener noreferrer"><code>console.timeEnd()</code></a>, using the same label. You can also add markers within a long running operation using <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/timeLog" rel="noopener noreferrer"><code>console.timeLog()</code></a></p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="nx">console</span><span class="p">.</span><span class="nf">time</span><span class="p">(</span><span class="dl">"</span><span class="s2">concatenation</span><span class="dl">"</span><span class="p">);</span> <span class="kd">let</span> <span class="nx">output</span> <span class="o">=</span> <span class="dl">""</span><span class="p">;</span> <span class="k">for </span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="nx">e6</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="nx">output</span> <span class="o">+=</span> <span class="nx">i</span><span class="p">;</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nf">timeEnd</span><span class="p">(</span><span class="dl">"</span><span class="s2">concatenation</span><span class="dl">"</span><span class="p">);</span> </code></pre> </div> <div class="highlight js-code-highlight"> <pre class="highlight plaintext"><code> concatenation: 1206ms - timer ended </code></pre> </div> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FhsHv4tc%2Fconsole-timer.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FhsHv4tc%2Fconsole-timer.png" title="Example output of console.time" alt="Screenshot showing an example output of console.time"></a></p> <p>There's also a non-standard method, <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/timeStamp" rel="noopener noreferrer"><code>console.timeStamp()</code></a> which adds markers within the performance tab, so you can correlate points in your code with the other events recorded in the timeline like paint and layout events.</p> <h2> Assert </h2> <p>You may only want to log to the console if an error occurs, or a certain condition is true or false. This can be done using <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/assert" rel="noopener noreferrer"><code>console.assert()</code></a>, which won't log anything to the console unless the first parameter is <code>false</code>.</p> <p>The first parameter is a boolean condition to check, followed by 0 or more data points you'd like to print, and the last parameter is a message to output. So <code>console.assert(false, 'Value was false')</code> will output the message, since the first parameter is <code>false</code>.</p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="kd">const</span> <span class="nx">errorMsg</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">the # is not even</span><span class="dl">'</span><span class="p">;</span> <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">num</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="nx">num</span> <span class="o">&lt;=</span> <span class="mi">5</span><span class="p">;</span> <span class="nx">num</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`the # is </span><span class="p">${</span><span class="nx">num</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nf">assert</span><span class="p">(</span><span class="nx">num</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">,</span> <span class="p">{</span> <span class="nx">num</span> <span class="p">},</span> <span class="nx">errorMsg</span><span class="p">);</span> <span class="p">}</span> </code></pre> </div> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F5xWCN5k%2Fconsole-assert.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2F5xWCN5k%2Fconsole-assert.png" title="Example output of console.assert" alt="Screenshot showing an example output of console.assert"></a></p> <h2> Count </h2> <p>Ever find yourself manually incrementing a number for logging? <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/count" rel="noopener noreferrer"><code>console.count()</code></a> is helpful for keeping track how many times something was executed, or how often a block of code was entered.</p> <p>You can optionally give your counter a label, which will let you manage multiple counters and make the output clearer.<br> Counters will always start from 1. You can reset a counter at anytime with <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/countReset" rel="noopener noreferrer"><code>console.countReset()</code></a>, which also takes an optional label parameter.</p> <p>The following code will increment the counter for each item in the array, the final value will be 8. </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="kd">const</span> <span class="nx">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">69</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">420</span><span class="p">];</span> <span class="nx">numbers</span><span class="p">.</span><span class="nf">forEach</span><span class="p">((</span><span class="nx">name</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nf">count</span><span class="p">();</span> <span class="p">});</span> </code></pre> </div> <p>The following is an example output of labelled counters.</p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FkhjHNKT%2Fconsole-count.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FkhjHNKT%2Fconsole-count.png" title="Example output of console.count" alt="Screenshot showing an example output of console.count"></a></p> <p>Instead of passing in a label, if you use a value, then you'll have a separate counter for each conditions value. For example:</p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="nx">console</span><span class="p">.</span><span class="nf">count</span><span class="p">(</span><span class="kc">NaN</span><span class="p">);</span> <span class="c1">// NaN: 1</span> <span class="nx">console</span><span class="p">.</span><span class="nf">count</span><span class="p">(</span><span class="kc">NaN</span><span class="o">+</span><span class="mi">3</span><span class="p">);</span> <span class="c1">// NaN: 2</span> <span class="nx">console</span><span class="p">.</span><span class="nf">count</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">0</span><span class="p">);</span> <span class="c1">// Infinity: 1</span> <span class="nx">console</span><span class="p">.</span><span class="nf">count</span><span class="p">(</span><span class="nc">String</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">0</span><span class="p">));</span> <span class="c1">// Infinity: 2</span> </code></pre> </div> <h2> Trace </h2> <p>In JavaScript, we're often working with deeply nested methods and objects. You can use <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/trace" rel="noopener noreferrer"><code>console.trace()</code></a> to traverse through the stack trace, and output which methods were called to get to a certain point.</p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FM1Bt2Jq%2Fconsole-trace.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FM1Bt2Jq%2Fconsole-trace.png" title="Example output of console.trace" alt="Screenshot showing an example output of console.trace"></a></p> <p>You can optionally pass data to also be outputted along with the stacktrace.</p> <h2> Dir </h2> <p>If your logging a large object to the console, it may become hard to read. The <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/dir" rel="noopener noreferrer"><code>console.dir()</code></a> method will format it in an expandable tree structure.</p> <p>The following is an example of a directory-style console output:</p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FPW073sy%2Fconsole-dir.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FPW073sy%2Fconsole-dir.png" title="Example output of console.dir" alt="Screenshot showing an example output of console.dir"></a></p> <p>You can also print XML or HTML based trees in a similar way, by using <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/dirxml" rel="noopener noreferrer"><code>console.dirxml()</code></a>.</p> <h2> Debug </h2> <p>You may have some logging set up within your app, that you rely on during development, but don't wish the user to see. Replacing log statements with <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/debug" rel="noopener noreferrer"><code>console.debug()</code></a> will do just this, it functions in exactly the same way as <code>console.log</code> but will be stripped out by most build systems, or disabled when running in production mode.</p> <h2> Log Levels </h2> <p>You may have noticed that there's several filters in the browser console (info, warnings and error), they allow you to change the verbosity of logged data. To make use of these filters, just switch out log statements with one of the following:</p> <ul> <li> <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/info" rel="noopener noreferrer"><code>console.info()</code></a> - Informational messages for logging purposes, commonly includes a small "i" and / or a blue background</li> <li> <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/warn" rel="noopener noreferrer"><code>console.warn()</code></a> - Warnings / non-critical errors, commonly includes a triangular exclamation mark and / or yellow background</li> <li> <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/error" rel="noopener noreferrer"><code>console.error()</code></a> - Errors which may affect the functionality, commonly includes a circular exclamation mark and / or red background</li> </ul> <p>In Node.js different log levels get written to different streams when running in production, for example <code>error()</code> will write to <code>stderr</code>, whereas <code>log</code> outputs to <code>stdout</code>, but during development they will all appear in the console as normal.</p> <h2> Multi-Value Logs </h2> <p>Most functions on the <code>console</code> object will accept multiple parameters, so you can add labels to your output, or print multiple data points at a time, for example: <code>console.log('User: ', user.name);</code></p> <p>But an easier approach for printing multiple, labelled values, is to make use of <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment" rel="noopener noreferrer">object deconstructing</a>. For example, if you had three variables (e.g. <code>x</code>, <code>y</code> and <code>z</code>), you could log them as an object by surrounding them in curly braces, so that each variables name and value is outputted - like <code>console.log( { x, y, z } );</code></p> <p><a href="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FynVWy52%2Fconsole-deconstructing.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FynVWy52%2Fconsole-deconstructing.png" title="Example output of console deconstructing" alt="Screenshot showing an example output of console deconstructing"></a></p> <h2> Log String Formats </h2> <p>If you need to build formatted strings to output, you can do this with C-style printf using format specifiers. </p> <p>The following specifiers are supported:</p> <ul> <li> <code>%s</code> - String or any other type converted to string</li> <li> <code>%d</code> / <code>%i</code> - Integer</li> <li> <code>%f</code> - Float</li> <li> <code>%o</code> - Use optimal formatting</li> <li> <code>%O</code> - Use default formatting</li> <li> <code>%c</code> - Use custom formatting (more info)</li> </ul> <p>For example</p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Hello %s, welcome to the year %d!</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Alicia</span><span class="dl">"</span><span class="p">,</span> <span class="k">new</span> <span class="nc">Date</span><span class="p">().</span><span class="nf">getFullYear</span><span class="p">());</span> <span class="c1">// Hello Alicia, welcome to the year 2022!</span> </code></pre> </div> <p>Of course, you could also use <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals" rel="noopener noreferrer">template literals</a> to achieve the same thing, which might be easier to read for shorter strings.</p> <h2> Clear </h2> <p>Finally, when you're looking for an output from an event, you might want to get rid of everything logged to the console when the page first loaded. This can be done with <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console/clear" rel="noopener noreferrer"><code>console.clear()</code></a>, which will clear all content, but nor reset any data.</p> <p>It's usually also possible to clear the console by clicking the Bin icon, as well as to search through it using the Filter text input.</p> <h2> Special Browser Methods </h2> <p>When running code directly in the browser's console, you'll have access to a couple of short-hand methods, which are super useful for debugging, automation and testing.</p> <p>The most useful of which are:</p> <ul> <li> <code>$()</code> - Short-hand for <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector" rel="noopener noreferrer"><code>Document.querySelector()</code></a> (to select DOM elements, jQuery-style!)</li> <li> <code>$$()</code> - Same as above, but for <code>selectAll</code> for when returning multiple elements in an array</li> <li> <code>$_</code> - Returns value of last evaluated expression</li> <li> <code>$0</code> - Returns the most recently selected DOM element (in the inspector)</li> <li> <code>$1</code>...<code>$4</code> can also be used to grab previously selected UI elements</li> <li> <code>$x()</code> - Lets you select DOM elements using an Xpath query</li> <li> <code>keys()</code> and <code>values()</code> - Shorthand for Object.getKeys(), will return an array of either obj keys or values</li> <li> <code>copy()</code> - Copies stuff to the clipboard</li> <li> <code>monitorEvents()</code> - Run command each time a given event is fireed</li> <li>For certain common console commands (like <code>console.table()</code>), you don't need to type the preceding <code>console.</code>, just run <code>table()</code> </li> </ul> <p>There's many more console shorthand commands, <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/console/utilities/" rel="noopener noreferrer">here's a full list</a>.</p> <blockquote> <p><strong>Warning</strong> These only work within the dev tools console, and will not work in your code!</p> </blockquote> <h2> And some more... </h2> <p>There's so much more that you can do with logging to the console! For more info, check out the <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/console" rel="noopener noreferrer">MDN <code>console</code> Documentation</a> or the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/console/api/" rel="noopener noreferrer">Chrome Dev Console Docs</a>.</p> <p>Just a quick note about best practices...</p> <ul> <li>Define a lint rule, to prevent any console.log statements from being merged into your main branch</li> <li>Write a wrapper function to handle logging, that way you can enable / disable debug logs based on environment, as well as use appropriate log levels, and apply any formatting. This can also be used to integrate with a third-party logging service with code updates only needed in a single place</li> <li>Never log any sensitive info, the browser logs can be captured by any installed extensions, so should not be considered secure</li> <li>Always use the correct log levels (like <code>info</code>, <code>warn</code>, <code>error</code>) to make filtering and disabling easier</li> <li>Follow a consistent format, so logs can be parsed by a machine if needed</li> <li>Write short, meaningful log messages always in English</li> <li>Include the context or category within logs</li> <li>Don't overdo it, only log useful info</li> </ul> <div class="table-wrapper-paragraph"><table> <thead> <tr> <th> <small>If you like this kind of stuff</small>,<br><small>consider following for more :)</small> </th> <th> <a href="proxy.php?url=https://github.com/Lissy93" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-Lissy93-3a3a3a%3Fstyle%3Dflat%26logo%3DGitHub%26logoColor%3Dwhite" alt="Follow Lissy93 on GitHub"></a><a href="proxy.php?url=https://twitter.com/Lissy_Sykes" rel="noopener noreferrer"><img src="proxy.php?url=https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2F-%40Lissy_Sykes-00acee%3Fstyle%3Dflat%26logo%3DTwitter%26logoColor%3Dwhite" alt="Follow Lissy_Sykes on Twitter"></a> </th> </tr> </thead> <tbody> </tbody> </table></div> webdev javascript tooling productivity Browser Dev Tools: The Ultimate Guide 🔥 Alicia Sykes Mon, 14 Nov 2022 17:37:47 +0000 https://dev.to/lissy93/awesome-dev-tool-tips-32oo https://dev.to/lissy93/awesome-dev-tool-tips-32oo <p> <strong>Contents</strong> (Click to expand) ↕️ <ul> <li>Design Mode</li> <li>Pretty Print</li> <li>Command Pallet and Super Search</li> <li>Snippets</li> <li>Live Expressions</li> <li>Tracking Changes</li> <li>Console Shorthand</li> <li>Find Unused Code</li> <li>Rendering Panel</li> <li>Network Paint Times</li> <li>Network Timings</li> <li>Inspect Network Requests</li> <li>Performance</li> <li>Identifying Memory Leaks</li> <li>Raw Memory Inspection</li> <li>Test bfcache</li> <li>Full Refresh</li> <li>Lighthouse</li> <li>Page Size Breakdown</li> <li>Record User Flows</li> <li>Advanced User Flow Operations</li> <li>Pausing Execution with Breakpoints</li> <li>Remote Debugging</li> <li>Mock Location and Sensors</li> <li>Death by Errors, no more!</li> <li>View and Edit Storage</li> <li>Debug Background Services</li> <li>HTTPS Security Checks</li> <li>Web Auth</li> <li>Accessibility Tools</li> <li>Screenshots</li> <li>Super-Copying</li> <li>Animations Timeline</li> <li>Forcing Elements State</li> <li>CSS Sizes and Units</li> <li>Color Pallets</li> <li>Easy Box Shadows</li> <li>Easy Animations</li> <li>Responsive Design Mode</li> <li>Badges</li> <li>Rulers</li> <li>Style Overview</li> <li>Layers</li> <li>Saving Changes to Disk</li> <li>Automation</li> <li>Familiar Shortcuts</li> <li>Dark Mode</li> <li>Useful Add-Ons</li> <li>Are we finished yet?</li> </ul> </p> <h2> Design Mode </h2> <p>Enabling <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/Document/designMode" rel="noopener noreferrer">design mode</a> will make the entire web page editable, just by clicking and typing.</p> <p>To use it, open up the console and run:<br> </p> <div class="highlight js-code-highlight"> <pre class="highlight javascript"><code><span class="nb">document</span><span class="p">.</span><span class="nx">designMode</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">on</span><span class="dl">'</span> </code></pre> </div> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fdesign-mode-2" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fdesign-mode-2" alt="demo of design mode" width="800" height="478"></a></p> <h2> Pretty Print </h2> <p>Raw files are usually minified, and therefore hard to read. Use the Pretty Print option to format it</p> <p>In the background, Chrome is creating a new file (names <code>filename.js:formatted</code>), closing that file will undo the formatting.</p> <p>If doing this each time is getting boring, then there's an experimental setting to auto-enable pretty print for all sources. <br> Under <code>⋮</code> → <code>Settings</code> → <code>Experiments</code> Select <code>Automatically pretty print in the Sources Panel</code>.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fpretty-print" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fpretty-print" alt="demo of pretty print" width="800" height="479"></a></p> <h2> Command Pallet and Super Search </h2> <p>The command pellet gives you full access to every command available within the dev tools, and is super valuable for quick navigation.</p> <p>Type Ctrl + Shift + P to open up the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/command-menu/" rel="noopener noreferrer">Command Menu</a>, then start typing to filter commands and press enter to execute.</p> <p>In the same way, if you're only looking to find a function name, you can use Ctrl + Shift + O to filter methods across files.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fcommand-palet" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fcommand-palet" alt="demo of command pallet" width="1334" height="798"></a></p> <p>From the same menu, you can also search through all loaded resources by filename or code (HTML, CSS, JS, etc), all network requests, visible components, memory profiles, snippets and much more. Advanced features like RegEx are supported.</p> <p>For an app built with a framework, you'll probably see a lot of irrelevant files (like node_modules, webpack output, etc). You can hide this under ⋮ → Hide ignore-list sources. By default, this uses the smart <code>x_google_ignorelist</code> to detect what's likely not relevant, but you can also add your own custom sources, specified by regex under Settings.</p> <h2> Snippets </h2> <p>So you've spent a while crafting a function in the console, and you plan on reusing it across various sites later. That's where <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/javascript/snippets/" rel="noopener noreferrer">snippets</a> come in, they're invoked from the command pallet, and let you save code for later and execute it using the bang <code>!</code> operator.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fsnippets-develop" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fsnippets-develop" alt="snippets demo" width="1334" height="798"></a></p> <h2> Live Expressions </h2> <p>Instead of repeatedly executing a command to monitor for changes, you can watch values in real-time using <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/console/live-expressions/" rel="noopener noreferrer">Live Expressions</a>. Just execute a command, then pin it using the eye icon to see changes reflected automatically.</p> <p>There's many use cases for this, but one I use often is when testing keyboard navigation of an app, pinning the <code>document.activeElement</code> command will print a log of evertime the focused element changes, even once it's been removed from the GUI.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Flive-expressions" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Flive-expressions" alt="live expressions demo" width="760" height="454"></a></p> <h2> Tracking Changes </h2> <p>We've all been there, you've been editing your app's HTML, CSS and JS through the dev tools and got things working perfectly, but you can't remember exactly what you changed. That's where the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/changes/" rel="noopener noreferrer">Changes Tab</a> comes in. Access it through the command pallet (with Control+Shift+P, then type "Show Changes"), or through the lower draw.</p> <p>You'll then be able to see a diff output of all your changes. From here you can Copy changes to clipboard, or revert certain changes.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fdiff-check" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fdiff-check" alt="diff check demo" width="1335" height="800"></a></p> <h2> Console Shorthand </h2> <ul> <li> <code>$()</code> - Short-hand for <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector" rel="noopener noreferrer"><code>Document.querySelector()</code></a> (to select DOM elements, jQuery-style!)</li> <li> <code>$$()</code> - Same as above, but for <code>selectAll</code> for when returning multiple elements in an array</li> <li> <code>$_</code> - Returns value of last evaluated expression</li> <li> <code>$0</code> - Returns the most recently selected DOM element (in the inspector)</li> <li> <code>$1</code>...<code>$4</code> can also be used to grab previously selected UI elements</li> <li> <code>$x()</code> - Lets you select DOM elements using an Xpath query</li> <li> <code>keys()</code> and <code>values()</code> - Shorthand for Object.getKeys(), will return an array of either obj keys or values</li> <li> <code>copy()</code> - Copies stuff to the clipboard</li> <li> <code>monitorEvents()</code> - Run command each time a given event is fireed</li> <li>For certain common console commands (like <code>console.table()</code>), you don't need to type the preceding <code>console.</code>, just run <code>table()</code> </li> </ul> <p>You can clear the console at anytime using Ctrl + L, using the clear button, or by running <code>clear()</code></p> <p>There's many more console shorthand commands, <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/console/utilities/" rel="noopener noreferrer">here's a full list</a>.</p> <blockquote> <p><strong>Warning</strong> These tricks only work within the dev tools console, and will not work in your code!</p> </blockquote> <h2> Find Unused Code </h2> <p>Easily identify which bundles are the largest, and how much of their code is actually used, and what the load impact of each file is, using the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/coverage/" rel="noopener noreferrer">Coverage</a> tool. This illustrates exactly which code is being loaded but never used, and what the cost of it is.</p> <p>Click the three dots, select coverage and reload the page. Any red bars indicate unused code, and will likely be making your app slower. Clicking an individual file will let you see specifically what code isn't being used.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fcoverage-tool" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fcoverage-tool" alt="coverage demo" width="1337" height="804"></a></p> <h2> Rendering Panel </h2> <p>This tool is super useful for identifying elements that are being edited more often than possibly necessary, and which are likely negatively affecting performance and user experience.</p> <p>The frame rendering stats is specifically useful, for monitoring CPU and GPU usage, helping you identify things before they become a problem.</p> <p>[<a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Frendering-tool" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Frendering-tool" alt="rendering" width="600" height="358"></a></p> <h2> Network Paint Times </h2> <p>Your probably familiar with the waterfall chart rendered by the Network tab, and how useful that is for detecting slower requests. But from here, you can also enable screenshots to see exactly what parts of your site will load visually for end users on slower connections.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fnetwork-paint-times" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fnetwork-paint-times" alt="demo" width="1337" height="804"></a></p> <h2> Network Timings </h2> <p>Clicking on an item shows headers and response, but head to the Timing tab, and you'll be able to see what stage the request was held up at, and specific server timings. Using the <a href="proxy.php?url=https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Server-Timing" rel="noopener noreferrer">Server-Timing API</a>, you can pass even more detailed info from your API to your client app, and view data in the Timings tab of the browser dev tools. To use this, just add the <code>Server-Timing</code> header to your response data, and detailed charts will be visible in the dev tools.</p> <p>To find the total size of your web page, under the Network panel, check Disable Cache, reload the page, and the info bar at the bottom will display total size, total time, total requests and other key stats.</p> <h2> Inspect Network Requests </h2> <p>You likely already know this, but you can also view the request and response for any HTTP request your site makes, as well as view loading times and see where in the code it was triggered.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fnetwork-timings" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fnetwork-timings" alt="demo" width="1335" height="808"></a></p> <h2> Performance </h2> <p>It's really worth exploring the performance panel and all that it has to offer. Just hit the record button, then interact with your site like an end-user might. When you're finished, you'll have a really detailed breakdown of CPU usage, FPS and memory allocated to the heap. Where ever there's a spike in the timeline, that usually indicates an area of code that needs to be optimised. You can then investigate this further by drilling down on the flame chart, to see the full stack trace of everything that happened on the main thread.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fperf-monitor" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fperf-monitor" alt="demo" width="1335" height="800"></a></p> <h2> Identifying Memory Leaks </h2> <p>Modern browser automatically garbage-collect any data that is no longer being referenced to. But poorly written code can mean you have obsolete code references that build up over time causing a memory leak. This can be detrimental to performance and greatly hider user experience.</p> <p>Thankfully, they're not as hard to find or debug as you might have thought. Under the Memory tab, select "Allocation instrumentation on timeline", then hit record.<br> The blue bars indicate memory that's still in use, and the grey bars show what was garbage collected. So a rapidly growing blue bar would be where your mem leak is happening, and you can then click that bar to see exactly what data objects they contain, and easily identify the cause.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fmem-leaks-1" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fmem-leaks-1" alt="demo" width="1335" height="800"></a></p> <p>Worth also noting that the web page isn't the only source of memory leaks. They can also be caused by add-ons, the browser engine itself or even data caching. Use the Statistics view to see a breakdown of what data is using memory.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fmem-leaks-2" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fmem-leaks-2" alt="demo" width="1335" height="800"></a></p> <h2> Raw Memory Inspection </h2> <p>If you're building a web assembly app, this will be particularly important to you. From the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/memory-inspector/" rel="noopener noreferrer">memory inspector</a>, you can drill down the scope, and inspect ArrayBuffer, TypedArray, DataView, and Wasm Memory. Here's a WASM demo:</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqosly2v3xzz7wdwyr8fz.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqosly2v3xzz7wdwyr8fz.gif" alt="demo" width="720" height="430"></a></p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vknethc5x4esmivt3o2.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vknethc5x4esmivt3o2.gif" alt=" " width="720" height="430"></a></p> <h2> Test bfcache </h2> <p><a href="proxy.php?url=https://web.dev/bfcache/" rel="noopener noreferrer">bfcache</a> is a browser feature that enables instant backward and forward navigation, it works differently from the HTTP cache because it stores a snapshot of the entire page in memory, which is what the user will see while the navigation is happening.</p> <p>In order for the bfcache feature to work effectively on your site, you need to <a href="proxy.php?url=https://web.dev/bfcache/#optimize-your-pages-for-bfcache" rel="noopener noreferrer">optimise for it</a>. And that's where the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/application/back-forward-cache/" rel="noopener noreferrer">Back/Forward Cache Tester</a> comes in. Under Application → Back/forward cache tab, click "Test back/forward cache", and you'll be presented with the results which will list issues for each frame. Clicking each result will also give you instructions on how you can fix it.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fbfcache-test" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fblog%2Fbfcache-test" alt="demo" width="1335" height="800"></a></p> <h2> Full Refresh </h2> <p>Some errors are caused by cached content, and for those a normal refresh isn't enough. With the dev tools open, you can hold down the refresh button (for 2 seconds), and you'll see some additional refresh options, including "Empty Cache and Full Reload".<br> This is also useful for measuring first-time load metrics for new users, when nothing is previously cached.</p> <p>To refresh all tabs at once, just reun <code>chrome://restart</code> in the address bar.</p> <h2> Lighthouse </h2> <p><a href="proxy.php?url=https://developer.chrome.com/docs/lighthouse/" rel="noopener noreferrer">Lighthouse</a> is an extremely useful (and easy!) tool for measuring <a href="proxy.php?url=https://web.dev/learn-core-web-vitals/" rel="noopener noreferrer">Core Web Vitals</a> - accessibility, SEO, responsivness, performances, security, PWA compatibility, best practices and overall user experience.</p> <p>Just open the Lighthouse tab, and click "Start Scan".</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2F11-lighthouse" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2F11-lighthouse" alt="demo" width="1335" height="800"></a></p> <p>Lighthouse results can be exported in a range of formats, and there are various external viewers you can use to gain additional insight (like <a href="proxy.php?url=https://googlechrome.github.io/lighthouse/viewer/" rel="noopener noreferrer">this one</a>).</p> <p>Lighthouse scans can also be incorporated into your CI/CD system, so that you have constant visibility into your apps core vitals.</p> <h2> Page Size Breakdown </h2> <p>Understanding what data is being loaded into your site will help you reduce overall bundle size. This can be done from the Memory and Network tabs, but sometimes a more visual view helps put things into context.<br> The Chrome Memory Treemap is really useful for this - to use, just run a Lighthouse scan, export the results in JSON, then import it into <a href="proxy.php?url=https://googlechrome.github.io/lighthouse/treemap/" rel="noopener noreferrer">googlechrome.github.io/lighthouse/treemap/</a>.<br> You can click any element, to zoom in and inspect additional info.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2F32-memory-treemap" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2F32-memory-treemap" alt="demo" width="1335" height="800"></a></p> <h2> Record User Flows </h2> <blockquote> <p><strong>Note</strong> <em>(This feature is still in beta, and currently requires Chrome Dev Eddition)</em></p> </blockquote> <p><a href="proxy.php?url=https://developer.chrome.com/docs/devtools/recorder/" rel="noopener noreferrer">Record, reply and audit user flows</a> under the audit panel. Just click Start new Recording, enter a name and hit go. Everything the user does, including mouse moves, keypresses, pauses and more will be logged. You can then use Replay to view back the users journey.</p> <p>In the replay settings each step can be expended to view details, you can also edit, add and remove steps in real-time. There are additional options for simulating things like environment of slow network connection. This is super useful for user testing.</p> <p>You can also import and export user flows as a Pupateer scripts, to share with others.</p> <h2> Advanced User Flow Operations </h2> <p>The recorder tool has many other valuable features which often go under-used. Being aware of what you can do, will help you supercharge your user testing.</p> <p>Examples of when this can be useful include: sending the exact steps to recreate a bug to another developer, demonstrating to an analyst exactly how users behaved during a testing session, or slowing things down to debug complex issues.</p> <p>Once you've recorded a user flow, you can:</p> <ul> <li>Replay it (obviously!)</li> <li>View detailed performance metrics over time</li> <li>Export it (as JSON, Puppeteer or Puppeteer reply script)</li> <li> Edit the flow (then re-import it)</li> <li> Share user flows with others (for testing or demonstration)</li> <li> Configure replay settings, such as apply throttling or device limitations</li> <li> Replay in slow mo, with detailed debugging</li> <li> Apply breakpoints, to pause and inspect at certain steps</li> <li> Import user flows generated by other tools</li> <li> Add additional steps, or remove steps</li> </ul> <p>There are several third-party tools that let you do even more, as well as import / export in additional formats, like the <a href="proxy.php?url=https://chrome.google.com/webstore/detail/cypress-chrome-recorder/fellcphjglholofndfmmjmheedhomgin" rel="noopener noreferrer">Cypress add-on</a>, <a href="proxy.php?url=https://chrome.google.com/webstore/detail/nightwatch-chrome-recorde/nhbccjfogdgkahamfohokdhcnemjafjk/" rel="noopener noreferrer">Nightwatch add-on</a>, <a href="proxy.php?url=https://chrome.google.com/webstore/detail/testing-library-recorder/pnobfbfcnoeealajjgnpeodbkkhgiici" rel="noopener noreferrer">Jest add-on</a>, <a href="proxy.php?url=https://chrome.google.com/webstore/detail/webdriverio-chrome-record/pllimkccefnbmghgcikpjkmmcadeddfn" rel="noopener noreferrer">WebDriver add-on</a> and more.</p> <h2> Pausing Execution with Breakpoints </h2> <p><a href="proxy.php?url=https://developer.chrome.com/docs/devtools/javascript/breakpoints/" rel="noopener noreferrer">Breakpoints</a> are an absolute essential for debugging. They enable you to pause everything at a certain point to inspect state and discover issues. You're probably already aware that you can trigger a breakpoint at a certain point, either with the <code>debugger</code> statement statement, or by clicking the margin (in the sources panel, or with a compatible IDE). But there's several other types of breakpoints, including:</p> <ul> <li>Conditional line-of-code - On an exact region of code, but only when some other condition is true.</li> <li>DOM - On the code that changes or removes a specific DOM node, or its children.</li> <li>XHR - When an XHR URL contains a string pattern.</li> <li>Event listener - On the code that runs after an event, such as click, is fired.</li> <li>Exception - On the line of code that is throwing a caught or uncaught exception.</li> <li>Function - Whenever a specific function is called.</li> </ul> <p>You can also make conditional breakpoints (represented as orange tabs), which will only pause the execution when certain conditions are met. To do so, just right-click, select Edit Breakpoint, then use JavaScript to resolve a boolean using current state. </p> <p>If there's a specific method you want to pause on, just run <code>debug(methodName)</code> to start, and <code>undebug(methodName)</code> to end.</p> <p>Once a breakpoint has been hit, you can interact with any current state through the console.</p> <h2> Remote Debugging </h2> <p>As any app developer will tell you, nothing beats testing on a real device. But when it comes to the web, the browser debugging tools are essential. That's where remote debugging comes in - it enables you to test on a physical device while continuing to have the debugging power of the browser tools.</p> <p>The same can work in the opposite direction, where you run your dev environment locally or host it remotely, but access it on an external device.</p> <p>This does require either port forwarding or custom domain mapping (but neither are as scary as they sound!). The <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/remote-debugging/local-server/" rel="noopener noreferrer">docs</a> provide setup instructions and proxy configurations.</p> <p>And if you're developing a native Android app, which has embedded web views, you can use the browser's dev tools to debug these too (<a href="proxy.php?url=https://developer.chrome.com/docs/devtools/remote-debugging/webviews/" rel="noopener noreferrer">docs</a>).</p> <h2> Mock Location and Sensors </h2> <p>In a similar way to the iOS and Android emulators, you can simulate various sensors and hardware settings. This is useful if the app your developing relies on any of this data. Under the Sensors tab, you'll be able to change your location, time zone, locale, screen lock, orientation, motion / acceleration etc.</p> <p>If you frequently find yourself switching between locations or locales, you can add these under Settings --&gt; Locations.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4p8128fsyxwqmphrzah.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4p8128fsyxwqmphrzah.gif" alt="demo" width="720" height="430"></a></p> <h2> Death by Errors, no more! </h2> <p>If you're wading through a large code base or dealing with a poorly written library, and drowning in exceptions which are distracting you from what you're actually trying to debug, then under the settings you can opt to ignore any exceptions thrown by certain scripts or from a given framework. The ignore list can be specified by regex patterns for specific targeting. </p> <p>You can auto-hide source files for most major frameworks by heading to ⋮ → Ignore List, and selecting "Automatically add known third-party sources to Ignore list". This will make the stack trace in the console show less irrelevant info. You'll still be able to view the full stack for any given error, just by clicking "Show more".</p> <p>By default the console will show output from all contexts. This means if you've got an extension installed that's throwing an error it will be cluttering up your console. Just right-click on the file name, and under Filter select Hide messages from [ext name]. You can unhide these at anytime from the same menu.</p> <h2> View and Edit Storage </h2> <p>While we're in the Application tab, it's worth mentioning how essential these tools are for viewing, deleting and editing data stored in local storage, session storage, cookies, IndexedDB, etc.</p> <p>From the storage tab, you can also see a breakdown of how much your site is storing, and simulate restraints like custom storage quotas or disabling cookies.</p> <p>Note that stored data is (usually) only accessible from the domain which set that data. So if you're debugging stored data in the console for any context other than the default one, you'll need to use the frame dropdown at the top to switch domains.</p> <h2> Debug Background Services </h2> <p>If you app includes notifications, sync, background fetch or anything else that should continue running even when the app / current tab is not in the foreground, then these tools are invaluable. Under the Application tab's <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/javascript/background-services/" rel="noopener noreferrer">Background Services</a> section, you can click a API category, start recording, then put your app into the background. When you come back, you'll be able to see specifically which events fired, and inspect each one.</p> <p>Side note, you can view all registered service workers, manage, debug and de-register them from: <code>chrome://serviceworker-internals</code></p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2Fservice-workers" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2Fservice-workers" alt="demo of service workers" width="1335" height="800"></a></p> <h2> HTTPS Security Checks </h2> <p>The Security tab provides a good starting point, for when verifying common HTTPS issues on your site. It checks for, and highlights common SSL issues, including non-secure main origins and mixed content. You can also check web certificate chains in more detail.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2Fsecurity-tab" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2Fsecurity-tab" alt="demo" width="1335" height="800"></a></p> <h2> Web Auth </h2> <p>This ones a bit more niche, but absolutely essential if you're building anything with soft-tokens or 2FA. The WebAuthn tool will let you generate and emulate virtual authenticator devices using a variety of protocols (2FA, FIDO/CTAP) and interface types (USB, NFC, Bluetooth, internal) with additional options for user verification, resident keys, etc.</p> <p>Here's a quick demo:</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbogmm8x9g3rbd5mj3iv1.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbogmm8x9g3rbd5mj3iv1.gif" alt="demo" width="760" height="454"></a></p> <p>For an overview of web auth, see <a href="proxy.php?url=https://webauthn.guide/" rel="noopener noreferrer">WebAuthn.guide</a>, or view the <a href="proxy.php?url=https://w3c.github.io/webauthn/" rel="noopener noreferrer">W3 spec</a></p> <p>On a side-note, there's an interesting article explaining <a href="proxy.php?url=https://developer.chrome.com/blog/webauthn-tab/" rel="noopener noreferrer">how they built the webauthn tab</a>. </p> <h2> Accessibility Tools </h2> <p>Accessibility is not just important for inclusion, it's also a legal requirement for most public-facing apps and services. If you're not yet sure the core concepts of web accessibility standards, I recommend the <a href="proxy.php?url=https://web.dev/learn/accessibility/" rel="noopener noreferrer">Web.Dev Accessibility Tutorial</a>, which provides a great summary.</p> <p>Lighthouse provides a good starting point for auditing accessibility, and is easy to use, and built directly into the developer tools.</p> <p>The CSS tools also have a built-in contrast tool, which will help you apply readable colors to your site. The inspect pop-up will show a warning, and you can analyze this further in the Styles pain.</p> <p>Beyond that, the Accessibility tab let's you view an element's position in the DOM tree, ARIA attributes, and computed accessibility properties, all of which are used by accessibility tools like screen readers.</p> <p>There are additional add-ons which can give you much more powerful insights. Mainly, the <a href="proxy.php?url=https://chrome.google.com/webstore/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd" rel="noopener noreferrer">axe DevTools</a>. This will show you detailed results and instructions of how to fix.</p> <h2> Screenshots </h2> <p>You can capture screenshots directly from the dev tools, including: full-page, specific area or single-node screenshots.<br> Either open up the command pallet and type screenshot, or for an <a href="proxy.php?url=https://developer.chrome.com/blog/new-in-devtools-86/#capture-node-screenshot" rel="noopener noreferrer">element screenshot</a>, just right-click on the DOM element in the inspector and select Capture Screenshot.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2Fscreenshot-nodes" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpixelflare.cc%2Falicia%2Fimages%2Fscreenshot-nodes" alt="demo" width="1335" height="800"></a></p> <h2> Super-Copying </h2> <p>From the elements tab, right-click on an element and under Copy, there are several different options. Copy selector will give you a CSS selector to target that element, similarly copy JS path will give you a query string to select the element in JavaScript, and copy outer HTML will copy the actual HTML. Copying the styles of an element, will give you all the computed CSS for a given element.</p> <h2> Animations Timeline </h2> <p>The animations panel (opened by clicking the 3-dots) lets you record any keyframe animations, and then scrub through them to inspect the actual CSS properties that are affected.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux8i1n637ka8y12gixyz.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux8i1n637ka8y12gixyz.gif" alt="demo" width="760" height="454"></a></p> <h2> Forcing Elements State </h2> <p>If you need to preview the styles of a given element in a particular state (e.g. :hover, :visited, :active, :focus, etc), then either right click it and select Change pseudo class, of from the the styles editor click the :hov icon.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllb0pvqq7gs92lposbv3.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllb0pvqq7gs92lposbv3.gif" alt="demo" width="720" height="430"></a></p> <h2> CSS Sizes and Units </h2> <p>Do you ever inspect an element, then hold the arrow keys up/ down for literally ever until the size looks right? Well you can also drag the units horizontally to easily preview different sizes. Similarly, for angles you can use the clock rotater to preview / apply any value. Got the wrong units? Just hover over the size, and click the drop down to quickly switch units.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fucyspscm627vnxzmlqy8.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fucyspscm627vnxzmlqy8.gif" alt="demo" width="720" height="430"></a></p> <h2> Color Pallets </h2> <p>Most apps include only a handful of colors, and usually when your changing a color, it will be to one of those values. That's why the palette tool is so useful. By default, there are several pre-made palettes: from your pages current colors, your pages CSS variabels, the Material pelette and an empty custom palette. Switch between them with the arrows.</p> <p>While we're here, it's worth also touching on just how powerful the color tool is. From here you can:</p> <ul> <li>Change color shades, hue and transparency - with live preview</li> <li>Convert between units (hex, RGB(A), HSL(A), HWB(A)) </li> <li>Use the eye dropper to pick any color from your screen</li> <li>Copy color value to the clipboard</li> </ul> <p>If you're not already doing so, try to make use of CSS variables (not SASS vars) throughout your app. That way you can update the color in one place, and have it previewed/ applied everywhere. In the dev tools, click a variables name to go to original definition, from there you can modify it.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyh8bgusxwn8p68cr1o5.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyh8bgusxwn8p68cr1o5.gif" alt="demo" width="760" height="454"></a></p> <h2> Easy Box Shadows </h2> <p>Box shadows are one of those things that are best previewed live. That's why the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/css/reference/#shadow-editor" rel="noopener noreferrer">shadow-editor</a> is so useful. Just click the icon next to any shadow to preview different X/Y offsets, blur, spread and directions of both inset and normal shadows.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3oti3wkzyzgq4rfpkvnc.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3oti3wkzyzgq4rfpkvnc.gif" alt="demo" width="760" height="454"></a></p> <h2> Easy Animations </h2> <p>By clicking the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/css/animations/" rel="noopener noreferrer">animation</a> option, you can easily preview various transitions and effects.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwb5343zwu74qp9kqu03m.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwb5343zwu74qp9kqu03m.gif" alt="demo" width="760" height="454"></a></p> <h2> Responsive Design Mode </h2> <p>Easily check that your site displays nicely on a range of devices, using the Responsive Design Mode.</p> <p>By default only a few devices are shown, but head to Settings --&gt; Devices and you'll be able to enable a whole bunch more from the list, or even create your own custom device with dimensions, user agent, platform, architecture and more.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqd5e80jvpzn0ku2pq7u1.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqd5e80jvpzn0ku2pq7u1.gif" alt="demo" width="760" height="454"></a></p> <h2> Badges </h2> <p>You may have notices a little chip/ badge next to certain elements in the Elements tab. These are <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/elements/badges/" rel="noopener noreferrer">Badges</a>, and can be used to apply overlays or add extra features to certain element types including Grids, Flex layouts, Ads, Scroll-Snaps, Containers, Slots and more. To enable badges, right-click an element in the DOM tree and select Badge settings, then check / uncheck what you'd like to be visible.</p> <p>Many of these badges open the door to additional features, like the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/css/flexbox/" rel="noopener noreferrer">Flexbox Debugger</a> and <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/css/grid/" rel="noopener noreferrer">Grid layout debugger</a></p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmi51j4ssuxxbp3blz6c.png" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmi51j4ssuxxbp3blz6c.png" alt="demo" width="800" height="479"></a></p> <h2> Rulers </h2> <p>There's always that one front-end dev, so keen to please the designers that he's using an actual ruler to measure the elements on his screen. Well no need for that, or any dodgy ruler browser extensions, as this feature is built directly into the dev tools. Enable it under ⋮ → Settings → Preferences → Elements → "Show rulers on hover".</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1te4gve64bqlhy32amqj.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1te4gve64bqlhy32amqj.gif" alt="demo" width="760" height="454"></a></p> <p>In Firefox, there is a built-in <a href="proxy.php?url=https://firefox-source-docs.mozilla.org/devtools-user/measure_a_portion_of_the_page/index.html" rel="noopener noreferrer">ruler feature</a>, available through the Toolbox Buttons in the top-right.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq78fqrq7qfq70q27ord.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq78fqrq7qfq70q27ord.gif" alt=" " width="760" height="454"></a></p> <h2> Style Overview </h2> <p>The <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/css-overview/" rel="noopener noreferrer">CSS Overview</a> tab helps you quickly get an overview of CSS improvments you can make. The aim is consistency (colors, fonts, breakpoints, styles, etc).</p> <ul> <li>Color Pallet - Shows all colors used on your site. Useful for identifying elements which don't conform to your desired theme / designs</li> <li>Fonts - Displays all typefaces, sizes and variations used in your page. A good webpage will be consistent with only a few fonts and text styles.</li> <li>Media queries - Outputs all breakpoints used in your site, sorted by highest occurrence. You should aim to keep them consistent to make responsive testing easier</li> <li>Unused Declarations - Lists key information about any unused declarations as well as styles that have no effect. Removing these will speed up load times, and make CSS easier to read.</li> </ul> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7ixak9p6jlbcdw9frt9.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7ixak9p6jlbcdw9frt9.gif" alt="demo" width="1334" height="798"></a></p> <h2> Layers </h2> <p>The Layers panel (more tools → Layers) will show what's happening both off screen and on additional layers (with 3d mode).</p> <p>It's particularly useful for visualising how specific animations are working, from a functional perspective, without having to wade through a bunch of keyframes and obfuscated code.</p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlbl00329myvt55ad6b5.gif" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlbl00329myvt55ad6b5.gif" alt="demo" width="760" height="454"></a></p> <p><a href="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcy92bgatkuhstb30k6zg.jpg" class="article-body-image-wrapper"><img src="proxy.php?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcy92bgatkuhstb30k6zg.jpg" alt="demo" width="800" height="479"></a></p> <h2> Saving Changes to Disk </h2> <p>There are two methods to save or persist changes you've made in the dev tools. Workspaces and Local Overrides.</p> <p><a href="proxy.php?url=https://developer.chrome.com/docs/devtools/workspaces/" rel="noopener noreferrer">Workspaces</a> enable you to save changes you make in the devtools directly to your working copy on disk<br> Workspaces can be setup under Sources → File System → Add Folder. They support HTML, CSS and JavaScript and content can be edited, previewed and saved directly through the sources panels. Certain frameworks require some extra setup to get properly working.</p> <p><a href="proxy.php?url=https://developer.chrome.com/blog/new-in-devtools-65/#overrides" rel="noopener noreferrer">Local Overrides</a> enable you to persist changes across sessions (but without effecting original source files)<br> Overrides can be setup under Sources → Overrides. You can use the Changes menu to preview / export a diff of what you've changed.</p> <h2> Automation </h2> <p>For more advanced tasks, everything in the developer tools can be automated, via the <a href="proxy.php?url=https://developer.chrome.com/docs/extensions/reference/automation/" rel="noopener noreferrer">Automation APIs</a> using <a href="proxy.php?url=https://w3c.github.io/webdriver/" rel="noopener noreferrer">WebDriver Protocol</a> (which is what tools like <a href="proxy.php?url=https://www.selenium.dev/documentation/webdriver/bidirectional/chrome_devtools/" rel="noopener noreferrer">Selenium use</a>). As an example, see the <a href="proxy.php?url=https://www.npmjs.com/package/devtools" rel="noopener noreferrer">webdriver devtools</a> package.</p> <h2> Familiar Shortcuts </h2> <p>So almost everything within the browser developer tools has keyboard shortcuts, here's the <a href="proxy.php?url=https://developer.chrome.com/docs/devtools/shortcuts" rel="noopener noreferrer">full list</a>. But if you're struggling to memorise them all, then you can actually switch to familiar VS Code bindings. Under Settings --&gt; Shortcuts, under the Match shortcuts from preset menu, select Visual Studio Code.</p> <h2> Dark Mode </h2> <p>Finally, but by far the most important tip of all: dev tools dark mode!</p> <p>Under Settings --&gt; Preferences --&gt; Appearances --&gt; Theme, use the dropdown to switch from Light to Dark, and immediately 10x your developer experience. Because like they say... bugs are attracted to the light 🐛🔦</p> <p>And if you're too cool for the default dark mode, you can write your own stylesheet, then enable the custom loading of CSS! There's a few pre-made stylesheets and an extension available <a href="proxy.php?url=https://github.com/micjamking/devtools-author" rel="noopener noreferrer">here</a>.</p> <h2> Useful Add-Ons </h2> <p>We're not quite done... so far we've only covered the built-in dev tools, but there are a bunch of super useful add-ons/ extensions</p> <p>If you're working with a specific framework (like React, Svelte, Vue, etc), then adding their dev tools with give you additional debugging power over components, state and more. </p> <ul> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi" rel="noopener noreferrer">React Dev Tools</a> - Inspect React component hierarchies and profile data</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd" rel="noopener noreferrer">Redux Dev Tools</a> - Debug redux data and monitor state changes </li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/graphql-network-inspector/ndlbedplllcgconngcnfmkadhokfaaln" rel="noopener noreferrer">GraphQL Network Inspector</a> - Inspect GQL requests with support for relay batching</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd" rel="noopener noreferrer">Vue Dev Tools</a> - Debug component hierarchy and state in Vue apps</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/svelte-devtools/ckolcbmkjpjmangdbmnkpjigpkddpogn" rel="noopener noreferrer">Svelte Dev Tools</a> - Inspect the Svelte state and component hierarchies </li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/angular-devtools/ienfalfjdbdpebioblfackkekamfmbnh" rel="noopener noreferrer">Angular Dev Tools</a> - Preview state of directives of Angular component instances</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/meteor-devtools-evolved/ibniinmoafhgbifjojidlagmggecmpgf" rel="noopener noreferrer">Meteor Dev Tools</a> - Debug Meteor apps</li> </ul> <p>Beyond that, almost everything else can be done nativity / without additional extensions, there's still a few QoL add-ons that can be helpful, but keep in mind, that if you use any of these, you should create a separate Dev profile within your browser, as otherwise they may negatively effect you privacy (installed extensions make you more identifiable).</p> <ul> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/visbug/cdockenadnadldjbbgcallicgledbeoc/" rel="noopener noreferrer">Visbug</a> - Interact with and modify any websites, without needing any HTML or CSS knowledge</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk" rel="noopener noreferrer">Lighthouse</a> - Automated performance, quality and correctness checker</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/designer-tools/jiiidpmjdakhbgkbdchmhmnfbdebfnhp" rel="noopener noreferrer">Designer Tools</a> - Grids and rulers for in-browser measurement and alignment </li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/motion-devtools/mnbliiaiiflhmnndmoidhddombbmgcdk" rel="noopener noreferrer">Motion Tools</a> - Inspect and design complex CSS animations</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi" rel="noopener noreferrer">Pixel Perfect</a> - Overlay designs over webpages for building pixel perfect pages</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/cpu-and-memory-performanc/nmpbhigddhbbhopeeagpnnmnihgagbfk" rel="noopener noreferrer">CPU + Mem Performance Monitor</a> - Add system resources overlay to sites</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/meta-seo-inspector/ibkclpciafdglkjkcibmohobjkcfkaef" rel="noopener noreferrer">SEO Inspector</a> - Easy inspection of Meta tags for SEO</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/save-all-resources/abpdnfjocnmdomablahdcfnoggeeiedb" rel="noopener noreferrer">Save all Resources</a> - Easily download everything associated with a site, preserving directory structure</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/multiproxy-tool/olonnmcaipjmcckefehcmaolkpigdjji" rel="noopener noreferrer">Multi-Proxy</a> - Connect to multiple proxies (simultaneously) with IP matching and blocking</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/accessibility-insights-fo/pbjjkligggfmakdaogkfomddhfmpjeni" rel="noopener noreferrer">Accessibility Insights</a> - Get an overview of accessibile navigation issues</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/check-my-links/ojkcdipcgfaekbeaelaapakgnjflfglf]" rel="noopener noreferrer">Check my Links</a> - Quickly find and highlight all dead links within a page</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg" rel="noopener noreferrer">Weppalizer</a> - Similar to <a href="proxy.php?url=https://builtwith.com/" rel="noopener noreferrer">BuiltWith</a>, quickly check what tech a site is built using</li> <li> <a href="proxy.php?url=https://chrome.google.com/webstore/detail/octotree-github-code-tree/bkhaagjahfmjljalopjnoealnfndnagc" rel="noopener noreferrer">Octotree</a> - Adds sidebar on GitHub for much easier navigation</li> </ul> <h2> Are we finished yet? </h2> <p>Alright, this time I swear it's the last section, but I couldn't resist mentioning this too!</p> <p>There is SO MUCH more to the browser developer tools than covered here. Even if you've been a web developer for several decades, I'm pretty sure there's still a whole bunch of handy features that even you've not yet come across. So don't be afraid to go exploring!</p> <p>The best features are still experimental. You can try them out by enabling them under Settings --&gt; Experiments. There's a link next to each item where you can view a usage tutorial as well as the API docs.</p> <p>Other Browsers:</p> <ul> <li> <a href="proxy.php?url=https://firefox-dev.tools/">Firefox dev tools</a> has a very similar feature set and layout to Chrome, but includes a few advanced features (around audio, shaders)</li> <li> <a href="proxy.php?url=https://developer.apple.com/safari/tools/" rel="noopener noreferrer">Safari's developer tools</a> are lagging behind in terms of features, but are sometimes still required for iOS testing.</li> <li>Other Chromium-based browsers (like Edge, Brave, Vivaldi, etc) inherit from the same source as Chrome, and as such have virtually identical dev tools.</li> </ul> <p>The following sources are great for staying up-to-date with the latest in debug tools:</p> <ul> <li><a href="proxy.php?url=https://developer.chrome.com/tags/new-in-devtools/" rel="noopener noreferrer">What's New in DevTools</a></li> <li><a href="proxy.php?url=https://www.youtube.com/c/GoogleChromeDevelopers" rel="noopener noreferrer">Chrome Developers on YouTube</a></li> </ul> webdev javascript tooling productivity