Alicia's Notes ๐Ÿš€ Alicia's Notes ๐Ÿš€ Thankful to be here ๐ŸŒ http://aliciasykes.com en Astro is pretty cool ๐Ÿ†’ Alicia's Notes ๐Ÿš€ Wed, 17 Apr 2024 19:28:19 +0000 https://notes.aliciasykes.com/51203/astro-is-pretty-cool https://notes.aliciasykes.com/51203/astro-is-pretty-cool <p><blockquote> <p>This post outlines the top 5 coolest things about Astro, and why you might want to consider it for your next project<br> At the <a href="#what-i-built">end</a>, I'll share a demo of a project I used Astro for, and how I found working with it</p> </blockquote> <h3>Intro</h3> <p>If you're new to <a href="https://astro.build/" rel="noopener nofollow" target="_blank">Astro</a>, in short it's a framework for generating very optimized, websites to be rendered by the server or statically generated. No heavy JavaScript needs to be sent to the client, nor is it needed for rendering. This gives your site a huge boost in performance, SEO, accessibility and user experience. </p> <p>As well as that, you're not locked into a single cloud provider, frontend framework, backend CMS or anything else. Pretty much all the features you could need for any sort of site, or any size are included, either out-of-the-box, or as 1-line integration.</p> <p>Astro is super easy to get started with, and an absolute joy to work with. The developer experience is ๐ŸคŒ</p> <p>If you're just interested in a demo of it in action, then <a href="#what-i-built">โญ๏ธ Skip to the End</a></p> <hr> <h2>Top 5 Cool Things about Astro ๐Ÿ˜Ž</h2> <h3>Cool Thing 1 - Lightening Fast โšก</h3> <p>Unlike other frameworks, that primarily do all expensive rendering on the users browser, Astro uses server-side rendering and static site generation, boosting your performance metrics.</p> <p>And it's super easy - just define the rendering mode by setting <code class="prettyprint">output</code> to either <code class="prettyprint">static</code>, <code class="prettyprint">server</code> or <code class="prettyprint">hybrid</code> at the top of any given file.</p> <p>This is awesome, as you can get the balance between between speed and dynamic content.</p> <ul> <li>Pre-rendered: The static output will generate all HTML routes once, at build-time.</li> <li>On-Demand Rendering: The server output will render routes on the server, at the point the user requests them (similar to how PHP, .NET and other SSR technologies used to work).</li> <li>Hybrid: For mostly-static sites with some on-demand content, you can use hybrid output for on-demand rendering of certain features only.</li> </ul> <hr> <h3>Cool Thing 2 - DevEx ๐Ÿ‘จโ€๐Ÿ’ป</h3> <p>With Astro, you get several really nice things out the box, without needing to install or configure anything extra.</p> <p>Firstly, page transitions. Implementing is as simple as importing <code class="prettyprint">ViewTransitions</code>, adding <code class="prettyprint">&lt;ViewTransitions /&gt;</code> to your layout file (or a common component), and adding the <code class="prettyprint">transition</code> attribute to any views/component you want to animate in/out.</p> <p>Secondly, prefetch. Page load times play a huge role in the enjoyability of using any website. With prefetch enabled, the next page is automatically loaded in the background when the user is about to click the link, that way it can be displayed near-instantly. Usage is simple, in your config just set <code class="prettyprint">prefetch: true</code>, then add the <code class="prettyprint">data-astro-prefetch</code> attribute to any link you'd like to be pre-fetched.</p> <p>Thirdly, there's first-class support for Typescript, built in environmental variable / .env support, CSS pre-processing (SASS/SCSS)</p> <p>For building, Astro uses Vite, which if needed you can easily extend with the Vite or Rollup plugin.</p> <hr> <h3>Cool Thing 3 - UI Agnostic ๐Ÿ“</h3> <p>Now, you might be wondering how you're going to deal with interactivity, especially for statically generated sites. That's where islands come in.</p> <p>The general idea is that you render your HTML on the server, but inject slots around highly dynamic regions, which are then hydrated on client-side once loaded.</p> <p>You can build these interactive islands in pretty much any frontend framework or web component library you like. Astro has integrations for React, Svelte, Vue, Solid, Alpine, Lit and more.</p> <p>This might sound a bit complicated, but Astro makes it stupidly easy.</p> <p>Here's an example, run <code class="prettyprint">npx astro add svelte</code>. Then go ahead and import standard Svelte components into any Astro view or component. In the below code snippet, for a news site - the post content can be statically generated for great SEO and snappy load times, but the comments form is a dynamic island</p> <div class="highlight"><pre class="highlight plaintext"><code>--- import PostContent from '@/components/PostContent.astro'; import Comments from '@/components/Comments.svelte'; //... // Get the slug/ID of post to render, and fetch it's contents const postSlug = Astro.request.params.slug; const content = await Astro.fetchContent(`../posts/${postSlug}.md`); --- &lt;Layout&gt; &lt;Navbar /&gt; &lt;main&gt; &lt;!-- Import and use standard Astro component (SSR or SSG) --&gt; &lt;PostContent innerHTML={content}/&gt; &lt;!-- Import dynamic component for comments/chat form (client) --&gt; &lt;Comments client:load postSlug={postSlug} /&gt; &lt;/main&gt; &lt;Footer /&gt; &lt;/Layout&gt; </code></pre></div> <p>As you can see, you can simply import any component (normal React, Svelte, Astro etc) into your Astro page, and add the <code class="prettyprint">client:load</code> directive, to specify it should be loaded client-side. If the page is particularly large, use <code class="prettyprint">client:visible</code> instead, so it won't be hydrated until visible to the user. Or if you want to skip server-side rendering + hydration all together, use <code class="prettyprint">client:only</code> to only execute client-side.</p> <p>If you have existing components, you can even mix and match - importing different types of components into a single Astro file. And you can pass Astro props or render slots to any of these components, as well as nest them.</p> <hr> <h3>Cool Thing 4 - Tooling &amp; Integrations ๐Ÿ› ๏ธ</h3> <p>Take a look at <a href="https://astro.build/integrations" rel="noopener nofollow" target="_blank">astro.build/integrations</a>, and you'll see the huge directory of plugins available.</p> <p>As you can see, pretty much every aspect needed for a high-quality, modern and scalable website is included. Everything from SPA support, accessibility, performance, auto-sitemap, storybook, testing add-ons, data adapters, frontend frameworks (for islands), adapters for (super) easy deployment to nearly any cloud platform and hosting provider.</p> <p>Setting up any of these is as simple as running one <code class="prettyprint">npx astro add __</code> command, which will automatically install, import and configure the integration.</p> <p>Talking about the <code class="prettyprint">astro</code> command, this CLI util makes the end-to-end setup, development and deployment process is a joy. It handles everything from creating your app, managing integrations, generating optimized platform-specific production builds, deploying, and much more. No matter the size of your app, the dev server is very snappy, with near-instant build + refresh times.</p> <p>There's a dev toolbar, which let's you audit, inspect and debug your Astro app.</p> <p>The community is also very strong, there's plenty of <a href="https://astro.build/themes/?search=&amp;price%5B%5D=free" rel="noopener nofollow" target="_blank">themes and templates</a> to get you started. </p> <hr> <h3>Cool Thing 5 - Content First ๐Ÿ“š</h3> <p>Managing a content-first site can quickly become messy. That's not the case with Astro.</p> <p>To start with, the project structure is very intuitive. You get file-based routing out of the box, where every file/directory inside of <code class="prettyprint">./src/pages</code> relates to an endpoint. You can write your pages using either <code class="prettyprint">.astro</code> , <code class="prettyprint">.html</code>, <code class="prettyprint">.md</code>, <code class="prettyprint">.mdx</code> and <code class="prettyprint">.ts</code>/<code class="prettyprint">.js</code> </p> <p>Below is a simple markdown example. If this were saved in <code class="prettyprint">./src/pages/my-page.md</code> then you'd be able to access it at <code class="prettyprint">https://my-site.com/my-page</code></p> <div class="highlight"><pre class="highlight plaintext"><code>--- layout: '../layouts/MySiteLayout.astro' title: 'My Markdown page' --- # Title This is my page, written in **Markdown.** </code></pre></div> <p>Of course, there's catch-all, path params, error pages, redirects, etc. You'll likey use a reusable layout from <code class="prettyprint">./src/layouts</code> too, which are extendable.</p> <p>For content-heavy websites, you'll probably want to use Astro's content collections option. This provides some neat features for creating, managing, organizing all front matter, as well as automatic validation and type saftey.</p> <p>As expected, usage is simple. Just place any content (like <code class="prettyprint">.md</code>, <code class="prettyprint">.mdx</code>, <code class="prettyprint">.yaml</code>, <code class="prettyprint">.json</code> files) within a directory of your choosing inside <code class="prettyprint">src/content</code>. Once you have a directory, you can start querying your data.</p> <p>This is ideal if interacting with a headless CMS or pulling structured content from a remote source. You define collections in <code class="prettyprint">src/content/config.ts</code>, as well specifying each collections schema (or using a remote schema).</p> <p>Astro uses Zod to validate every fileโ€™s frontmatter within a collection and provide automatic TypeScript types when you go to query content from inside your project.</p> <p>Once your content is setup, you can reference and query it in any Astro page. Tasks like generating routes automatically from content, providing search functionality, passing content as props and rendering content as HTML is all strait forward.</p> <hr> <h3>Bonus Cool Thing - It's Super Easy ๐Ÿ˜‡</h3> <p>Astro is insanely easy to use, the learning curve is so shallow that you can cover all the core concepts, and get your first project up and running within a few hours.</p> <p>Markup lives in <code class="prettyprint">.astro</code> files, a superset of HTML (any valid HTML is also valid Astro). The templating language is simple yet powerful, it takes all the best parts of the likes of Svelte and Vue', while also borrowing support for JSX expressions from React.</p> <p>One big reason why Astro is able to be so much less-complex than other frameworks, is that it was designed to render on the server, not in the browser. That means that you donโ€™t need to worry about: hooks (React), stale closures (also React), refs (Vue), observables (Svelte), atoms, selectors, reactions, or derivations. There is no reactivity on the server, so all of that complexity melts away.</p> <p>If you're using server-side rendering, this can get tricky when you need to support multiple providers / want to avoid ventor lock-in. Vercel serverless functions works differently to Netlify Edge functions, Cloudflare Workers, AWS Amplify, Azure, Deno etc. Thankfully, with Astro you don't need to worry about any of this. Just add the <a href="https://astro.build/integrations/?search=&amp;categories%5B%5D=adapters" rel="noopener nofollow" target="_blank">Adapters</a> you need, and deploy!</p> <hr> <p>This has been a whistle stop tour of Astro. There's much much more to discover, so do take a look at their (very well-written) <a href="https://docs.astro.build/en/getting-started/" rel="noopener nofollow" target="_blank">docs</a>.</p> <p></p><hr id="what-i-built"><p></p> <h2>Demo ๐ŸŒ</h2> <p>I'd like to finish off by briefly demoing an app that I build with Astro - <a href="https://github.com/lissy93/awesome-privacy" rel="noopener nofollow" target="_blank">Awesome Privacy</a>. The website is deployed to <a href="https://awesome-privacy.xyz/" rel="noopener nofollow" target="_blank">awesome-privacy.xyz</a> if you're interested!</p> <p><a href="https://github.com/lissy93/awesome-privacy"><img src="https://gh-card.dev/repos/lissy93/awesome-privacy.svg" alt="lissy93/awesome-privacy - GitHub"></a></p> <p>For this project, I compiled a list of <em>privacy-respecting</em> apps and services in a single YAML file, each including a name, description, and a link to the project's website and GitHub repo.</p> <ul> <li>I made an Astro API route to fetch and parse this data.</li> <li>Then I used dynamic routes, so that there was a page for each category, section and listing. <ul> <li>For example, <a href="https://awesome-privacy.xyz/productivity" rel="noopener nofollow" target="_blank">/productivity</a> --&gt; <a href="https://awesome-privacy.xyz/productivity/digital-notes" rel="noopener nofollow" target="_blank">/productivity/digital-notes</a> --&gt; <a href="https://awesome-privacy.xyz/productivity/digital-notes/standard-notes" rel="noopener nofollow" target="_blank">/productivity/digital-notes/standard-notes</a></li> </ul></li> <li>Then, when you click a listing, I fetch data about the services privacy policy, website security, mobile app trackers, source code info, Docker metrics, social presence and more. As an example, see the <a href="https://awesome-privacy.xyz/essentials/password-managers/bitwarden" rel="noopener nofollow" target="_blank">Bitwarden</a> page. <ul> <li>Thanks to Astro, all these fetch requests happen at build-time, so there's no ongoing load on the backend, and the site is near-instant despite the amount of data fetched.</li> </ul></li> <li>I implemented site-wide search, at <a href="https://awesome-privacy.xyz/search" rel="noopener nofollow" target="_blank">/search</a> and results, at <a href="https://awesome-privacy.xyz/search/password" rel="noopener nofollow" target="_blank">/search/[search-term]</a></li> <li>I added some additional routes to make the site more complete, including <ul> <li>For viewing all listings: <a href="https://awesome-privacy.xyz/all" rel="noopener nofollow" target="_blank">/all</a></li> <li>Your saved listings: <a href="https://awesome-privacy.xyz/inventory" rel="noopener nofollow" target="_blank">/inventory</a></li> <li>And an about page: <a href="https://awesome-privacy.xyz/about" rel="noopener nofollow" target="_blank">/about</a></li> </ul></li> </ul> <p>The site has over 500 pages (you can see a full list <a href="https://awesome-privacy.xyz/sitemap" rel="noopener nofollow" target="_blank">here</a>). But the cool thing is, all the content that defines and makes up all these pages is coming from a single YAML file. Astro is perfect for generating all these static routes, from one simple codebase.</p> <p>I also made a quick API (at <a href="https://api.awesome-privacy.xyz/" rel="noopener nofollow" target="_blank">api.awesome-privacy.xyz</a> - <a href="https://github.com/Lissy93/awesome-privacy/tree/main/api" rel="noopener nofollow" target="_blank">here's the code</a>), but that was built with Hono and Cloudflare Workers, so it's a post for another day!</p> <p>Originally the Awesome Privacy reop was just a markdown document. I wanted to preserve the ability to view all listings in the main README, while also keeping data synced across the website and GitHub repo. For this I used my YAML file as the single source of truth, then wrote a quick Python script (<a href="https://github.com/Lissy93/awesome-privacy/blob/main/lib/awesome-privacy-readme-gen.py" rel="noopener nofollow" target="_blank">awesome-privacy-readme-gen.py</a>) to convert the YAML into neatley formatted markdown content and insert into the README. This process runs via GitHub Actions, so whenever the YAML is updated, the README will automatically reflect these changes too.</p> <hr> <p>Below is an example, showing the input YAML, and the output webpage. </p> <p>As you can see, from a small amount of user-submitted data, we're able to generate a quite comprehensive report on a given service (in this example, it's Signal Messenger).</p> <p><a href="https://awesome-privacy.xyz/communication/encrypted-messaging/signal"><img src="https://i.ibb.co/YcgH0d8/awesome-privacy-data-example.png" alt="example"></a></p> </p> My thoughts on Tailwind ๐Ÿƒ Alicia's Notes ๐Ÿš€ Tue, 13 Feb 2024 12:56:02 +0000 https://notes.aliciasykes.com/49557/my-thoughts-on-tailwind https://notes.aliciasykes.com/49557/my-thoughts-on-tailwind <p><p>For a long time I've always been very anti-Tailwind. I don't like how cluttered it makes your markup, or how it abstracts away what's actually happening, or the un-semantic approach it forces you to take.</p> <p>That said, it does have some very clear benefits. So for my most recent project (<a href="https://digital-defense.io/" rel="noopener nofollow" target="_blank">digital-defense.io</a>), I thought I'd give it a second shot.</p> <p>Here's my thoughts:</p> <h3>Pros</h3> <ul> <li>๐Ÿ‘ It is actually possible to cover 99% of styling with Tailwind. I was expecting to have to still write my own CSS to cover edge cases, but it really wasn't necessary</li> <li>๐Ÿ‘ The built-in colors, dimensions and values really do make a lot of sense, everything is incredibley consistent</li> <li>๐Ÿ‘ Some things which take several lines of CSS are just much quicker with Tailwind (like flex / grid layouts, transitions, transformations)</li> <li>๐Ÿ‘ For accessibility, the screen-reader-only and forced colour adjustments are really nice</li> <li>๐Ÿ‘ The overhead it added (in terms of bundle and load performance) was negligible</li> </ul> <h3>Meh</h3> <ul> <li>๐Ÿซฑ You're forced to really componetize every small element of your application, to prevent any repetition of classes</li> <li>๐Ÿซฑ Mixing styling with markup doesn't feel right. But nor does duplicating the structure of your markup with SCSS, we just don't have an ideal approach yet.</li> </ul> <h3>Cons</h3> <ul> <li>๐Ÿ‘Ž Theme switching is hard out the box, as Tailwind doesn't use semantic class names (like primary, secondary, etc). Instead you need to either use a library, or just create your own theme, which consumes Tailwind properties</li> <li>๐Ÿ‘Ž If you need to dynamically apply styles/classes, based on a certain computed value, then the Tailwind classes you're using are tree-shaken out by Vite and won't be applied. Therefore you need to list those classes in your Tailwind config. Bit of a pain, but they do support regex, and it shouldn't be a too common occurrence.</li> <li>๐Ÿ‘Ž The computed vales are a bit cryptic in the dev tools of a production site. This also isn't ideal if your targeting power users, who might want to override colors/styles themselves.</li> <li>๐Ÿ‘Ž There's no two ways around it, whatever fancy VS Code extensions you might have, Tailwind REALLY clutters up your markup. Means you need to be really thoughtful to prevent your HTML from becoming a mess to read</li> </ul> <h3>Thoughts</h3> <ul> <li>๐Ÿซด At the start I needed to reference the docs quite a lot (really great docs site they have), but I picked up the pattern very quickly, as their class identifiers are very intuitive</li> <li>๐Ÿซด I think people who start out with Tailwind would be at a huge disadvantage, not fully understanding the CSS fundamentals under the hood. Definetley learn CSS properly first</li> <li>๐Ÿซด By the end, I could build components much faster than I could with just CSS. And it was nice to not have to be constantly jumping to style files / style tags. But later on I needed to spend more time componentizing molecules to prevent repetition. Even still, I would say the Tailwind makes development faster overall.</li> <li>๐Ÿซด Using a Tailwind based component library (I went with <a href="https://daisyui.com/" rel="noopener nofollow" target="_blank">daisyUI</a>) reduces the long list of class names you need for common elements, bringing back a more semantic approach</li> </ul> </p> Project Ideas: Agile ๐Ÿ’ก Alicia's Notes ๐Ÿš€ Tue, 12 Dec 2023 19:43:03 +0000 https://notes.aliciasykes.com/48239/project-ideas-agile https://notes.aliciasykes.com/48239/project-ideas-agile <p><p>Many software development teams follow some kind of <a href="https://www.atlassian.com/agile" rel="noopener nofollow" target="_blank">agile</a> methodology, as the backbone for their ways of working. And if you are one of them, you'll know the current software landscape (Jira, Confluence, Teams, etc) leaves plenty to be desired.</p> <p>Here's 25 ideas for mini projects, to help optimize your workflow for you and your colleges.</p> <p>None of these should take much more than a weekend to build, so a good opportunity to try out a new tech stack. And it gives you something cool to show to your boss on Monday!</p> <hr> <h3>1. Sentiment Tracking</h3> <blockquote> <p>A system to gauge and monitor the sentiment of the team. Should be anonymous, so members can be honest. Needs to be as frictionless as possible, so maybe a Slack / Teams Bot, with data collected via reactions. Generate some pretty charts for the scrum master (I did something similar ages ago, <a href="https://github.com/Lissy93/happy-app" rel="noopener nofollow" target="_blank">here</a>)</p> </blockquote> <h3>2. Meeting Timer</h3> <blockquote> <p>Keep meetings moving quickly with customizable timers. Could also show meeting time stats + metrics too. Built either as a web app, or a plugin for Zoom/ Teams / Meet.</p> </blockquote> <h3>3. Sprint Health Dash</h3> <blockquote> <p>Pull data from Jira (or elsewhere) to display some neat real-time dashboards, to make the PO happy.</p> </blockquote> <h3>4. Impediment Tracker</h3> <blockquote> <p>A page dedicated to blockers or issues, to visualize which developers are blocked by which tickets. Gives motivation and recognition to the developers who solve the biggest blockers.</p> </blockquote> <h3>5. Team Availability Calendar</h3> <blockquote> <p>A simple 1-page app, to quickly visualize which team members will be available when. Useful for remote teams, or those which work across timezones, have part-time workers, or have many members taking upskilling or vacation days. Could also hook it up to Outlook / Google Calendar to automatically populate</p> </blockquote> <h3>6. Skill Matrix Tool</h3> <blockquote> <p>An app that helps teams track and manage the skills and learning goals of its members. This could be used for identifying skill gaps, planning pair programming sessions, and supporting personal development plans. Also helps with story planning, if scrum masters know who can do what</p> </blockquote> <h3>7. Estimation Voting</h3> <blockquote> <p>A planning poker app, where members anonymously vote on the size of a story during refinement sessions, and it outputs the average and upper + lower bounds</p> </blockquote> <h3>8. Real-time Feedback Tool</h3> <blockquote> <p>An app where team members can give and receive real-time feedback on tasks and during sprints. This could foster a culture of continuous improvement and open communication.</p> </blockquote> <h3>9. Automated Sprint Report Generator</h3> <blockquote> <p>Managers love a pretty status report. This app could connect to your Jira / Trello board, and provide a summary of everything completed in that week, along with some pretty charts and shoutouts to top developers</p> </blockquote> <h3>10. Stand-Up Bot</h3> <blockquote> <p>Because real standup includes too much human interaction. Have a bot prompt everyone for their update, and compile it into a single easily accessible report. Less meetings!</p> </blockquote> <h3>11. Action Item Tracker</h3> <blockquote> <p>Use AI to read the auto-generated transcript for a meeting, and then send out a list of actions to the individual responsible for each. E.g. if you're talking about researching XYZ, then Pam asks Tony if he could do that, Tony will get a reminder to "research XYZ" after the meeting</p> </blockquote> <h3>12. Automated Risk Assessments</h3> <blockquote> <p>Because risks assessments are boring. Could read in data from your project management software, and use AI to identify risks and output an assessment of each in the form of a report</p> </blockquote> <h3>13. Visual Dependencies</h3> <blockquote> <p>In larger or more complex projects, you often get the situation where X is dependent on Y, which is dependent on V and W, which are blocked by Z. It all becomes a bit complicated. A took to show dependencies visually will solve this. But the challenge is getting and processing the data. It could be extended to show and manage cross-team dependencies too</p> </blockquote> <h3>14. Retro Board</h3> <blockquote> <p>An alternative to Miro or sticky notes for retrospective meetings. Could include features like anonymous feedback, timers, actions, etc</p> </blockquote> <h3>15. Decision Making</h3> <blockquote> <p>Often decisions take a long time to make, because everyone has a different opinion on something. A poll app, specifically designed for agile teams, where users can vote and provide justification should make this process a lot quicker and more civil</p> </blockquote> <h3>16. Interactive Glossary</h3> <blockquote> <p>Many projects use lots of acronyms, which some people find hard to remember. This is especially hard for new-joiners. A glossary on Confluence quickly becomes out-dated and hard to manage, but a dedicated app could make searching, adding and browsing much easier</p> </blockquote> <h3>17. Personal Timer</h3> <blockquote> <p>If a task is taking considerably longer than estimated, it may have not been properly refined, or the developer could need extra support. Often you don't realize this until you've sunk 8+ hours into it. A Pomadoro-style timer, with a cusomizable limit may help developers track and identify when they need to escalate something. This could be extended further to integrate with other systems (like Jira or Wakatime)</p> </blockquote> <h3>18. Meeting Minutes</h3> <blockquote> <p>The contents of meetings often become lost. Hundreds of hours or recordings make it hard to find specifically what you're looking for. A system which uses AI to generate minutes, and lets users search the textual content of all historic meetings should make this easier to manage</p> </blockquote> <h3>19. Snippet Hub</h3> <blockquote> <p>A centralized repository for code snippets relating to your specific project. Will help newer developers find solutions to common problems (e.g. database connection, using custom components, mocking your data, etc). Could also create a VS Code extension, which let's developers easily insert snippets without leaving their IDE</p> </blockquote> <h3>20. Review Scheduler</h3> <blockquote> <p>When there are lots of PR review notifications, they often either get ignored by developers, or break their flow. A centralised hub for review tasks would help devs work through their code reviews all at once, like once or twice a day. This could be done using the GitHub / GitLab API, to fetch PRs assigned to each specific developer</p> </blockquote> <h3>21. Debug Diary</h3> <blockquote> <p>Like a personal mini StackOverflow instance, where whenever a developer encounters something they get stuck on, they can post the solution, so that no one needs to spend time figuring out the same thing twice</p> </blockquote> <h3>22. Interactive DoD</h3> <blockquote> <p>On more established projects, you often have a very long checklist for the definition of done. Many of the items are not relevant to many of the stories (such as API docs for a frontend ticket). Having a system which can generate a relevant DoD checklist for a specific ticket type, will mean that the list is much shorter, more relevant and hence (hopefully) easier to achieve</p> </blockquote> <h3>23. Mobbing Helper</h3> <blockquote> <p>Pair programming is hugely beneficial, but some longer mobbing sessions end up with the same few developers driving and doing all the work. A simple timer type extension could help ensure the driver is frequently rotated, keeping all developer engaged</p> </blockquote> <h3>24. Automated Onboarding</h3> <blockquote> <p>A script to walk new joiners through the onboarding process, including local development environment setup for their specific architecture. If this was an all-in-one process, it could cut down on the sometimes many days or weeks it can take new developers to get setup</p> </blockquote> <h3>25. Link List</h3> <blockquote> <p>So you've probably got a whole bunch of links (Agile board, messaging, cloud, source code, wiki, CI/CD, docs, dev/UAT/prod environments, etc) along with all the mini apps you've built that you need to keep track of. This makes finding the URL you're looking for tiresome, especially for new joiners. The last project idea is just a simple web page, that brings together all your agile apps into one single place. So the new BA won't ever need to ask you for the link to UAT ever again!</p> </blockquote> </p> Trying out Solid.js ๐Ÿฐ Alicia's Notes ๐Ÿš€ Mon, 04 Dec 2023 20:02:06 +0000 https://notes.aliciasykes.com/48068/trying-out-solid-js https://notes.aliciasykes.com/48068/trying-out-solid-js <p><h3>Intro</h3> <p>I've been interested in Solid ever since I saw it rising on the StackOverflow developer survey (the <a href="https://survey.stackoverflow.co/2023/#section-admired-and-desired-web-frameworks-and-technologies" rel="noopener nofollow" target="_blank">third-most admired framework</a>), and even more so since watching Fireship's <a href="https://www.youtube.com/watch?v=hw3Bx5vxKl0" rel="noopener nofollow" target="_blank">Solid in 100 Seconds</a> video.</p> <hr> <h3>What's Solid?</h3> <p>In short, Solid is declarative JavaScript framework for building extremely performant UIs, thanks to it's maximum control over reactivity.</p> <p>At first glance, it looks kinda similar to React. It uses JSX, with a component-based architecture. There's hook-type syntax (called composables) for hooking into state and lifecycle features. And it takes a very declarative approach to defining what the UI should look like based on state.</p> <p>But that's about where the similarities end. In Solid, there's no virtual DOM, it compiles down into well optimized vanilla JavaScript. And it is properly reactive, with functional components only called once, with state managed by Signals, instead of re-rendering the entire component whenever a prop somewhere changes.</p> <p>It was created by the very talented <a href="https://twitter.com/RyanCarniato" rel="noopener nofollow" target="_blank">Ryan Carniato</a></p> <hr> <h3>What I built</h3> <p>I learn best by doing, so after a quick skim read of the Solid docs I decided to dive straight in.</p> <p>What was I going to build? Well one of the things I do at work is order in the office snacks. I like to know what kind of stuff people like, but sending out surveys is really boring.</p> <p>In order to cover off the basics of Solid, while also producing a (somewhat) useful app, it would need to do several things:</p> <ul> <li>Let users login via their SSO provider</li> <li>Enable users to request, upvote and downvote snacks</li> <li>View results, with real-time updates</li> <li>I'd also like it to be translatable, themable, responsive, accessible, tested, observable and overall easy enough to maintain (so basically just all the best practice buzz words)</li> </ul> <p>I gave myself one weekend to get this done, and though I got the MVP done in that time, I ended up spending 2 weekends getting it feature-complete.</p> <p>The source code is on GitHub, at <strong><a href="https://github.com/Lissy93/cso" rel="noopener nofollow" target="_blank">github.com/Lissy93/cso</a></strong></p> <p>Here's a quick demo:</p> <p><img class="demo-recordin" src="https://i.ibb.co/PZLw8xj/Snack-Champion-Demo.webp" alt="Demo" width="750"></p> <p>(yes, it has AI - because it's 2023 and even your toaster has AI!)</p> <hr> <h3>My Thoughts on Solid</h3> <p>Overall, Solid was easy enough to get started with. I liked that it seemed more vanilla and closer to the DOM than other frameworks, and that you can be really deliberate with what you do and don't want to be reactive. If performance is an important factor in your app, then Solid could be an awesome choice.</p> <p>I didn't so much love the developer experience. My dev env was slow, errors were vague, I missed some the nice built-in features of larger frameworks, and the ecosystem was tiny compared to more established alternatives. Given the inherent messiness of JSX and without such a rigid or opinionated structure, my project didn't take long to descend into a a big pile of spaghetti code. </p> <p>...</p> <p>Learning Curve.<br> The time took to learn the (very very) basics of solid was pretty quick. The docs are very clear and thorough. It took about 10 minutes to skim read <a href="https://www.solidjs.com/docs/latest/api" rel="noopener nofollow" target="_blank">the spec</a>, and there's also plenty of guides, tutorials, examples and playgrounds on <a href="https://www.solidjs.com/" rel="noopener nofollow" target="_blank">solidjs.com</a>.</p> <p>Features.<br> I really missed those quality of life / nice to have features that are directly built into larger frameworks. Little things, like Svelte's built-in animations, Vue's built-in form handling (v-model), React's global state management (context API), etc. Of course, that's to be expected when you're choosing a framework know for performance.</p> <p>Developing.<br> Again, this may have been due to some misconfiguration on my part, but out-of-the-box, I found the full page reloads on the development server to be notably slower than what I was used to. Sure live-reload was speedy enough, but I had to force kill and restart the dev server every 20 minutes or so</p> <p>Tooling.<br> Several times I made stupid mistakes, like messed up an export or made a typo in a tag. In React, or any other framework, you'd usually get a somewhere meaningful error message. But in Solid I just got a blank white screen of death, and a cryptic message in the console, usually something just like <code class="prettyprint">Uncaught</code>, with no other details.</p> <p>Ecosystem.<br> With many other frameworks, there's tons of ready-made components, libraries and add-ons that you can just npm insstall to get your prototype up and running quickly. Not so much in Solid, as it's newer and so has a smaller community.</p> <p>Syntax.<br> This is very much a personal preference. But although I'm familiar with React, I do not like it at all, because of it's use of JSX. There's just something about mixing logic in with your UI, which seems wrong to me. And Solid, of course uses JSX. I also found that I needed to write a fair bit of boilerplate when it came to components with more complex state management or side effects, which further complicated my JSX components.</p> <hr> <h3>Side note: Supabase</h3> <p>For the backend, I was looking for something quick and easy. I'd played around with a local Supabase back when it was in Alpha, and it seemed cool enough. But bloody hell is Supabase awesome now!</p> <p>In my app, Supabase handling everything from data storage (insertions, updates, deletions), user management (with 3rd party auth providers), real-time, and really decent RLS policies (so rows that were not created by a given user cannot be either read, modified or deleted). </p> <p>Supabase's client packages make integrating with it so so easy - it literally took under 5 minutes to get the database up and running.</p> <p>Since it's a small enough project, I decided to just go with the hosted instance, as it's well within the free plan, and the frontends just Netlify anyway. So no complicated infrastructure to setup or manage!</p> <style> img.demo-recordin { margin: 1rem auto; border-radius: 4px; } </style> </p> 50 ways to bring in extra cash as a developer ๐Ÿ’ฐ Alicia's Notes ๐Ÿš€ Sun, 19 Nov 2023 21:18:30 +0000 https://notes.aliciasykes.com/47804/50-ways-to-bring-in-extra-cash-as-a-developer https://notes.aliciasykes.com/47804/50-ways-to-bring-in-extra-cash-as-a-developer <p><p><img class="thumb" width="400" src="https://i.ibb.co/DDQBHvL/developer-side-hustles.png" alt="Picture of coder doing his thing"></p> <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> <hr> <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="https://creators.brave.com/" rel="noopener nofollow" target="_blank">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="https://basicattentiontoken.org/" rel="noopener nofollow" target="_blank">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="https://flattr.com/" rel="noopener nofollow" target="_blank">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="https://webmonetization.org/" rel="noopener nofollow" target="_blank">webmonetization.org</a> spec, a proposal which makes use of <a href="https://paymentpointers.org/" rel="noopener nofollow" target="_blank">payment pointers</a> via <a href="https://interledger.org/" rel="noopener nofollow" target="_blank">ILP</a> to stream income from WM-enabled visitors, via the use of a simple <code class="prettyprint">&lt;link rel="monetization" href="your-pointer-here" /&gt;</code> tag.</p> <hr> <h3>2. API as a Service</h3> <p>Platforms like RapidAPI make it possible to <a href="https://rapidapi.com/guides/earn-a-passive-income-by-monetizing-apis-as-a-developer" rel="noopener nofollow" target="_blank">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="https://rapidapi.com/courses/build-and-sell-your-own-api" rel="noopener nofollow" target="_blank">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> <hr> <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="https://www.boss.dev/" rel="noopener nofollow" target="_blank">BOSS.dev</a> - Feature requests and bug fixes to complete, with bounties ranging from $30 to $1000.</li> </ul> <hr> <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="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository" rel="noopener nofollow" target="_blank">enable the Sponsor button</a> for your GitHub projects, by creating a <code class="prettyprint">.github/FUNDING.yml</code>. This works for a variety of platforms, as well as GitHub Sponsors </p> <ul> <li><a href="https://github.com/sponsors" rel="noopener nofollow" target="_blank">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="https://www.patreon.com/" rel="noopener nofollow" target="_blank">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="https://liberapay.com/" rel="noopener nofollow" target="_blank">LibrePay</a> - Aimed at those creating open source content</li> <li><a href="https://opencollective.com/" rel="noopener nofollow" target="_blank">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="https://steadyhq.com/en" rel="noopener nofollow" target="_blank">Steady</a></li> <li><a href="https://tidelift.com" rel="noopener nofollow" target="_blank">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="https://lfx.linuxfoundation.org/" rel="noopener nofollow" target="_blank">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> <hr> <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="https://ko-fi.com/" rel="noopener nofollow" target="_blank">Ko-fi</a></li> <li><a href="https://www.buymeacoffee.com/" rel="noopener nofollow" target="_blank">Buy Me a Coffee</a></li> <li><a href="https://en.tipeee.com/" rel="noopener nofollow" target="_blank">Tipeee</a></li> <li><a href="https://www.paypal.com/paypalme/" rel="noopener nofollow" target="_blank">PayPal Me</a></li> </ul> <p>Tip: Don't beg. Create something useful, and drop your Tip link at the bottom.</p> <hr> <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> <hr> <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="https://summerofcode.withgoogle.com/" rel="noopener nofollow" target="_blank">Summer of Code</a> - Run by Google, you'll receive a <a href="https://developers.google.com/open-source/gsoc/help/student-stipends" rel="noopener nofollow" target="_blank">contributor stipend</a> ranging from $750 to $6000 upon successful acceptance, the amount depends on your country and project size</li> <li><a href="https://codeheat.org/" rel="noopener nofollow" target="_blank">CodeHeat</a> - Run by FOSS Asia, 100 SGD every 2 weeks plus smaller prizes</li> <li><a href="https://www.hackerearth.com/challenges/hackathon/" rel="noopener nofollow" target="_blank">HackerEarth</a></li> <li><a href="https://www.hackathon.com/online" rel="noopener nofollow" target="_blank">Hackathon.com</a></li> <li><a href="https://devfolio.co/hackathons/upcoming" rel="noopener nofollow" target="_blank">Devfolio Hackathons</a></li> </ul> <blockquote> <p>When I was a student, I <a href="https://alicia.omg.lol/hackathons" rel="noopener nofollow" target="_blank">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> <hr> <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 class="prettyprint">npm fund</code>, and seeing a list of the packages you're using which are looking for funding. The <a href="https://docs.npmjs.com/cli/v6/commands/npm-fund" rel="noopener nofollow" target="_blank">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 class="prettyprint">funding</code> field in your package.json, and users will be able to support you more easily.</li> <li><a href="https://www.stackaid.us/" rel="noopener nofollow" target="_blank">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="https://github.com/sponsors/explore" rel="noopener nofollow" target="_blank">lets users give to their most-used dependencies</a> - although this is a manual process, and not automatic.</li> </ul> <hr> <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="https://hackerone.com/opportunities/all/search?ordering=Highest+bounties" rel="noopener nofollow" target="_blank">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="https://bug-bounties.as93.net" rel="noopener nofollow" target="_blank">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="https://www.hackerone.com/" rel="noopener nofollow" target="_blank">HackerOne</a> - Number 1 platform, most bounties and good protection and payout rate</li> <li><a href="https://immunefi.com/" rel="noopener nofollow" target="_blank">Immunefi</a> - Specifically for Web3</li> <li><a href="https://www.bugcrowd.com/bug-bounty-list/" rel="noopener nofollow" target="_blank">BugCrowd</a></li> <li><a href="https://www.intigriti.com/" rel="noopener nofollow" target="_blank">Intigriti</a></li> <li><a href="https://issuehunt.io/" rel="noopener nofollow" target="_blank">Issue Hunt</a></li> </ul> <hr> <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> <hr> <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="https://www.privjs.com/" rel="noopener nofollow" target="_blank">PrivJS</a> - Distribute premium versions of your Node packages</li> <li><a href="https://codecodeship.com/" rel="noopener nofollow" target="_blank">CodeShip</a> - Private registry, where users need to pay to use your package</li> </ul> <hr> <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="https://otechie.com/" rel="noopener nofollow" target="_blank">Otechie</a> which adds paid features + support via embedded an chat dialog. Tools like <a href="https://calendly.com/" rel="noopener nofollow" target="_blank">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="https://www.helpscout.com/" rel="noopener nofollow" target="_blank">HelpScout</a> may make this easier.</p> <hr> <h3>13. Documentation</h3> <ul> <li><a href="https://www.writethedocs.org/" rel="noopener nofollow" target="_blank">Write the Docs</a> is the go-to place for all things documentation.</li> <li><a href="https://developers.google.com/season-of-docs" rel="noopener nofollow" target="_blank">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="https://dev.to/juliafmorgado/get-paid-to-write-technical-articles-16cl" rel="noopener nofollow" target="_blank">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="https://www.scripted.com/" rel="noopener nofollow" target="_blank">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="https://github.com/Lissy93?tab=repositories" rel="noopener nofollow" target="_blank">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> <hr> <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="https://www.ethicalads.io/" rel="noopener nofollow" target="_blank">Ethical Ads</a></li> <li><a href="https://www.carbonads.net/open-source" rel="noopener nofollow" target="_blank">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> <hr> <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="https://indiemaker.co/" rel="noopener nofollow" target="_blank">IndieMaker</a> - Sell your entire project</li> <li><a href="https://www.piecex.com/" rel="noopener nofollow" target="_blank">PieceX</a> - Sell ready-to-go source code</li> <li><a href="https://www.codester.com/info/seller" rel="noopener nofollow" target="_blank">Codester</a> - Aimed at PHP and Wordpress</li> </ul> <hr> <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="https://gumroad.com/" rel="noopener nofollow" target="_blank">GumRoad</a> - Code, courses, posts, art, design, media (10% fee)</li> <li><a href="https://sell.appsumo.com/" rel="noopener nofollow" target="_blank">AppSumo</a> - Code, apps, extensions, courses, templates, etc</li> </ul> <hr> <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="https://leanpub.com/" rel="noopener nofollow" target="_blank">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="https://kdp.amazon.com/en_US/" rel="noopener nofollow" target="_blank">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="https://www.smashwords.com/" rel="noopener nofollow" target="_blank">SmashWords</a> and <a href="https://draft2digital.com/sw/" rel="noopener nofollow" target="_blank">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> <hr> <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="https://github.com/sponsors" rel="noopener nofollow" target="_blank">GitHub Sponsors</a> - Platform for individuals and organizations to financially support open source developers. Amount varies based on sponsorships.</li> <li><a href="https://summerofcode.withgoogle.com/" rel="noopener nofollow" target="_blank">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="https://www.mozilla.org/en-US/moss/" rel="noopener nofollow" target="_blank">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="https://www.linuxfoundation.org/" rel="noopener nofollow" target="_blank">The Linux Foundation Grants</a> - Offers various grants and fellowships for developers working on Linux Foundation projects.</li> <li><a href="https://numfocus.org/programs/small-development-grants" rel="noopener nofollow" target="_blank">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="https://www.apache.org/foundation/sponsorship.html" rel="noopener nofollow" target="_blank">Apache Software Foundation Sponsorship</a> - Financial support for Apache software projects, focusing on the Apache software ecosystem.</li> <li><a href="https://www.outreachy.org/" rel="noopener nofollow" target="_blank">Outreachy</a> - Provides three-month internships for underrepresented groups in technology, with stipends typically around $5,500.</li> <li><a href="https://knightfoundation.org/grants/" rel="noopener nofollow" target="_blank">Knight Foundation</a> - Offers grants for tech projects that promote quality journalism. Grant amounts vary widely based on project scope.</li> <li><a href="https://prototypefund.de/" rel="noopener nofollow" target="_blank">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="https://sloan.org/programs/digital-technology" rel="noopener nofollow" target="_blank">The Sloan Foundation</a> - Offers grants for open science community projects, especially those enhancing open source software in research.</li> <li><a href="https://chanzuckerberg.com/rfa/" rel="noopener nofollow" target="_blank">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="https://www.raspberrypi.org/grants/" rel="noopener nofollow" target="_blank">Raspberry Pi Foundation</a> - Provides grants for educational projects involving Raspberry Pi and computing education.</li> <li><a href="https://gitcoin.co/" rel="noopener nofollow" target="_blank">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="https://nlnet.nl/foundation/" rel="noopener nofollow" target="_blank">NLnet Foundation</a> - Supports projects in Internet technology and network research. Grant amounts vary.</li> <li><a href="https://www.opentech.fund/" rel="noopener nofollow" target="_blank">Open Technology Fund</a> - Supports projects developing open technologies that promote human rights and open societies. Funding varies.</li> </ul> <hr> <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="https://www.eventbrite.co.uk/" rel="noopener nofollow" target="_blank">Eventbrite</a>, <a href="https://meetup.com/" rel="noopener nofollow" target="_blank">Meetup</a>, or <a href="https://ticketmaster.com" rel="noopener nofollow" target="_blank">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="https://zoom.us/" rel="noopener nofollow" target="_blank">Zoom</a>, <a href="https://www.webex.com/" rel="noopener nofollow" target="_blank">WebEx</a>, or <a href="https://hopin.com/" rel="noopener nofollow" target="_blank">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> <hr> <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="https://minds.testable.org/" rel="noopener nofollow" target="_blank">Testable Minds</a>, <a href="https://app.respondent.io/signup" rel="noopener nofollow" target="_blank">Respondent</a></p> <hr> <h3>21. Creating Courses</h3> <ul> <li><a href="https://www.skillshare.com/teach" rel="noopener nofollow" target="_blank">Skillshare</a> - Offers payment based on the number of minutes watched in your classes, along with referral bonuses.</li> <li><a href="https://www.coursera.org/for-universities" rel="noopener nofollow" target="_blank">Coursera</a> - Partner with institutions to offer courses; payments are typically based on revenue-sharing agreements.</li> <li><a href="https://www.linkedin.com/learning/instructors" rel="noopener nofollow" target="_blank">LinkedIn Learning</a> - Instructors can create courses for professionals; compensation details are arranged with LinkedIn.</li> <li><a href="https://www.thinkific.com/" rel="noopener nofollow" target="_blank">Thinkific</a> - Provides tools to create, market, and sell online courses, with various pricing plans including a free option.</li> <li><a href="https://kajabi.com/" rel="noopener nofollow" target="_blank">Kajabi</a> - All-in-one platform for online courses, marketing, payments, and website building.</li> <li><a href="https://www.podia.com/" rel="noopener nofollow" target="_blank">Podia</a> - Offers a platform for hosting courses, webinars, and digital downloads with direct sales to your audience.</li> <li><a href="https://www.pluralsight.com/teach" rel="noopener nofollow" target="_blank">Pluralsight</a> - Focused on tech and creative courses; pays instructors through royalties based on the popularity of their courses.</li> <li><a href="https://www.masterclass.com/teach" rel="noopener nofollow" target="_blank">MasterClass</a> - High-quality, celebrity-led courses; instructors are typically established experts or celebrities in their field.</li> <li><a href="https://uteach.io/" rel="noopener nofollow" target="_blank">uTeach</a></li> <li><a href="https://www.newline.co/" rel="noopener nofollow" target="_blank">NewLine</a></li> </ul> <hr> <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="https://substack.com" rel="noopener nofollow" target="_blank">Substack</a></li> <li><a href="https://buttondown.email/" rel="noopener nofollow" target="_blank">ButtonDown</a></li> <li><a href="https://convertkit.com/" rel="noopener nofollow" target="_blank">ConvertKit</a></li> <li><a href="https://steadyhq.com" rel="noopener nofollow" target="_blank">Steady</a></li> <li><a href="https://ghost.org/" rel="noopener nofollow" target="_blank">Ghost</a> </li> </ul> <hr> <h3>23. Member-only Sites</h3> <ul> <li><a href="https://www.memberspace.com/" rel="noopener nofollow" target="_blank">MemberSpace</a> - Enables you to paywall certain parts of your website, for members-only</li> <li><a href="https://www.patreon.com/" rel="noopener nofollow" target="_blank">Patreon</a> - Popular for setting up membership tiers with exclusive content and perks.</li> <li><a href="https://substack.com/" rel="noopener nofollow" target="_blank">Substack</a> - Ideal for newsletters; offers the ability to have paid subscribers for exclusive content.</li> <li><a href="https://ghost.org/" rel="noopener nofollow" target="_blank">Ghost</a> - A professional publishing platform with built-in membership and subscription features.</li> <li><a href="https://www.podia.com/" rel="noopener nofollow" target="_blank">Podia</a> - Enables the sale of memberships, online courses, and digital downloads.</li> <li>WordPress with <a href="https://memberpress.com/" rel="noopener nofollow" target="_blank">MemberPress Plugin</a> - A plugin for WP users to create membership sites.</li> <li><a href="https://www.wildapricot.com/" rel="noopener nofollow" target="_blank">Wild Apricot</a> - Membership management software that integrates with your website.</li> <li><a href="https://kajabi.com/" rel="noopener nofollow" target="_blank">Kajabi</a> - Offers tools for creating online courses, membership sites, and more, with a focus on marketing.</li> <li><a href="https://www.mightynetworks.com/" rel="noopener nofollow" target="_blank">Mighty Networks</a> - Build a community with memberships, subscriptions, and courses.</li> </ul> <hr> <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="https://www.linode.com/lp/write-for-linode/" rel="noopener nofollow" target="_blank">Linode</a></li> <li><a href="https://blog.logrocket.com/become-a-logrocket-guest-author/" rel="noopener nofollow" target="_blank">Log Rocket</a></li> <li><a href="https://www.smashingmagazine.com/contact/?Becoming%20an%20Author/Reviewer%20(Autoresponder)" rel="noopener nofollow" target="_blank">Smashing Magazine</a></li> <li><a href="https://auth0.com/apollo-program" rel="noopener nofollow" target="_blank">Auth0</a></li> <li><a href="https://css-tricks.com/guest-writing-for-css-tricks/" rel="noopener nofollow" target="_blank">CSS Tricks</a></li> <li><a href="https://www.delftstack.com/write-for-us/" rel="noopener nofollow" target="_blank">DelftStack</a></li> <li><a href="https://www.digitalocean.com/community/pages/write-for-digitalocean" rel="noopener nofollow" target="_blank">DigitialOcean</a></li> <li><a href="https://infatica.io/contribute/" rel="noopener nofollow" target="_blank">Infatica</a></li> <li><a href="https://blog.honeypot.io/write-for-honeypot/" rel="noopener nofollow" target="_blank">HoneyPot</a></li> <li><a href="https://premiumcoding.com/write-for-us-premiumcoding/" rel="noopener nofollow" target="_blank">Premium Coding</a></li> <li><a href="https://reflectoring.io/contribute/become-an-author/" rel="noopener nofollow" target="_blank">Reflectoring</a></li> <li><a href="https://strapi.io/write-for-the-community" rel="noopener nofollow" target="_blank">Strapi</a></li> <li><a href="https://www.authoritymedia.com/jobs" rel="noopener nofollow" target="_blank">Android Authority</a></li> <li><a href="https://www.sitepoint.com/write-for-us/" rel="noopener nofollow" target="_blank">SitePoint</a></li> <li><a href="https://www.tutorialspoint.com/about/tutorials_writing.htm" rel="noopener nofollow" target="_blank">TutorialsPoint</a></li> <li><a href="https://realpython.com/jobs/tutorial-writer/" rel="noopener nofollow" target="_blank">Real Python</a></li> <li><a href="https://www.dart-creations.com/about-us/write-for-us.html" rel="noopener nofollow" target="_blank">Dart Creations</a></li> </ul> <p>Dmytro Spilka compiled a great list of 300+ <a href="https://solvid.co.uk/180-websites-that-accept-guest-posts/" rel="noopener nofollow" target="_blank">sites accepting guest posts</a>. Another great list was put together <a href="https://dev.to/juliafmorgado/get-paid-to-write-technical-articles-16cl" rel="noopener nofollow" target="_blank">here by Julia here on Dev.to</a>.</p> <hr> <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> <hr> <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="https://mentorcruise.com/" rel="noopener nofollow" target="_blank">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="https://www.codementor.io/" rel="noopener nofollow" target="_blank">CodeMentor</a> - Better for short-term, charged hourly-rate, great for tackling specific problems (earn $60-$300/hour)</li> </ul> <hr> <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="https://www.superprof.co.uk/" rel="noopener nofollow" target="_blank">Super Prof</a> - List your services, world-wide ($30-300/hour)</li> <li><a href="https://www.theprofs.co.uk/become-a-private-tutor/" rel="noopener nofollow" target="_blank">The Profs</a> - Verified tutors (income unknown)</li> <li><a href="https://www.mytutor.co.uk/" rel="noopener nofollow" target="_blank">My Tutor</a> - UK only, (ยฃ22-ยฃ55/hour)</li> <li><a href="https://www.tutor.com/" rel="noopener nofollow" target="_blank">Tutor.com</a> - US-based high-school tuition ($75-$100/hour)</li> </ul> <hr> <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> <hr> <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> <hr> <h3>30. Streaming</h3> <p>A rapidly growing niche is dev streams, don't expect to instantly <a href="https://twitch.pages.dev/" rel="noopener nofollow" target="_blank">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="https://dev.to/nickytonline/getting-started-with-streaming-on-twitch-4im7" rel="noopener nofollow" target="_blank">Getting Started with Dev Streaming</a>.</p> <hr> <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="https://stripe.com/docs/payments" rel="noopener nofollow" target="_blank">Stripe</a> make accepting payments and adding subscription features to your app surprisingly easy. </p> <hr> <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> <hr> <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="https://chrome.google.com/webstore/detail/wa-web-plus-by-elbruz-tec/ekcgkejcjdcmonfpmnljobemcbpnkamh" rel="noopener nofollow" target="_blank">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="https://chrome.google.com/webstore/detail/elevate-for-strava/dhiaggccakkgdfcadnklkbljcgicpckn" rel="noopener nofollow" target="_blank">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> <hr> <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> <hr> <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> <hr> <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, 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, or need to be re-registered by the original owner </li> <li>Consider registering names of popular websites but with a different extension</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> <hr> <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="https://www.trymyui.com/" rel="noopener nofollow" target="_blank">Try My UI</a> - Averages on $10 per website or app test</li> <li><a href="https://www.userlytics.com/user-experience-research/paid-ux-testing/" rel="noopener nofollow" target="_blank">Userlytics</a> - Earn between $5 and $50 depending on complexity and length of testing session</li> <li><a href="https://www.usertesting.com/get-paid-to-test" rel="noopener nofollow" target="_blank">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="https://www.testingtime.com/en/become-a-paid-testuser/" rel="noopener nofollow" target="_blank">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="https://www.intellizoom.com/" rel="noopener nofollow" target="_blank">IntelliZoom</a> - Earn between $2 and $10 per 10 minute study. Paid via PayPal with a 3-5 day delay</li> </ul> <hr> <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="https://www.mturk.com/" rel="noopener nofollow" target="_blank">Amazon Mechanical Turk</a> - Crowd sourcing marketplace for outsourcing virtual micro-tasks </li> <li><a href="https://sequence.work/contributors/" rel="noopener nofollow" target="_blank">Sequence Works</a> - Image annotation, data labeling and clasification</li> <li><a href="https://en.appjobber.com/" rel="noopener nofollow" target="_blank">App Jobber</a> - Market research, go to the shops and take photos of specific product placements</li> <li><a href="https://www.gigwalk.com/gigwalkers/" rel="noopener nofollow" target="_blank">GigWalk</a> - App-based micro-tasks on the go</li> <li>Take a look at <a href="https://gigworker.com/" rel="noopener nofollow" target="_blank">GigWorker.com</a> for more micro-tasking and gig-based jobs</li> </ul> <hr> <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="https://www.swagbucks.com/" rel="noopener nofollow" target="_blank">Swagbucks</a>, <a href="https://20cogs.co.uk/" rel="noopener nofollow" target="_blank">20Cogs</a>, <a href="https://www.testingtime.com/en/become-a-paid-testuser" rel="noopener nofollow" target="_blank">TestingTime</a> are some prominent ones.</p> <hr> <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="https://www.storj.io/node" rel="noopener nofollow" target="_blank">Storj</a>: Run a Storj node, for decentralized cloud computing</li> <li><a href="https://network3.io/" rel="noopener nofollow" target="_blank">Network3</a>: AIoT layer 2 for training and validating models</li> <li><a href="https://runonflux.io/" rel="noopener nofollow" target="_blank">Flux</a>: Decentralized infra</li> <li><a href="https://mystnodes.com/" rel="noopener nofollow" target="_blank">Mysterium</a>: P2P VPN node</li> <li><p><a href="https://www.koii.network/node" rel="noopener nofollow" target="_blank">Koii</a>: Distributed cloud</p></li> <li><p><a href="https://www.helium.com/mine" rel="noopener nofollow" target="_blank">Helium</a>: Provide wireless connectivity for long-range IoT devices</p></li> <li><p><a href="https://filecoin.io/" rel="noopener nofollow" target="_blank">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="https://sia.tech/host" rel="noopener nofollow" target="_blank">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="https://wiki.crust.network/docs/en/nodeOverview" rel="noopener nofollow" target="_blank">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="https://www.arweave.org/" rel="noopener nofollow" target="_blank">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="https://docs.btfs.io/v2.0/docs/install-run-btfs20-node" rel="noopener nofollow" target="_blank">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="https://holo.host/" rel="noopener nofollow" target="_blank">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> <hr> <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> <hr> <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="https://notes.aliciasykes.com/p/3Ia4JzPw43">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> <hr> <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="https://supermetrics.com/" rel="noopener nofollow" target="_blank">Supermetrics</a>: Marketing reporting, analytics, data integration, 20% recurring commission.</li> <li><a href="https://keap.com/" rel="noopener nofollow" target="_blank">Keap</a>: CRM, sales and marketing automation, 20โ€“30% recurring commissions.</li> <li><a href="https://www.klaviyo.com/" rel="noopener nofollow" target="_blank">Klaviyo</a>: Email and SMS marketing, 5โ€“15% one-time payouts, 10โ€“20% revenue shares.</li> <li><a href="https://www.drift.com/" rel="noopener nofollow" target="_blank">Drift</a>: Live chat software, 20% revenue share.</li> <li><a href="https://www.activecampaign.com/" rel="noopener nofollow" target="_blank">ActiveCampaign</a>: Email marketing, CRM, 20โ€“30% commission or discount model.</li> <li><a href="https://www.hubspot.com/" rel="noopener nofollow" target="_blank">HubSpot</a>: CRM, inbound marketing, sales, 20% revenue share.</li> <li><a href="https://www.gorgias.com/" rel="noopener nofollow" target="_blank">Gorgias</a>: Ecommerce helpdesk, 20% revenue share.</li> <li><a href="https://www.shopify.com/" rel="noopener nofollow" target="_blank">Shopify</a>: E-commerce platform, 20% commission, 10% for Shopify Plus.</li> <li><a href="https://partners.livechat.com/" rel="noopener nofollow" target="_blank">LiveChat</a>: Customer service platform, live chat, 20% commission.</li> <li><a href="https://www.getresponse.com/" rel="noopener nofollow" target="_blank">GetResponse</a>: Email marketing, online campaign management, 35% discount on sub-accounts, 35% recurring commission.</li> </ul> <hr> <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="https://flucamp.com/" rel="noopener nofollow" target="_blank">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="https://bepartofresearch.nihr.ac.uk/" rel="noopener nofollow" target="_blank">NIHR Be Part of Research</a> website</p> <hr> <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="https://www.fiverr.com/" rel="noopener nofollow" target="_blank">Fiverr</a>: Known for its diverse marketplace, Fiverr is great for developers who are just starting out in freelancing</li> <li><a href="https://www.upwork.com/work" rel="noopener nofollow" target="_blank">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="https://www.peopleperhour.com/" rel="noopener nofollow" target="_blank">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> <hr> <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> <hr> <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="https://weworkremotely.com/" rel="noopener nofollow" target="_blank">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> <hr> <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> <hr> <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> <hr> <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> <hr> <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="https://aliciasykes.com" rel="noopener nofollow" target="_blank">Alicia</a> ๐Ÿฅฐ</small></th> <th><a href="https://github.com/Lissy93"><img src="https://img.shields.io/badge/-Lissy93-3a3a3a?style=flat&amp;logo=GitHub&amp;logoColor=white" alt="Follow Lissy93 on GitHub"></a><a href="https://mastodon.social/@lissy93"><img src="https://img.shields.io/badge/-@Lissy93-6364ff?style=flat&amp;logo=mastodon&amp;logoColor=white" alt="Mastodon"></a> <a href="https://twitter.com/Lissy_Sykes"><img src="https://img.shields.io/badge/-@Lissy_Sykes-00acee?style=flat&amp;logo=x&amp;logoColor=white" alt="Follow Lissy_Sykes on X"></a></th> </tr> </thead><tbody> </tbody></table> <style> .thumb{ border-radius: 6px; width: 330px; float: right; clear: right; margin: 0 1rem; margin-top: 0 !important; } </style> </p> SvelteKit 1.0 - Building a Blog that fetches from RSS ๐Ÿฆ„ Alicia's Notes ๐Ÿš€ Mon, 20 Feb 2023 22:10:08 +0000 https://notes.aliciasykes.com/42764/sveltekit-1-0-building-a-blog-that-fetches-from-rss https://notes.aliciasykes.com/42764/sveltekit-1-0-building-a-blog-that-fetches-from-rss <p><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><a href="#intro-to-sveltekit">Intro to SvelteKit</a></li> <li><a href="#what-were-going-to-build">What we're going to build</a></li> <li><a href="#lets-get-started">Let's get Started!</a> <ul> <li><a href="#step-0-prerequisites">Step #0 - Prerequisites</a></li> <li><a href="#step-1-project-setup">Step #1 - Project Setup</a></li> <li><a href="#step-2-finish-setup">Step #2 - Finish Setup</a></li> <li><a href="#step-3-components">Step #3 - Components</a></li> <li><a href="#step-4-creating-a-route">Step #4 - Creating a Route</a></li> <li><a href="#step-5-special-routes">Step #5 - Special Routes</a></li> <li><a href="#step-6-fetching-data">Step #6 - Fetching Data</a></li> <li><a href="#step-7-render-results">Step #7 - Render Results</a></li> <li><a href="#step-8-serverside">Step #8 - Server-Side</a></li> <li><a href="#step-9-build-the-post-page">Step #9 - The Post Route</a></li> <li><a href="#step-10-deploy">Step #10 - Deploy!</a></li> </ul></li> <li><a href="#the-project">The Final Project</a> <ul> <li><a href="#blog-page-fetched-from-rss">Blog Page (fetched from RSS)</a></li> <li><a href="#projects-page-fetched-from-github">Projects Page (fetched from GitHub)</a></li> <li><a href="#social-media-links-stats-fetched-from-apis">Social Media Links (stats fetched from APIs)</a></li> </ul></li> </ul> <hr> <h2>Intro to SvelteKit</h2> <p>Svelte has pretty quickly taken the top spot for most loved web framework <sup><a href="https://insights.stackoverflow.com/survey/2021#web-frameworks" rel="noopener nofollow" target="_blank">[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> <hr> <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 class="prettyprint">https://dev.to/feed/[your-username]</code>).</p> <p>Here's a live demo: <strong><a href="https://devolio.netlify.app/blog" rel="noopener nofollow" target="_blank">devolio.netlify.app/blog</a></strong></p> <p>And here's the full source: <strong><a href="https://github.com/Lissy93/devolio" rel="noopener nofollow" target="_blank">@Lissy93/Devolio</a></strong></p> <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> <hr> <h2>Let's get Started!</h2> <h3>Step #0 - Prerequisites</h3> <p>You'll need <a href="https://nodejs.org/en/" rel="noopener nofollow" target="_blank">Node.js</a> (LTS or latest) installed. It's also recommended to have <a href="https://git-scm.com/" rel="noopener nofollow" target="_blank">Git</a>, a code editor (like <a href="https://code.visualstudio.com/" rel="noopener nofollow" target="_blank">VS Code</a>), and access to a terminal. Alternatively, you can use a cloud service, like <a href="https://github.com/codespaces/" rel="noopener nofollow" target="_blank">Codespaces</a>.</p> <hr> <h3>Step #1 - Project Setup</h3> <p>We can easily create our project by running:</p> <div class="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 class="prettyprint">cd dev-blog</code>), and install dependencies (with <code class="prettyprint">npm install</code>).</p> <p>To launch the app, with live reload enabled, run:</p> <div class="highlight"><pre class="highlight shell"><code>npm run dev </code></pre></div> <p>Then open <a href="http://localhost:5173/" rel="noopener nofollow" target="_blank">localhost:5173</a></p> <hr> <h3>Step #2 - Finish Setup</h3> <p>To avoid the typical ugly <code class="prettyprint">../../../</code> in import statements, we're going to add an alias within our <code class="prettyprint">svelte.config.js</code> file.</p> <p>This can be done by just adding <code class="prettyprint">alias</code> object under <code class="prettyprint">config.sveltekit</code>. Here's an example, where I'll map <code class="prettyprint">./src/</code> to <code class="prettyprint">$src</code>.</p> <div class="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="nx">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="nx">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 class="prettyprint">.prettierrc</code>, <code class="prettyprint">.eslintrc.cjsprett</code> and <code class="prettyprint">tsconfig.json</code> respectively. Run <code class="prettyprint">npm run format</code> to apply Prettier rules, and <code class="prettyprint">npm run check</code> to verify.</p> <hr> <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:</p> <div class="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.</p> <div class="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 class="prettyprint">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 class="prettyprint">{}</code></li> <li>If we need attributes to be reactive, we use the <code class="prettyprint">$: variabeName</code> syntax</li> <li>We can specify what type of semantic element is used, with <code class="prettyprint">&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> <hr> <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 class="prettyprint">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 class="prettyprint">routes</code> directory. All you need is a directory named after the route name, containing a Svelte file names <code class="prettyprint">+page.svelte</code>. So let's create that route, with: <code class="prettyprint">touch src/routes/blog/+page.svelte</code> - the contents of this file will just be a normal Svelte component, like what we saw above.</p> <div class="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 class="prettyprint">[slug]</code> that the user will land on when they visit <code class="prettyprint">example.com/blog/example-post</code></p> <hr> <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 class="prettyprint">+layout.svelte</code>, and since we want this on all pages, we'll put it into <code class="prettyprint">src/routes</code>.</p> <p>Populate this with something like:</p> <div class="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 class="prettyprint">&lt;slot /&gt;</code> is placed</li> <li>We're adding a page transition animation, by importing <code class="prettyprint">svelte/transition</code> and setting <code class="prettyprint">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 class="prettyprint">page</code> object (imported from <code class="prettyprint">$app/stores</code>) - precede it with a <code class="prettyprint">$</code> to keep the value updated</li> <li>If we need to set any tags within the <code class="prettyprint">&lt;head&gt;</code> we can use <code class="prettyprint">&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 class="prettyprint">:global(body)</code> (or whatever selector you're targeting) - but use this sparingly!</li> </ul> <p>Another special route within SvelteKit, is <code class="prettyprint">+error.svelte</code>, which will be rendered in place of the current route if an error is thrown within the <code class="prettyprint">load()</code> function of any route.</p> <p>Again, let's create that file in <code class="prettyprint">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 class="prettyprint">$page</code> object)</p> <div class="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:</p> <div class="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> <hr> <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 class="prettyprint">+page.js</code> / <code class="prettyprint">+page.ts</code> file (alongside the <code class="prettyprint">+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="https://www.npmjs.com/package/fast-xml-parser" rel="noopener nofollow" target="_blank">fast-xml-parser</a> to parse the XML response, into JSON.</p> <p>The following script simply fetches and parses feeds from a given XML RSS feed.</p> <div class="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="nx">XMLParser</span><span class="p">();</span> <span class="k">return</span> <span class="nx">parser</span><span class="p">.</span><span class="nx">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="nx">fetch</span><span class="p">(</span><span class="nx">RSS_URL</span><span class="p">)</span> <span class="p">.</span><span class="nx">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="nx">text</span><span class="p">())</span> <span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">rawXml</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">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> <hr> <h3>Step #7 - Render Results</h3> <p>Rendering the results from the returned data is really easy. In the <code class="prettyprint">blog/+page.svelte</code> component (next to the <code class="prettyprint">+page.ts</code> file), simply include <code class="prettyprint">export let data</code> - this will be the result returned by our fetch function. We can now reference this data in the markup.</p> <div class="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 class="prettyprint">{#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="https://svelte.dev/docs#template-syntax" rel="noopener nofollow" target="_blank">template syntax</a>. There are other properties also, like <code class="prettyprint">{#if expression}...{/if}</code> for conditionals, or <code class="prettyprint">{#await expression}...{:then name}...{/await}</code> for promises, as well as a whole host of other useful features.</p> <hr> <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 class="prettyprint">+page.ts</code> to <code class="prettyprint">+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 class="prettyprint">browser</code> from <code class="prettyprint">$app/environment</code>, then using <code class="prettyprint">if (browser) { /* Can access browser API here */ }</code></p> <hr> <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 class="prettyprint">@html</code> directive, then styling it.</p> <div class="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> <hr> <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 class="prettyprint">npm i --save-dev @sveltejs/adapter-netlify</code></li> </ul></li> <li>Import said adaptor in your <code class="prettyprint">svelte.config.js</code> file <ul> <li>E.g. <code class="prettyprint">import netlifyAdapter from '@sveltejs/adapter-netlify';</code></li> </ul></li> <li>Initiate the adaptor, within the config object, under <code class="prettyprint">kit</code> <ul> <li>kit: <code class="prettyprint">{ 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 class="prettyprint">@sveltejs/adapter-node</code>. Repeat the process above, then run <code class="prettyprint">yarn build</code>, and start the node server by running <code class="prettyprint">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:</p> <div class="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="nx">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="nx">all</span><span class="p">(</span><span class="nx">adapters</span><span class="p">.</span><span class="nx">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="nx">resolve</span><span class="p">(</span><span class="nx">item</span><span class="p">).</span><span class="nx">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="nx">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="nx">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="nx">multiAdapter</span><span class="p">([</span><span class="nx">autoAdapter</span><span class="p">(),</span> <span class="nx">netlifyAdapter</span><span class="p">(),</span> <span class="nx">vercelAdapter</span><span class="p">(),</span> <span class="nx">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="https://github.com/Lissy93/devolio/blob/master/Dockerfile" rel="noopener nofollow" target="_blank">Dockerfile</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="https://hub.docker.com/r/lissy93/devolio" rel="noopener nofollow" target="_blank">lissy93/devolio</a>), so you should be able to use it with <code class="prettyprint">docker run -p 3000:80 lissy93/devolio</code> - or use the <a href="https://github.com/Lissy93/devolio/blob/master/docker-compose.yml" rel="noopener nofollow" target="_blank">docker-compose.yml</a> as an template for your own container.</p> <hr> <h2>The Project</h2> <p>I've had to skip over a few details for the sake of brevity, but all <a href="https://github.com/Lissy93/devolio" rel="noopener nofollow" target="_blank">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="https://github.com/Lissy93/devolio/blob/master/src/store/BlogStore.ts" rel="noopener nofollow" target="_blank">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="https://github.com/Lissy93/devolio/blob/master/src/store/Language.ts" rel="noopener nofollow" target="_blank">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><img src="https://i.ibb.co/XVC9YZy/blog-page-gif.gif" alt="Blog Page"></p> <h5>Projects Page (fetched from GitHub)</h5> <p><img src="https://i.ibb.co/nmwLZTr/projects-page.gif" alt="Projects Page"></p> <h5>Social Media Links (stats fetched from APIs)</h5> <p><img src="https://i.ibb.co/xSvJRbZ/social-previews.gif" alt="Social Media Links"></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="https://github.com/Lissy93/devolio" rel="noopener nofollow" target="_blank">here</a> (<code class="prettyprint">MIT</code>) on GitHub, and I'll drop you a mention in the credits if you're able to submit a PR!</p> <hr> <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> <table><thead> <tr> <th><small>If you like this kind of stuff</small>,<br><small>consider following for more :)</small></th> <th><a href="https://github.com/Lissy93"><img src="https://img.shields.io/badge/-Lissy93-3a3a3a?style=flat&amp;logo=GitHub&amp;logoColor=white" alt="Follow Lissy93 on GitHub"></a><a href="https://twitter.com/Lissy_Sykes"><img src="https://img.shields.io/badge/-@Lissy_Sykes-00acee?style=flat&amp;logo=Twitter&amp;logoColor=white" alt="Follow Lissy_Sykes on Twitter"></a></th> </tr> </thead><tbody> </tbody></table> </p> 20 Amazing Collections for Self-Taught Developers ๐ŸŽ“ Alicia's Notes ๐Ÿš€ Fri, 27 Jan 2023 17:45:35 +0000 https://notes.aliciasykes.com/42310/20-amazing-collections-for-self-taught-developers https://notes.aliciasykes.com/42310/20-amazing-collections-for-self-taught-developers <p><blockquote> <p><em>A collection of the best free developer resources, from GitHub and beyond</em></p> </blockquote> <h3>Developer Curriculum</h3> <ul> <li><a href="https://github.com/kamranahmedse/developer-roadmap" rel="noopener nofollow" target="_blank">Developer Roadmaps</a> - Complete roadmaps for developers </li> <li><a href="https://www.freecodecamp.org/learn/" rel="noopener nofollow" target="_blank">FreeCodeCamp Curriculum</a> - Full and free learning curriculum to become a developer</li> </ul> <h3>Comp Sci University</h3> <ul> <li><a href="https://github.com/ossu/computer-science#curriculum" rel="noopener nofollow" target="_blank">Open Source Uni</a> - Collection of everything you need for a Comp Sci degree </li> <li><a href="https://github.com/jwasham/coding-interview-university#lets-get-started" rel="noopener nofollow" target="_blank">CompSci Study Plan</a> - Full study plan for computer science </li> </ul> <h3>Learn by Doing</h3> <ul> <li><a href="https://github.com/codecrafters-io/build-your-own-x" rel="noopener nofollow" target="_blank">Build your own X</a> - Tutorials to recreate common technologies<br></li> <li><a href="https://github.com/practical-tutorials/project-based-learning" rel="noopener nofollow" target="_blank">Project Tutorials</a> - Tutorials for project-based learning </li> <li><a href="https://github.com/microsoft/Web-Dev-For-Beginners" rel="noopener nofollow" target="_blank">Web Dev projects</a> - Projects and tutorials to take you from zero to hero </li> <li><a href="https://github.com/florinpop17/app-ideas" rel="noopener nofollow" target="_blank">App Ideas</a> - Big list of app ideas you can build to learn </li> <li><a href="https://github.com/public-apis/public-apis" rel="noopener nofollow" target="_blank">APIs for Projects</a> - Public APIs you can build projects around </li> <li><a href="https://github.com/awesomedata/awesome-public-datasets" rel="noopener nofollow" target="_blank">Public Data Sets</a> - Public datasets you can build projects around </li> </ul> <h3>Algorithms</h3> <ul> <li><a href="https://github.com/trekhleb/javascript-algorithms" rel="noopener nofollow" target="_blank">JavaScript</a> - Common algorithms + data structures, implemented in JS </li> <li><a href="https://github.com/TheAlgorithms/Python/blob/master/DIRECTORY.md" rel="noopener nofollow" target="_blank">Python</a> - Common algorithms + data structures, implemented in Python </li> <li><a href="https://github.com/iluwatar/java-design-patterns" rel="noopener nofollow" target="_blank">Java Design Patterns</a> - Common design patterns + data structures, implemented in Java</li> <li><a href="https://github.com/labuladong/fucking-algorithm/tree/english" rel="noopener nofollow" target="_blank">Cracking LeetCode</a> - Resources for learning algorithms for LeetCode</li> </ul> <h3>Content</h3> <ul> <li><a href="https://github.com/EbookFoundation/free-programming-books/blob/main/books/free-programming-books-subjects.md" rel="noopener nofollow" target="_blank">Free Programming Books</a> - Massive list of free programming books </li> <li><a href="https://github.com/papers-we-love/papers-we-love" rel="noopener nofollow" target="_blank">Papers</a> - Collection of interesting programming research papers </li> <li><a href="https://github.com/Developer-Y/cs-video-courses" rel="noopener nofollow" target="_blank">CS Video Courses</a> - Compiled list of free Comp Sci lecture videos </li> <li><a href="https://github.com/mtdvio/every-programmer-should-know" rel="noopener nofollow" target="_blank">Things</a> - Things every programmer should know </li> <li><a href="https://github.com/ripienaar/free-for-dev" rel="noopener nofollow" target="_blank">Free Services</a> - List of SaaS websites you can use for free </li> </ul> <h3>Misc</h3> <ul> <li><a href="https://github.com/donnemartin/system-design-primer" rel="noopener nofollow" target="_blank">System Design Primer</a> - Introduction to system designs </li> <li><a href="https://www.techinterviewhandbook.org/" rel="noopener nofollow" target="_blank">Tech Interview Handbook</a> - Full guide to technical interviews </li> <li><a href="https://github.com/sindresorhus/awesome/#contents" rel="noopener nofollow" target="_blank">Awesome</a> - A list of awesome lists (your gateway to endless awesomeness!)</li> </ul> </p> CLI tools you can't live without ๐Ÿ”ง Alicia's Notes ๐Ÿš€ Thu, 19 Jan 2023 17:42:01 +0000 https://notes.aliciasykes.com/41983/cli-tools-you-can-t-live-without https://notes.aliciasykes.com/41983/cli-tools-you-can-t-live-without <p><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> <h2>Utils</h2> <h3><a href="https://github.com/nvbn/thefuck" rel="noopener nofollow" target="_blank">thefuck</a> - Auto-correct miss-typed commands</h3> <blockquote> <p><code class="prettyprint">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 class="prettyprint">fuck</code> and it'll auto-correct it. Use up/down to choose a correction, or just run <code class="prettyprint">fuck --yeah</code> to just execute the most likely immediately.</p> </blockquote> <p><img src="https://i.ibb.co/J55hWKX/thefuck.gif" alt="the-fuck-example-usage"></p> <p><a href="https://github.com/nvbn/thefuck"><img src="https://img.shields.io/github/stars/nvbn/thefuck?color=232323&amp;label=thefuck&amp;logo=github&amp;labelColor=232323" alt="View thefuck on GitHub"></a><a href="https://github.com/nvbn"><img src="https://img.shields.io/badge/nvbn-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author nvbn"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install thefuck # Arch Linux sudo pacman -S thefuck # FreeBSD pkg install thefuck ``` </details> <hr> <h3><a href="https://github.com/ajeetdsouza/zoxide" rel="noopener nofollow" target="_blank">zoxide</a> - Easy navigation <em>(better cd)</em></h3> <blockquote> <p><code class="prettyprint">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 class="prettyprint">fzf</code> so you can live-filter directory results</p> </blockquote> <p><img src="https://i.ibb.co/6Z960jq/zoxide.gif" alt="zoxide-example-usage"></p> <p><a href="https://github.com/ajeetdsouza/zoxide"><img src="https://img.shields.io/github/stars/ajeetdsouza/zoxide?color=232323&amp;label=zoxide&amp;logo=github&amp;labelColor=232323" alt="View zoxide on GitHub"></a><a href="https://github.com/ajeetdsouza"><img src="https://img.shields.io/badge/ajeetdsouza-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author ajeetdsouza"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install zoxide # Arch Linux sudo pacman -S zoxide # Debian / Ubuntu sudo apt install zoxide # FreeBSD pkg install zoxide # Other (via Rust Creates) cargo install zoxide --locked ``` </details> <hr> <h3><a href="https://github.com/tldr-pages/tldr" rel="noopener nofollow" target="_blank">tldr</a> - Community-maintained docs <em>(better <code class="prettyprint">man</code>)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/jTW9knx/tlfr.gif" alt="tldr-example-usage"></p> <p><a href="https://github.com/tldr-pages/tldr"><img src="https://img.shields.io/github/stars/tldr-pages/tldr?color=232323&amp;label=tldr&amp;logo=github&amp;labelColor=232323" alt="View tldr on GitHub"></a><a href="https://github.com/tldr-pages"><img src="https://img.shields.io/badge/tldr-pages-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author tldr-pages"></a> </p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install tldr # Other (via NPM) npm install -g tldr ``` </details> <hr> <h3><a href="https://github.com/boyter/scc" rel="noopener nofollow" target="_blank">scc</a> - Count lines of code <em>(better <code class="prettyprint">cloc</code>)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/NygHWXt/scc.png" alt="scc-example-usage"></p> <p><a href="https://github.com/boyter/scc"><img src="https://img.shields.io/github/stars/boyter/scc?color=232323&amp;label=scc&amp;logo=github&amp;labelColor=232323" alt="View scc on GitHub"></a><a href="https://github.com/boyter"><img src="https://img.shields.io/badge/boyter-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author boyter"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install scc # Other (via go) go install github.com/boyter/scc/v3@latest ``` </details> <hr> <h3><a href="https://github.com/ogham/exa" rel="noopener nofollow" target="_blank">exa</a> - Listing Files <em>(better <code class="prettyprint">ls</code>)</em></h3> <blockquote> <p><code class="prettyprint">exa</code> is a modern Rust-based replacement for the <code class="prettyprint">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><img src="https://i.ibb.co/cTs0wQ5/exa.png" alt="exa-example-usage"></p> <p><a href="https://github.com/ogham/exa"><img src="https://img.shields.io/github/stars/ogham/exa?color=232323&amp;label=exa&amp;logo=github&amp;labelColor=232323" alt="View exa on GitHub"></a><a href="https://github.com/ogham"><img src="https://img.shields.io/badge/ogham-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author ogham"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install exa # Arch Linux sudo pacman -S exa # Debian / Ubuntu sudo apt install exa ``` </details> <hr> <h3><a href="https://github.com/muesli/duf" rel="noopener nofollow" target="_blank">duf</a> - Disk Usage <em>(better <code class="prettyprint">df</code>)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/sP59DKd/duf.png" alt="duf-example-usage"></p> <p><a href="https://github.com/muesli/duf"><img src="https://img.shields.io/github/stars/muesli/duf?color=232323&amp;label=duf&amp;logo=github&amp;labelColor=232323" alt="View duf on GitHub"></a><a href="https://github.com/muesli"><img src="https://img.shields.io/badge/muesli-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author muesli"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install duf # Arch Linux sudo pacman -S duf # Debian / Ubuntu sudo apt install duf # FreeBSD pkg install duf ``` </details> <hr> <h3><a href="https://github.com/aria2/aria2" rel="noopener nofollow" target="_blank">aria2</a> - Download Utility <em>(better <code class="prettyprint">wget</code>)</em></h3> <blockquote> <p><code class="prettyprint">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="https://aria2.github.io/manual/en/html/README.html" rel="noopener nofollow" target="_blank">feature rich</a>, and has tons of <a href="https://aria2.github.io/manual/en/html/aria2c.html" rel="noopener nofollow" target="_blank">options</a>. There's also <a href="https://github.com/ziahamza/webui-aria2" rel="noopener nofollow" target="_blank">ziahamza/webui-aria2</a> - a nice web interface companion.</p> </blockquote> <p><img src="https://i.ibb.co/pJkkX6x/aria2c.png" alt="aria2c-example-usage"></p> <p><a href="https://github.com/aria2/aria2"><img src="https://img.shields.io/github/stars/aria2/aria2?color=232323&amp;label=aria2&amp;logo=github&amp;labelColor=232323" alt="View aria2 on GitHub"></a><a href="https://github.com/aria2"><img src="https://img.shields.io/badge/aria2-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author aria2"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C++&amp;color=00599C&amp;logo=cplusplus&amp;logoColor=FFFFFF" alt="Written in C++"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install aria2 # Arch Linux sudo pacman -S aria2 # Debian / Ubuntu sudo apt install aria2 ``` </details> <hr> <h3><a href="https://github.com/sharkdp/bat" rel="noopener nofollow" target="_blank">bat</a> - Reading Files <em>(better <code class="prettyprint">cat</code>)</em></h3> <blockquote> <p><code class="prettyprint">bat</code> is a clone of <code class="prettyprint">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><img src="https://i.ibb.co/VND3Y9s/bat.png" alt="bat-example-usage"></p> <p><a href="https://github.com/sharkdp/bat"><img src="https://img.shields.io/github/stars/sharkdp/bat?color=232323&amp;label=bat&amp;logo=github&amp;labelColor=232323" alt="View bat on GitHub"></a><a href="https://github.com/sharkdp"><img src="https://img.shields.io/badge/sharkdp-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author sharkdp"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install bat # Arch Linux sudo pacman -S bat # Debian / Ubuntu sudo apt install bat ``` </details> <hr> <h3><a href="https://github.com/so-fancy/diff-so-fancy" rel="noopener nofollow" target="_blank">diff-so-fancy</a> - File Comparisons <em>(better <code class="prettyprint">diff</code>)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/RGKLhQk/diff-so-fancy.png" alt="diff-so-fancy-example-usage"></p> <p><a href="https://github.com/so-fancy/diff-so-fancy"><img src="https://img.shields.io/github/stars/so-fancy/diff-so-fancy?color=232323&amp;label=diff-so-fancy&amp;logo=github&amp;labelColor=232323" alt="View diff-so-fancy on GitHub"></a><a href="https://github.com/so-fancy"><img src="https://img.shields.io/badge/so-fancy-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author so-fancy"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Perl&amp;color=39457E&amp;logo=perl&amp;logoColor=FFFFFF" alt="Written in Perl"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install diff-so-fancy # Arch Linux sudo pacman -S diff-so-fancy # Debian / Ubuntu sudo apt install diff-so-fancy ``` </details> <hr> <h3><a href="https://github.com/eradman/entr" rel="noopener nofollow" target="_blank">entr</a> - Watch for changes</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/HHKQx2H/entr.png" alt="entr-example-usage"></p> <p><a href="https://github.com/eradman/entr"><img src="https://img.shields.io/github/stars/eradman/entr?color=232323&amp;label=entr&amp;logo=github&amp;labelColor=232323" alt="View entr on GitHub"></a><a href="https://github.com/eradman"><img src="https://img.shields.io/badge/eradman-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author eradman"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install entr # Arch Linux sudo pacman -S entr # Debian / Ubuntu sudo apt install entr ``` </details> <hr> <h3><a href="https://github.com/exiftool/exiftool" rel="noopener nofollow" target="_blank">exiftool</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><img src="https://i.ibb.co/Gv5PN6v/exiftool.png" alt="exiftool-example-usage"></p> <p><a href="https://github.com/exiftool/exiftool"><img src="https://img.shields.io/github/stars/exiftool/exiftool?color=232323&amp;label=exiftool&amp;logo=github&amp;labelColor=232323" alt="View exiftool on GitHub"></a><a href="https://github.com/exiftool"><img src="https://img.shields.io/badge/exiftool-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author exiftool"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Perl&amp;color=39457E&amp;logo=perl&amp;logoColor=FFFFFF" alt="Written in Perl"></p> <hr> <h3><a href="https://github.com/jbruchon/jdupes" rel="noopener nofollow" target="_blank">fdupes</a> - Duplicate file finder</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/jhSY2Nn/fdupes.png" alt="fdupes-example-usage"></p> <p><a href="https://github.com/jbruchon/jdupes"><img src="https://img.shields.io/github/stars/jbruchon/jdupes?color=232323&amp;label=jdupes&amp;logo=github&amp;labelColor=232323" alt="View jdupes on GitHub"></a><a href="https://github.com/jbruchon"><img src="https://img.shields.io/badge/jbruchon-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author jbruchon"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <hr> <h3><a href="https://github.com/junegunn/fzf" rel="noopener nofollow" target="_blank">fzf</a> - Fuzzy file finder <em>(better <code class="prettyprint">find</code>)</em></h3> <blockquote> <p><code class="prettyprint">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="https://github.com/junegunn/fzf/wiki/Related-projects" rel="noopener nofollow" target="_blank">plugins</a> available for most shells and IDEs, for showing instant results while searching. This <a href="https://www.freecodecamp.org/news/fzf-a-command-line-fuzzy-finder-missing-demo-a7de312403ff/" rel="noopener nofollow" target="_blank">post</a> by Alexey Samoshkin highlights some of it's use cases.</p> </blockquote> <p><img src="https://i.ibb.co/LNcwjWm/fzf.gif" alt="fzf-example-usage"></p> <p><a href="https://github.com/junegunn/fzf"><img src="https://img.shields.io/github/stars/junegunn/fzf?color=232323&amp;label=fzf&amp;logo=github&amp;labelColor=232323" alt="View fzf on GitHub"></a><a href="https://github.com/junegunn"><img src="https://img.shields.io/badge/junegunn-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author junegunn"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install fzf # Arch Linux sudo pacman -S fzf # Debian / Ubuntu sudo apt install fzf ``` </details> <hr> <h3><a href="https://github.com/sharkdp/hyperfine" rel="noopener nofollow" target="_blank">hyperfine</a> - Command benchmarking</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/tKNR5gr/hyperfine.png" alt="hyperfine-example-usage"></p> <p><a href="https://github.com/sharkdp/hyperfine"><img src="https://img.shields.io/github/stars/sharkdp/hyperfine?color=232323&amp;label=hyperfine&amp;logo=github&amp;labelColor=232323" alt="View hyperfine on GitHub"></a><a href="https://github.com/sharkdp"><img src="https://img.shields.io/badge/sharkdp-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author sharkdp"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install hyperfine # Arch Linux sudo pacman -S hyperfine # Debian / Ubuntu sudo apt install hyperfine ``` </details> <hr> <h3><a href="https://github.com/casey/just" rel="noopener nofollow" target="_blank">just</a> - Modern command runner <em>(better <code class="prettyprint">make</code>)</em></h3> <blockquote> <p><code class="prettyprint">just</code> is similar to <code class="prettyprint">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="https://github.com/casey/just"><img src="https://img.shields.io/github/stars/casey/just?color=232323&amp;label=just&amp;logo=github&amp;labelColor=232323" alt="View just on GitHub"></a><a href="https://github.com/casey"><img src="https://img.shields.io/badge/casey-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author casey"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <details> <summary>Install</summary> ```bash # MacOS (via Homebrew) brew install just # Arch Linux sudo pacman -S just # Debian / Ubuntu sudo apt install just ``` </details> <hr> <h3><a href="https://github.com/stedolan/jq" rel="noopener nofollow" target="_blank">jq</a> - JSON processor</h3> <blockquote> <p><code class="prettyprint">jq</code> is like <code class="prettyprint">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="https://jqplay.org/" rel="noopener nofollow" target="_blank">jq playground</a> that you can use to try it out, or formulate queries with live feedback</p> </blockquote> <p><a href="https://github.com/stedolan/jq"><img src="https://img.shields.io/github/stars/stedolan/jq?color=232323&amp;label=jq&amp;logo=github&amp;labelColor=232323" alt="View jq on GitHub"></a><a href="https://github.com/stedolan"><img src="https://img.shields.io/badge/stedolan-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author stedolan"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <hr> <h3><a href="https://www.jedsoft.org/most/" rel="noopener nofollow" target="_blank">most</a> - Multi-window scroll pager <em>(better less)</em></h3> <blockquote> <p><code class="prettyprint">most</code> is a pager, for reading through long files or command outputs. <code class="prettyprint">most</code> supports multi-windows and has the option to not wrap text </p> </blockquote> <p><a href="https://www.jedsoft.org/aboutme.html"><img src="https://img.shields.io/badge/jed-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author Jed"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=S_Lang&amp;color=000000&amp;logo=simkl&amp;logoColor=FFFFFF" alt="Written in S-Lang"></p> <hr> <h3><a href="https://github.com/dalance/procs" rel="noopener nofollow" target="_blank">procs</a> - Process viewer <em>(better ps)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/y6qhgDX/procs-demo.gif" alt="procs-example-usage"></p> <p><a href="https://github.com/dalance/procs"><img src="https://img.shields.io/github/stars/dalance/procs?color=232323&amp;label=procs&amp;logo=github&amp;labelColor=232323" alt="View procs on GitHub"></a><a href="https://github.com/dalance"><img src="https://img.shields.io/badge/dalance-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author dalance"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/nivekuil/rip" rel="noopener nofollow" target="_blank">rip</a> - Deletion tool <em>(better rm)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/10DTvT2/rip.gif" alt="rip-example-usage"></p> <p><a href="https://github.com/nivekuil/rip"><img src="https://img.shields.io/github/stars/nivekuil/rip?color=232323&amp;label=rip&amp;logo=github&amp;labelColor=232323" alt="View rip on GitHub"></a><a href="https://github.com/nivekuil"><img src="https://img.shields.io/badge/nivekuil-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author nivekuil"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/BurntSushi/ripgrep" rel="noopener nofollow" target="_blank">ripgrep</a> - Search within files <em>(better <code class="prettyprint">grep</code>)</em></h3> <blockquote> <p><code class="prettyprint">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 class="prettyprint">.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><img src="https://i.ibb.co/qkMgQm9/ripgrep.png" alt="ripgrep-example-usage"></p> <p><a href="https://github.com/BurntSushi/ripgrep"><img src="https://img.shields.io/github/stars/BurntSushi/ripgrep?color=232323&amp;label=ripgrep&amp;logo=github&amp;labelColor=232323" alt="View ripgrep on GitHub"></a><a href="https://github.com/BurntSushi"><img src="https://img.shields.io/badge/BurntSushi-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author BurntSushi"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://rsync.samba.org/" rel="noopener nofollow" target="_blank">rsync</a> - Fast, incremental file transfer</h3> <blockquote> <p><code class="prettyprint">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="https://github.com/WayneD/rsync"><img src="https://img.shields.io/github/stars/WayneD/rsync?color=232323&amp;label=rsync&amp;logo=github&amp;labelColor=232323" alt="View rsync on GitHub"></a><a href="https://github.com/WayneD"><img src="https://img.shields.io/badge/WayneD-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author WayneD"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <hr> <h3><a href="https://github.com/chmln/sd" rel="noopener nofollow" target="_blank">sd</a> - Find and replace <em>(better <code class="prettyprint">sed</code>)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/G9CfcGS/sd.png" alt="sd-example-usage"></p> <p><a href="https://github.com/chmln/sd"><img src="https://img.shields.io/github/stars/chmln/sd?color=232323&amp;label=sd&amp;logo=github&amp;labelColor=232323" alt="View sd on GitHub"></a><a href="https://github.com/chmln"><img src="https://img.shields.io/badge/chmln-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author chmln"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/dduan/tre" rel="noopener nofollow" target="_blank">tre</a> - Directory hierarchy <em>(better <code class="prettyprint">tree</code>)</em></h3> <blockquote> <p><code class="prettyprint">tre</code> outputs a tree stye list of files for your current or a specified directory, with colors. When running with the <code class="prettyprint">-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><img src="https://i.ibb.co/CmMrZLB/tre.png" alt="tre-example-usage"></p> <p><a href="https://github.com/dduan/tre"><img src="https://img.shields.io/github/stars/dduan/tre?color=232323&amp;label=tre&amp;logo=github&amp;labelColor=232323" alt="View tre on GitHub"></a><a href="https://github.com/dduan"><img src="https://img.shields.io/badge/dduan-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author dduan"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/kfish/xsel" rel="noopener nofollow" target="_blank">xsel</a> - Access the clipboard</h3> <blockquote> <p><code class="prettyprint">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="https://github.com/kfish/xsel"><img src="https://img.shields.io/github/stars/kfish/xsel?color=232323&amp;label=xsel&amp;logo=github&amp;labelColor=232323" alt="View xsel on GitHub"></a><a href="https://github.com/kfish"><img src="https://img.shields.io/badge/kfish-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author kfish"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <hr> <hr> <h2>CLI Monitoring and Performance Apps</h2> <h3><a href="https://github.com/imsnif/bandwhich" rel="noopener nofollow" target="_blank">bandwhich</a> - Bandwidth utilization monitor</h3> <blockquote> <p>Show bandwidth usage, connection information, outgoing hosts and DNS queries in real-time</p> </blockquote> <p><img src="https://i.ibb.co/8jHHBD3/Screenshot-from-2023-01-18-22-45-32.png" alt="bandwhich-example-usage"></p> <p><a href="https://github.com/imsnif/bandwhich"><img src="https://img.shields.io/github/stars/imsnif/bandwhich?color=232323&amp;label=bandwhich&amp;logo=github&amp;labelColor=232323" alt="View bandwhich on GitHub"></a><a href="https://github.com/imsnif"><img src="https://img.shields.io/badge/imsnif-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author imsnif"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/bcicen/ctop" rel="noopener nofollow" target="_blank">ctop</a> - Container metrics and monitoring</h3> <blockquote> <p>Like <code class="prettyprint">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><img src="https://i.ibb.co/xGjyzZ2/ctop.gif" alt="ctop-example-usage"></p> <p><a href="https://github.com/bcicen/ctop"><img src="https://img.shields.io/github/stars/bcicen/ctop?color=232323&amp;label=ctop&amp;logo=github&amp;labelColor=232323" alt="View ctop on GitHub"></a><a href="https://github.com/bcicen"><img src="https://img.shields.io/badge/bcicen-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author bcicen"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <hr> <h3><a href="https://github.com/aristocratos/bpytop" rel="noopener nofollow" target="_blank">bpytop</a> - Resource monitoring <em>(better <code class="prettyprint">htop</code>)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/nj9jrhr/bpytop.gif" alt="bpytop-example-usage"></p> <p><a href="https://github.com/aristocratos/bpytop"><img src="https://img.shields.io/github/stars/aristocratos/bpytop?color=232323&amp;label=bpytop&amp;logo=github&amp;labelColor=232323" alt="View bpytop on GitHub"></a><a href="https://github.com/aristocratos"><img src="https://img.shields.io/badge/aristocratos-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author aristocratos"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <h3><a href="https://github.com/nicolargo/glances" rel="noopener nofollow" target="_blank">glances</a> - Resource monitor + web and API</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/6g65Qy4/glances.gif" alt="glances-example-usage"></p> <p><a href="https://github.com/nicolargo/glances"><img src="https://img.shields.io/github/stars/nicolargo/glances?color=232323&amp;label=glances&amp;logo=github&amp;labelColor=232323" alt="View glances on GitHub"></a><a href="https://github.com/nicolargo"><img src="https://img.shields.io/badge/nicolargo-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author nicolargo"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <h3><a href="https://github.com/orf/gping" rel="noopener nofollow" target="_blank">gping</a> - Interactive ping tool <em>(better <code class="prettyprint">ping</code>)</em></h3> <blockquote> <p><code class="prettyprint">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 class="prettyprint">--cmd</code> flag</p> </blockquote> <p><img src="https://i.ibb.co/CvG6xt0/gping.gif" alt="gping-example-usage"></p> <p><a href="https://github.com/orf/gping"><img src="https://img.shields.io/github/stars/orf/gping?color=232323&amp;label=gping&amp;logo=github&amp;labelColor=232323" alt="View gping on GitHub"></a><a href="https://github.com/orf"><img src="https://img.shields.io/badge/orf-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author orf"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/Byron/dua-cli" rel="noopener nofollow" target="_blank">dua-cli</a> - Disk usage analyzer and monitor <em>(better <code class="prettyprint">du</code>)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/x3NbDLR/dua.gif" alt="dua-cli-usage-example"></p> <p><a href="https://github.com/Byron/dua-cli"><img src="https://img.shields.io/github/stars/Byron/dua-cli?color=232323&amp;label=dua-cli&amp;logo=github&amp;labelColor=232323" alt="View dua-cli on GitHub"></a><a href="https://github.com/Byron"><img src="https://img.shields.io/badge/Byron-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author Byron"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/sivel/speedtest-cli" rel="noopener nofollow" target="_blank">speedtest-cli</a> - Command line speed test utility</h3> <blockquote> <p><code class="prettyprint">speedtest-cli</code> just runs an internet speed test, via speedtest.net - but straight from the terminal :)</p> </blockquote> <p><img src="https://i.ibb.co/25QCbdF/speedtest-cli.gif" alt="speedtest-cli-example-usage"></p> <p><a href="https://github.com/sivel/speedtest-cli"><img src="https://img.shields.io/github/stars/sivel/speedtest-cli?color=232323&amp;label=speedtest-cli&amp;logo=github&amp;labelColor=232323" alt="View speedtest-cli on GitHub"></a><a href="https://github.com/sivel"><img src="https://img.shields.io/badge/sivel-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author sivel"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <h3><a href="https://github.com/ogham/dog" rel="noopener nofollow" target="_blank">dog</a> - DNS lookup client <em>(better <code class="prettyprint">dig</code>)</em></h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/48n617Q/dog.png" alt="dog-example-usage"></p> <p><a href="https://github.com/ogham/dog"><img src="https://img.shields.io/github/stars/ogham/dog?color=232323&amp;label=dog&amp;logo=github&amp;labelColor=232323" alt="View dog on GitHub"></a><a href="https://github.com/ogham"><img src="https://img.shields.io/badge/ogham-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author ogham"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <hr> <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="https://github.com/browsh-org/browsh" rel="noopener nofollow" target="_blank">browsh</a> - CLI web browser</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/S7nLFX5/browsh.gif" alt="browsh-example-usage"></p> <p><a href="https://github.com/browsh-org/browsh"><img src="https://img.shields.io/github/stars/browsh-org/browsh?color=232323&amp;label=browsh&amp;logo=github&amp;labelColor=232323" alt="View browsh on GitHub"></a><a href="https://github.com/browsh-org"><img src="https://img.shields.io/badge/browsh-org-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author browsh-org"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=JavaScript&amp;color=F7DF1E&amp;logo=javascript&amp;logoColor=FFFFFF" alt="Written in JavaScript"></p> <hr> <h3><a href="https://github.com/jarun/buku" rel="noopener nofollow" target="_blank">buku</a> - Bookmark manager</h3> <blockquote> <p><code class="prettyprint">buku</code> is a terminal-based bookmark manager, with tons of configuration, storage and usage options. There's also an optional <a href="https://github.com/jarun/buku/tree/master/bukuserver#screenshots" rel="noopener nofollow" target="_blank">web UI</a> and <a href="https://github.com/samhh/bukubrow-webext#installation" rel="noopener nofollow" target="_blank">browser plugin</a>, for accessing your bookmarks outside of the terminal</p> </blockquote> <p><img src="https://i.ibb.co/CWQsf1x/buku.png" alt="buku-example-usage"></p> <p><a href="https://github.com/jarun/buku"><img src="https://img.shields.io/github/stars/jarun/buku?color=232323&amp;label=buku&amp;logo=github&amp;labelColor=232323" alt="View buku on GitHub"></a><a href="https://github.com/jarun"><img src="https://img.shields.io/badge/jarun-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author jarun"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <h3><a href="https://github.com/cmus/cmus" rel="noopener nofollow" target="_blank">cmus</a> - Music browser / player</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/dP6b3bd/cmus.png" alt="cmus-example-usage"></p> <p><a href="https://github.com/cmus/cmus"><img src="https://img.shields.io/github/stars/cmus/cmus?color=232323&amp;label=cmus&amp;logo=github&amp;labelColor=232323" alt="View cmus on GitHub"></a><a href="https://github.com/cmus"><img src="https://img.shields.io/badge/cmus-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author cmus"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <hr> <h3><a href="https://github.com/cointop-sh/cointop" rel="noopener nofollow" target="_blank">cointop</a> - Track crypto prices</h3> <blockquote> <p><code class="prettyprint">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="https://cointop.sh/" rel="noopener nofollow" target="_blank">cointop.sh</a>, or by running <code class="prettyprint">ssh cointop.sh</code></p> </blockquote> <p><img src="https://i.ibb.co/JBf9y4y/cointop.png" alt="cointop-example-usage"></p> <p><a href="https://github.com/cointop-sh/cointop"><img src="https://img.shields.io/github/stars/cointop-sh/cointop?color=232323&amp;label=cointop&amp;logo=github&amp;labelColor=232323" alt="View cointop on GitHub"></a><a href="https://github.com/cointop-sh"><img src="https://img.shields.io/badge/cointop-sh-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author cointop-sh"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <hr> <h3><a href="https://github.com/jarun/ddgr" rel="noopener nofollow" target="_blank">ddgr</a> - Search the web from the terminal</h3> <blockquote> <p><code class="prettyprint">ddgr</code> is like <a href="https://github.com/jarun/googler" rel="noopener nofollow" target="_blank">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><img src="https://i.ibb.co/S0H21QH/dggr.png" alt="dggr-example-usage"></p> <p><a href="https://github.com/jarun/ddgr"><img src="https://img.shields.io/github/stars/jarun/ddgr?color=232323&amp;label=ddgr&amp;logo=github&amp;labelColor=232323" alt="View ddgr on GitHub"></a><a href="https://github.com/jarun"><img src="https://img.shields.io/badge/jarun-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author jarun"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <h3><a href="https://github.com/pimutils/khal" rel="noopener nofollow" target="_blank">khal</a> - Calendar client</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/hLCdjZW/khal.png" alt="khal-example-usage"></p> <p><a href="https://github.com/pimutils/khal"><img src="https://img.shields.io/github/stars/pimutils/khal?color=232323&amp;label=khal&amp;logo=github&amp;labelColor=232323" alt="View khal on GitHub"></a><a href="https://github.com/pimutils"><img src="https://img.shields.io/badge/pimutils-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author pimutils"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <h3><a href="https://gitlab.com/muttmua/mutt" rel="noopener nofollow" target="_blank">mutt</a> - Email client</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/zVVsG3s/mutt.webp" alt="mutt-example-usage"></p> <p><a href="https://gitlab.com/muttmua/mutt"><img src="https://img.shields.io/github/stars/muttmua/mutt?color=232323&amp;label=mutt&amp;logo=github&amp;labelColor=232323" alt="View mutt on GitHub"></a><a href="https://github.com/muttmua"><img src="https://img.shields.io/badge/muttmua-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author muttmua"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <hr> <h3><a href="https://github.com/newsboat/newsboat" rel="noopener nofollow" target="_blank">newsboat</a> - RSS / ATOM news reader</h3> <blockquote> <p><code class="prettyprint">newsboat</code> is an RSS feed reader and aggregator, for reading the news, blogs and following updates directly from the terminal</p> </blockquote> <p><img src="https://i.ibb.co/fvT4YzD/newsboat.png" alt="newsboat-example-usage"></p> <p><a href="https://github.com/newsboat/newsboat"><img src="https://img.shields.io/github/stars/newsboat/newsboat?color=232323&amp;label=newsboat&amp;logo=github&amp;labelColor=232323" alt="View newsboat on GitHub"></a><a href="https://github.com/newsboat"><img src="https://img.shields.io/badge/newsboat-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author newsboat"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C++&amp;color=00599C&amp;logo=cplusplus&amp;logoColor=FFFFFF" alt="Written in C++"></p> <hr> <h3><a href="https://github.com/rclone/rclone" rel="noopener nofollow" target="_blank">rclone</a> - Manage cloud storage</h3> <blockquote> <p><code class="prettyprint">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="https://github.com/rclone/rclone"><img src="https://img.shields.io/github/stars/rclone/rclone?color=232323&amp;label=rclone&amp;logo=github&amp;labelColor=232323" alt="View rclone on GitHub"></a><a href="https://github.com/rclone"><img src="https://img.shields.io/badge/rclone-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author rclone"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <hr> <h3><a href="https://github.com/GothenburgBitFactory/taskwarrior" rel="noopener nofollow" target="_blank">taskwarrior</a> - Todo + task management</h3> <blockquote> <p><code class="prettyprint">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="https://taskwarrior.org/tools/" rel="noopener nofollow" target="_blank">plugins</a> for extending it's functionality and integrating with third-party services</p> </blockquote> <p><img src="https://i.ibb.co/7k6M37g/taskwarrior.jpg" alt="task-warrior-example-usage"></p> <p><a href="https://github.com/GothenburgBitFactory/taskwarrior"><img src="https://img.shields.io/github/stars/GothenburgBitFactory/taskwarrior?color=232323&amp;label=taskwarrior&amp;logo=github&amp;labelColor=232323" alt="View taskwarrior on GitHub"></a><a href="https://github.com/GothenburgBitFactory"><img src="https://img.shields.io/badge/GothenburgBitFactory-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author GothenburgBitFactory"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C++&amp;color=00599C&amp;logo=cplusplus&amp;logoColor=FFFFFF" alt="Written in C++"></p> <hr> <h3><a href="https://gitlab.com/ajak/tuir" rel="noopener nofollow" target="_blank">tuir</a> - Terminal UI for Reddit</h3> <blockquote> <p><code class="prettyprint">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="https://github.com/donnemartin/haxor-news" rel="noopener nofollow" target="_blank">haxor</a> for hacker news</p> </blockquote> <p><img src="https://i.ibb.co/vzSw7s5/tuir.png" alt="tuir-example-usage"></p> <p><a href="https://gitlab.com/ajak/tuir"><img src="https://img.shields.io/gitlab/stars/ajak/tuir?color=fc6d26&amp;label=tuir&amp;logo=gitlab&amp;labelColor=232323" alt="View tuir on GitLab"></a><a href="https://github.com/ajak"><img src="https://img.shields.io/badge/ajak-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author ajak"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <hr> <h2>CLI Dev Suits</h2> <h3><a href="https://github.com/httpie/httpie" rel="noopener nofollow" target="_blank">httpie</a> - HTTP / API testing testing client</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/Wk5S19g/httpie.png" alt="httpie-example-usage"></p> <p><a href="https://github.com/httpie/httpie"><img src="https://img.shields.io/github/stars/httpie/httpie?color=232323&amp;label=httpie&amp;logo=github&amp;labelColor=232323" alt="View httpie on GitHub"></a><a href="https://github.com/httpie"><img src="https://img.shields.io/badge/httpie-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author httpie"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <h3><a href="https://github.com/jesseduffield/lazydocker" rel="noopener nofollow" target="_blank">lazydocker</a> - Full Docker management app</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/MD8MWNH/lazydocker.png" alt="lazy-docker-example-usage"></p> <p><a href="https://github.com/jesseduffield/lazydocker"><img src="https://img.shields.io/github/stars/jesseduffield/lazydocker?color=232323&amp;label=lazydocker&amp;logo=github&amp;labelColor=232323" alt="View lazydocker on GitHub"></a><a href="https://github.com/jesseduffield"><img src="https://img.shields.io/badge/jesseduffield-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author jesseduffield"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <hr> <h3><a href="https://github.com/jesseduffield/lazygit" rel="noopener nofollow" target="_blank">lazygit</a> - Full Git management app</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/KLF3C6s/lazygit.png" alt="lazy-git-example-usage"></p> <p><a href="https://github.com/jesseduffield/lazygit"><img src="https://img.shields.io/github/stars/jesseduffield/lazygit?color=232323&amp;label=lazygit&amp;logo=github&amp;labelColor=232323" alt="View lazygit on GitHub"></a><a href="https://github.com/jesseduffield"><img src="https://img.shields.io/badge/jesseduffield-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author jesseduffield"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <hr> <h3><a href="https://github.com/kdash-rs/kdash/" rel="noopener nofollow" target="_blank">kdash</a> - Kubernetes dashboard app</h3> <blockquote> <p><code class="prettyprint">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="https://github.com/kdash-rs/kdash/"><img src="https://img.shields.io/github/stars/kdash-rs/kdash?color=232323&amp;label=kdash&amp;logo=github&amp;labelColor=232323" alt="View kdash on GitHub"></a><a href="https://github.com/kdash-rs"><img src="https://img.shields.io/badge/kdash-rs-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author kdash-rs"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/cyrus-and/gdb-dashboard" rel="noopener nofollow" target="_blank">gdp-dashboard</a> - Visual GDP debugger</h3> <blockquote> <p><code class="prettyprint">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><img src="https://i.ibb.co/2g2hVLh/gdp-dashboard.png" alt="gdp-dashboard-example-usage"></p> <p><a href="https://github.com/cyrus-and/gdb-dashboard"><img src="https://img.shields.io/github/stars/cyrus-and/gdb-dashboard?color=232323&amp;label=gdb-dashboard&amp;logo=github&amp;labelColor=232323" alt="View gdb-dashboard on GitHub"></a><a href="https://github.com/cyrus-and"><img src="https://img.shields.io/badge/cyrus-and-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author cyrus-and"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <hr> <h2>CLI External Sercvices</h2> <h3><a href="https://ngrok.com/" rel="noopener nofollow" target="_blank">ngrok</a> - Reverse proxy for sharing localhost</h3> <blockquote> <p><code class="prettyprint">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="https://notes.aliciasykes.com/p/RUi22QSyWe">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><img src="https://i.ibb.co/4WPZNGx/ngrok.png" alt="ngrok-example-usage"></p> <p><a href="https://github.com/inconshreveable/ngrok"><img src="https://img.shields.io/github/stars/inconshreveable/ngrok?color=232323&amp;label=ngrok&amp;logo=github&amp;labelColor=232323" alt="View ngrok on GitHub"></a><a href="https://github.com/inconshreveable"><img src="https://img.shields.io/badge/inconshreveable-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author inconshreveable"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <hr> <h3><a href="https://tmate.io/" rel="noopener nofollow" target="_blank">tmate</a> - Share a terminal session via internet</h3> <blockquote> <p><code class="prettyprint">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="https://github.com/tmate-io/tmate"><img src="https://img.shields.io/github/stars/tmate-io/tmate?color=232323&amp;label=tmate&amp;logo=github&amp;labelColor=232323" alt="View tmate on GitHub"></a><a href="https://github.com/tmate-io"><img src="https://img.shields.io/badge/tmate-io-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author tmate-io"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <hr> <h3><a href="https://asciinema.org/" rel="noopener nofollow" target="_blank">asciinema</a> - Recording + sharing terminal sessions</h3> <blockquote> <p><code class="prettyprint">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> <p>{% embed <a href="https://asciinema.org/a/335480?speed=3" rel="noopener nofollow" target="_blank">https://asciinema.org/a/335480?speed=3</a> %}</p> <p><a href="https://github.com/asciinema/asciinema"><img src="https://img.shields.io/github/stars/asciinema/asciinema?color=232323&amp;label=asciinema&amp;logo=github&amp;labelColor=232323" alt="View asciinema on GitHub"></a><a href="https://github.com/asciinema"><img src="https://img.shields.io/badge/asciinema-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author asciinema"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <h3><a href="https://github.com/denisidoro/navi" rel="noopener nofollow" target="_blank">navi</a> - Interactive cheat sheet</h3> <blockquote> <p><code class="prettyprint">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="https://github.com/tldr-pages/tldr" rel="noopener nofollow" target="_blank">tldr</a> and <a href="https://github.com/chubin/cheat.sh" rel="noopener nofollow" target="_blank">cheat.sh</a> to get content, but you can also import other cheatsheets, or even write your own</p> </blockquote> <p>{% embed <a href="https://asciinema.org/a/406461?speed=2" rel="noopener nofollow" target="_blank">https://asciinema.org/a/406461?speed=2</a> %}</p> <p><a href="https://github.com/denisidoro/navi"><img src="https://img.shields.io/github/stars/denisidoro/navi?color=232323&amp;label=navi&amp;logo=github&amp;labelColor=232323" alt="View navi on GitHub"></a><a href="https://github.com/denisidoro"><img src="https://img.shields.io/badge/denisidoro-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author denisidoro"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Rust&amp;color=e86243&amp;logo=rust&amp;logoColor=FFFFFF" alt="Written in Rust"></p> <hr> <h3><a href="https://github.com/dutchcoders/transfer.sh/" rel="noopener nofollow" target="_blank">transfer.sh</a> - Fast file sharing</h3> <blockquote> <p><code class="prettyprint">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="https://github.com/Lissy93/dotfiles/blob/master/utils/transfer.sh" rel="noopener nofollow" target="_blank">find it here</a> or try it out by running <code class="prettyprint">bash &lt;(curl -L -s https://alicia.url.lol/transfer)</code></p> </blockquote> <p><img src="https://i.ibb.co/cCqDb1k/transfer-sh.png" alt="transfer-sh-example-usage"></p> <p><a href="https://github.com/dutchcoders/transfer.sh"><img src="https://img.shields.io/github/stars/dutchcoders/transfer.sh?color=232323&amp;label=transfer.sh&amp;logo=github&amp;labelColor=232323" alt="View transfer.sh on GitHub"></a><a href="https://github.com/dutchcoders"><img src="https://img.shields.io/badge/dutchcoders-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author dutchcoders"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Go%20Lang&amp;color=00ADD8&amp;logo=go&amp;logoColor=FFFFFF" alt="Written in Go"></p> <hr> <h3><a href="https://surge.sh/" rel="noopener nofollow" target="_blank">surge</a> - Deploy a site in seconds</h3> <blockquote> <p><code class="prettyprint">surge</code> is a free static hosting provider, that you can deploy to directly from the terminal in a single command, just run <code class="prettyprint">surge</code> from within your <code class="prettyprint">dist</code> directory! It supports custom domains, auto SSL certs, pushState support, cross-origin resource support - and it's free!</p> </blockquote> <p><img src="https://i.ibb.co/NynprxZ/surge-sh.png" alt="surge-sh-example-usage"></p> <hr> <h3><a href="https://github.com/chubin/wttr.in" rel="noopener nofollow" target="_blank">wttr.in</a> - Check the weather</h3> <blockquote> <p><code class="prettyprint">wttr.in</code> is a service that displays the weather in a format that's digestible in the command line. Just run <code class="prettyprint">curl wttr.in</code> or <code class="prettyprint">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><img src="https://i.ibb.co/J2JWnYT/Screenshot-from-2023-01-18-21-10-54.png" alt="wrrt-in-example-usage"></p> <p><a href="https://github.com/chubin/wttr.in"><img src="https://img.shields.io/github/stars/chubin/wttr.in?color=232323&amp;label=wttr.in&amp;logo=github&amp;labelColor=232323" alt="View wttr.in on GitHub"></a><a href="https://github.com/chubin"><img src="https://img.shields.io/badge/chubin-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author chubin"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Python&amp;color=3C78A9&amp;logo=python&amp;logoColor=FFFFFF" alt="Written in Python"></p> <hr> <hr> <h2>CLI Fun</h2> <h3><a href="https://en.wikipedia.org/wiki/Cowsay" rel="noopener nofollow" target="_blank">cowsay</a> - Have an ASCII cow say your message</h3> <blockquote> <p><code class="prettyprint">cowsay</code> is a configurable talking cow. It's based off the <a href="https://github.com/tnalpgge/rank-amateur-cowsay" rel="noopener nofollow" target="_blank">original</a> by Tony Monroe</p> </blockquote> <p><img src="https://i.ibb.co/TRqW3jD/cowsay.png" alt="cowsay-example-usage"></p> <p><a href="https://github.com/piuccio/cowsay"><img src="https://img.shields.io/github/stars/piuccio/cowsay?color=232323&amp;label=cowsay&amp;logo=github&amp;labelColor=232323" alt="View cowsay on GitHub"></a><a href="https://github.com/piuccio"><img src="https://img.shields.io/badge/piuccio-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author piuccio"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=JavaScript&amp;color=F7DF1E&amp;logo=javascript&amp;logoColor=FFFFFF" alt="Written in JavaScript"></p> <hr> <h3><a href="http://www.figlet.org/" rel="noopener nofollow" target="_blank">figlet</a> - Output text as big ASCII art text</h3> <blockquote> <p><code class="prettyprint">figlet</code> outputs text as ASCII art</p> </blockquote> <p><img src="https://i.ibb.co/fk4T7D0/figlet.png" alt="figlet-example-usage"></p> <p><a href="https://github.com/cmatsuoka/figlet"><img src="https://img.shields.io/github/stars/cmatsuoka/figlet?color=232323&amp;label=figlet&amp;logo=github&amp;labelColor=232323" alt="View figlet on GitHub"></a><a href="https://github.com/cmatsuoka"><img src="https://img.shields.io/badge/cmatsuoka-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author cmatsuoka"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=C&amp;color=A8B9CC&amp;logo=c&amp;logoColor=FFFFFF" alt="Written in C"></p> <hr> <h3><a href="https://github.com/busyloop/lolcat" rel="noopener nofollow" target="_blank">lolcat</a> - Make console output raibow colored</h3> <blockquote> <p><code class="prettyprint">lolcat</code> makes any text passed to it rainbow coloured</p> </blockquote> <p><img src="https://i.ibb.co/nfp9Ycx/lolcat.png" alt="lolcat-example-usage"></p> <p><a href="https://github.com/busyloop/lolcat"><img src="https://img.shields.io/github/stars/busyloop/lolcat?color=232323&amp;label=lolcat&amp;logo=github&amp;labelColor=232323" alt="View lolcat on GitHub"></a><a href="https://github.com/busyloop"><img src="https://img.shields.io/badge/busyloop-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author busyloop"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Ruby&amp;color=CC342D&amp;logo=ruby&amp;logoColor=FFFFFF" alt="Written in Ruby"></p> <hr> <h3><a href="https://github.com/dylanaraps/neofetch" rel="noopener nofollow" target="_blank">neofetch</a> - Show system data and ditstro info</h3> <blockquote> <p><code class="prettyprint">neofetch</code> prints distro and system info (so you can flex that you use Arch btw on r/unixporn)</p> </blockquote> <p><img src="https://i.ibb.co/x1PHpFC/Screenshot-from-2023-01-18-22-44-28.png" alt="neofetch-example-usage"></p> <p><a href="https://github.com/dylanaraps/neofetch"><img src="https://img.shields.io/github/stars/dylanaraps/neofetch?color=232323&amp;label=neofetch&amp;logo=github&amp;labelColor=232323" alt="View neofetch on GitHub"></a><a href="https://github.com/dylanaraps"><img src="https://img.shields.io/badge/dylanaraps-b820f9?labelColor=b820f9&amp;logo=githubsponsors&amp;logoColor=fff" alt="Author dylanaraps"></a> <img src="https://img.shields.io/static/v1?label=&amp;message=Bash&amp;color=green&amp;logo=gnubash&amp;logoColor=FFFFFF" alt="Written in Bash"></p> <p>As an example, I'm using <code class="prettyprint">cowsay</code>, <code class="prettyprint">figlet</code>, <code class="prettyprint">lolcat</code> and <code class="prettyprint">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="https://github.com/Lissy93/dotfiles/blob/master/utils/welcome-banner.sh" rel="noopener nofollow" target="_blank">Here's the source code</a>.</p> <p><img src="https://i.ibb.co/cTg0jyn/Screenshot-from-2023-01-18-22-59-28.png" alt="welcome"></p> <hr> <hr> <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="https://github.com/Lissy93/dotfiles/tree/master/scripts/installs" rel="noopener nofollow" target="_blank">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="https://brew.sh/" rel="noopener nofollow" target="_blank">Homebrew</a>. Just create a Brewfile (with <code class="prettyprint">touch ~/.Brewfile</code>), then list each of your apps, and run <code class="prettyprint">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="https://github.com/Lissy93/Brewfile" rel="noopener nofollow" target="_blank">https://github.com/Lissy93/Brewfile</a></p> <p>On Linux, you usually want to use the native package manager (e.g. <code class="prettyprint">pacman</code>, <code class="prettyprint">apt</code>). As an example, <a href="https://github.com/Lissy93/dotfiles/blob/master/scripts/installs/arch-pacman.sh" rel="noopener nofollow" target="_blank">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="https://github.com/Lissy93/dotfiles/blob/master/scripts/installs/flatpak.sh" rel="noopener nofollow" target="_blank">here's an example script</a> :)</p> <hr> <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> <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>Find More</h4> <p>If you were enjoying this, I recommend also checking out:</p> <ul> <li><strong><a href="https://github.com/k4m4/terminals-are-sexy" rel="noopener nofollow" target="_blank">terminals-are-sexy</a></strong> by Nikolaos Kamarinakis</li> <li><strong><a href="https://github.com/alebcay/awesome-shell" rel="noopener nofollow" target="_blank">awesome-shell</a></strong> by Caleb Xu</li> <li><strong><a href="https://github.com/agarrharr/awesome-cli-apps" rel="noopener nofollow" target="_blank">awesome-cli-apps</a></strong> by Adam Garrett-Harris</li> </ul> <p>If you're new to the command line, then <strong><a href="https://github.com/jlevy/the-art-of-command-line" rel="noopener nofollow" target="_blank">The Art of Command Line</a></strong> by Joshua Levy is an excellent resource, as is the <strong><a href="https://github.com/Idnan/bash-guide" rel="noopener nofollow" target="_blank">Bash Guide</a></strong> by Adnan Ahmed.</p> <p>And if you are looking for inspiration, you'll love <strong><a href="https://www.reddit.com/r/unixporn/" rel="noopener nofollow" target="_blank">r/unixporn</a></strong> โšก</p> <table><thead> <tr> <th><small>If you like this kind of stuff</small>,<br><small>consider following for more :)</small></th> <th><a href="https://github.com/Lissy93"><img src="https://img.shields.io/badge/-Lissy93-3a3a3a?style=flat&amp;logo=GitHub&amp;logoColor=white" alt="Follow Lissy93 on GitHub"></a><a href="https://twitter.com/Lissy_Sykes"><img src="https://img.shields.io/badge/-@Lissy_Sykes-00acee?style=flat&amp;logo=Twitter&amp;logoColor=white" alt="Follow Lissy_Sykes on Twitter"></a></th> </tr> </thead><tbody> </tbody></table> <style> .post-body.p1 img, .post-body.p1 small, .post-body.p1 blockquote { max-width: 600px !important; margin: 0.25rem auto; border-radius: 5px; } .post-body.p1 blockquote { margin: 1rem auto; } .post-body.p1 img { box-shadow: 1px 2px 4px 2px #090909cf; } .post-body.p1 h2 { font-size: 1.8rem !important; max-width: 800px; margin: 1rem auto 0.25rem auto; text-align: center; } .post-body.p1 h3 { font-size: 1.5rem !important; border-top: 3px solid var(--post-code-border-color); padding: 1rem 0 0; max-width: 600px; margin: 1rem auto; } </style> </p> 20 Git Commands you (probably) didn't know ๐Ÿง™โ€โ™‚๏ธ Alicia's Notes ๐Ÿš€ Sat, 17 Dec 2022 20:46:47 +0000 https://notes.aliciasykes.com/41171/20-git-commands-you-probably-didn-t-know https://notes.aliciasykes.com/41171/20-git-commands-you-probably-didn-t-know <p><p>A collection of 20 under-used git command to upgrade your development experience.</p> <p>If you've ever browsed the <a href="https://git-scm.com/docs" rel="noopener nofollow" target="_blank">git manual</a> (or run <code class="prettyprint">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).<br> 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> <h3>Contents</h3> <ul> <li><a href="#">Git Web</a> - <em>Open builtin GUI</em></li> <li><a href="#">Git Notes</a> - <em>Attach extra info to commits</em></li> <li><a href="#">Git Bisect</a> - <em>Debug like a pro</em></li> <li><a href="#">Git Grep</a> - <em>Search for anything</em></li> <li><a href="#">Git Archive</a> - <em>Compress project for sharing</em></li> <li><a href="#">Git Submodules</a> - <em>Import other repos into yours</em></li> <li><a href="#">Git Bugreport</a> - <em>Compile bug report with system info</em></li> <li><a href="#">Git Fsck</a> - <em>Verify and recover unreachable objects</em></li> <li><a href="#">Git Stripspace</a> - <em>Remove trailing whitespaces</em></li> <li><a href="#">Git Diff</a> - <em>Compare changes between two files</em></li> <li><a href="#">Git Hooks</a> - <em>Execute script when a git command is run</em></li> <li><a href="#">Git Blame</a> - <em>Show who wrote a given line</em></li> <li><a href="#">Git Large File Storage</a> - <em>Store big files in git</em></li> <li><a href="#">Git Garbage Collection</a> - <em>Optimize your git repo</em></li> <li><a href="#">Git Show</a> - <em>Easily inspect any git object</em></li> <li><a href="#">Git Describe</a> - <em>Give readable name based on last tag</em></li> <li><a href="#">Git Tag</a> - <em>Create version tags at specific points</em></li> <li><a href="#">Git Reflog</a> - <em>List all git actions made on a repo</em></li> <li><a href="#">Git Log</a> - <em>View commit log, and branch diagrams</em></li> <li><a href="#">Git Cherry Pick</a> - <em>Pull a feature or fix into your branch</em></li> </ul> <hr> <h2>Git Web</h2> <blockquote> <p>Run <a href="https://git-scm.com/docs/git-instaweb" rel="noopener nofollow" target="_blank">git instaweb</a> to instantly browse your working repository in gitweb</p> </blockquote> <p>Git has a built-in <a href="https://git-scm.com/docs/gitweb" rel="noopener nofollow" target="_blank">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 class="prettyprint">git instaweb</code> from within your repo. Your browser should pop open, and load <code class="prettyprint">http://localhost:1234</code>. If you don't have Lighttpd installed, you can specify an alternative web server with the <code class="prettyprint">-d</code> flag. Other options can be configured either via flags (like <code class="prettyprint">-p</code> for port, <code class="prettyprint">-b</code> for the browser to open, etc), or under the <code class="prettyprint">[instaweb]</code> block in your git config.</p> <p>There's also the <code class="prettyprint">git gui</code> command, which can open up a GUI-based git app</p> <p><img src="https://i.ibb.co/0DrmcWG/Screenshot-from-2022-12-17-20-26-30.png" alt="Screenshot of Git GUI" width="400"></p> <hr> <h2>Git Notes</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-notes" rel="noopener nofollow" target="_blank">git notes</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 class="prettyprint">.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 class="prettyprint">git log</code>, using most git GUI apps, or with the <code class="prettyprint">git notes show</code> command. Some git hosts also show notes in the commit view (although <a href="https://github.blog/2010-08-25-git-notes-display/" rel="noopener nofollow" target="_blank">GH no longer displays notes</a>).</p> <hr> <h2>Git Bisect</h2> <blockquote> <p>With <a href="https://git-scm.com/docs/git-bisect" rel="noopener nofollow" target="_blank">git bisect</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 class="prettyprint">good</code> (no bug), or <code class="prettyprint">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 class="prettyprint">git bisect start</code> then pass it a known good commit with <code class="prettyprint">git bisect good &lt;commit-hash&gt;</code> and a known bad one (defaults to current) with <code class="prettyprint">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 class="prettyprint">git bisect good</code> or <code class="prettyprint">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 class="prettyprint">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> <hr> <h2>Git Grep</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-grep" rel="noopener nofollow" target="_blank">git grep</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 <kbd>Ctrl</kbd> + <kbd>F</kbd>!). </p> <p><code class="prettyprint">git grep &lt;regexp&gt; &lt;ref&gt;</code></p> <p>It includes plenty of <a href="https://git-scm.com/docs/git-grep#_options" rel="noopener nofollow" target="_blank">options</a> to narrow down your search, or specify results format. For example, use <code class="prettyprint">-l</code> to only return file names, <code class="prettyprint">-c</code> to specify number of matches per file to return, <code class="prettyprint">-e</code> to exclude results matching a condition, <code class="prettyprint">--and</code> to specify multiple conditions, <code class="prettyprint">-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 class="prettyprint">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 class="prettyprint">git grep "foo" HEAD~1</code> will search the previous commit.</p> <hr> <h2>Git Archive</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-archive" rel="noopener nofollow" target="_blank">git archive</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.</p> <div class="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> <hr> <h2>Git Submodules</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-submodule" rel="noopener nofollow" target="_blank">git submodule</a> to pull any other repository into yours</p> </blockquote> <p>In git, <a href="https://git-scm.com/docs/gitsubmodules" rel="noopener nofollow" target="_blank">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="https://notes.aliciasykes.com/17996/quick-tip-git-submodules">this post</a>.</p> <p>Running the following command will pull a module into the specified location, and also create a <code class="prettyprint">.gitmodules</code> file so that it's always downloaded when the repo is cloned. Use the <code class="prettyprint">--recursive</code> flag to include sub-modules when cloning the repo.</p> <div class="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="https://www.atlassian.com/git/tutorials/git-subtree" rel="noopener nofollow" target="_blank">git subtree</a>, which does a similar thing, but without the need for metadata files.</p> <hr> <h2>Git Bug Report</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-bugreport" rel="noopener nofollow" target="_blank">git bugreport</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="https://git-scm.com/docs/git-diagnose" rel="noopener nofollow" target="_blank">git diagnose</a> command, and then raise your issue <a href="https://github.com/git/git" rel="noopener nofollow" target="_blank">here</a>.</p> <hr> <h2>Git Fsck</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-fsck" rel="noopener nofollow" target="_blank">git fsck</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 class="prettyprint">--unreachable</code> flag to find objects that are no longer reachable from any named reference (since unlike other commands, it includes everything in <code class="prettyprint">.git/objects</code>).</p> <hr> <h2>Git Stripspace</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-stripspace" rel="noopener nofollow" target="_blank">git stripspace</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 class="prettyprint">cat ./path-to-file.txt | git stripspace</code> or <code class="prettyprint">git stripspace &lt; dirty-file.txt &gt; clean-file.txt</code></p> <p>You can also use this to remove comments (with <code class="prettyprint">--strip-comments</code>), or even comment out lines (with <code class="prettyprint">--comment-lines</code>).</p> <hr> <h2>Git Diff</h2> <blockquote> <p>With <a href="https://git-scm.com/docs/git-diff" rel="noopener nofollow" target="_blank">git diff</a> you can compare the difference between 2 sets of code</p> </blockquote> <p>You're probably aware that you you can run <code class="prettyprint">git diff</code> to show all changes since the last commit, or use <code class="prettyprint">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 class="prettyprint">diff file-1.txt file-2.txt</code> (no more visiting <a href="https://www.diffchecker.com/compare/" rel="noopener nofollow" target="_blank">diffchecker.com</a>!)</p> <p>Or compare 2 branches, or refs with each other, using <code class="prettyprint">git diff branch1..branch2</code></p> <p>Note that a double dot (<code class="prettyprint">..</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 class="prettyprint">...</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 class="prettyprint">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="https://www.git-scm.com/docs/git-range-diff" rel="noopener nofollow" target="_blank">git range-diff</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="https://git-scm.com/docs/git-diff#_description" rel="noopener nofollow" target="_blank">the docs</a>.</p> <hr> <h2>Git Hooks</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/githooks" rel="noopener nofollow" target="_blank">hooks</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="https://git-scm.com/docs/githooks" rel="noopener nofollow" target="_blank">hooks available</a> for most git events, like commit, rebase, merge, push, update, applypatch, etc.</p> <p>Hooks are stored in <code class="prettyprint">.git/hooks</code> (unless you configure them elsewhere with <code class="prettyprint">git config core.hooksPath</code>), and can be tested with the <a href="https://git-scm.com/docs/git-hook" rel="noopener nofollow" target="_blank">git hook</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="https://github.com/aitemr/awesome-git-hooks#tools" rel="noopener nofollow" target="_blank">hook manager</a>, like <a href="https://github.com/evilmartians/lefthook" rel="noopener nofollow" target="_blank">lefthook</a> or <a href="https://github.com/typicode/husky" rel="noopener nofollow" target="_blank">husky</a>. There's also several <a href="https://githooks.com/#projects" rel="noopener nofollow" target="_blank">3rd-party tools</a>, which make managing hooks easier, I recommend <a href="https://github.com/sds/overcommit" rel="noopener nofollow" target="_blank">overcommit</a>.</p> <p>Remember, hooks can always be skipped (with the <code class="prettyprint">--no-verify</code> flag), so never rely purely on hooks, especially for anything security related. </p> <hr> <h2>Git Blame</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-blame" rel="noopener nofollow" target="_blank">git blame</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:</p> <div class="highlight"><pre class="highlight shell"><code>git blame <span class="nt">-L</span> 400,420 index.rs </code></pre></div> <hr> <h2>Git LFS</h2> <blockquote> <p>Store large files using <a href="https://git-lfs.github.com/" rel="noopener nofollow" target="_blank">git lfs</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="https://git-lfs.github.com/" rel="noopener nofollow" target="_blank">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 class="prettyprint">git lfs track &lt;file glob&gt;</code>, which will update your <code class="prettyprint">.gitattributes</code> file. You can specify files by their extension (e.g. <code class="prettyprint">*.psd</code>), directory, or individually. Running <code class="prettyprint">git lfs ls-files</code> to view a list of tracked LFS files.</p> <hr> <h2>Git GC</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-gc" rel="noopener nofollow" target="_blank">git gc</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 class="prettyprint">git gc</code> will remove orphaned and inaccessible commits (with <a href="https://git-scm.com/docs/git-prune" rel="noopener nofollow" target="_blank">git prune</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 class="prettyprint">--aggressive</code> flag will <a href="https://git-scm.com/docs/git-gc#_aggressive" rel="noopener nofollow" target="_blank">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> <hr> <h2>Git Show</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-show" rel="noopener nofollow" target="_blank">git show</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 class="prettyprint">git show &lt;object&gt;</code>. You'll likely also want to append the <code class="prettyprint">--pretty</code> flag, for a clearer output, but there's many other options available to customize the output (with <code class="prettyprint">--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 class="prettyprint">git show branch:file</code></p> <hr> <h2>Git Describe</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-describe" rel="noopener nofollow" target="_blank">git describe</a> to find the latest tag reachable from a commit, and give it a human-readable name</p> </blockquote> <p>Run <code class="prettyprint">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 class="prettyprint">--all</code> flag. Git describe will also only use annotated tags by default, so you must specify the <code class="prettyprint">--tags</code> flag to make it use lightweight tags as well.</p> <hr> <h2>Git Tag</h2> <blockquote> <p>Tag a specific point in your repo's history using <a href="https://git-scm.com/docs/git-tag" rel="noopener nofollow" target="_blank">git tag</a></p> </blockquote> <p>It's often useful to be able to <a href="https://git-scm.com/book/en/v2/Git-Basics-Tagging" rel="noopener nofollow" target="_blank">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 class="prettyprint">git&nbsp;tag&nbsp;&lt;tagname&gt;</code>, or you can tag a historical commit with <code class="prettyprint">git tag -a v4.2.0 &lt;commit sha&gt;</code>. Like with commits, you can include a message alongside a tag, using <code class="prettyprint">-m</code>.</p> <p>Don't forget to push your tag to remote, with <code class="prettyprint">git push origin &lt;tagname&gt;</code>.<br> To list all tags, just run <code class="prettyprint">git&nbsp;tag</code>, and optionally use <code class="prettyprint">-l</code> for a wildcard search.<br> You'll then be able to checkout a specific tag, with <code class="prettyprint">git&nbsp;checkout&nbsp;&lt;tagname&gt;</code></p> <hr> <h2>Git Reflog</h2> <blockquote> <p>List all updates made on your repo using <a href="https://git-scm.com/docs/git-reflog" rel="noopener nofollow" target="_blank">git reflog</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 class="prettyprint">git reflog</code> to view recent events on <code class="prettyprint">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 class="prettyprint">HEAD</code> (your current branch), but you can run reflog on any ref. For example <code class="prettyprint">git reflog show &lt;branch name&gt;</code>, or to see stashed changes with <code class="prettyprint">git reflog stash</code>. Or show all references with <code class="prettyprint">git reflog show --all</code></p> <hr> <h2>Git Log</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-log" rel="noopener nofollow" target="_blank">git log</a> to view a list of commits</p> </blockquote> <p>You're likely already familiar with running <code class="prettyprint">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 class="prettyprint">git log --graph --decorate --oneline</code> will show a nice neat commit graph along with ref pointers.</p> <p><img src="https://i.ibb.co/c1WByg8/Screenshot-from-2022-12-17-20-43-56.png" alt="example git log output"></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 class="prettyprint">git log --search="&lt;anything&gt;"</code> - Search logs for specific code changes</li> <li><code class="prettyprint">git log --author="&lt;pattern&gt;"</code> - Show log only for specific author(s)</li> <li><code class="prettyprint">git log --grep="&lt;pattern&gt;"</code> - Filter log using search term or regex</li> <li><code class="prettyprint">git log &lt;since&gt;..&lt;until&gt;</code> - Show all commits between two references</li> <li><code class="prettyprint">git log -- &lt;file&gt;</code> - Show all commits made only to a specific file</li> </ul> <p>Or, just run <code class="prettyprint">git shortlog</code> for a summerized list of commits.</p> <hr> <h2>Git Cherry Pick</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-cherry-pick" rel="noopener nofollow" target="_blank">git cherry-pick</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 class="prettyprint">git cherry-pick &lt;commit-hash&gt;</code>. This will pull the specified commit into your current branch.</p> <hr> <h2>Git Switch</h2> <blockquote> <p>Use <a href="https://git-scm.com/docs/git-switch" rel="noopener nofollow" target="_blank">git switch</a></p> </blockquote> <p>Moving between branches is something that we do often, the <code class="prettyprint">switch</code> command is like a simplified version of <code class="prettyprint">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 class="prettyprint">checkout -b</code>, with the switch command you can append the <code class="prettyprint">-c</code> flag to create a new branch, and jump strait into it, e.g. <code class="prettyprint">git switch -c &lt;new branch&gt;</code>. And running <code class="prettyprint">git switch -</code> will discard any experimental changes you've made, and return you to your previous branch.</p> <hr> <h2>Git Standup</h2> <blockquote> <p>Use <a href="https://github.com/kamranahmedse/git-standup" rel="noopener nofollow" target="_blank">git standup</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="https://github.com/kamranahmedse/git-standup#install" rel="noopener nofollow" target="_blank">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 class="prettyprint">git standup</code>, or use <a href="https://github.com/kamranahmedse/git-standup#options" rel="noopener nofollow" target="_blank">these options</a> to specify what data should be shown (author, timeframe, branches, etc.</p> <hr> <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="https://github.com/tj/git-extras/blob/master/Commands.md" rel="noopener nofollow" target="_blank">git-extras</a> by <a href="https://github.com/tj" rel="noopener nofollow" target="_blank">@tj</a>. It gives you 70+ <a href="https://github.com/tj/git-extras/blob/master/Commands.md" rel="noopener nofollow" target="_blank">extra commands</a> to automate common git jobs.</p> <p>For a list of more useful git add-ons, see <a href="https://github.com/stevemao/awesome-git-addons" rel="noopener nofollow" target="_blank">stevemao/awesome-git-addons</a>.</p> <p>If you're working with GitHub repos, then the <a href="https://cli.github.com/" rel="noopener nofollow" target="_blank">GitHub CLI</a> let's you do common tasks (managing PRs, issues, code reviews, etc) from the command line.</p> </p> Super Useful CSS Resources ๐ŸŒˆ Alicia's Notes ๐Ÿš€ Sat, 03 Dec 2022 17:25:01 +0000 https://notes.aliciasykes.com/40638/super-useful-css-resources https://notes.aliciasykes.com/40638/super-useful-css-resources <p><p>View on Dev.to: <a href="https://dev.to/lissy93/super-useful-css-resources-1ba3"><img width="250" style="display: inline; width: 250px; margin: 0;" src="https://img.shields.io/badge/Dev.to-Super_Useful_CSS_Resources_๐ŸŒˆ-%23a300ff?logo=Dev.to&amp;style=flat-square" alt="Super Useful CSS Resources ๐ŸŒˆ"></a></p> <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><a href="#property-generators">Property Generators</a></li> <li><a href="#animations">Animations</a></li> <li><a href="#backgrounds">Backgrounds</a></li> <li><a href="#colors">Color Tools</a></li> <li><a href="#typography">Typography</a></li> <li><a href="#loaders">Loaders</a></li> <li><a href="#layouts">Layouts</a></li> <li><a href="#informative">Informative</a></li> </ul> <h2 id="property-generators">Property Generators</h2> <h3>1. <a href="https://neumorphism.io" rel="noopener nofollow" target="_blank">Neumorphism</a></h3> <blockquote> <p>Generate Soft-UI CSS styles using inset shadows, by <a href="https://github.com/adamgiebl" rel="noopener nofollow" target="_blank">@adamgiebl</a></p> </blockquote> <p><img src="https://i.ibb.co/vPH0YMV/32-neumorphism.gif" alt="screenshot"></p> <h3>2. <a href="https://shadows.brumm.af/" rel="noopener nofollow" target="_blank">Shaddows Brumm</a></h3> <blockquote> <p>Make and preview beautifully smooth shadows, by <a href="https://github.com/brumm" rel="noopener nofollow" target="_blank">@brumm</a></p> </blockquote> <p><img src="https://i.ibb.co/vD2rd3G/25-shadows-brum.gif" alt="screenshot"></p> <h3>3. <a href="https://9elements.github.io/fancy-border-radius/" rel="noopener nofollow" target="_blank">Fancy Border Radius</a></h3> <blockquote> <p>Generate cool shaped objects with border-radius, by <a href="https://github.com/9elements" rel="noopener nofollow" target="_blank">@9Elements</a>. Similar to <a href="https://www.blobmaker.app/" rel="noopener nofollow" target="_blank">BlobMaker</a></p> </blockquote> <p><img src="https://i.ibb.co/0KQPHHh/35-fancy-border-radius.gif" alt="screenshot"></p> <h3>4. <a href="https://cssbud.com/css-generator/css-glow-generator/" rel="noopener nofollow" target="_blank">Glow Generator</a></h3> <blockquote> <p>Generate pure CSS, cross-browser glow effects</p> </blockquote> <p><img src="https://i.ibb.co/DDfw0Mz/54-glow-generator.gif" alt="screenshot"></p> <h3>5. <a href="https://onotakehiko.dev/clothoid/" rel="noopener nofollow" target="_blank">Clothoid Corners</a></h3> <blockquote> <p>Generates clothoid rounded corners by CSS clip-path, by <a href="https://onotakehiko.com/" rel="noopener nofollow" target="_blank">Takehiko Ono</a></p> </blockquote> <p><img src="https://i.ibb.co/HHR644q/33-clothoid.gif" alt="screenshot"></p> <h3>6. <a href="https://hype4.academy/tools/glassmorphism-generator" rel="noopener nofollow" target="_blank">Glassmorphism</a></h3> <blockquote> <p>Build semi-transparent, blurred glass-like backgrounds. Similar to <a href="https://ui.glass/generator/" rel="noopener nofollow" target="_blank">ui.glass/generator</a></p> </blockquote> <p><img src="https://i.ibb.co/89R9Ckp/55-css-glow.gif" alt="screenshot"></p> <h3>7. <a href="https://bennettfeely.com/clippy/" rel="noopener nofollow" target="_blank">Clipy</a></h3> <blockquote> <p>Generate complex shaped objects using clip-path, by <a href="https://github.com/bennettfeely" rel="noopener nofollow" target="_blank">@bennettfeely</a></p> </blockquote> <p><img src="https://i.ibb.co/fHjj3FP/34-clippy.gif" alt="screenshot"></p> <h3>8. <a href="https://www.cssfilters.co/" rel="noopener nofollow" target="_blank">CSS Filters</a></h3> <blockquote> <p>Generate and preview pure CSS Instagram-style photo filters, by <a href="https://github.com/ghosh" rel="noopener nofollow" target="_blank">@ghosh</a></p> </blockquote> <p><img src="https://i.ibb.co/4Nwr01c/37-cssfilters.gif" alt="screenshot"></p> <h3>9. <a href="https://www.base64-image.de/" rel="noopener nofollow" target="_blank">Base64 Image</a></h3> <blockquote> <p>Encode an image directly in your CSS in Base64</p> </blockquote> <p><img src="https://i.ibb.co/FgTRfQd/38-base64-image.gif" alt="screenshot"></p> <h3>10. <a href="https://quantityqueries.com/" rel="noopener nofollow" target="_blank">Quantity Queries</a></h3> <blockquote> <p>Generate quantity-based CSS queries, by <a href="https://github.com/drewminns" rel="noopener nofollow" target="_blank">@drewminns</a></p> </blockquote> <p><img src="https://i.ibb.co/wK77hT7/39-quantityqueries.png" alt="screenshot"></p> <hr> <h2 id="animations">Animations</h2> <h3>11. <a href="https://animista.net/play" rel="noopener nofollow" target="_blank">Animista</a></h3> <blockquote> <p>CSS animation playground and generator, by <a href="https://www.linkedin.com/in/anatravas" rel="noopener nofollow" target="_blank">Ana T</a></p> </blockquote> <p><img src="https://i.ibb.co/zQ0y2mk/1-animista.gif" alt="screenshot"></p> <h3>12. <a href="https://cubic-bezier.com/" rel="noopener nofollow" target="_blank">Cubic-Bezier</a></h3> <blockquote> <p>Preview and generate advanced cubic bezier animations, by <a href="https://github.com/LeaVerou" rel="noopener nofollow" target="_blank">@LeaVerou</a></p> </blockquote> <p><img src="https://i.ibb.co/bLHhQ41/2-cubic-besier.gif" alt="screenshot"></p> <h3>13. <a href="https://keyframes.app/animate" rel="noopener nofollow" target="_blank">Keyframes</a></h3> <blockquote> <p>Advanced keyframe animation maker, by <a href="https://github.com/mitchas" rel="noopener nofollow" target="_blank">@mitchas</a></p> </blockquote> <p><img src="https://i.ibb.co/dK3Lxgr/3-keyframes.png" alt="screenshot"></p> <h3>14. <a href="https://waitanimate.wstone.uk/" rel="noopener nofollow" target="_blank">Wait Animate</a></h3> <blockquote> <p>Use animation-delay to simulate delays, by <a href="https://github.com/will-stone" rel="noopener nofollow" target="_blank">@will-stone</a></p> </blockquote> <p><img src="https://i.ibb.co/NZPMwf8/4-waitanimate.png" alt="screenshot"></p> <h3>15. <a href="https://www.transition.style" rel="noopener nofollow" target="_blank">Transition.Style</a></h3> <blockquote> <p>Copy-paste transition animations, by <a href="https://github.com/argyleink" rel="noopener nofollow" target="_blank">@argyleink</a></p> </blockquote> <p><img src="https://i.ibb.co/YPwRgVW/5-transition.gif" alt="screenshot"></p> <hr> <h2 id="backgrounds">Backgrounds</h2> <h3>16. <a href="https://heropatterns.com/" rel="noopener nofollow" target="_blank">Hero Patterns</a></h3> <blockquote> <p>Find and customize simple pure-CSS patterned backgrounds, by <a href="https://twitter.com/steveschoger" rel="noopener nofollow" target="_blank">@steveschoger</a></p> </blockquote> <p><img src="https://i.ibb.co/gdnKVKG/56-hero-backgrounds.gif" alt="screenshot"></p> <h3>17. <a href="https://app.haikei.app/" rel="noopener nofollow" target="_blank">Haikei</a></h3> <blockquote> <p>Generate unique organic SVG banners and backgrounds (similar to <a href="https://www.shapedivider.app/" rel="noopener nofollow" target="_blank">Shape Divider</a>)</p> </blockquote> <p><img src="https://i.ibb.co/dQqztYV/14-haikei.gif" alt="screenshot"></p> <h3>18. <a href="https://doodad.dev/pattern-generator/" rel="noopener nofollow" target="_blank">Pattern Generator</a></h3> <blockquote> <p>Advanced pattern generator</p> </blockquote> <p><img src="https://i.ibb.co/th8khVj/15-pattern-generator.gif" alt="screenshot"></p> <h3>19. <a href="https://css-pattern.com/" rel="noopener nofollow" target="_blank">CSS Pattern</a></h3> <blockquote> <p>Collection of pre-made pure CSS patterned backgrounds, by <a href="https://github.com/Afif13" rel="noopener nofollow" target="_blank">@Afif13</a></p> </blockquote> <p><img src="https://i.ibb.co/Hh37hbb/16-css-pattern.gif" alt="screenshot"></p> <h3>20. <a href="https://patternizer.com" rel="noopener nofollow" target="_blank">Patternizer</a></h3> <blockquote> <p>Build striped backgrounds, by <a href="https://twitter.com/matthewlein" rel="noopener nofollow" target="_blank">@matthewlein</a></p> </blockquote> <p><img src="https://i.ibb.co/PMMQC6F/17-patternizer.png" alt="screenshot"></p> <h3>21. <a href="http://www.patternify.com/" rel="noopener nofollow" target="_blank">Patternify</a></h3> <blockquote> <p>Build your own old-school pattern, by <a href="https://twitter.com/SachaGreif" rel="noopener nofollow" target="_blank">@SachaGreif</a></p> </blockquote> <p><img src="https://i.ibb.co/2P45cZT/18-patternify.gif" alt="screenshot"></p> <h3>22. <a href="https://wweb.dev/resources/animated-css-background-generator/" rel="noopener nofollow" target="_blank">Animated BG</a></h3> <blockquote> <p>Generate blurred animated pure CSS backgrounds</p> </blockquote> <p><img src="https://i.ibb.co/KFwrZQS/19-animated-bg.gif" alt="screenshot"></p> <h3>23. <a href="https://trianglify.io/" rel="noopener nofollow" target="_blank">Trianglify</a></h3> <blockquote> <p>Geometric background designer (note: only semmi-free), by <a href="https://github.com/qrohlf" rel="noopener nofollow" target="_blank">@qrohlf</a></p> </blockquote> <p><img src="https://i.ibb.co/6F812Dd/20-trianglify.gif" alt="screenshot"></p> <h3>24. <a href="https://animatedbackgrounds.me" rel="noopener nofollow" target="_blank">Animated Backgrounds</a></h3> <blockquote> <p>Collection of pure CSS background animations</p> </blockquote> <p><img src="https://i.ibb.co/YhxFmVw/21-animatedbackgrounds.png" alt="screenshot"></p> <h3>25. <a href="https://www.magicpattern.design/tools/css-backgrounds" rel="noopener nofollow" target="_blank">Magic Pattern CSS Backgrounds</a></h3> <blockquote> <p>Collection of reusable SVG-based / pure CSS background patterns, with a visual explorer</p> </blockquote> <p><img src="https://i.ibb.co/gdnKVKG/56-hero-backgrounds.gif" alt="screenshot"></p> <hr> <h2 id="colors">Colors</h2> <h3>26. <a href="https://cssgradient.io/" rel="noopener nofollow" target="_blank">CSS Gradient</a></h3> <blockquote> <p>Advanced CSS gradient builder</p> </blockquote> <p><img src="https://i.ibb.co/xJG5cCv/6-cssgradient.png" alt="screenshot"></p> <h3>27. <a href="https://colormixer.web.app" rel="noopener nofollow" target="_blank">Parametric Mixer</a></h3> <blockquote> <p>Equaliser-based CSS color composer. by <a href="https://twitter.com/dawidwoldu" rel="noopener nofollow" target="_blank">@dawidwoldu</a></p> </blockquote> <p><img src="https://i.ibb.co/k6T022D/60-parametric-mixer.gif" alt="screenshot"></p> <h3>28. <a href="https://palettte.app/" rel="noopener nofollow" target="_blank">Palettte.</a></h3> <blockquote> <p>Develop and tweak color schemes</p> </blockquote> <p><img src="https://i.ibb.co/wr7Zhdz/61-palettte.gif" alt="screenshot"></p> <h3>29. <a href="https://paletton.com" rel="noopener nofollow" target="_blank">Paletton</a></h3> <blockquote> <p>Palette builder using opposing or attracting colors</p> </blockquote> <p><img src="https://i.ibb.co/qBYcsgk/7-paletton.png" alt="screenshot"></p> <h3>30. <a href="https://www.grabient.com/" rel="noopener nofollow" target="_blank">Grabient</a></h3> <blockquote> <p>Sample gradients.<br> Similar to <a href="https://webkul.github.io/coolhue/" rel="noopener nofollow" target="_blank">CoolHue</a>, <a href="https://webgradients.com/" rel="noopener nofollow" target="_blank">WebGradients.com</a>, <a href="https://gradienthunt.com/" rel="noopener nofollow" target="_blank">GradientHunt</a>, <a href="https://gradientbuttons.colorion.co/" rel="noopener nofollow" target="_blank">GradientButtons</a> and <a href="https://uigradients.com" rel="noopener nofollow" target="_blank">UI gradients</a></p> </blockquote> <p><img src="https://i.ibb.co/Qj88dCZ/8-grabient.png" alt="screenshot"></p> <h3>31. <a href="https://colorhunt.co/" rel="noopener nofollow" target="_blank">Color Hunt</a></h3> <blockquote> <p>Yet another color palette designer</p> </blockquote> <p><img src="https://i.ibb.co/ZVWbL7s/9-colorhunt.png" alt="screenshot"></p> <h3>32. <a href="https://larsenwork.com/easing-gradients/#editor" rel="noopener nofollow" target="_blank">Easing Gradients</a></h3> <blockquote> <p>Cubic-bezier style pure CSS gradients, by <a href="https://github.com/larsenwork" rel="noopener nofollow" target="_blank">@larsenwork</a></p> </blockquote> <p><img src="https://i.ibb.co/bdr9R8P/10-easing-gradients.png" alt="screenshot"></p> <h3>33. <a href="https://flatuicolors.com/" rel="noopener nofollow" target="_blank">Flat UI Colors</a></h3> <blockquote> <p>Flat-style handpicked color palettes, by <a href="https://twitter.com/ahmetsulek" rel="noopener nofollow" target="_blank">@ahmetsulek</a></p> </blockquote> <p><img src="https://i.ibb.co/t3TwmWw/11-flatuicolors.png" alt="screenshot"></p> <h3>34. <a href="https://colordesigner.io/tools" rel="noopener nofollow" target="_blank">Color Tools</a></h3> <blockquote> <p>Mix, extract, convert and generate colors</p> </blockquote> <p><img src="https://i.ibb.co/1ntDHZc/12-colordesigner.png" alt="screenshot"></p> <h3>35. <a href="https://colorpalettes.earth/" rel="noopener nofollow" target="_blank">ColorPalettes.Earth</a></h3> <blockquote> <p>Natural color pallets from nature</p> </blockquote> <p><img src="https://i.ibb.co/tJ0JMK6/13-eart-palettes.png" alt="screenshot"></p> <hr> <h2 id="typography">Typography</h2> <h3>36. <a href="https://fontjoy.com/" rel="noopener nofollow" target="_blank">Font Joy</a></h3> <blockquote> <p>Discover and preview various font pairings, by <a href="https://github.com/Jack000" rel="noopener nofollow" target="_blank">@Jack000</a></p> </blockquote> <p><img src="https://i.ibb.co/2jGJdDD/22-font-joy.png" alt="screenshot"></p> <h3>37. <a href="https://typesetwith.me/" rel="noopener nofollow" target="_blank">Type set With Me</a></h3> <blockquote> <p>Typography &amp; legibility sandbox, by <a href="https://github.com/tsmith512" rel="noopener nofollow" target="_blank">@tsmith512</a></p> </blockquote> <p><img src="https://i.ibb.co/5vFDphR/23-typesetwith.png" alt="screenshot"></p> <h3>38. <a href="https://type-scale.com/" rel="noopener nofollow" target="_blank">Type Scale</a></h3> <blockquote> <p>Generate heading/ body font sizes, by <a href="https://github.com/jeremychurch" rel="noopener nofollow" target="_blank">@jeremychurch</a></p> </blockquote> <p><img src="https://i.ibb.co/4809qtW/24-typescale.png" alt="screenshot"></p> <h3>39. <a href="https://glyphter.com/" rel="noopener nofollow" target="_blank">Glyphter</a></h3> <blockquote> <p>Create icon fonts from SVG graphics</p> </blockquote> <p><img src="https://i.ibb.co/x3myt3N/25-glyphter.png" alt="screenshot"></p> <h3>40. <a href="https://katydecorah.com/font-library" rel="noopener nofollow" target="_blank">Font-Library</a></h3> <blockquote> <p>Tagged library of Google Fonts, by <a href="https://github.com/katydecorah" rel="noopener nofollow" target="_blank">@katydecorah</a></p> </blockquote> <p><img src="https://i.ibb.co/gPCghyQ/26-font-library.png" alt="screenshot"></p> <h3>41. <a href="https://wh0.github.io/glitter/" rel="noopener nofollow" target="_blank">Glitter</a></h3> <blockquote> <p>Export 90s-style Glitter text</p> </blockquote> <p><img src="https://i.ibb.co/GFyMm5k/27-glitter.png" alt="screenshot"></p> <hr> <h2 id="loaders">Loaders</h2> <h3>42. <a href="https://tobiasahlin.com/spinkit/" rel="noopener nofollow" target="_blank">Spin Kit</a></h3> <blockquote> <p>Selection of clean CSS loading animations</p> </blockquote> <p><img src="https://i.ibb.co/t2CJLg0/28-spinkit.gif" alt="screenshot"></p> <h3>43. <a href="https://whirl.netlify.app/" rel="noopener nofollow" target="_blank">Whirl</a></h3> <blockquote> <p>100+ CSS loading animations, for copy-paste</p> </blockquote> <p><img src="https://i.ibb.co/rvG8Bzx/29-whirl.gif" alt="screenshot"></p> <h3>44. <a href="https://www.cssportal.com/css-loader-generator/" rel="noopener nofollow" target="_blank">Loader Generator</a></h3> <blockquote> <p>Pre-built and custom pure CSS loaders</p> </blockquote> <p><img src="https://i.ibb.co/7jwBBj4/30-loader-generator.gif" alt="screenshot"></p> <h3>45. <a href="https://projects.lukehaas.me/css-loaders/" rel="noopener nofollow" target="_blank">lukehaas - CSS-Loaders</a></h3> <blockquote> <p>Simple pure CSS loading animations</p> </blockquote> <p><img src="https://i.ibb.co/M1YWH6d/31-lukehaas-single-element.gif" alt="screenshot"></p> <h3>46. <a href="https://cssloaders.github.io/" rel="noopener nofollow" target="_blank">CSSLoaders</a></h3> <blockquote> <p>Complex pure CSS loaders</p> </blockquote> <h3>47. <a href="https://loading.io/css/" rel="noopener nofollow" target="_blank">loading.io/css</a></h3> <blockquote> <p>CSS implementations of common loaders</p> </blockquote> <hr> <h2 id="layouts">Layouts</h2> <h3>48. <a href="https://cssgridgarden.com/" rel="noopener nofollow" target="_blank">CSS Grid Garden</a></h3> <blockquote> <p>Interactive game for learning CSS grid, by <a href="https://github.com/thomaspark" rel="noopener nofollow" target="_blank">@thomaspark</a></p> </blockquote> <p><img src="https://i.ibb.co/Ph6kx0X/40-css-gridgarden.png" alt="screenshot"></p> <h3>49. <a href="https://flexboxfroggy.com/" rel="noopener nofollow" target="_blank">FlexboxFroggy</a></h3> <blockquote> <p>Interactive game for learning flexbox, by <a href="https://github.com/thomaspark" rel="noopener nofollow" target="_blank">@thomaspark</a></p> </blockquote> <p><img src="https://i.ibb.co/SPy0Qdg/41-flexbox-froggy.png" alt="screenshot"></p> <h3>50. <a href="https://bennettfeely.com/flexplorer/" rel="noopener nofollow" target="_blank">Flexplorer</a></h3> <blockquote> <p>Visual flexbox demo, by <a href="https://twitter.com/bennettfeely" rel="noopener nofollow" target="_blank">@bennettfeely</a></p> </blockquote> <p><img src="https://i.ibb.co/dbqDnnZ/42-flexsplorer.png" alt="screenshot"></p> <h3>51. <a href="https://www.flexulator.com/" rel="noopener nofollow" target="_blank">Flexulator</a></h3> <blockquote> <p>An interactive CSS Flexbox space distribution calculator, by <a href="https://github.com/telagraphic" rel="noopener nofollow" target="_blank">@telagraphic</a></p> </blockquote> <p><img src="https://i.ibb.co/pZNwVZj/43-flexulator.png" alt="screenshot"></p> <h3>52. <a href="https://cssgrid-generator.netlify.app/" rel="noopener nofollow" target="_blank">Grid Generator</a></h3> <blockquote> <p>Make grids using the CSS grid-template properties, by <a href="https://github.com/sdras" rel="noopener nofollow" target="_blank">@sdras</a> (similar to <a href="https://grid.layoutit.com/" rel="noopener nofollow" target="_blank">grid.layoutit.com</a>)</p> </blockquote> <p><img src="https://i.ibb.co/59t7mw0/44-grid-generator.png" alt="screenshot"></p> <h3>53. <a href="https://layout.bradwoods.io/" rel="noopener nofollow" target="_blank">Layout Generator</a></h3> <blockquote> <p>A modern CSS layout maker</p> </blockquote> <p><img src="https://i.ibb.co/4mzZWMT/45-layout-generator.png" alt="screenshot"></p> <h3>54. <a href="https://codepen.io/carolineartz/full/ogVXZj" rel="noopener nofollow" target="_blank">Box Model Diagram</a></h3> <blockquote> <p>Just a visual box model demo</p> </blockquote> <p><img src="https://i.ibb.co/FK0p8r9/46-box-model.png" alt="screenshot"></p> <hr> <h2 id="informative">Informative</h2> <h3>55. <a href="https://css-timeline.vercel.app/" rel="noopener nofollow" target="_blank">CSS Timeline</a></h3> <blockquote> <p>A history of CSS</p> </blockquote> <p><img src="https://i.ibb.co/fSHtrQ8/47-css-timeline.png" alt="screenshot"></p> <h3>56. <a href="https://screensizemap.com/" rel="noopener nofollow" target="_blank">Screen Size Map</a></h3> <blockquote> <p>View popular screen sizes for responsive design</p> </blockquote> <p><img src="https://i.ibb.co/gvt1rX9/48-screensizemap.png" alt="screenshot"></p> <h3>57. <a href="https://katydecorah.com/css-ruler/" rel="noopener nofollow" target="_blank">CSS Ruler</a></h3> <blockquote> <p>Preview various CSS units relative to each other</p> </blockquote> <p><img src="https://i.ibb.co/RbVTKXk/49-css-ruler.png" alt="screenshot"></p> <h3>58. <a href="http://bada55.io/" rel="noopener nofollow" target="_blank">bada55</a></h3> <blockquote> <p>List of very funny CSS hex color codes<br> See also, <a href="https://colors.lol/" rel="noopener nofollow" target="_blank">colors.lol</a> for some overly-descriptive color pallets</p> </blockquote> <p><img src="https://i.ibb.co/WW3vXs6/50-bada55.png" alt="screenshot"></p> <h3>59. <a href="https://www.whocanuse.com" rel="noopener nofollow" target="_blank">Who can use?</a></h3> <blockquote> <p>Checks accessibility grade of a given color combinations, similar to <a href="https://colorable.jxnblk.com/" rel="noopener nofollow" target="_blank">Colorable</a></p> </blockquote> <p><img src="https://i.ibb.co/ZGVxFvf/59-who-can-use.png" alt="screenshot"></p> <h3>60. <a href="https://caniuse.com/" rel="noopener nofollow" target="_blank">Can I use?</a></h3> <blockquote> <p>Browser compatibility check of various, CSS, JS, HTML and web features</p> </blockquote> <p><img src="https://i.ibb.co/sg6MLP3/57-can-i-use.png" alt="screenshot"></p> <h3>61. <a href="https://www.caniemail.com/" rel="noopener nofollow" target="_blank">Can I email?</a></h3> <blockquote> <p>Similar to <a href="https://caniuse.com" rel="noopener nofollow" target="_blank">Can I use?</a>, but checks if a given CSS property (or HTML elem) is compatible with email clients</p> </blockquote> <p><img src="https://i.ibb.co/h7qwsnb/58-can-i-email.png" alt="screenshot"></p> <h3>62. <a href="https://codebeautify.org/css-tools" rel="noopener nofollow" target="_blank">CSS Processing Tools</a></h3> <blockquote> <p>Convert to and from any other CSS language</p> </blockquote> <p><img src="https://i.ibb.co/82F5fSG/51-css-tools.png" alt="screenshot"></p> <h3>63. <a href="https://unused-css.com/" rel="noopener nofollow" target="_blank">Unused CSS</a></h3> <blockquote> <p>Searches your site for unused CSS, and displays stats</p> </blockquote> <p><img src="https://i.ibb.co/z4MYSs5/52-unused-css.png" alt="screenshot"></p> <h3>64. <a href="https://component.gallery" rel="noopener nofollow" target="_blank">Component.Gallery</a></h3> <blockquote> <p>Global component search</p> </blockquote> <p><img src="https://i.ibb.co/YPLHzd8/53-component-gallery.png" alt="screenshot"></p> <h3>65. <a href="https://designsystemsrepo.com/design-systems-recent/" rel="noopener nofollow" target="_blank">Design System Gallery</a></h3> <blockquote> <p>A collection of open design systems, for inspiration</p> </blockquote> <h3>66. <a href="https://www.checklist.design/" rel="noopener nofollow" target="_blank">Checklist.design</a></h3> <blockquote> <p>A collection of design best practices organised as checklists</p> </blockquote> <h3>67. <a href="https://css-tricks.com/snippets/html/glyphs/" rel="noopener nofollow" target="_blank">Glyphs</a></h3> <blockquote> <p>A list of CSS glyph character codes (see also <a href="https://glyphsearch.com" rel="noopener nofollow" target="_blank">GlyphSearch</a> for library icons)</p> </blockquote> <h3>68. <a href="https://css-tricks.com/" rel="noopener nofollow" target="_blank">CSS-Tricks.com</a></h3> <blockquote> <p>The best CSS blog out there</p> </blockquote> <h3>69. <a href="https://github.com/kudapara/curated-design-tools" rel="noopener nofollow" target="_blank">Curated Design Tools</a></h3> <blockquote> <p>A curated list of awesome design tools</p> </blockquote> <h3>70. <a href="https://github.com/troxler/awesome-css-frameworks" rel="noopener nofollow" target="_blank">Awesome-CSS-Frameworks</a></h3> <blockquote> <p>A list of open source CSS frameworks</p> </blockquote> <h3>71. <a href="https://cssreference.io/" rel="noopener nofollow" target="_blank">CSS Reference</a></h3> <blockquote> <p>A visual guide to CSS properties (similar to <a href="https://htmlreference.io/" rel="noopener nofollow" target="_blank">htmlreference.io</a>)</p> </blockquote> <h3>72. <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference" rel="noopener nofollow" target="_blank">MDN CSS Docs</a></h3> <blockquote> <p>Excellent documentation of all available CSS properties</p> </blockquote> <style> .post-body.p1 img, .post-body.p1 ul, .post-body.p1 small, .post-body.p1 blockquote { max-width: 600px !important; width: 100%; margin: 0 auto; border-radius: 5px; } .post-body.p1 blockquote { margin: 1rem auto; } .post-body.p1 img { box-shadow: 1px 2px 4px 2px #090909cf; } .post-body.p1 h2 { font-size: 1.8rem !important; max-width: 800px; margin: 1rem auto 0.25rem auto; text-align: center; } .post-body.p1 h3 { font-size: 1.5rem !important; border-top: 3px solid var(--post-code-border-color); padding: 1rem 0 0; max-width: 600px; margin: 1rem auto; } </style> </p> Generate Pretty Code / App Screenshots ๐Ÿ“ธ Alicia's Notes ๐Ÿš€ Sat, 26 Nov 2022 16:13:49 +0000 https://notes.aliciasykes.com/40473/generate-pretty-code-app-screenshots https://notes.aliciasykes.com/40473/generate-pretty-code-app-screenshots <p><p>Spice up your docs, blog posts and Tweets with some pretty screenshots!<br> The following is a list of 20 free tools, that will generate nicely formatted screenshots of code, device mockups and embedded info.</p> <h2>Code Screenshots</h2> <h3>1. <a href="https://ray.so/" rel="noopener nofollow" target="_blank">Ray.so</a></h3> <blockquote> <p><a href="https://ray.so/" rel="noopener nofollow" target="_blank">Ray.so</a> developed by the team behind Raycast, generates clean and minimal code screenshots.<br> You can also specify options via GET URL params, so you could programatically generate an image (e.g. using <a href="https://github.com/raycast/script-commands/blob/master/commands/developer-utils/create-image-from-code.sh" rel="noopener nofollow" target="_blank">this shell script</a>, or <a href="https://marketplace.visualstudio.com/items?itemName=Goopware.raythis" rel="noopener nofollow" target="_blank">this VS Code extension</a>).</p> </blockquote> <p><img src="https://i.ibb.co/SmVqcYs/1-ray-so.png" alt="screenshot"></p> <h3>2. <a href="https://app.codeimage.dev/" rel="noopener nofollow" target="_blank">CodeImage</a></h3> <blockquote> <p><a href="https://app.codeimage.dev/" rel="noopener nofollow" target="_blank">CodeImage</a>, built by Riccardo Perra, and available on GitHub at <a href="https://github.com/riccardoperra/codeimage" rel="noopener nofollow" target="_blank">riccardoperra/codeimage</a>, let's you generate customized code screenshots, but also embed live code with support for multiple files.</p> </blockquote> <p><img src="https://i.ibb.co/2jpJGk7/codeimage-screenshot.png" alt="screenshot"></p> <h3>3. <a href="https://carbon.now.sh/" rel="noopener nofollow" target="_blank">Carbon</a></h3> <blockquote> <p><a href="https://carbon.now.sh/" rel="noopener nofollow" target="_blank">Carbon</a> has more advanced styling options. It's open source (<a href="https://github.com/carbon-app/carbon" rel="noopener nofollow" target="_blank">view on GitHub</a>) and developed by <a href="https://github.com/mfix22" rel="noopener nofollow" target="_blank">@mfix22</a>.<br> You can also directly generate an image from a GitHub Gist, by passing the Gist ID in the URL, for example: <code class="prettyprint">https://carbon.now.sh/9da07fe8b877801f7814424a00acbe90</code></p> </blockquote> <p><img src="https://i.ibb.co/Bz24QTJ/2-carbon-sh.png" alt="screenshot"></p> <h3>4. <a href="https://chalk.ist/" rel="noopener nofollow" target="_blank">Chalk.ist</a></h3> <blockquote> <p><a href="https://chalk.ist/" rel="noopener nofollow" target="_blank">Chalk.ist</a> is another clean and simple option, it too is open source (<a href="https://github.com/Idered/chalk.ist" rel="noopener nofollow" target="_blank">view on GitHub</a>) developed by <a href="https://github.com/Idered" rel="noopener nofollow" target="_blank">@Idered</a>.</p> </blockquote> <p><img src="https://i.ibb.co/mSWgg9H/3-chalkist.png" alt="screenshot"></p> <h3>5. <a href="https://snappify.com/editor" rel="noopener nofollow" target="_blank">Snappify</a></h3> <blockquote> <p><a href="https://snappify.com/editor" rel="noopener nofollow" target="_blank">Snappify</a> is a snippet manager, but also includes a nice tool for generating screenshots. Login isn't required, but some extra features do need a user account. There's also a <a href="https://snappify.com/docs/integrations/vs-code" rel="noopener nofollow" target="_blank">VS Code plugin</a>, and the option to <a href="https://snappify.com/docs/embedding/getting-started" rel="noopener nofollow" target="_blank">embed code</a> into blog posts</p> </blockquote> <p><img src="https://i.ibb.co/bNzhk1n/snapify.png" alt="screenshot"></p> <h3>6. <a href="https://codekeep.io/screenshot" rel="noopener nofollow" target="_blank">CodeKeep</a></h3> <blockquote> <p><a href="https://codekeep.io/screenshot" rel="noopener nofollow" target="_blank">CodeKeep</a> is another snippet manager, but what makes their screenshot tool unique is the many options for customization. You can add text, annotations, icons and include multiple snippets in a single screenshot</p> </blockquote> <p><img src="https://i.ibb.co/tbFXM1B/codekeep.png" alt="screenshot"></p> <h3>7. <a href="https://codeimg.io/" rel="noopener nofollow" target="_blank">CodeImg.io</a></h3> <blockquote> <p><a href="https://codeimg.io/" rel="noopener nofollow" target="_blank">CodeImg.io</a> is great for social media posts, with a series of templates optimized for various websites. There are a range of themes to choose from, support for SVG exports, and many customization options. Developed by <a href="https://github.com/iduspara" rel="noopener nofollow" target="_blank">@iduspara</a>, but not open source.</p> </blockquote> <p><img src="https://i.ibb.co/7XbcPN9/code-img-io.png" alt="screenshot"></p> <h3>8. <a href="https://www.snippetshot.com/" rel="noopener nofollow" target="_blank">SnippetShot.com</a></h3> <blockquote> <p><a href="https://www.snippetshot.com/" rel="noopener nofollow" target="_blank">SnippetShot.com</a> is great for clean and simple code snippets. A variety pf backgrounds, themes and fonts, and the ability to add an attribution link, as well as Gist import, unique links and SVG export. It's developed by <a href="https://marcoslooten.com" rel="noopener nofollow" target="_blank">Marco Slooten</a>, and is not open source</p> </blockquote> <p><img src="https://i.ibb.co/XFK29r9/Snippet-shot.png" alt="screenshot"></p> <h3>VS Code Extensions</h3> <blockquote> <p>While we're on the topic of code screenshots, I have to mention a few really neat IDE extensions which help you take great screenshots, directly from VS Code.</p> <ul> <li><a href="https://marketplace.visualstudio.com/items?itemName=pnp.polacode" rel="noopener nofollow" target="_blank">Polacode</a> by <a href="https://github.com/octref" rel="noopener nofollow" target="_blank">@octref</a></li> <li><a href="https://marketplace.visualstudio.com/items?itemName=adpyke.codesnap" rel="noopener nofollow" target="_blank">CodeSnap</a> by <a href="https://github.com/kufii" rel="noopener nofollow" target="_blank">@kufii</a></li> <li><a href="https://marketplace.visualstudio.com/items?itemName=JeffersonLicet.snipped" rel="noopener nofollow" target="_blank">Snipped</a> by <a href="https://github.com/jeffersonlicet" rel="noopener nofollow" target="_blank">@jeffersonlicet</a></li> </ul> </blockquote> <hr> <h2>Browser / Device Screenshots</h2> <h3>9. <a href="https://browserframe.com/" rel="noopener nofollow" target="_blank">Browser Frame</a></h3> <blockquote> <p><a href="https://browserframe.com/" rel="noopener nofollow" target="_blank">Browser Frame</a>, developed by <a href="https://github.com/pqvst" rel="noopener nofollow" target="_blank">@pqvst</a> creates clean and minimal web browser mock-ups, with a range of browser frames in both light and dark mode supported.</p> </blockquote> <p><img src="https://i.ibb.co/9q4wH36/4-browser-frame.png" alt="screenshot"></p> <h3>10. <a href="https://www.screely.com/" rel="noopener nofollow" target="_blank">Screely</a></h3> <blockquote> <p><a href="https://www.screely.com/" rel="noopener nofollow" target="_blank">Screely</a>, developed by <a href="https://github.com/JurnW" rel="noopener nofollow" target="_blank">@JurnW</a> creates very simple browser mockups, with an optional background fill.</p> </blockquote> <p><img src="https://i.ibb.co/Q63Vyh0/5-screely.png" alt="screenshot"></p> <h3>11. <a href="https://mockuphone.com/" rel="noopener nofollow" target="_blank">Mock up Phone</a></h3> <blockquote> <p><a href="https://mockuphone.com/" rel="noopener nofollow" target="_blank">Mock up Phone</a> by Authgear has a range of different mobile, tablet, laptop and large screen device frames, which are easy to upload images into. But keep in mind the screenshots ratio must be correct to avoid it being stretched.</p> </blockquote> <p><img src="https://i.ibb.co/7ppfPcC/6-mocku-phone.png" alt="screenshot"></p> <h3>12. <a href="https://screenshot.rocks/" rel="noopener nofollow" target="_blank">Screenshot.Rocks</a></h3> <blockquote> <p><a href="https://screenshot.rocks/" rel="noopener nofollow" target="_blank">Screenshot.Rocks</a> by <a href="https://github.com/daveearley" rel="noopener nofollow" target="_blank">@daveearley</a> generates very simple browser and mobile mockups, with an optional background, shadow and controls.</p> </blockquote> <p><img src="https://i.ibb.co/z2jpDyq/7-screenshot-rocks.png" alt="screenshot"></p> <h3>13. <a href="https://theapplaunchpad.com/" rel="noopener nofollow" target="_blank">The App Launchpad</a> (requires sign up)</h3> <blockquote> <p>Unlike other options on this list, <a href="https://theapplaunchpad.com/" rel="noopener nofollow" target="_blank">The App Launchpad</a> does require sign up, but it's free to use. It's a tool that makes it easy to build beautiful screenshots for your app, optimised for publishing to Google Play and the Apple Store.</p> </blockquote> <p><img src="https://i.ibb.co/LpqC3gS/8-theapplaunchpad.png" alt="screenshot"></p> <h3>14. <a href="http://magicmockups.com" rel="noopener nofollow" target="_blank">Magic Mockups</a></h3> <blockquote> <p><a href="http://magicmockups.com" rel="noopener nofollow" target="_blank">Magic Mockups</a>, developed by Kaspars Sprogis is an older tool, but still very useful if you want to generate mockups displayed on a physical device in real-life situations. Note that your screenshot needs to be exactly the right ratio, to avoid it being stretched or cropped.</p> </blockquote> <p><img src="https://i.ibb.co/FwYrzCm/9-magicmockups.png" alt="screenshot"></p> <h3>15. <a href="https://deviceshots.com/" rel="noopener nofollow" target="_blank">Device Shots</a></h3> <blockquote> <p><a href="https://deviceshots.com/" rel="noopener nofollow" target="_blank">Device Shots</a> by <a href="https://github.com/diogocapela" rel="noopener nofollow" target="_blank">@diogocapela</a> let's you build colourful, annotated app screenshots.</p> </blockquote> <p><img src="https://i.ibb.co/K7FjMXv/10-deviceshots.png" alt="screenshot"></p> <hr> <h2>Social Media Screenshots</h2> <h3>16. <a href="https://poet.so/" rel="noopener nofollow" target="_blank">Poet.so</a></h3> <blockquote> <p><a href="https://poet.so/" rel="noopener nofollow" target="_blank">Poet.so</a>, built by Callum Mckeefery generated beutiful embeded social media posts. It supports content fetched from Twitter, LinkedIn and Shopify, and has several themes and customization options.</p> </blockquote> <p><img src="https://i.ibb.co/fCsH518/11-poet.png" alt="screenshot"></p> <h3>14. <a href="https://tweetlet.net/" rel="noopener nofollow" target="_blank">Tweetlet</a></h3> <blockquote> <p><a href="https://tweetlet.net/" rel="noopener nofollow" target="_blank">Tweetlet</a> by Basharath is very similar to Poet, but also supports embedding code, images, text and Tweets.</p> </blockquote> <p><img src="https://i.ibb.co/7rD7zNb/12-tweetlet.png" alt="screenshot"></p> <hr> <h2>General</h2> <h3>17. <a href="https://mockoops.mohitya.dev/create" rel="noopener nofollow" target="_blank">Mockoops</a></h3> <blockquote> <p><a href="https://mockoops.mohitya.dev" rel="noopener nofollow" target="_blank">Mockoops</a> by Mohit Yadav lets you turn any screen recording (or image) into a beautiful animated video</p> </blockquote> <p><img src="https://i.ibb.co/55MYFxC/mockoops.gif" alt="screenshot"></p> <h3>18. <a href="https://www.fabpic.app/" rel="noopener nofollow" target="_blank">Fabpic</a></h3> <blockquote> <p><a href="https://www.fabpic.app/" rel="noopener nofollow" target="_blank">Fabpic</a> by Shadab Alam adds beautiful gradient backgrounds, drop shadow and borders to any image</p> </blockquote> <p><img src="https://i.ibb.co/18LRQTN/13-fabpic.png" alt="screenshot"></p> <h3>19. <a href="https://superblog.ai/supershots" rel="noopener nofollow" target="_blank">SuperShots</a></h3> <blockquote> <p><a href="https://superblog.ai/supershots" rel="noopener nofollow" target="_blank">SuperShots</a> by Superblog is a simple tool to add gradient backgrounds to a picture. It's similar to <a href="https://prettysnap.app/" rel="noopener nofollow" target="_blank">PrettySnap</a>, which also supports patterned backgrounds</p> </blockquote> <p><img src="https://i.ibb.co/JmCzBSn/14-superblog.png" alt="screenshot"></p> <h3>20. <a href="https://prettysnap.app/" rel="noopener nofollow" target="_blank">PrettySnap.app</a></h3> <blockquote> <p>Finally, <a href="https://prettysnap.app/" rel="noopener nofollow" target="_blank">PrettySnap.app</a> applies custom patterned backgrounds, shadows, and border radius to images. It's made by <a href="https://twitter.com/kanga_bru" rel="noopener nofollow" target="_blank">@kanga_bru</a>, and there's also a <a href="https://prettysnap.io/" rel="noopener nofollow" target="_blank">Windows App</a></p> </blockquote> <p><img src="https://i.ibb.co/NVFm75L/pretty-snap.png" alt="screenshot"></p> <hr> <h2>APIs</h2> <h3>21. <a href="https://apiflash.com/" rel="noopener nofollow" target="_blank">API Flash</a></h3> <p><img src="https://i.ibb.co/SvsKdgy/Screenshot-from-2022-11-26-01-21-27.png" alt="screenshot"></p> <blockquote> <p>There's plenty of screenshot API services out there, but API Flash is one that I've personally used across countless projects. You can generate a URL which resolves to a screenshot of your website and pass in parameters to configure it (like custom CSS, element selector, device + resolution, timeout delay, no ads / cookie banner, etc).<br> Although you only get 100 scr/ month on the free plan, there's an option to set the cache time, which makes it easy to stay within that limit.</p> </blockquote> <hr> <h2>Screenshot Apps</h2> <p><br><br> <a href="https://flameshot.org" rel="noopener nofollow" target="_blank">Flameshot</a> is a free and open source (<a href="https://github.com/flameshot-org/flameshot" rel="noopener nofollow" target="_blank">here on GitHub</a>), cross-platform (C++ for Win, Mac and Linux), highly customisable desktop screenshot app. It's simple to use, includes some nice features like an in-app screenshot editor, and most importantly has an integrated command line interface. For Windows users, <a href="https://getsharex.com/" rel="noopener nofollow" target="_blank">ShareX</a> is super powerful</p> <p>If you use Firefox, you can <a href="https://support.mozilla.org/en-US/kb/take-screenshots-firefox?redirectslug=firefox-screenshots&amp;redirectlocale=en-US" rel="noopener nofollow" target="_blank">capture screenshots</a> right from your browser. Just right-click on any part of a website and select "Take Screenshot" (or <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>S</kbd>). From here, you can either capture the entire page, a selection, or specific HTML nodes.</p> <p><a href="https://www.gimp.org/" rel="noopener nofollow" target="_blank">Gimp</a> can also take screenshote (although it needs to e launched first), just navigate to File --&gt; Create --&gt; Screenshot, select your options, and hit Snap.</p> <p>Finally, the <a href="https://imagemagick.org/" rel="noopener nofollow" target="_blank">ImageMagick</a> package includes a <a href="https://imagemagick.org/script/import.php" rel="noopener nofollow" target="_blank">screenshot util</a> with plenty of customisation options, and can be invoked from the command line (with <code class="prettyprint">import</code>), or integrated into a script.</p> <p>And if you need to create visual step-by-step guides, there's several extensions that will help with this, including: <a href="https://www.tango.us/" rel="noopener nofollow" target="_blank">Tango.us</a>, <a href="https://scribehow.com/" rel="noopener nofollow" target="_blank">ScribeHow</a>, <a href="https://www.minervaknows.com/" rel="noopener nofollow" target="_blank">Minervaknows</a>, etc.</p> <style> .post-body.p1 img, blockquote { max-width: 600px !important; width: 100%; margin: 0.5rem auto; border-radius: 5px; } .post-body.p1 h2 { font-size: 1.8rem !important; max-width: 800px; margin: 1rem auto 0.25rem auto; text-align: center; } .post-body.p1 h3 { font-size: 1.5rem !important; border-top: 3px solid var(--post-code-border-color); padding: 1rem 0 0; max-width: 600px; margin: 1rem auto; } </style> </p> 50+ Awesome Dev Tool Tips ๐Ÿ”ฅ Alicia's Notes ๐Ÿš€ Sun, 13 Nov 2022 13:47:37 +0000 https://notes.aliciasykes.com/40065/50-awesome-dev-tool-tips https://notes.aliciasykes.com/40065/50-awesome-dev-tool-tips <p><p><img class="banner-img" src="https://i.ibb.co/QQQRTdm/dev-tools-tips-banner.png"></p> <p>The browser developer tools are incredibly powerful, with new debugging and optimisation features being added every few months.</p> <p>The following post outlines 50+ awesome tips, that you can use to supercharge your web development experience.</p> <hr> <h2>Design Mode</h2> <p>Enabling <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/designMode" rel="noopener nofollow" target="_blank">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:</p> <div class="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><img src="https://i.ibb.co/MZPYGdt/01-design-mode.gif" alt="demo"></p> <hr> <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 class="prettyprint">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 class="prettyprint">โ‹ฎ</code> โ†’ <code class="prettyprint">Settings</code> โ†’ <code class="prettyprint">Experiments</code> Select <code class="prettyprint">Automatically pretty print in the Sources Panel</code>.</p> <p><img src="https://i.ibb.co/2SRy5hw/02-pretty-print.gif" alt="demo"></p> <hr> <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 <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> to open up the <a href="https://developer.chrome.com/docs/devtools/command-menu/" rel="noopener nofollow" target="_blank">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 <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>O</kbd> to filter methods across files.</p> <p><img src="https://i.ibb.co/3pvG891/03-command-palet.gif" alt="demo"></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<em>modules, webpack output, etc). You can hide this under โ‹ฎ โ†’ Hide ignore-list sources. By default, this uses the smart `x</em>google_ignorelist` to detect what's likely not relevant, but you can also add your own custom sources, specified by regex under Settings.</p> <hr> <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="https://developer.chrome.com/docs/devtools/javascript/snippets/" rel="noopener nofollow" target="_blank">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 class="prettyprint">!</code> operator.</p> <p><img src="https://i.ibb.co/NSK7SL6/18-snippets.gif" alt="demo"></p> <hr> <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="https://developer.chrome.com/docs/devtools/console/live-expressions/" rel="noopener nofollow" target="_blank">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 class="prettyprint">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><img src="https://i.ibb.co/mTLQ5CP/17-live-expressions.gif" alt="demo"></p> <hr> <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="https://developer.chrome.com/docs/devtools/changes/" rel="noopener nofollow" target="_blank">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><img src="https://i.ibb.co/4ShJ8Fn/19-diff-check.png" alt="demo"></p> <hr> <h2>Console Shorthand</h2> <ul> <li><code class="prettyprint">$()</code> - Short-hand for <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector" rel="noopener nofollow" target="_blank">Document.querySelector()</a> (to select DOM elements, jQuery-style!)</li> <li><code class="prettyprint">$$()</code> - Same as above, but for <code class="prettyprint">selectAll</code> for when returning multiple elements in an array</li> <li><code class="prettyprint">$_</code> - Returns value of last evaluated expression</li> <li><code class="prettyprint">$0</code> - Returns the most recently selected DOM element (in the inspector)</li> <li><code class="prettyprint">$1</code>...<code class="prettyprint">$4</code> can also be used to grab previously selected UI elements</li> <li><code class="prettyprint">$x()</code> - Lets you select DOM elements using an Xpath query</li> <li><code class="prettyprint">keys()</code> and <code class="prettyprint">values()</code> - Shorthand for Object.getKeys(), will return an array of either obj keys or values</li> <li><code class="prettyprint">copy()</code> - Copies stuff to the clipboard</li> <li><code class="prettyprint">monitorEvents()</code> - Run command each time a given event is fireed</li> <li>For certain common console commands (like <code class="prettyprint">console.table()</code>), you don't need to type the preceding <code class="prettyprint">console.</code>, just run <code class="prettyprint">table()</code></li> </ul> <p>You can clear the console at anytime using <kbd>Ctrl</kbd> + <kbd>L</kbd>, using the clear button, or by running <code class="prettyprint">clear()</code></p> <p>There's many more console shorthand commands, <a href="https://developer.chrome.com/docs/devtools/console/utilities/" rel="noopener nofollow" target="_blank">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> <hr> <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="https://developer.chrome.com/docs/devtools/coverage/" rel="noopener nofollow" target="_blank">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><img src="https://i.ibb.co/BPzqWvR/05-coverage-tool.png" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/YW2Rp9F/05-rendering-2.gif" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/mF6YdF0/06-network-paint-times.png" alt="demo"></p> <hr> <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="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Server-Timing" rel="noopener nofollow" target="_blank">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 class="prettyprint">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> <hr> <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><img src="https://i.ibb.co/yf2tHRw/07-network-timings.png" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/KKWKdtV/08-perf-monitor.png" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/X3G0y21/09-mem-leaks-1.png" alt="demo"></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><img src="https://i.ibb.co/pnbQdMC/09-mem-leaks-2.png" alt="demo"></p> <hr> <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="https://developer.chrome.com/docs/devtools/memory-inspector/" rel="noopener nofollow" target="_blank">memory inspector</a>, you can drill down the scope, and inspect ArrayBuffer, TypedArray, DataView, and Wasm Memory. Here's a WASM demo:</p> <p><img src="https://i.ibb.co/rHdHWPd/36-memory-inspector.gif" alt="demo"></p> <hr> <h2>Test bfcache</h2> <p><a href="https://web.dev/bfcache/" rel="noopener nofollow" target="_blank">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="https://web.dev/bfcache/#optimize-your-pages-for-bfcache" rel="noopener nofollow" target="_blank">optimise for it</a>. And that's where the <a href="https://developer.chrome.com/docs/devtools/application/back-forward-cache/" rel="noopener nofollow" target="_blank">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><img src="https://i.ibb.co/XDqkGjw/10-bfcache-test.png" alt="demo"></p> <hr> <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 class="prettyprint">chrome://restart</code> in the address bar.</p> <hr> <h2>Lighthouse</h2> <p><a href="https://developer.chrome.com/docs/lighthouse/" rel="noopener nofollow" target="_blank">Lighthouse</a> is an extremely useful (and easy!) tool for measuring <a href="https://web.dev/learn-core-web-vitals/" rel="noopener nofollow" target="_blank">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><img src="https://i.ibb.co/M2yGPbv/11-lighthouse.png" alt="demo"></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="https://googlechrome.github.io/lighthouse/viewer/" rel="noopener nofollow" target="_blank">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> <hr> <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="https://googlechrome.github.io/lighthouse/treemap/" rel="noopener nofollow" target="_blank">googlechrome.github.io/lighthouse/treemap/</a>.<br> You can click any element, to zoom in and inspect additional info.</p> <p><img src="https://i.ibb.co/SPYsyYs/32-memory-treemap.png" alt="demo"></p> <hr> <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="https://developer.chrome.com/docs/devtools/recorder/" rel="noopener nofollow" target="_blank">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> <hr> <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="https://chrome.google.com/webstore/detail/cypress-chrome-recorder/fellcphjglholofndfmmjmheedhomgin" rel="noopener nofollow" target="_blank">Cypress add-on</a>, <a href="https://chrome.google.com/webstore/detail/nightwatch-chrome-recorde/nhbccjfogdgkahamfohokdhcnemjafjk/" rel="noopener nofollow" target="_blank">Nightwatch add-on</a>, <a href="https://chrome.google.com/webstore/detail/testing-library-recorder/pnobfbfcnoeealajjgnpeodbkkhgiici" rel="noopener nofollow" target="_blank">Jest add-on</a>, <a href="https://chrome.google.com/webstore/detail/webdriverio-chrome-record/pllimkccefnbmghgcikpjkmmcadeddfn" rel="noopener nofollow" target="_blank">WebDriver add-on</a> and more.</p> <hr> <h2>Pausing Execution with Breakpoints</h2> <p><a href="https://developer.chrome.com/docs/devtools/javascript/breakpoints/" rel="noopener nofollow" target="_blank">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 class="prettyprint">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 class="prettyprint">debug(methodName)</code> to start, and <code class="prettyprint">undebug(methodName)</code> to end.</p> <p>Once a breakpoint has been hit, you can interact with any current state through the console.</p> <p>TODO</p> <hr> <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="https://developer.chrome.com/docs/devtools/remote-debugging/local-server/" rel="noopener nofollow" target="_blank">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="https://developer.chrome.com/docs/devtools/remote-debugging/webviews/" rel="noopener nofollow" target="_blank">docs</a>).</p> <hr> <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><img src="https://i.ibb.co/fpCdNLz/13-sensors.gif" alt="demo"></p> <hr> <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> <hr> <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> <hr> <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="https://developer.chrome.com/docs/devtools/javascript/background-services/" rel="noopener nofollow" target="_blank">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 class="prettyprint">chrome://serviceworker-internals</code></p> <p><img src="https://i.ibb.co/v36CkSL/30-service-workers.png" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/frhmCr5/14-security-tab.png" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/ngtNnGd/15-webauthn.gif" alt="demo"></p> <p>For an overview of web auth, see <a href="https://webauthn.guide/" rel="noopener nofollow" target="_blank">WebAuthn.guide</a>, or view the <a href="https://w3c.github.io/webauthn/" rel="noopener nofollow" target="_blank">W3 spec</a></p> <p>On a side-note, there's an interesting article explaining <a href="https://developer.chrome.com/blog/webauthn-tab/" rel="noopener nofollow" target="_blank">how they built the webauthn tab</a>. </p> <hr> <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="https://web.dev/learn/accessibility/" rel="noopener nofollow" target="_blank">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="https://chrome.google.com/webstore/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd" rel="noopener nofollow" target="_blank">axe DevTools</a>. This will show you detailed results and instructions of how to fix.</p> <hr> <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="https://developer.chrome.com/blog/new-in-devtools-86/#capture-node-screenshot" rel="noopener nofollow" target="_blank">element screenshot</a>, just right-click on the DOM element in the inspector and select Capture Screenshot.</p> <p><img src="https://i.ibb.co/txXZ0wy/20-screenshot-nodes.png" alt="demo"></p> <hr> <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> <hr> <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><img src="https://i.ibb.co/KV35Z8k/21-animation-scrubber.gif" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/j8LNrwf/38-phsudo-classes.gif" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/6X35LMG/28-size-tools.gif" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/VCGPNqq/27-color-picker.gif" alt="demo"></p> <hr> <h2>Easy Box Shadows</h2> <p>Box shadows are one of those things that are best previewed live. That's why the <a href="https://developer.chrome.com/docs/devtools/css/reference/#shadow-editor" rel="noopener nofollow" target="_blank">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><img src="https://i.ibb.co/K72x2pJ/26-box-shaddows.gif" alt="demo"></p> <hr> <h2>Easy Animations</h2> <p>By clicking the <a href="https://developer.chrome.com/docs/devtools/css/animations/" rel="noopener nofollow" target="_blank">animation</a> option, you can easily preview various transitions and effects.</p> <p><img src="https://i.ibb.co/fdJkyDn/37-animation-editor.gif" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/bmh54tv/33-responsive-mode.gif" alt="demo"></p> <hr> <h2>Badges</h2> <p>You may have notices a little chip/ badge next to certain elements in the Elements tab. These are <a href="https://developer.chrome.com/docs/devtools/elements/badges/" rel="noopener nofollow" target="_blank">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="https://developer.chrome.com/docs/devtools/css/flexbox/" rel="noopener nofollow" target="_blank">Flexbox Debugger</a> and <a href="https://developer.chrome.com/docs/devtools/css/grid/" rel="noopener nofollow" target="_blank">Grid layout debugger</a></p> <p><img src="https://i.ibb.co/C2WhDcS/25-css-badges.png" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/JQ98R9n/23-rulers.gif" alt="demo"></p> <p>In Firefox, there is a built-in <a href="https://firefox-source-docs.mozilla.org/devtools-user/measure_a_portion_of_the_page/index.html" rel="noopener nofollow" target="_blank">ruler feature</a>, available through the Toolbox Buttons in the top-right.</p> <p><img src="https://i.ibb.co/85fDCMB/34-ruler.gif" alt="demo"></p> <hr> <h2>Style Overview</h2> <p>The <a href="https://developer.chrome.com/docs/devtools/css-overview/" rel="noopener nofollow" target="_blank">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><img src="https://i.ibb.co/VvT8Shq/24-css-overview.gif" alt="demo"></p> <hr> <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><img src="https://i.ibb.co/1J2B6sC/29-css-layers.gif" alt="demo"></p> <p><img src="https://i.ibb.co/mvZZD5s/12-layers.png" alt="demo"></p> <hr> <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="https://developer.chrome.com/docs/devtools/workspaces/" rel="noopener nofollow" target="_blank">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="https://developer.chrome.com/blog/new-in-devtools-65/#overrides" rel="noopener nofollow" target="_blank">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> <hr> <h2>Automation</h2> <p>For more advanced tasks, everything in the developer tools can be automated, via the <a href="https://developer.chrome.com/docs/extensions/reference/automation/" rel="noopener nofollow" target="_blank">Automation APIs</a> using <a href="https://w3c.github.io/webdriver/" rel="noopener nofollow" target="_blank">WebDriver Protocol</a> (which is what tools like <a href="https://www.selenium.dev/documentation/webdriver/bidirectional/chrome_devtools/" rel="noopener nofollow" target="_blank">Selenium use</a>). As an example, see the <a href="https://www.npmjs.com/package/devtools" rel="noopener nofollow" target="_blank">webdriver devtools</a> package.</p> <hr> <h2>Familiar Shortcuts</h2> <p>So almost everything within the browser developer tools has keyboard shortcuts, here's the <a href="https://developer.chrome.com/docs/devtools/shortcuts" rel="noopener nofollow" target="_blank">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> <hr> <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="https://github.com/micjamking/devtools-author" rel="noopener nofollow" target="_blank">here</a>.</p> <hr> <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="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi" rel="noopener nofollow" target="_blank">React Dev Tools</a> - Inspect React component hierarchies and profile data</li> <li><a href="https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd" rel="noopener nofollow" target="_blank">Redux Dev Tools</a> - Debug redux data and monitor state changes </li> <li><a href="https://chrome.google.com/webstore/detail/graphql-network-inspector/ndlbedplllcgconngcnfmkadhokfaaln" rel="noopener nofollow" target="_blank">GraphQL Network Inspector</a> - Inspect GQL requests with support for relay batching</li> <li><a href="https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd" rel="noopener nofollow" target="_blank">Vue Dev Tools</a> - Debug component hierarchy and state in Vue apps</li> <li><a href="https://chrome.google.com/webstore/detail/svelte-devtools/ckolcbmkjpjmangdbmnkpjigpkddpogn" rel="noopener nofollow" target="_blank">Svelte Dev Tools</a> - Inspect the Svelte state and component hierarchies </li> <li><a href="https://chrome.google.com/webstore/detail/angular-devtools/ienfalfjdbdpebioblfackkekamfmbnh" rel="noopener nofollow" target="_blank">Angular Dev Tools</a> - Preview state of directives of Angular component instances</li> <li><a href="https://chrome.google.com/webstore/detail/meteor-devtools-evolved/ibniinmoafhgbifjojidlagmggecmpgf" rel="noopener nofollow" target="_blank">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="https://chrome.google.com/webstore/detail/visbug/cdockenadnadldjbbgcallicgledbeoc/" rel="noopener nofollow" target="_blank">Visbug</a> - Interact with and modify any websites, without needing any HTML or CSS knowledge</li> <li><a href="https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk" rel="noopener nofollow" target="_blank">Lighthouse</a> - Automated performance, quality and correctness checker</li> <li><a href="https://chrome.google.com/webstore/detail/designer-tools/jiiidpmjdakhbgkbdchmhmnfbdebfnhp" rel="noopener nofollow" target="_blank">Designer Tools</a> - Grids and rulers for in-browser measurement and alignment </li> <li><a href="https://chrome.google.com/webstore/detail/motion-devtools/mnbliiaiiflhmnndmoidhddombbmgcdk" rel="noopener nofollow" target="_blank">Motion Tools</a> - Inspect and design complex CSS animations</li> <li><a href="https://chrome.google.com/webstore/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi" rel="noopener nofollow" target="_blank">Pixel Perfect</a> - Overlay designs over webpages for building pixel perfect pages</li> <li><a href="https://chrome.google.com/webstore/detail/cpu-and-memory-performanc/nmpbhigddhbbhopeeagpnnmnihgagbfk" rel="noopener nofollow" target="_blank">CPU + Mem Performance Monitor</a> - Add system resources overlay to sites</li> <li><a href="https://chrome.google.com/webstore/detail/meta-seo-inspector/ibkclpciafdglkjkcibmohobjkcfkaef" rel="noopener nofollow" target="_blank">SEO Inspector</a> - Easy inspection of Meta tags for SEO</li> <li><a href="https://chrome.google.com/webstore/detail/save-all-resources/abpdnfjocnmdomablahdcfnoggeeiedb" rel="noopener nofollow" target="_blank">Save all Resources</a> - Easily download everything associated with a site, preserving directory structure</li> <li><a href="https://chrome.google.com/webstore/detail/multiproxy-tool/olonnmcaipjmcckefehcmaolkpigdjji" rel="noopener nofollow" target="_blank">Multi-Proxy</a> - Connect to multiple proxies (simultaneously) with IP matching and blocking</li> <li><a href="https://chrome.google.com/webstore/detail/accessibility-insights-fo/pbjjkligggfmakdaogkfomddhfmpjeni" rel="noopener nofollow" target="_blank">Accessibility Insights</a> - Get an overview of accessibile navigation issues</li> <li><a href="https://chrome.google.com/webstore/detail/check-my-links/ojkcdipcgfaekbeaelaapakgnjflfglf%5D" rel="noopener nofollow" target="_blank">Check my Links</a> - Quickly find and highlight all dead links within a page</li> <li><a href="https://chrome.google.com/webstore/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg" rel="noopener nofollow" target="_blank">Weppalizer</a> - Similar to <a href="https://builtwith.com/" rel="noopener nofollow" target="_blank">BuiltWith</a>, quickly check what tech a site is built using</li> <li><a href="https://chrome.google.com/webstore/detail/octotree-github-code-tree/bkhaagjahfmjljalopjnoealnfndnagc" rel="noopener nofollow" target="_blank">Octotree</a> - Adds sidebar on GitHub for much easier navigation</li> </ul> <hr> <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="https://firefox-dev.tools/" rel="noopener nofollow" target="_blank">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="https://developer.apple.com/safari/tools/" rel="noopener nofollow" target="_blank">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="https://developer.chrome.com/tags/new-in-devtools/" rel="noopener nofollow" target="_blank">What's New in DevTools</a></li> <li><a href="https://www.youtube.com/c/GoogleChromeDevelopers" rel="noopener nofollow" target="_blank">Chrome Developers on YouTube</a></li> </ul> <style> p img { background: #0b1021; border-radius: 4px; border: 2px solid #141b33; margin: 0.5rem auto; box-shadow: 1px 2px 4px 2px #00000091; max-width: 750px; } img.banner-img { border: none; box-shadow: none; max-width: 450px !important; opacity: 0.85; float: right; } </style> </p> Fun with console.log() ๐Ÿ’ฟ Alicia's Notes ๐Ÿš€ Sun, 11 Sep 2022 20:00:15 +0000 https://notes.aliciasykes.com/38041/fun-with-console-log https://notes.aliciasykes.com/38041/fun-with-console-log <p><p>If you've ever developed a web app, you'll be familiar with <a href="https://developer.mozilla.org/en-US/docs/Web/API/Console/log" rel="noopener nofollow" target="_blank">console.log(...)</a>, the method which prints data to the developer console; useful for debugging, logging and testing.</p> <p>Run <code class="prettyprint">console.log(console)</code>, and you'll see that there's much more to the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Console" rel="noopener nofollow" target="_blank">console</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><a href="#tables">Tables</a></li> <li><a href="#groups">Groups</a></li> <li><a href="#styled-logs">Styles</a></li> <li><a href="#time">Times</a></li> <li><a href="#assert">Asserts</a></li> <li><a href="#count">Counts</a></li> <li><a href="#trace">Traces</a></li> <li><a href="#dir">Directory</a></li> <li><a href="#debug">Debugs</a></li> <li><a href="#log-levels">Log Levels</a></li> <li><a href="#multi-value-logs">Multi-Values</a></li> <li><a href="#log-string-formats">Log Strings</a></li> <li><a href="#clear">Clear</a></li> </ul> <p></p><hr id="tables"><p></p> <h2>Tables</h2> <p>The <a href="https://developer.mozilla.org/en-US/docs/Web/API/Console/table" rel="noopener nofollow" target="_blank">console.table()</a> method prints objects/ arrays as a neatly formatted tables.</p> <div class="highlight"><pre class="highlight javascript"><code><span class="nx">console</span><span class="p">.</span><span class="nx">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="nb">Date</span><span class="p">().</span><span class="nx">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><img width="450" src="https://i.ibb.co/HDmBv62/console-table.png" title="Example output of console.table" alt="Screenshot showing an example output of console.table"></p> <hr> <h2>Groups</h2> <p>Group related console statements together with collapsible sections, using <a href="https://developer.mozilla.org/en-US/docs/Web/API/Console/group" rel="noopener nofollow" target="_blank">console.group()</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 class="prettyprint">groupCollapsed</code> instead of <code class="prettyprint">group</code>. You can also nest sub-sections within sections but be sure to remember to close out each group with <code class="prettyprint">groupEnd</code>.</p> <p>The following example will output an open section, containing some info</p> <div class="highlight"><pre class="highlight javascript"><code><span class="nx">console</span><span class="p">.</span><span class="nx">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="nx">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="nx">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="nx">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="nx">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="nx">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="nb">Date</span><span class="p">().</span><span class="nx">getTime</span><span class="p">());</span> <span class="nx">console</span><span class="p">.</span><span class="nx">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="nx">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="nx">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="nx">groupEnd</span><span class="p">();</span> <span class="nx">console</span><span class="p">.</span><span class="nx">groupEnd</span><span class="p">();</span> </code></pre></div> <p><img width="450" src="https://i.ibb.co/jMhk8KM/console-group.png" title="Example output of console.group" alt="Screenshot showing an example output of console.group"></p> <p></p><hr id="styled-logs"><p></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"><pre class="highlight javascript"><code><span class="nx">console</span><span class="p">.</span><span class="nx">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><img width="450" src="https://i.ibb.co/0Zyw4TF/console-styles-1.png" title="Example output of console styles" alt="Screenshot showing an example using CSS in the console"></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><img width="450" src="https://i.ibb.co/L6P26CL/console-styles-2.png" title="Example output of console styles" alt="Screenshot showing an example using CSS in the console"></p> <p>Here's something similar I'm using in a developer dashboard, the code is <a href="https://github.com/Lissy93/dashy/blob/master/src/utils/CoolConsole.js" rel="noopener nofollow" target="_blank">here</a></p> <p><img width="450" src="https://i.ibb.co/7jgSC8p/console-styles-3.png" title="Example output of console styles" alt="Screenshot showing an example using CSS in the console"></p> <p></p><hr id="time"><p></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="https://developer.mozilla.org/en-US/docs/Web/API/Console/time" rel="noopener nofollow" target="_blank">console.time()</a> and passing in a label, then ending the timer using <a href="https://developer.mozilla.org/en-US/docs/Web/API/console/timeEnd" rel="noopener nofollow" target="_blank">console.timeEnd()</a>, using the same label. You can also add markers within a long running operation using <a href="https://developer.mozilla.org/en-US/docs/Web/API/console/timeLog" rel="noopener nofollow" target="_blank">console.timeLog()</a></p> <div class="highlight"><pre class="highlight javascript"><code><span class="nx">console</span><span class="p">.</span><span class="nx">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="nx">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"><pre class="highlight plaintext"><code>concatenation: 1206ms - timer ended </code></pre></div> <p><img width="450" align="centre" src="https://i.ibb.co/hsHv4tc/console-timer.png" title="Example output of console.time" alt="Screenshot showing an example output of console.time"></p> <p>There's also a non-standard method, <a href="https://developer.mozilla.org/en-US/docs/Web/API/console/timeStamp" rel="noopener nofollow" target="_blank">console.timeStamp()</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> <p></p><hr id="assert"><p></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="https://developer.mozilla.org/en-US/docs/Web/API/console/assert" rel="noopener nofollow" target="_blank">console.assert()</a>, which won't log anything to the console unless the first parameter is <code class="prettyprint">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 class="prettyprint">console.assert(false, 'Value was false')</code> will output the message, since the first parameter is <code class="prettyprint">false</code>.</p> <div class="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="nx">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="nx">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><img width="450" src="https://i.ibb.co/5xWCN5k/console-assert.png" title="Example output of console.assert" alt="Screenshot showing an example output of console.assert"></p> <p></p><hr id="count"><p></p> <h2>Count</h2> <p>Ever find yourself manually incrementing a number for logging? <a href="https://developer.mozilla.org/en-US/docs/Web/API/console/count" rel="noopener nofollow" target="_blank">console.count()</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="https://developer.mozilla.org/en-US/docs/Web/API/console/countReset" rel="noopener nofollow" target="_blank">console.countReset()</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"><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="nx">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="nx">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><img width="450" src="https://i.ibb.co/khjHNKT/console-count.png" title="Example output of console.count" alt="Screenshot showing an example output of console.count"></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"><pre class="highlight javascript"><code><span class="nx">console</span><span class="p">.</span><span class="nx">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="nx">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="nx">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="nx">count</span><span class="p">(</span><span class="nb">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> <p></p><hr id="trace"><p></p> <h2>Trace</h2> <p>In JavaScript, we're often working with deeply nested methods and objects. You can use <a href="https://developer.mozilla.org/en-US/docs/Web/API/console/trace" rel="noopener nofollow" target="_blank">console.trace()</a> to traverse through the stack trace, and output which methods were called to get to a certain point.</p> <p><img width="450" src="https://i.ibb.co/M1Bt2Jq/console-trace.png" title="Example output of console.trace" alt="Screenshot showing an example output of console.trace"></p> <p>You can optionally pass data to also be outputted along with the stacktrace.</p> <p></p><hr id="dir"><p></p> <h2>Dir</h2> <p>If your logging a large object to the console, it may become hard to read. The <a href="https://developer.mozilla.org/en-US/docs/Web/API/console/dir" rel="noopener nofollow" target="_blank">console.dir()</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><img width="450" align="center" src="https://i.ibb.co/PW073sy/console-dir.png" title="Example output of console.dir" alt="Screenshot showing an example output of console.dir"></p> <p>You can also print XML or HTML based trees in a similar way, by using <a href="https://developer.mozilla.org/en-US/docs/Web/API/console/dirxml" rel="noopener nofollow" target="_blank">console.dirxml()</a>.</p> <p></p><hr id="debug"><p></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="https://developer.mozilla.org/en-US/docs/Web/API/console/debug" rel="noopener nofollow" target="_blank">console.debug()</a> will do just this, it functions in exactly the same way as <code class="prettyprint">console.log</code> but will be stripped out by most build systems, or disabled when running in production mode.</p> <p></p><hr id="log-levels"><p></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="https://developer.mozilla.org/en-US/docs/Web/API/console/info" rel="noopener nofollow" target="_blank">console.info()</a> - Informational messages for logging purposes, commonly includes a small "i" and / or a blue background</li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/API/console/warn" rel="noopener nofollow" target="_blank">console.warn()</a> - Warnings / non-critical errors, commonly includes a triangular exclamation mark and / or yellow background</li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/API/console/error" rel="noopener nofollow" target="_blank">console.error()</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 class="prettyprint">error()</code> will write to <code class="prettyprint">stderr</code>, whereas <code class="prettyprint">log</code> outputs to <code class="prettyprint">stdout</code>, but during development they will all appear in the console as normal.</p> <p></p><hr id="multi-value-logs"><p></p> <h2>Multi-Value Logs</h2> <p>Most functions on the <code class="prettyprint">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 class="prettyprint">console.log('User: ', user.name);</code></p> <p>But an easier approach for printing multiple, labelled values, is to make use of <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment" rel="noopener nofollow" target="_blank">object deconstructing</a>. For example, if you had three variables (e.g. <code class="prettyprint">x</code>, <code class="prettyprint">y</code> and <code class="prettyprint">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 class="prettyprint">console.log( { x, y, z } );</code></p> <p><img width="450" src="https://i.ibb.co/ynVWy52/console-deconstructing.png" title="Example output of console deconstructing" alt="Screenshot showing an example output of console deconstructing"></p> <p></p><hr id="log-string-formats"><p></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 class="prettyprint">%s</code> - String or any other type converted to string</li> <li><code class="prettyprint">%d</code> / <code class="prettyprint">%i</code> - Integer</li> <li><code class="prettyprint">%f</code> - Float</li> <li><code class="prettyprint">%o</code> - Use optimal formatting</li> <li><code class="prettyprint">%O</code> - Use default formatting</li> <li><code class="prettyprint">%c</code> - Use custom formatting (<a href="#styled-logs">more info</a>)</li> </ul> <p>For example</p> <div class="highlight"><pre class="highlight javascript"><code><span class="nx">console</span><span class="p">.</span><span class="nx">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="nb">Date</span><span class="p">().</span><span class="nx">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="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals" rel="noopener nofollow" target="_blank">template literals</a> to achieve the same thing, which might be easier to read for shorter strings.</p> <p></p><hr id="clear"><p></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="https://developer.mozilla.org/en-US/docs/Web/API/console/clear" rel="noopener nofollow" target="_blank">console.clear()</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> <hr> <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="https://developer.mozilla.org/en-US/docs/Web/API/console" rel="noopener nofollow" target="_blank">MDN console Documentation</a> or the <a href="https://developer.chrome.com/docs/devtools/console/api/" rel="noopener nofollow" target="_blank">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 class="prettyprint">info</code>, <code class="prettyprint">warn</code>, <code class="prettyprint">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> <style> img { width: 500px; } .highlight { width: fit-content; min-width: 500px; } img, .highlight, pre { border-radius: 4px; box-shadow: 1px 1px 3px #060913; } h4 { margin: 0; } ul li { margin-bottom: 0 !important; font-size: 1rem; } </style> </p> GitHub Markdown Tricks ๐Ÿ™ Alicia's Notes ๐Ÿš€ Fri, 01 Jul 2022 14:49:16 +0000 https://notes.aliciasykes.com/36402/github-markdown-tricks https://notes.aliciasykes.com/36402/github-markdown-tricks <p><blockquote> <p>A collection of 20 <em>things</em> you can do with GitHub-flavoured markdown to spice-up your projects readme!</p> </blockquote> <hr> <h3>Include Notes and Warnings</h3> <div class="highlight"><pre class="highlight plaintext"><code>&gt; [!IMPORTANT] &gt; This is some important text. &gt; [!WARNING] &gt; This is a warning. &gt; [!NOTE] &gt; This is just a note. </code></pre></div> <p>Will render:</p> <p><img width="300" src="https://user-images.githubusercontent.com/1862727/180773573-4afb7e3a-b4d1-40c5-8624-dfeacc62b8c1.png"></p> <p>Note that this feature is <a href="https://github.com/github-community/community/discussions/16925" rel="noopener nofollow" target="_blank">still in beta</a>.</p> <hr> <h3>Mermaid Diagrams</h3> <p>You can add live diagrams to your documentation, using <a href="https://mermaid.js.org/" rel="noopener nofollow" target="_blank">Mermaid Syntax</a>. Check <a href="https://mermaid.js.org/intro/n00b-syntaxReference.html" rel="noopener nofollow" target="_blank">the docs</a> for syntax, then use the <a href="https://mermaid.live/edit" rel="noopener nofollow" target="_blank">Live Editor</a> to build out your diagrams, then embed the code into your readme, where they'll be rendered.</p> <p>Just add the <code class="prettyprint">mermaid</code> identifier to the start of your code block. For some examples, see the <a href="https://github.com/mermaid-js/mermaid#examples" rel="noopener nofollow" target="_blank">mermaid repo</a>.</p> <p><a href="https://github.com/mermaid-js/mermaid#examples"><img width="600" src="https://i.ibb.co/tKtD3QK/Screen-Shot-2023-02-24-at-15-20-58.png"></a></p> <hr> <h3>Embedding Files</h3> <p>You can embed any code, markdown or media file into GitHub markdown, by copying it's permalink, and pasting it into your document. Note that the content must be located in the same repository.</p> <p><img width="600" src="https://i.ibb.co/wcg9wxS/Screen-Shot-2023-02-24-at-15-32-27.png"></p> <hr> <h3>Tiny Text</h3> <p>Using the <code class="prettyprint">&lt;sub&gt;&lt;/sub&gt;</code> (Subscript) and <code class="prettyprint">&lt;sup&gt;&lt;/sup&gt;</code> (superscript) will generate tiny text. But to keep it vertically-centred, you can combine the two with: <code class="prettyprint">&lt;sub&gt;&lt;sup&gt;Small Text!&lt;/sup&gt;&lt;/sub&gt;</code></p> <p><img src="https://i.ibb.co/3Bq6Syz/Screen-Shot-2023-02-24-at-12-50-17.png" width="400"></p> <hr> <h3>Insert Keyboard Keys</h3> <p>Great for visually showing which keys to press, or drawing attention to something (<a href="https://github.com/Lissy93/dashy/blob/master/docs/searching.md#navigating" rel="noopener nofollow" target="_blank">see example</a>)</p> <div class="highlight"><pre class="highlight html"><code><span class="nt">&lt;kbd&gt;</span>Key<span class="nt">&lt;/kbd&gt;</span> </code></pre></div> <p><img src="https://i.ibb.co/HG82RJd/Screen-Shot-2023-02-24-at-12-53-43.png" width="400"></p> <hr> <h3>Underlined Text</h3> <p>You probably already know that you can make <strong>bold</strong> text with <code class="prettyprint">**Bold!**</code>, and <em>italic</em> text with <code class="prettyprint">_Italic!_</code> (both of which can also be done with the <code class="prettyprint">&lt;b&gt;&lt;/b&gt;</code> and <code class="prettyprint">&lt;i&gt;&lt;/i&gt;</code> tags) - but you can also have underlined text, using the <code class="prettyprint">&lt;ins&gt;&lt;/ins&gt;</code> tag.</p> <div class="highlight"><pre class="highlight html"><code><span class="nt">&lt;ins&gt;</span>I'm Underlined!<span class="nt">&lt;/ins&gt;</span> </code></pre></div> <p><img src="https://i.ibb.co/VVkGpVh/Screenshot-from-2023-05-10-21-24-43.png" width="600"></p> <hr> <h3>Collapsible Sections</h3> <p>Useful for including long blocks of text (like logs or API response), without clogging up your page (<a href="https://github.com/Lissy93/Lissy93#readme" rel="noopener nofollow" target="_blank">see example</a>)</p> <div class="highlight"><pre class="highlight html"><code><span class="nt">&lt;details&gt;</span> <span class="nt">&lt;summary&gt;</span>Collapsable Title<span class="nt">&lt;/summary&gt;</span> <span class="nt">&lt;p&gt;</span>Put Content Here<span class="nt">&lt;/p&gt;</span> <span class="nt">&lt;/details&gt;</span> </code></pre></div> <p><img src="https://i.ibb.co/82pn1rX/2023-02-24-12-56-24.gif" width="300"></p> <p>Note that to include markdown within the <code class="prettyprint">&lt;p&gt;&lt;/p&gt;</code> content block, you must pad it with blank lines, both top and bottom</p> <p>Want sections to be open by default? Just append the <code class="prettyprint">open</code> attribute. For example:</p> <div class="highlight"><pre class="highlight html"><code><span class="nt">&lt;details</span> <span class="na">open</span><span class="nt">&gt;&lt;summary&gt;&lt;h2&gt;</span>I'm Open<span class="nt">&lt;/h2&gt;&lt;/summary&gt;</span> ... <span class="nt">&lt;/details&gt;</span> </code></pre></div> <hr> <h3>Indentation</h3> <p>Using <code class="prettyprint">&lt;dl&gt;</code>, <code class="prettyprint">&lt;dt&gt;</code> and <code class="prettyprint">&lt;dd&gt;</code> you can create indented paragraphs, with a nicer aphetic. The indented text can wrap multiple lines, while maintaining indentation.</p> <div class="highlight"><pre class="highlight html"><code><span class="nt">&lt;dl&gt;</span> <span class="nt">&lt;dt&gt;</span>This is a list<span class="nt">&lt;/dt&gt;</span> <span class="nt">&lt;dd&gt;</span>With hanging indentation<span class="nt">&lt;/dd&gt;</span> <span class="nt">&lt;/dl&gt;</span> </code></pre></div> <p><img width="400" src="https://i.ibb.co/3S4b6yv/Screen-Shot-2023-02-24-at-15-41-19.png"></p> <hr> <h3>Embedding a Video</h3> <p>You can embed an MP4, simply by including the URL to the raw video in your markdown file (<a href="https://github.com/bjesus/muxile" rel="noopener nofollow" target="_blank">see example</a>)</p> <p><img src="https://i.ibb.co/L8XxmbH/Screen-Shot-2023-02-24-at-13-01-55.png" width="500"></p> <p>This doesn't (yet) work with YouTube videos (unless you download and re-upload them). But here's a trick to embed a frame, which will take the user to the video on-click:</p> <div class="highlight"><pre class="highlight html"><code><span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"http://www.youtube.com/watch?feature=player_embedded&amp;v=YOUTUBE_VIDEO_ID_HERE"</span> <span class="na">target=</span><span class="s">"_blank"</span><span class="nt">&gt;</span> <span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">"http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0.jpg"</span> <span class="na">alt=</span><span class="s">"IMAGE ALT TEXT HERE"</span> <span class="na">width=</span><span class="s">"240"</span> <span class="na">height=</span><span class="s">"180"</span> <span class="na">border=</span><span class="s">"10"</span> <span class="nt">/&gt;</span> <span class="nt">&lt;/a&gt;</span> </code></pre></div> <hr> <h3>Centre an image or other content</h3> <p>Make the title, sub-title and / or logo image centred (<a href="https://github.com/Lissy93/dashy#readme" rel="noopener nofollow" target="_blank">see example</a>)</p> <div class="highlight"><pre class="highlight html"><code><span class="nt">&lt;p</span> <span class="na">align=</span><span class="s">"center"</span><span class="nt">&gt;</span> <span class="nt">&lt;img</span> <span class="na">width=</span><span class="s">"500"</span> <span class="na">src=</span><span class="s">"---"</span> <span class="na">alt=</span><span class="s">"---"</span><span class="nt">&gt;</span> <span class="nt">&lt;/p&gt;</span> </code></pre></div> <p><a href="https://github.com/lissy93/dotfiles"><img src="https://i.ibb.co/Vmp1DdZ/Screen-Shot-2023-02-24-at-14-51-59.png" width="600"></a></p> <hr> <h3>Adding Title to Links</h3> <p>You can add a title to a link, which will be displayed when the user hovers over it. This is done by surrounding it in quotes immediately after the URL</p> <div class="highlight"><pre class="highlight markdown"><code><span class="p">[</span><span class="nv">DuckDuckGo</span><span class="p">](</span><span class="sx">https://duckduckgo.com</span> <span class="nn">"A great search engine for privacy"</span><span class="p">)</span>. </code></pre></div> <hr> <h3>GitHub-Specific Emojies</h3> <p>In GitHub flavoured markdown, emojis can be specified by their shortcode (e.g. <code class="prettyprint">:nerd_face:</code>), <a href="https://github.com/ikatyang/emoji-cheat-sheet" rel="noopener nofollow" target="_blank">here's a cheatsheet</a></p> <p>But there are also some GitHub-specific emojis, including:</p> <ul> <li><strong>Octocat</strong> <code class="prettyprint">:octocat:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/octocat.png" alt="octocat"></li> <li><strong>Bowtie</strong> <code class="prettyprint">:bowtie:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/bowtie.png" alt="bowtie"></li> <li><strong>Neck Beard</strong> <code class="prettyprint">:neckbeard:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/neckbeard.png" alt="neckbeard"></li> <li><strong>Troll Face</strong> <code class="prettyprint">:trollface:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/trollface.png" alt="trollface"></li> <li><strong>Ship It</strong> <code class="prettyprint">:shipit:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/shipit.png" alt="shipit"></li> <li><strong>Suspect</strong> <code class="prettyprint">:suspect:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/suspect.png" alt="suspect"></li> </ul> <p>And a few more...</p> <ul> <li><code class="prettyprint">:rage1:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/rage1.png" alt="rage1"> <code class="prettyprint">:rage2:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/rage2.png" alt="rage2"> <code class="prettyprint">:rage3:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/rage3.png" alt="rage3"> <code class="prettyprint">:rage4:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/rage4.png" alt="rage4"> </li> <li><code class="prettyprint">:hurtrealbad:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/hurtrealbad.png" alt="hurtrealbad"> <code class="prettyprint">:goberserk:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/goberserk.png" alt="goberserk"> <code class="prettyprint">:finnadie:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/finnadie.png" alt="finnadie"> <code class="prettyprint">:feelsgood:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/feelsgood.png" alt="feelsgood"></li> <li><code class="prettyprint">:atom:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/atom.png" alt="atom"> <code class="prettyprint">:basecamp:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/basecamp.png" alt="basecamp"> <code class="prettyprint">:basecampy:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/basecampy.png" alt="basecampy"> <code class="prettyprint">:electron:</code> โ†’ <img src="https://github.githubassets.com/images/icons/emoji/electron.png" alt="electron"></li> </ul> <hr> <h3>Syntax Highlighting in Code Blocks</h3> <p>Code blocks become much easier to read with syntax highlighting. To use this, you must specify the language immediatley after the first <code>```</code>.</p> <p><img src="https://i.ibb.co/BzYLYpL/Screen-Shot-2023-02-24-at-13-56-03.png" width="400"></p> <p>You can view a full list of supported languages, <a href="https://github.com/jincheng9/markdown_supported_languages" rel="noopener nofollow" target="_blank">here</a></p> <hr> <h3>Showing Code Additions (or Deletions)</h3> <p>Set the language type to <code class="prettyprint">diff</code>, and then precede each line which indicates an addition with <code class="prettyprint">+</code>, or a <code class="prettyprint">-</code> if it's a deletion. Note that the sign must be the first character of the line (watch out for white space), and should be followed by at least one blank space/ tab.</p> <p><img src="https://i.ibb.co/72rBJVH/Screen-Shot-2023-02-24-at-13-05-43.png" width="400"></p> <hr> <h3>Side-Aligned Images</h3> <p>In a similar way to centering images, you can also right align them, where the text will flow down the left-side. An example of this can be seen in the <a href="https://github.com/Bugswriter/tuxi" rel="noopener nofollow" target="_blank">tuxi</a> repo. (<a href="https://github.com/Lissy93/Lissy93" rel="noopener nofollow" target="_blank">See example</a>)</p> <div class="highlight"><pre class="highlight plaintext"><code>&lt;img src="https://i.ibb.co/sCwYpZ8/general.gif" alt="Video Preview Gif" align="right" width="500px"/&gt; </code></pre></div> <p><img width="600" src="https://i.ibb.co/8zvZCc8/Screen-Shot-2023-02-24-at-15-10-21.png"></p> <hr> <h3>Moving Readme</h3> <p>If it bothers you having your <code class="prettyprint">README.md</code> file cluttering up your projects root directory, then you can place it in <code class="prettyprint">.github/README.md</code> (along with any other GH stuff or assets). It will still be rendered as normal in your repositories home, but now you've got one less file in your project's base directory. (<a href="https://github.com/Lissy93/go-apod" rel="noopener nofollow" target="_blank">see example</a>)</p> <hr> <h3>Sub-Directory Readmes</h3> <p>You can also place a <code class="prettyprint">README.*</code> / <code class="prettyprint">readme.*</code> (see supported extensions below) into any directory of your GitHub repo, and it will be rendered when the user views that folder.</p> <p><a href="https://github.com/Lissy93/dotfiles/tree/master/scripts"><img src="https://i.ibb.co/p233JZq/Screenshot-from-2023-09-22-21-52-35.png" width="800"></a></p> <hr> <h3>Creating Home Page .md</h3> <p>You can display a short markdown document at the top of your GitHub profile. To do so, just create a public repository with the same name as your GitHub username, and populate it with a non-empty <code class="prettyprint">README.md</code>. For more info, see the <a href="https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme" rel="noopener nofollow" target="_blank">Profile Readme Docs</a>, or (<a href="https://github.com/Lissy93" rel="noopener nofollow" target="_blank">see example</a>)</p> <p><a href="https://github.com/lissy93/lissy93"><img src="https://i.ibb.co/BPtg0Pq/Screen-Shot-2023-02-24-at-13-58-27.png" width="800"></a></p> <hr> <h3>Using other Formats</h3> <p>Markdown isn't the only supported format for rendering readmes and docs on GitHub.</p> <ul> <li><a href="https://orgmode.org/" rel="noopener nofollow" target="_blank">Org Mode</a> <code class="prettyprint">.org</code> - Useful for notes, lists, timelines and planning documents</li> <li><a href="https://docutils.sourceforge.io/rst.html" rel="noopener nofollow" target="_blank">reStructuredText</a> <code class="prettyprint">.rst</code> - Primarily used in Python projects, can work with tools like Sphinx for complex docs sites</li> <li><a href="https://asciidoc.org/" rel="noopener nofollow" target="_blank">AsciiDoc</a> <code class="prettyprint">.adoc</code> - Contains semantics and options for modular / reusable content</li> <li><a href="https://commonmark.org/" rel="noopener nofollow" target="_blank">MarkDown</a> <code class="prettyprint">.md</code> - The classic</li> <li>Plain text <code class="prettyprint">.txt</code> - Just monospace plaintext</li> </ul> <hr> <h3>Merging Cells in Tables</h3> <p>It is possible to merge cells in tables (so that a given cell spans multiple rows or columns), but only if you define your table in HTML (see <a href="https://github.com/lowlighter/metrics/blob/master/source/plugins/introduction/README.md" rel="noopener nofollow" target="_blank">example</a>).</p> <p>This is done by adding the <code class="prettyprint">colspan</code> or <code class="prettyprint">rowspan</code> attribute, with the number of cells horizontally or vertically that it should span.</p> <p>For example:</p> <div class="highlight"><pre class="highlight html"><code> <span class="nt">&lt;td</span> <span class="na">colspan=</span><span class="s">"2"</span><span class="nt">&gt;</span>I take up two columns!<span class="nt">&lt;/td&gt;</span> </code></pre></div> <p>You can also set the text align property here too, using <code class="prettyprint">align="center"</code> to centre text.</p> <p><a href="https://github.com/Lissy93/Lissy93/blob/tech-stack-merged-cells/TECH-STACK.md"><img src="https://i.ibb.co/y5cL10p/Screen-Shot-2023-02-24-at-14-40-28.png" width="600"></a></p> <hr> <h3>Single-Cell Tables</h3> <p>This is a great way to draw attention to an important message</p> <div class="highlight"><pre class="highlight plaintext"><code>| Hello World! | |-| </code></pre></div> <p><img src="https://i.ibb.co/jHk6c9R/Screen-Shot-2023-02-24-at-13-04-00.png" width="300"></p> <hr> <h3>Create Buttons</h3> <p>In GitHub-flavoured markdown, the <code class="prettyprint">&lt;kbd&gt;</code> tags also make great buttons. for your readme header.</p> <p>For example:</p> <div class="highlight"><pre class="highlight plaintext"><code>**[&lt;kbd&gt;โ€ƒ&lt;br&gt;โ€ƒInstallโ€ƒ&lt;br&gt;โ€ƒ&lt;/kbd&gt;][Install]**โ€ƒ **[&lt;kbd&gt;โ€ƒ&lt;br&gt;โ€ƒQuick Startโ€ƒ&lt;br&gt;โ€ƒ&lt;/kbd&gt;][Quick Start]**โ€ƒ **[&lt;kbd&gt;โ€ƒ&lt;br&gt;โ€ƒConfigureโ€ƒ&lt;br&gt;โ€ƒ&lt;/kbd&gt;][Configure]**โ€ƒ **[&lt;kbd&gt;โ€ƒ&lt;br&gt;โ€ƒContributeโ€ƒ&lt;br&gt;โ€ƒ&lt;/kbd&gt;][Contribute]** </code></pre></div> <p><a href="https://github.com/lissy93/cyber-defence-presentation"><img src="https://i.ibb.co/f9mbT3D/Screen-Shot-2023-02-24-at-14-47-01.png" width="800"></a></p> <hr> <h3>Task Lists</h3> <p>You can create tasks lists too, useful for adding into Pull Request templates or showing task progress in readme.</p> <div class="highlight"><pre class="highlight plaintext"><code>A list of things: - [X] Googley Eyes - [X] Tesco Clubcard - [ ] The Elizibeth Line - [ ] Beans on Toast - [ ] My Current Account </code></pre></div> <p><img src="https://i.ibb.co/vX6GYDT/Screen-Shot-2023-02-24-at-15-50-22.png" width="400"></p> <hr> <h3>References</h3> <div class="highlight"><pre class="highlight plaintext"><code>Some text[^myreference] Clicking the here will scroll down to references. [^myreference]: Here's a reference (include links or something) </code></pre></div> <hr> <h3>Including the code quote symbol (<code class="prettyprint">`</code>) in a code block</h3> <p>Sometimes you may need to use the ` symbol within a code block.</p> <p>Just wrap the code with double quotes <code class="prettyprint"></code> ``, and ensure there is a space around the quote symbol</p> <p><a href="https://www.cl.cam.ac.uk/%7Emgk25/ucs/quotes.html" rel="noopener nofollow" target="_blank">https://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html</a></p> <hr> <h3>Further Links</h3> <ul> <li>GitHub Docs: <a href="https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting" rel="noopener nofollow" target="_blank">Working with advanced formatting</a></li> </ul> <p><img src="https://media4.giphy.com/media/NytMLKyiaIh6VH9SPm/giphy.gif" width="180"></p> <style> ul li { display: flex; align-items: center; } ul li img { display: inline; width: 50px; margin-top: 0 !important; margin: 0 1rem; } ul li strong, ul li code { margin-right: 1rem; } </style> </p> Comparison of Private / Secure Emai Providers ๐Ÿ“ฌ Alicia's Notes ๐Ÿš€ Sun, 22 May 2022 14:18:48 +0000 https://notes.aliciasykes.com/35375/comparison-of-private-secure-emai-providers https://notes.aliciasykes.com/35375/comparison-of-private-secure-emai-providers <p><p>The following table is a quick, undetailed comparison of security-focused email providers.</p> <blockquote> <p>Update: Since the markdown table isn't very clear, here's is a web version:<br> <strong><a href="https://lissy93.github.io/email-comparison/" rel="noopener nofollow" target="_blank">lissy93.github.io/email-comparison</a></strong></p> </blockquote> <div class="table-wrapper"> <table class="fl-table"> <tbody><tr> <th>Name</th> <th>Jurisdiction</th> <th>Encryption</th> <th>Open Source</th> <th>Onion Site</th> <th>Pricing</th> <th>Domain Support</th> <th>Additional Aliases or Catch-All</th> <th>POP, IMAP, STMP</th> <th>External Security Audit</th> <th>Accepts Crypto</th> <th>Personal Info Requiements</th> </tr> <tr> <td>ProtonMail</td> <td>๐ŸŸข Switzerland</td> <td>๐ŸŸข PGP</td> <td>๐ŸŸข Yes</td> <td>๐ŸŸข Yes</td> <td>๐ŸŸข Free Plan - 500MB, 1 address, no custom domain. Paid plans start from โ‚ฌ5 and allow for additional features, custom domain, and increased message volume</td> <td>๐ŸŸ  Yes (Pluss Plan, โ‚ฌ5.00/m)</td> <td>๐ŸŸ  Yes (Professional Plan, โ‚ฌ8.00)</td> <td>๐ŸŸ  Yes, but through Bridge</td> <td>๐ŸŸข Yes (2021, by Securitum)</td> <td>๐ŸŸข Yes (BTC only)</td> <td>๐ŸŸข Recovery Email Only</td> </tr> <tr> <td>Tutanota</td> <td>๐ŸŸข Germany (14 Eyes)</td> <td>๐ŸŸ  Hybrid AES + RSA</td> <td>๐ŸŸ  Client Apps Only</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸข Free Plan - 1GB, 1 address, no custom domain. Paid plans start from โ‚ฌ1 / month, and allow for a custom domain, 5 alias addresses and improved search and filters</td> <td>๐ŸŸ  Yes (Premium Plan, โ‚ฌ1.00/m)</td> <td>๐ŸŸ  โ‚ฌ1 / month per 20 aliases. No catch-all</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  Apparently, but not published</td> <td>๐ŸŸ  No (But ProxyStore gift cards accepted</td> <td>๐ŸŸข None</td> </tr> <tr> <td>CriptText</td> <td>โšช (Decentralized)</td> <td>๐ŸŸ  Signal Protocol</td> <td>๐ŸŸข Yes</td> <td>โšช N/A (no webmail)</td> <td>๐ŸŸข Free</td> <td>๐ŸŸข Yes</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>โšช N/A (no payment required)</td> <td>๐ŸŸข None</td> </tr> <tr> <td>Mailfence</td> <td>๐ŸŸข Belgium (14 Eyes)</td> <td>๐ŸŸข PGP</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸข Free Plan - 500MB, 1 address, no custom domain. Paid plans start from โ‚ฌ2.50 and allow for custom domain, 10 aliases, mail client access and increased message volume</td> <td>๐ŸŸ  Yes (Entry Plan, โ‚ฌ2.50/m)</td> <td>๐ŸŸ  Yes (Entry Plan, โ‚ฌ2.50)</td> <td>๐ŸŸข Yes (IMAP, POP3, SMTP)</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No (Card, PayPal)</td> <td>๐ŸŸข Recovery Email Only</td> </tr> <tr> <td>Mailbox.org</td> <td>๐ŸŸข Germany (14 Eyes)</td> <td>๐ŸŸข PGP</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  No free plan. Starts at โ‚ฌ1 / month. Increases to โ‚ฌ9 for all features, and increased storage</td> <td>๐ŸŸ  Yes (Standard Plan, โ‚ฌ3.00/m)</td> <td>๐ŸŸ  25 aliases (Standard Plan). No catch-all</td> <td>๐ŸŸข Yes (IMAP, POP3)</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด Requires full name, location, mobile number and a recovery email</td> </tr> <tr> <td>Soverin</td> <td>๐ŸŸ  Netherlands (9 Eyes)</td> <td>๐ŸŸข PGP</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  No free plan, but flat fee of โ‚ฌ3.25 / month for everything</td> <td>๐ŸŸ  Yes (Paid Plan, โ‚ฌ3.25)</td> <td>๐ŸŸ  Yes (Paid Plan, โ‚ฌ3.25)</td> <td>๐ŸŸข Yes (IMAP)</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด Requires phone number</td> </tr> <tr> <td>Posteo</td> <td>๐ŸŸข Germany (14 Eyes)</td> <td>๐ŸŸข PGP</td> <td>๐ŸŸข Yes</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  No free plan. Pricing is โ‚ฌ1 / month</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  Yes (โ‚ฌ0.10/m per alias). No catch-all</td> <td>๐ŸŸข Yes (IMAP, POP3)</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No (Card, PayPal, Bank Transfer, Cash)</td> <td>๐ŸŸข Payment Info Only</td> </tr> <tr> <td>Runbox</td> <td>๐ŸŸข Norway (14 Eyes)</td> <td>๐ŸŸข PGP</td> <td>๐ŸŸ  Client Apps Only</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  No free plan. Starts at โ‚ฌ14.95 / year for a single domain, going up to โ‚ฌ69.95 / year for more storage and domains</td> <td>๐ŸŸ  Yes (Micro Plan, โ‚ฌ1.25/m)</td> <td>๐ŸŸ  โ‚ฌ3.95 / year per 5 aliases. No catch-all</td> <td>๐ŸŸข Yes (IMAP, POP, SMTP)</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸข Yes (BTC only)</td> <td>๐ŸŸ  Full name, recovery email</td> </tr> <tr> <td>Kolab Now</td> <td>๐ŸŸข Switzerland</td> <td>๐ŸŸข PGP</td> <td>๐ŸŸข Yes</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  No free plan. Starts at CHF 5.00 / mo, basic features only. Groupware account is CHF 9.90</td> <td>๐ŸŸ  Yes (Group Plan, CHF 9.90/m)</td> <td>๐ŸŸ  Yes (Group Plan Only (CHF 9.90/ m)</td> <td>๐ŸŸข Yes (IMAP, POP, SMTP)</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No (Card, PayPal, Bank Transfer)</td> <td>๐ŸŸ  Full name, recovery email</td> </tr> <tr> <td>CounterMail</td> <td>๐ŸŸข Sweden (14 Eyes)</td> <td>๐ŸŸข PGP</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  No free plan. Pricing is $4.83 / month</td> <td>๐ŸŸ  Yes (Pain Plan + $15 setup fee)</td> <td>๐ŸŸ  Yes, max 10 text aliases. No catch-all</td> <td>๐ŸŸข Yes (IMAP)</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸข Yes (BTC only)</td> <td>๐ŸŸข None</td> </tr> <tr> <td>StartMail</td> <td>๐ŸŸ  Netherlands (9 Eyes)</td> <td>๐ŸŸข PGP</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  No free plan. Starts at $5 / month, but without custom domain support</td> <td>๐ŸŸ  Yes (Custom Domain Plan, $5.85)</td> <td>๐ŸŸ  Unlimited aliases. No catch-all</td> <td>๐ŸŸข Yes (IMAP, SMTP)</td> <td>๐ŸŸ  Apparently, but not published</td> <td>๐ŸŸ  Yes (BTC only, but only personal accounts)</td> <td>๐ŸŸ  Full name, recovery email</td> </tr> <tr> <td>Disroot</td> <td>๐ŸŸ  Netherlands (9 Eyes)</td> <td>๐ŸŸ  PGP (Off-by-default)</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸข Free, with payment required for each additional feature</td> <td>๐ŸŸ  Yes (Donation required)</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸข Yes (IMAP, POP, SMTP)</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸข Yes (BTC only)</td> <td>๐ŸŸข None</td> </tr> <tr> <td>Hushmail</td> <td>๐Ÿ”ด Canada (5 Eyes)</td> <td>๐ŸŸข PGP</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  No free plan. Starts at $5.99 / month, rising to $7.99 for email archiving support</td> <td>๐ŸŸ  Yes (Small Business Plan, $5.99/m)</td> <td>๐ŸŸ  Yes (Small Business Plan, $5.99/m)</td> <td>๐ŸŸข Yes (POP, SMTP)</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  Full name, recovery email</td> </tr> <tr> <td>LavaBit</td> <td>๐Ÿ”ด United States (5 Eyes)</td> <td>๐ŸŸ  DIME</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  Free plan, but invite only. Pricing ranges from $30 - $60 / year, depending on storage requirements</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐Ÿ”ด No</td> <td>๐ŸŸ  Full name, recovery email</td> </tr> </tbody></table> </div> <p><em>To make changes to the above list, submit a pull request to <a href="https://github.com/Lissy93/email-comparison" rel="noopener nofollow" target="_blank">github.com/Lissy93/email-comparison</a></em></p> <hr> <h3>See Also</h3> <ul> <li><a href="https://github.com/Lissy93/personal-security-checklist#emails" rel="noopener nofollow" target="_blank">Email Security Tips</a></li> <li><a href="https://github.com/Lissy93/personal-security-checklist/blob/master/5_Privacy_Respecting_Software.md" rel="noopener nofollow" target="_blank">More Privacy Software</a></li> </ul> <style> .single-post-show .post-content { max-width: 98%; margin: 0 auto; } .post-body table { width: 95%; max-width: 90vw; } .post-body iframe { max-width: 600px; margin: 1rem auto; border-radius: 5px; } /* Table Styles */ .table-wrapper{ margin: 1rem; border-radius: 8px; box-shadow: 0 5px 8px #00000080, 0 1px 2px #000000; } .fl-table { border-radius: 5px; font-size: 12px; font-weight: normal; border: none; border-collapse: collapse; width: 100%; max-width: 100%; white-space: nowrap; } .fl-table th { text-align: center; padding: 0.5rem; } .fl-table td { text-align: left; padding: 0.5rem; } .fl-table td { border-right: 1px solid #f8f8f8; font-size: 1rem; } .fl-table thead th { color: #ffffff; background: #4FC3A1; } .fl-table tr { color: #ffffff; background: #0b1021; } .fl-table thead th:nth-child(odd) { color: #ffffff; background: #060913; } .fl-table tr:nth-child(even) { background: #092935; } /* Responsive */ @media (max-width: 767px) { .fl-table { display: block; width: 100%; } .table-wrapper:before{ content: "Scroll horizontally >"; display: block; text-align: right; font-size: 11px; color: white; padding: 0 0 10px; } .fl-table thead, .fl-table tbody, .fl-table thead th { display: block; } .fl-table thead th:last-child{ border-bottom: none; } .fl-table thead { float: left; } .fl-table tbody { width: auto; position: relative; overflow-x: auto; } .fl-table td, .fl-table th { padding: 20px .625em .625em .625em; height: 60px; vertical-align: middle; box-sizing: border-box; overflow-x: hidden; overflow-y: auto; width: 120px; font-size: 13px; text-overflow: ellipsis; } .fl-table thead th { text-align: left; border-bottom: 1px solid #f7f7f9; } .fl-table tbody tr { display: table-cell; } .fl-table tbody tr:nth-child(odd) { background: none; } .fl-table tr:nth-child(even) { background: transparent; } .fl-table tr td:nth-child(odd) { background: #F8F8F8; border-right: 1px solid #E6E4E4; } .fl-table tr td:nth-child(even) { border-right: 1px solid #E6E4E4; } .fl-table tbody td { display: block; text-align: left; } } </style> </p> One-Line Web Server ๐Ÿ–ฅ๏ธ Alicia's Notes ๐Ÿš€ Thu, 10 Feb 2022 13:54:56 +0000 https://notes.aliciasykes.com/32456/one-line-web-server https://notes.aliciasykes.com/32456/one-line-web-server <p><p>The following commands will each start a simple web server, serving up the files in the current directory.<br> Just open up the browser, and navigate to the system's IP + port (e.g. <code class="prettyprint">http://localhost:8080</code>).</p> <h3>Python</h3> <div class="highlight"><pre class="highlight plaintext"><code>python -m http.server 8000 </code></pre></div> <hr> <h3>Node.js</h3> <div class="highlight"><pre class="highlight plaintext"><code>npx http-server ./ --port 8080 </code></pre></div> <hr> <h3>PHP</h3> <div class="highlight"><pre class="highlight plaintext"><code>php -S 127.0.0.1:8080 </code></pre></div> <hr> <h3>Ruby</h3> <div class="highlight"><pre class="highlight plaintext"><code>ruby -run -e httpd ./ -p 8080 </code></pre></div> <hr> <h3>R</h3> <div class="highlight"><pre class="highlight plaintext"><code>Rscript -e 'servr::httd()' -p8080 </code></pre></div> <hr> <h3>Caddy</h3> <p><a href="https://caddyserver.com/" rel="noopener nofollow" target="_blank">Caddy</a> is a feature-rich production-ready Go-based web server, with easy configuration. Just download and use something like the following command.</p> <div class="highlight"><pre class="highlight plaintext"><code>caddy file-server </code></pre></div> <hr> <h3>Rust (with <a href="https://github.com/svenstaro/miniserve" rel="noopener nofollow" target="_blank">miniserve</a>)</h3> <div class="highlight"><pre class="highlight plaintext"><code>cargo install miniserve miniserve -p 8080 . </code></pre></div> <hr> <h3>BusyBox</h3> <div class="highlight"><pre class="highlight plaintext"><code>busybox httpd -f -p 8080 </code></pre></div> <hr> <p>You can also share the server with someone remotely,<br> see: <a href="https://notes.aliciasykes.com/p/RUi22QSyWe">Using Ngrok to expose server to the internet</a></p> </p> NPM Dependency Security Best Practices ๐Ÿ“ฆ Alicia's Notes ๐Ÿš€ Mon, 20 Sep 2021 12:06:46 +0000 https://notes.aliciasykes.com/28300/npm-dependency-security-best-practices https://notes.aliciasykes.com/28300/npm-dependency-security-best-practices <p><p><em>The Definitive Guide to NPM Package Security</em></p> <h2>Check for Outdated Dependencies</h2> <p>It's important to keep dependencies up-to-datem since these packages usually undergo continuous improvements, bugs fixes and security patches.</p> <p>Yarn has this functionality built in, with <a href="https://classic.yarnpkg.com/en/docs/cli/outdated/" rel="noopener nofollow" target="_blank">yarn outdated</a>, which shows version info for all a projects installed dependencies. </p> <p>A better tool for the job is <a href="https://github.com/dylang/npm-check" rel="noopener nofollow" target="_blank">npm-check</a> (MIT) by @dylang, which will check for outdated, incorrect, and unused dependencies. This is used by just running <code class="prettyprint">npx npm-check</code> from your projects root, you can also interactively update outdated packages with the <code class="prettyprint">--update</code> flag, check <a href="https://github.com/dylang/npm-check#options" rel="noopener nofollow" target="_blank">the docs</a> for all options.</p> <p>There's also <a href="https://david-dm.org/" rel="noopener nofollow" target="_blank">David-DM</a>, a website that shows list of outdated dependencies for a given <strong>public</strong> git repo, with embeddable badges.</p> <hr> <h2>Remove Unused Packages</h2> <p>Large projects have a tendency to accumulate unused dependencies, causing there to be more to maintain, larger package size, and increased attack surface.</p> <p>An easy way to check for unused dependencies, is with <a href="https://github.com/depcheck/depcheck" rel="noopener nofollow" target="_blank">depcheck</a>, a CLI tool for determining which of your installed packages are (likely) not being used anywhere in your code base. To use, just run <code class="prettyprint">npx depcheck</code>. This tool is included within the npm-check mentioned above. It's worth noting, that this is not 100% accurate, so be careful when removing dependencies. <br> You can also remove any dependencies that have an overlapping range, with <code class="prettyprint">yarn dedupe</code></p> <hr> <h2>Audit Package Security</h2> <p>If a project has a large number of dependencies, then it will be more exposed to security risks. Many packages open new ports, thus increasing the attack surface, and some include vulnerabilities, a few of which are extremely severe; and open source projects regularly grow stale, neglecting to fix security flaws.</p> <p><a href="https://classic.yarnpkg.com/en/docs/cli/audit" rel="noopener nofollow" target="_blank">yarn audit</a> or <a href="https://support.snyk.io/hc/en-us/articles/360003812578-Our-full-CLI-reference#test" rel="noopener nofollow" target="_blank">Snyk Test</a> can be used to find, fix and monitor known vulnerabilities in open-source dependencies.</p> <p>Sometimes these can be fixed automatically, with <code class="prettyprint">yarn audit fix</code>, which will update certain semver-compatible packages to the patched version, if available.</p> <p>Another option is to use a bot to scan for vulnerable packages, and submit a PR when a fix becomes available. The branch can then be pulled, tested and either merged or rejected. A popular choice for this is <a href="https://dependabot.com/" rel="noopener nofollow" target="_blank">Dependabot</a>. This functionality, plus more is also included with <a href="https://snyk.io/" rel="noopener nofollow" target="_blank">Snyk</a>, a hosted solution for E2E application security monitoring.</p> <p>If your project contains a dependency that has been identified as vulnerable, it is important to address it as quickly as possible. Either:</p> <ul> <li>Update the package to a patched version, if available</li> <li>Remove or replace the vulnerable package</li> <li>Mark the issue as low risk, if you've looked into it and identified that there is no issue in your use case, such as in a dev dependency that is not used in production</li> </ul> <p>It's worth noting that not all issues raised by the audit will actually have any impact on your application. Each issue still needs to be looked into to determine weather it is relevant to your use case though.</p> <hr> <h2>Only use Well Maintained Packages</h2> <p>Packages that are used by tens of thousands of projects are usually more closely monitored by other developers and security researchers, as opposed to smaller projects with very few regular users. This is important, as security (and other issues) will likely be spotted sooner, and addressed quicker in better maintained projects.</p> <p>One way to assess package usage is its download rate, indicated in "Stats" section of the npmโ€™s package page, or using <a href="https://npm-stat.com/" rel="noopener nofollow" target="_blank">npm-stat.com</a> for historic download data. You should also check the projects GitHub page, see what to look for below.</p> <hr> <h2>Analysing Package Sizes</h2> <p><a href="https://bundlephobia.com/" rel="noopener nofollow" target="_blank">Bundlephobia</a> is a super useful tool for checking any packages size and bundle impact prior to installing. There's also <a href="https://github.com/siddharthkp/cost-of-modules" rel="noopener nofollow" target="_blank">cost-of-modules</a>, a CLI tool for locally analysing the size of the significant packages within your project. Just run <code class="prettyprint">npx cost-of-modules</code> within your projects root.</p> <hr> <h2>Respecting Package Licenses</h2> <p>Open-Source components are published either under a permissive or a copyleft license. Before adding any package, it's important to check the license. Some common open source software licenses, such as GPL will prevent you from using their packages unless you also open source your code, and many packages (such as MIT) require you to correctly give attribution to the original author. To quickly understand what any given license allows you to do, <a href="https://tldrlegal.com/" rel="noopener nofollow" target="_blank">TDLR; Legal</a> is a useful resource. </p> <p>There are also tools to help you automate the process of license checking within your project. The most notable hosted solution is <a href="https://fossa.com/" rel="noopener nofollow" target="_blank">FOSSA</a>, which will automatically scan your project for dependency licenses and notify you of any issues and breach of licenses. There's also <a href="https://github.com/davglass/license-checker" rel="noopener nofollow" target="_blank">license-checker</a>, a CLI tool which runs locally, and will output a list of licenses used by dependencies. This can be used by running <code class="prettyprint">npx license-checker</code> from the root of your project</p> <hr> <h2>Ignore Run Scripts</h2> <p>NPM <a href="https://docs.npmjs.com/cli/v8/using-npm/scripts" rel="noopener nofollow" target="_blank">script hooks</a> allow code to run at various points of the package life cycle. This is often used for general housekeeping tasks, but it can also be abused by bad actors to execute malicious code (such as the <a href="https://security.snyk.io/vuln/npm:eslint-scope:20180712" rel="noopener nofollow" target="_blank">eslint-scope incident</a> and the <a href="https://security.snyk.io/vuln/npm:crossenv:20170802" rel="noopener nofollow" target="_blank">crossenv incident</a>). Such attacks can usually be avoided by properly vetting new packages as well as upgrades. Adding the <code class="prettyprint">ignore-scripts</code> option to your <code class="prettyprint">.npmrc</code> file will prevent packages from running arbitrary commands.</p> <hr> <h2>Package Health Checks</h2> <p>The <a href="https://docs.npmjs.com/cli/v6/commands/npm-doctor" rel="noopener nofollow" target="_blank">npm doctor</a> command is useful for ensuring that everything is in order, and should be integrated into your automated checks. It will do the following:</p> <ul> <li>Check the official npm registry is reachable, and display the currently configured registry.</li> <li>Check that Git is available.</li> <li>Review installed npm and Node.js versions.</li> <li>Run permission checks on the various folders such as the local and global node_modules, and on the folder used for package cache.</li> <li>Check the local npm module cache for checksum correctness.</li> </ul> <hr> <h2>Considerations when adding new Packages</h2> <p>A lot of the above issues can be mitigated, just by being thoughtful about what your installing into your project. Think about weather you really need another new dependency, ensure there's nothing similar already included in your app, and then thouroughly check the project out, being sure to validate the following criteria:</p> <ul> <li>When was it last updated?</li> <li>How often are releases published?</li> <li>How many developers have contributed to it? (More is better, as there is a lower risk of the project being abandoned, and a higher chance that issues are spotted).</li> <li>How many open issues are there?</li> <li>Does it have a security policy?</li> <li>Any open or recent security advisories?</li> <li>Is it correctly using semantic versioning?</li> <li>Is it thoroughly tested?</li> <li>Does it use many additional dependencies? If so, are they to be deemed trustworthy?</li> <li>How many other projects rely on it?</li> <li>Is it frequently downloaded? (Check the "Stats" section of the NPM page, or use <a href="https://npm-stat.com/" rel="noopener nofollow" target="_blank">npm-stat.com</a>)</li> <li>Is the code clear and readable? If it is, then issues will be much easier to spot</li> <li>Is the license compatible with your project, and have you acknowledged the terms (e.g. attribution)</li> <li>How large is the package? And how will this affect your project's bundle size</li> </ul> <p>For quick info about any package, you can also run <code class="prettyprint">npm view [package-name]</code></p> <hr> <h2>Strict Installs</h2> <p>When setting up your project in the CI environment, it is reccomended to use the CI install command. This is more strict than a regular install, which can help catch errors or inconsistencies caused by the incrementally-installed local environments of most npm users. It's also significantly faster, since it skips certain user-oriented features. Just replace npm i, with <code class="prettyprint">npm ci</code>, or for yarn use: <code class="prettyprint">yarn install --frozen-lockfile</code>.</p> <hr> <h2>Lockfiles</h2> <p>In order to ensure reproducible builds, yarn needs to know exactley which version of each package should be installed. This is specified in the <code class="prettyprint">yarn.lock</code> file (or <code class="prettyprint">npm-lock.json</code> for NPM), and is auto-generated on install. This file should be commited to git, as it will prevent updates in a packages minor version causing any unexpected errors in on other machines.</p> <hr> <h2>Registry</h2> <p>Using your own registry, such as <a href="https://github.com/verdaccio/verdaccio" rel="noopener nofollow" target="_blank">Verdaccio</a> which can be privatley self-hosted, gives you far greater control over your NPM downloads. It allows for easy usage of private packages, and also gives you the ability to proxy other registries, and cache the downloaded of modules along the way, for improved speed and control, you can link multiple registries and override public packages. Alternative options include using NPM's enterprise offering, or installing dependencies directly from private git repos.</p> <hr> <h2>Dependency Inversion Principle</h2> <p>When writing your own modules, follow the SOLID principles, specifically in terms of the coupling between the different classes or modules. Writing small, maintainable, tested, single-purpose packages, which will then be easier to manage in terms of security and quality.</p> <hr> <h2>Secure your NPM Account</h2> <p>If you're publishing any of your modules to the NPM registry, then secure access is very important. Ensure that you've enabled 2FA, and keep your account credentials and tokens safe. If your not making any updates, then login using read-only mode. Make use of NPM author tokens for publishing and updating packages.</p> <hr> <h2>Watch out for Typosquatting Attacks</h2> <p>Typosquatting is an attack that involves packages with slight naming changes, that are often installed by mistake due to a typo. Since packages can have access to environmental variables, which often include credentials, tokens and API keys, a malicious actor can harvest this sensitive info.</p> <p>To protect yourself:</p> <ul> <li>Take care when copying and pasting commands into the terminal and always verify the source of the repo that you are installing via <code class="prettyprint">npm info</code>.</li> <li>Default to having an npm logged-out user in your daily work routines so your credentials wonโ€™t be the weak spot that would lead to easily compromising your account.</li> <li>Consider appending the <code class="prettyprint">--ignore-script</code> flag when installing packages, to prevent them from executing arbitrary code.</li> </ul> <hr> <h2>Tips and Tricks</h2> <ul> <li>Use any NPM CLI package, without having to first install it, using <code class="prettyprint">npx</code></li> <li>While developing multiple packages simultaneously, <a href="https://classic.yarnpkg.com/en/docs/cli/link/" rel="noopener nofollow" target="_blank">yarn link</a> is useful for creating symbolic links between them</li> <li>Due to how NPM dependencies are structured, if you've been working on a lot of projects, you can find your disk space frequently running low. <a href="https://npkill.js.org/" rel="noopener nofollow" target="_blank">NPKill</a> is a handy CLI util, to find all node_modules directories for easy deletion of the ones you no longer need. Just run <code class="prettyprint">npx npkill</code> to get started. You can also <a href="https://listed.to/@lissy93/16988/how-to-remove-all-node_modules-folders" rel="noopener nofollow" target="_blank">do this nativley</a></li> <li>To open the GitHub page for any package, just run <code class="prettyprint">npm docs [package-name]</code></li> <li>If your facing any issues with NPM, then running <code class="prettyprint">npm doctor</code> with troubleshoot common issues, and output the likely fix</li> <li>List all installed packages in a tree structure with <code class="prettyprint">npm ls</code></li> <li>Many of the NPM short commands can be grouped together, for example <code class="prettyprint">npm cit</code> is the same as fresh install and run tests</li> <li>When working with mono-repos or multiple packages, you can use the <code class="prettyprint">--prefix [./path/to/dir]</code> flag to run NPM commands in other directories, without having to cd</li> <li>To view all valid release versions of a given package, run <code class="prettyprint">npm view [package-name] versions</code>, or <code class="prettyprint">yarn info [package-name] versions</code></li> <li>View a tree of dependencies for any package, with <a href="https://npmgraph.js.org/" rel="noopener nofollow" target="_blank">npmgraph.js.org</a></li> <li>Use different NPM versions for different projects easily with <a href="https://volta.sh/" rel="noopener nofollow" target="_blank">Volta</a></li> <li>More info can be found for any CVE via <a href="https://www.cvedetails.com/" rel="noopener nofollow" target="_blank">cvedetails.com</a> or using <a href="https://github.com/advisories" rel="noopener nofollow" target="_blank">GitHub Advisories</a>.</li> </ul> </p> AHK: Use Arrow Keys as Modfifiers Alicia's Notes ๐Ÿš€ Thu, 06 May 2021 10:27:33 +0000 https://notes.aliciasykes.com/25326/ahk-use-arrow-keys-as-modfifiers https://notes.aliciasykes.com/25326/ahk-use-arrow-keys-as-modfifiers <p><h3>Intro</h3> <p>The following <a href="https://www.autohotkey.com/" rel="noopener nofollow" target="_blank">AutoHotKey</a> script enables you to use Ctrl + Alt followed by an arrow key to target PgUp, PgDwn, Home and End. </p> <p>These function keys are seriously underated, they allow you to navigate code, documents, webpages etc much faster than using the arrow keys alone. It means you don't have to reach so far across the keyboard, and useful for smaller keyboards that don't have these dedicated keys</p> <p>This is inspired by using <code class="prettyprint">Alt</code> + <code class="prettyprint">Left</code> / <code class="prettyprint">Right</code> arrow, which (in most systems) moves the cursor forward/ backward by one word at a time (rather than a single character)</p> <hr> <h3>Usage</h3> <p>Moving the cursor/ navigating:</p> <ul> <li><code class="prettyprint">Ctrl</code> + <code class="prettyprint">Alt</code> + <code class="prettyprint">Up</code> --&gt; <code class="prettyprint">Page Up</code></li> <li><code class="prettyprint">Ctrl</code> + <code class="prettyprint">Alt</code> + <code class="prettyprint">Down</code> --&gt; <code class="prettyprint">Page Down</code></li> <li><code class="prettyprint">Ctrl</code> + <code class="prettyprint">Alt</code> + <code class="prettyprint">Left</code> --&gt; <code class="prettyprint">Home</code></li> <li><code class="prettyprint">Ctrl</code> + <code class="prettyprint">Alt</code> + <code class="prettyprint">Right</code> --&gt; <code class="prettyprint">End</code></li> </ul> <p>You can also use this combination along with the Shift key, in order to select text between the cursors start and end point:</p> <ul> <li><code class="prettyprint">Ctrl</code> + <code class="prettyprint">Alt</code> + <code class="prettyprint">Shift</code> + <code class="prettyprint">Up</code> --&gt; Will select entire document above cursor</li> <li><code class="prettyprint">Ctrl</code> + <code class="prettyprint">Alt</code> + <code class="prettyprint">Shift</code> + <code class="prettyprint">Down</code> --&gt; Will select entire document below cursor</li> <li><code class="prettyprint">Ctrl</code> + <code class="prettyprint">Alt</code> + <code class="prettyprint">Shift</code> + <code class="prettyprint">Left</code> --&gt; Will select entire line to the left</li> <li><code class="prettyprint">Ctrl</code> + <code class="prettyprint">Alt</code> + <code class="prettyprint">Shift</code> + <code class="prettyprint">Right</code> --&gt; Will select all text from the cursor, to the end of the line</li> </ul> <hr> <h3>The Script</h3> <div class="highlight"><pre class="highlight plaintext"><code>!^*Up:: GetKeyState, state, Shift if state = D Send +{PgUp} else Send {PgUp} return !^*Down:: GetKeyState, state, Shift if state = D Send +{PgDn} else Send {PgDn} return !^*Left:: GetKeyState, state, Shift if state = D Send +{Home} else Send {Home} return !^*Right:: GetKeyState, state, Shift if state = D Send +{End} else Send {End} return </code></pre></div> <hr> <h3>Installation</h3> <p>First ensure that you have the latest version of <a href="https://www.autohotkey.com/" rel="noopener nofollow" target="_blank">AutoHotKey</a> installed on your system. Copy the above script, and save it in a file with a <code class="prettyprint">.ahk</code> extension. Finally, double click on the file, and it should now be running. You will now see the AHK icon in your task bar, and should be able to use the above key bindings.</p> <p>Note that AutoHotKey is only available for Windows-based systems, but similar functionality can usually be achieved natively on Linux, through your WM, or using a utility such as <a href="https://github.com/autokey/autokey" rel="noopener nofollow" target="_blank">AutoKey</a> for X11.</p> </p> Dashy - A Self-Hosted Home Lab Dashboard ๐Ÿš€ Alicia's Notes ๐Ÿš€ Wed, 05 May 2021 10:39:23 +0000 https://notes.aliciasykes.com/25291/dashy-a-self-hosted-home-lab-dashboard https://notes.aliciasykes.com/25291/dashy-a-self-hosted-home-lab-dashboard <p><p>Here's a quick project that I built in order to keep track of locally running services on my home lab. It serves as a landing page, to make it easier to navigate to various apps, without having to remember and type IP addresses or URLs. </p> <p><img src="https://i.ibb.co/LrcpNg9/dashy.png" style="float:right;width:220px;"></p> <h4>Contents</h4> <ul> <li><a href="#features">Features</a></li> <li><a href="#code">Source Code</a></li> <li><a href="#demo">Live Demo</a></li> <li><a href="#screenshots">Screenshots</a></li> <li><a href="#usage">Usage Guide</a></li> <li><a href="#alternatives">Similar Apps / Alternatives</a></li> <li><a href="#credits">Credits</a></li> <li><a href="#license">License</a></li> </ul> <p></p><hr id="features"><p></p> <h3>Features</h3> <ul> <li>Instant search by name, domain and tags - just start typing</li> <li>Full keyboard shortcuts for navigation, searching and launching</li> <li>Multiple color themes, with easy method for adding more</li> <li>Customizable layout options, and item sizes</li> <li>Quickly preview a website, by holding down the Alt key while clicking, to open it in a resizable pop-up modal</li> <li>Many options for icons, including full Font-Awesome support and the ability to auto-fetch icon from URLs favicon</li> <li>Additional info for each item visible on hover (including opening method icon and description as a tooltip)</li> <li>Option for full-screen background image, custom nav-bar links, and custom footer text</li> <li>User settings stored in local storage and applied on load</li> <li>Encrypted cloud backup and restore feature available</li> <li>Easy single-file YAML-based configuration</li> <li>Small bundle size, fully responsive UI and PWA makes the app easy to use on any device</li> <li>Plus lots more...</li> </ul> <p></p><hr id="code"><p></p> <h3>Source Code</h3> <p>Source, on GitHub: <a href="https://github.com/Lissy93/dashy" rel="noopener nofollow" target="_blank">github.com/Lissy93/dashy</a></p> <p></p><hr id="demo"><p></p> <h3>Live Demo</h3> <p><a href="https://dashy-demo-1.as93.net" rel="noopener nofollow" target="_blank">Demo 1</a> โ”† <a href="https://dashy-demo-2.as93.net" rel="noopener nofollow" target="_blank">Demo 2</a> โ”† <a href="https://dashy-demo-3.as93.net" rel="noopener nofollow" target="_blank">Demo 3</a></p> <p></p><hr id="screenshots"><p></p> <h3>Screenshots</h3> <p><img class="screen-recording" src="https://i.ibb.co/L8YbNNc/dashy-demo2.gif"></p> <p><img class="screen-shots" src="https://i.ibb.co/7r2FwL2/dashy-screenshots-grid.png"></p> <p><img src="https://i.ibb.co/M6nyvqW/dashy-options-screen.png"></p> <p></p><hr id="usage"><p></p> <h3>Usage Guide</h3> <blockquote> <p>For full setup instructions, see <a href="https://listed.to/p/We3d5inEky" rel="noopener nofollow" target="_blank">this post</a>, or follow the GitHub readme.</p> </blockquote> <h4>Setup</h4> <p>Get the code: <code class="prettyprint">git clone git@github.com:Lissy93/dashy.git</code> and <code class="prettyprint">cd dashy</code><br> Then install the dependencies: <code class="prettyprint">yarn</code></p> <h4>Configuring</h4> <p>All settings are specified in <code class="prettyprint">./public/conf.yml</code>. You can see a full list of options in the <a href="https://github.com/Lissy93/dashy#configuring-" rel="noopener nofollow" target="_blank">docs</a>, or modify one of <a href="https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10" rel="noopener nofollow" target="_blank">these example configs</a></p> <h4>Deploying</h4> <p>First build the project, with <code class="prettyprint">yarn build</code>, you can then run <code class="prettyprint">yarn start</code> to run it. Alternatively use Docker, with <code class="prettyprint">docker run -it -p 8080:80 --rm --name my-dashboard lissy93/dashy</code></p> <h4>Developing</h4> <p>Running <code class="prettyprint">yarn dev</code> will build, test, lint then start the development server and watch for changes</p> <p></p><hr id="alternatives"><p></p> <h3>Similar Apps / Alternatives</h3> <p>There are a few self-hosted web apps, that serve a similar purpose to Dashy. Including, but not limited to: <a href="https://github.com/phntxx/dashboard" rel="noopener nofollow" target="_blank">Dashboard</a>, <a href="https://github.com/rmountjoy92/DashMachine" rel="noopener nofollow" target="_blank">Dash Machine</a>, <a href="https://github.com/linuxserver/Heimdall" rel="noopener nofollow" target="_blank">Heimdall</a>, <a href="https://lamarios.github.io/Homedash2" rel="noopener nofollow" target="_blank">HomeDash2</a>, <a href="https://github.com/tomershvueli/homepage" rel="noopener nofollow" target="_blank">Homepage</a>, <a href="https://github.com/bastienwirtz/homer" rel="noopener nofollow" target="_blank">Homer</a>, <a href="https://organizr.app/" rel="noopener nofollow" target="_blank">Organizr</a> and <a href="https://github.com/kutyla-philipp/simple-dash" rel="noopener nofollow" target="_blank">Simple-Dash</a></p> <p></p><hr id="credits"><p></p> <h3>Credits</h3> <p>The app makes use of the following components, kudos to their respective authors</p> <ul> <li><a href="https://github.com/sagalbot/vue-select" rel="noopener nofollow" target="_blank">vue-select</a> - Dropdown component by @sagalbot</li> <li><a href="https://github.com/euvl/vue-js-modal" rel="noopener nofollow" target="_blank">vue-js-modal</a> - Modal component by @euvl</li> <li><a href="https://github.com/Akryum/v-tooltip" rel="noopener nofollow" target="_blank">v-tooltip</a> - Tooltip component by @Akryum</li> <li><a href="https://github.com/jairoblatt/vue-material-tabs" rel="noopener nofollow" target="_blank">vue-material-tabs</a> - Tab view component by @jairoblatt</li> <li><a href="https://github.com/yansenlei/VJsoneditor" rel="noopener nofollow" target="_blank">VJsoneditor</a> - Interactive JSON editor component by @yansenlei <ul> <li>Forked from <a href="https://github.com/josdejong/jsoneditor" rel="noopener nofollow" target="_blank">JsonEditor</a> by @josdejong</li> </ul></li> </ul> <p>And the app itself is built with <a href="https://github.com/vuejs/vue" rel="noopener nofollow" target="_blank">Vue.js</a> <img class="vue-logo" src="https://i.ibb.co/xqKW6h5/vue-logo.png"></p> <p></p><hr id="license"><p></p> <h3>License</h3> <p><img class="license" src="https://user-images.githubusercontent.com/1862727/68531648-69ef4200-030c-11ea-8d48-74af7a2d8304.png"></p> <p>Licensed under <a href="https://gist.github.com/Lissy93/143d2ee01ccc5c052a17" rel="noopener nofollow" target="_blank">MIT X11</a>, ยฉ Alicia Sykes 2021: <a href="https://aliciasykes.com" rel="noopener nofollow" target="_blank">https://aliciasykes.com</a></p> <style> .screen-recording, .screen-shots { margin: 0 auto; border-radius: 4px; border: 1px solid #00CCB4; } .vue-logo { display: inline !important; height: 1.5rem; margin: 0;} .license { width: 150px; float: right; margin: 0 !important;} .post-content .post-body h4 { margin-bottom: 0; font-size: 1.1rem;} </style> </p> Using Espanso to boost Efficiency ๐Ÿšค Alicia's Notes ๐Ÿš€ Sat, 01 May 2021 19:37:17 +0000 https://notes.aliciasykes.com/25213/using-espanso-to-boost-efficiency https://notes.aliciasykes.com/25213/using-espanso-to-boost-efficiency <p><h2>Intro</h2> <p><img align="right" width="350" src="https://i.ibb.co/0GTVC02/espanso-octocat.png"></p> <p><a href="https://espanso.org/" rel="noopener nofollow" target="_blank">Espanso</a> is an open source, privacy-first, cross-platform text expander developed by <a href="https://github.com/federico-terzi" rel="noopener nofollow" target="_blank">@federico-terzi</a> and written in Rust. In short, it detects when you type a certain keyword, and replaces it on the fly with a pre-defined string or dynamic output. </p> <p>Espanso not only supports simple text replacement/ expansion, but also images, custom scripts and shell commands, app-specific configurations and more. There is also a basic form feature, enabling arguments to be passed to a block. It's under active development, so hopefully there will be even more functionality implemented in the future. </p> <p>It uses a file-based configuration, written entirely in <a href="https://yaml.org/" rel="noopener nofollow" target="_blank">YAML</a> (but I think there is a GUI <a href="https://github.com/federico-terzi/espanso/issues/255" rel="noopener nofollow" target="_blank">in development</a>), and for the most part is quick and easy to it it configured exactly to your liking. But you can also use pre-built packages, installed via <a href="https://hub.espanso.org/" rel="noopener nofollow" target="_blank">Espanso Hub</a> (or any external source).</p> <p>There are many possibilities where Espanso can be really useful, but the main areas that I am using it for are:</p> <ul> <li>Quickly typing characters that do not appear on my keyboard (such as math symbols, foreign language characters and emojis)</li> <li>Easily inserting longer strings that would otherwise have required many keystrokes</li> <li>Inserting dynamic content, such as the output of a script, response from an API call, or time/ date info</li> <li>Making typing easier, with a custom spelling and grammar auto-correct system</li> </ul> <p><strong>Espanso Links</strong>: <a href="https://espanso.org/docs/" rel="noopener nofollow" target="_blank">Docs</a>, <a href="https://www.reddit.com/r/espanso/" rel="noopener nofollow" target="_blank">Reddit</a>, <a href="https://hub.espanso.org/" rel="noopener nofollow" target="_blank">Package Hub</a>, <a href="https://github.com/federico-terzi/espanso" rel="noopener nofollow" target="_blank">Source Code</a>, <a href="https://espanso.org/install/" rel="noopener nofollow" target="_blank">Quick Start</a>, <a href="https://federicoterzi.com/" rel="noopener nofollow" target="_blank">Author's Site</a></p> <blockquote> <p>I'm still working on my config, but for reference here it is: <a href="https://github.com/Lissy93/espanso-config" rel="noopener nofollow" target="_blank">github.com/Lissy93/espanso-config</a></p> </blockquote> <hr> <h2>Use Cases</h2> <h3>Easy Emoji Inputs</h3> <p>The first thing I used Espanso for was being able to type emojis, without having to use wait for a popup to load or use the internet.</p> <p>There is a plugin that does exactly this perfectly, called <a href="https://github.com/FoxxMD/espanso-all-emojis/blob/master/all-emojis/0.1.0/package.yml" rel="noopener nofollow" target="_blank">espanso-all-emojis</a>, by <a href="https://github.com/FoxxMD" rel="noopener nofollow" target="_blank">@FoxxMD</a>, using <a href="https://github.com/github/gemoji" rel="noopener nofollow" target="_blank">gemoji</a>. It can be installed with:<br> <code class="prettyprint">espanso install all-emojis</code></p> <p>Then just type the name of the emoji, surrounded by colons. For example:<br> <code class="prettyprint">:smile:</code> --&gt; ๐Ÿ˜„, <code class="prettyprint">:rocket:</code> --&gt; ๐Ÿš€, <code class="prettyprint">:milky way:</code> --&gt; ๐ŸŒŒ</p> <p>For reference, here is the <a href="https://listed.to/p/B8GXbP6Yk3" rel="noopener nofollow" target="_blank">full list emojis</a>, along with their shorthand code</p> <p>The next thing I wanted to do, was be able to easily insert old-school ASCII emoticons or Lenny faces. This could be done with a similar method, but I didn't want to have to remember all the key combinations. A perfect opportunity to give Espanso's <a href="https://espanso.org/docs/forms/" rel="noopener nofollow" target="_blank">form feature</a> a go!</p> <p>With the above code, typing <code class="prettyprint">:lenny</code> will open up a form with a dropdown, using the arrow keys I can now select an option, hit enter and it will be inserted</p> <p><img class="demo" src="https://i.ibb.co/Vx2Xpdn/Espanso-lenny.gif" alt="Espanso Lenny Demo"></p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Easily inputs ASCII emoticons from a dropdown</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:lenny</span> <span class="na">form</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{smileys}}"</span> <span class="na">form_fields</span><span class="pi">:</span> <span class="na">smileys</span><span class="pi">:</span> <span class="na">type</span><span class="pi">:</span> <span class="s">choice</span> <span class="na">values</span><span class="pi">:</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">ยฏ\\_(ใƒ„)_/ยฏ'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">(โ•ฏยฐโ–กยฐ๏ผ‰โ•ฏ๏ธต</span><span class="nv"> </span><span class="s">โ”ปโ”โ”ป'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">(</span><span class="nv"> </span><span class="s">อกเฒ </span><span class="nv"> </span><span class="s">ส–ฬฏ</span><span class="nv"> </span><span class="s">อกเฒ )'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">โ˜‰</span><span class="nv"> </span><span class="s">โ€ฟ</span><span class="nv"> </span><span class="s">โš†'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">ส•โ€ขแดฅโ€ขส”'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">โ‹†๏ฝกหš</span><span class="nv"> </span><span class="s">โ˜๏ธŽ</span><span class="nv"> </span><span class="s">หš๏ฝกโ‹†๏ฝกหšโ˜ฝหš๏ฝกโ‹†'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">(ใฅแต”โ—กแต”)ใฅ'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">|แต”โ€ฟแต”|'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">โคœ(*๏น*)โค'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">ใƒ„'</span> </code></pre></div> <hr> <h3>Inserting Dynamic Content</h3> <p>Espanso has a series of built in extensions, that are able to insert dynamic data, either from a command, script, web address or API</p> <p>An example of how this can be useful, is for fetching your current public IP address, using <a href="https://api.ipify.org" rel="noopener nofollow" target="_blank">ipify.org</a>:</p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Outputs public IP address</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:ip"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{output}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">output</span> <span class="na">type</span><span class="pi">:</span> <span class="s">shell</span> <span class="na">params</span><span class="pi">:</span> <span class="na">cmd</span><span class="pi">:</span> <span class="s2">"</span><span class="s">curl</span><span class="nv"> </span><span class="s">'https://api.ipify.org'"</span> </code></pre></div> <p>Or the current weather in your location, using <a href="http://wttr.in" rel="noopener nofollow" target="_blank">wttr.in</a>:</p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Outputs the current weather for your location</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:weather"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{output}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">output</span> <span class="na">type</span><span class="pi">:</span> <span class="s">shell</span> <span class="na">params</span><span class="pi">:</span> <span class="na">cmd</span><span class="pi">:</span> <span class="s2">"</span><span class="s">curl</span><span class="nv"> </span><span class="s">'http://wttr.in/?format=3'"</span> </code></pre></div> <p>Easily insert the MIT license:</p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Outputs full MIT license text, from GitHub</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:mit-long</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{output}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">output</span> <span class="na">type</span><span class="pi">:</span> <span class="s">shell</span> <span class="na">params</span><span class="pi">:</span> <span class="na">cmd</span><span class="pi">:</span> <span class="s2">"</span><span class="s">curl</span><span class="nv"> </span><span class="s">'https://gist.githubusercontent.com/Lissy93/143d2ee01ccc5c052a17/raw/a8ac96cd15847a231931b561d95d2de47066fd33/LICENSE.MD'"</span> </code></pre></div> <hr> <h3>Generating Deterministic Passwords on the Fly</h3> <p><a href="https://lesspass.com" rel="noopener nofollow" target="_blank">LessPass</a> is a stateless password manager, given a set of arguments (usually site, username and master pass) the output will always be the same, omitting the need to store passwords anywhere. I use it for less important accounts, and this sounded like another great use case for Espanso.</p> <div class="highlight"><pre class="highlight yaml"><code><span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:pass</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{lesspass}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">params"</span> <span class="na">type</span><span class="pi">:</span> <span class="s">form</span> <span class="na">params</span><span class="pi">:</span> <span class="na">layout</span><span class="pi">:</span> <span class="pi">|</span> <span class="s">Less Pass Generator</span> <span class="s">Website: {{site}}</span> <span class="s">Login: {{login}}</span> <span class="s">Master Password: {{pass}}</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">lesspass</span> <span class="na">type</span><span class="pi">:</span> <span class="s">shell</span> <span class="na">params</span><span class="pi">:</span> <span class="na">cmd</span><span class="pi">:</span> <span class="s2">"</span><span class="s">lesspass</span><span class="nv"> </span><span class="s">$ESPANSO_PARAMS_SITE</span><span class="nv"> </span><span class="s">$ESPANSO_PARAMS_LOGIN</span><span class="nv"> </span><span class="s">$ESPANSO_PARAMS_PASS"</span> </code></pre></div> <p>With the above block, you can type <code class="prettyprint">:pass</code>, and a form will popup, prompting you for the three arguments, and on submit a password will be returned and auto-filled. This does of course require the <a href="https://github.com/lesspass/lesspass/tree/master/cli" rel="noopener nofollow" target="_blank">LessPass CLI</a> tool to be installed.</p> <hr> <h3>Quickly Closing Brackets</h3> <p>This is a small one, saving only a single key press, but over time it all adds up. In Espanso, you can specify where the cursor should be placed using <code class="prettyprint">$|$</code></p> <p>So typing a colon <code class="prettyprint">:</code> followed by any type of bracket, tag or formatting symbol, will result in the corresponding closing bracket will be filled, and the cursor will be moved conveniently middle of the parenthesis.<br> This works for <code class="prettyprint">()</code>, <code class="prettyprint">[]</code>, <code class="prettyprint">{}</code>, <code class="prettyprint">&lt;&gt;</code>, <code class="prettyprint">` `</code>, <code class="prettyprint">''</code>, <code class="prettyprint">""</code>, <code class="prettyprint">__</code>, <code class="prettyprint">--</code> and <code class="prettyprint">**</code></p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Auto close brackets, quotes and modifiers, putting cursor in the center</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:('</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">($|$)'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:['</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">[$|$]'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:{'</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">{$|$}'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:&lt;'</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;$|$&gt;'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:`'</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">`$|$`'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:</span><span class="err">\</span><span class="s">'"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="err">\</span><span class="s">'$|$</span><span class="err">\</span><span class="s">'"</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:"'</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">"$|$"'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:_'</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">_$|$_'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:*'</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">*$|$*'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s1">'</span><span class="s">:-'</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">-$|$-'</span> </code></pre></div> <hr> <h3>Date / Time Info</h3> <p>Another handy feature, is the <a href="https://espanso.org/docs/matches/#date-extension" rel="noopener nofollow" target="_blank">built-in date extension</a>. For the format of the date, see the <a href="https://docs.rs/chrono/0.3.1/chrono/format/strftime" rel="noopener nofollow" target="_blank">chrono::format::strftime Docs</a>.</p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Outputs todays date (dd/mm/yy)</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:date</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{date}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">date</span> <span class="na">type</span><span class="pi">:</span> <span class="s">date</span> <span class="na">params</span><span class="pi">:</span> <span class="na">format</span><span class="pi">:</span> <span class="s2">"</span><span class="s">%d/%m/%y"</span> <span class="c1"># Outputs the current time (24hr)</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:time</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{time}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">time</span> <span class="na">type</span><span class="pi">:</span> <span class="s">date</span> <span class="na">params</span><span class="pi">:</span> <span class="na">format</span><span class="pi">:</span> <span class="s2">"</span><span class="s">%H:%M"</span> <span class="c1"># Outputs the month and year (e.g. January 2020)</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:month</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{date}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">date</span> <span class="na">type</span><span class="pi">:</span> <span class="s">date</span> <span class="na">params</span><span class="pi">:</span> <span class="na">format</span><span class="pi">:</span> <span class="s2">"</span><span class="s">%B</span><span class="nv"> </span><span class="s">%Y"</span> </code></pre></div> <hr> <h3>Inserting Links</h3> <p>This is handy if you find yourself often sharing links in forums, or pasting them in documents. It makes use of Espanso's handy built-in <a href="https://espanso.org/docs/matches/#clipboard-extension" rel="noopener nofollow" target="_blank">Clipboard Extension</a>, to get the URL that has been copied. </p> <p>This works for Markdown with <code class="prettyprint">:md-link</code>, HTML with <code class="prettyprint">:html-link</code> and BB Code with <code class="prettyprint">:bb-link</code>. </p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Outputs markdown link, with clipboard contents as the URL</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:md-link"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">[$|$]({{clipboard}})"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span> <span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span> <span class="c1"># Creates a HTML anchor element, with clipboard contents as href</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:html-link"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">&lt;a</span><span class="nv"> </span><span class="s">href=</span><span class="se">\"</span><span class="s">{{clipboard}}</span><span class="se">\"</span><span class="nv"> </span><span class="s">/&gt;$|$&lt;/a&gt;"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span> <span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span> <span class="c1"># Outputs BB Code link, with clipboard contents as the URL</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:bb-link"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">[url={{clipboard}}]$|$[/url]"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span> <span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span> </code></pre></div> <p>For example, say you's copied have <code class="prettyprint">http://example.com</code> and ran <code class="prettyprint">:html-link</code> is would return <code class="prettyprint">&lt;a href="http://example.com" /&gt;&lt;/a&gt;</code>, with the cursor in the middle, ready for the title.</p> <hr> <h3>Auto-Correct Typos</h3> <p>This is certainly the task that I use Espanso for most! And I have previously written <a href="https://listed.to/@lissy93/22944/spelling-auto-correct-system" rel="noopener nofollow" target="_blank">a post</a> outlining this.</p> <p>If you're interested in doing this, I prepared a <a href="https://listed.to/p/nWcfB31ZTD" rel="noopener nofollow" target="_blank">list of 4,200 of the most commonly misspelled words</a> from Wikipedia, presented in AHK format, and wrote a <a href="https://ahk-to-espanso.as93.net/" rel="noopener nofollow" target="_blank">quick script</a> to convert it to Espanso YAML.</p> <p>I personally just use the 250 words that I most often mistype / spell. The format looks like this (below), and my full script is <a href="https://github.com/Lissy93/espanso-config/blob/master/alicia-auto-correct.yml" rel="noopener nofollow" target="_blank">here</a></p> <div class="highlight"><pre class="highlight yaml"><code><span class="na">matches</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">acsent</span> <span class="na">replace</span><span class="pi">:</span> <span class="s">accent</span> <span class="na">propagate_case</span><span class="pi">:</span> <span class="no">true</span> <span class="na">word</span><span class="pi">:</span> <span class="no">true</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">advesary</span> <span class="na">replace</span><span class="pi">:</span> <span class="s">adversary</span> <span class="na">propagate_case</span><span class="pi">:</span> <span class="no">true</span> <span class="na">word</span><span class="pi">:</span> <span class="no">true</span> </code></pre></div> <p>The word will not update until a terminator character (such as space or enter) is pressed (defined by <code class="prettyprint">word: true</code>). The case will be propogated, (because <code class="prettyprint">propagate_case: true</code> is set), so the output will match the case of the original word (either lower-case, upper-case or capitalized)</p> <hr> <h3>Inserting Common HTML and Markdown Elements</h3> <p>A simple one, if you find yourself often typing the symbols required for DOM elements, then this can save a bit of time.</p> <p>Common tags, like <code class="prettyprint">:hr</code>, <code class="prettyprint">:br</code>, <code class="prettyprint">:div</code>, <code class="prettyprint">:span</code>, <code class="prettyprint">:para</code>, <code class="prettyprint">:h1</code>, <code class="prettyprint">:h2</code> etc are autofilled, with the cursor placed inside the tag ready for the value. For custom web components and XML tags, use <code class="prettyprint">:tag</code>, and a form will open, where you can type the name of the element</p> <p>Right now, for markdown, all I have is <code class="prettyprint">:md-code</code> to insert a code block, and <code class="prettyprint">:md-collapse</code> will in the very annoying <code class="prettyprint">&lt;details&gt;&lt;summary&gt;</code>, and again place the cursor inside.</p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Inserts common HTML elements</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:hr</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;hr</span><span class="nv"> </span><span class="s">/&gt;'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:br</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;br</span><span class="nv"> </span><span class="s">/&gt;'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:div</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;div&gt;$|$&lt;/div&gt;'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:span</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;span&gt;$|$&lt;/span&gt;'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:h1</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;h1&gt;$|$&lt;/h1&gt;'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:h2</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;h2&gt;$|$&lt;/h2&gt;'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:h3</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;h3&gt;$|$&lt;/h3&gt;'</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:para</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">&lt;p&gt;$|$&lt;/p&gt;'</span> <span class="c1"># Inserts any custom HTML, XML or web component tag </span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:tag"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">&lt;{{html.element}}&gt;$|$&lt;/{{html.element}}&gt;"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">html"</span> <span class="na">type</span><span class="pi">:</span> <span class="s">form</span> <span class="na">params</span><span class="pi">:</span> <span class="na">layout</span><span class="pi">:</span> <span class="s2">"</span><span class="s">XML</span><span class="nv"> </span><span class="s">/</span><span class="nv"> </span><span class="s">HTML</span><span class="nv"> </span><span class="s">Element</span><span class="nv"> </span><span class="s">Inserter</span><span class="se">\n</span><span class="s">Tag</span><span class="nv"> </span><span class="s">Name:</span><span class="nv"> </span><span class="s">{{element}}"</span> <span class="na">fields</span><span class="pi">:</span> <span class="pi">{</span> <span class="nv">element</span><span class="pi">:</span> <span class="pi">{</span> <span class="nv">type</span><span class="pi">:</span> <span class="nv">text</span> <span class="pi">}}</span> <span class="c1"># Inserts a markdown code block</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:md-code</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">```</span><span class="se">\n</span><span class="s">$|$</span><span class="se">\n</span><span class="s">```"</span> <span class="c1"># Inserts markdown collapsable section</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s">:md-collapse</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="se">\n</span><span class="s">&lt;details&gt;</span><span class="se">\n\t</span><span class="s">&lt;summary&gt;$|$&lt;/summary&gt;</span><span class="se">\n\t</span><span class="s">&lt;p&gt;&lt;/p&gt;</span><span class="se">\n</span><span class="s">&lt;/details&gt;"</span> </code></pre></div> <hr> <h3>Inserting Personal Info</h3> <p>There are several things that I find I need to type quite often, for various reasons. For example, email addresses, phone numbers, social media links, address and other important details. For some of this, I just use shortcuts (e.g. <code class="prettyprint">:addr</code> outputs my address), whereas for other tasks I use dropdowns. </p> <p>For example, to insert a social media profile link, without having to remember different shortcuts for different services, I just type <code class="prettyprint">:social</code>. I do the same thing with email addresses and project websites</p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Inserts the URL to a selected website or social media platform</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:social"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{{social.links}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">social"</span> <span class="na">type</span><span class="pi">:</span> <span class="s">form</span> <span class="na">params</span><span class="pi">:</span> <span class="na">layout</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Social</span><span class="nv"> </span><span class="s">Media</span><span class="nv"> </span><span class="s">Profiles</span><span class="nv"> </span><span class="se">\n</span><span class="s">{{links}}"</span> <span class="na">fields</span><span class="pi">:</span> <span class="na">links</span><span class="pi">:</span> <span class="na">type</span><span class="pi">:</span> <span class="s">choice</span> <span class="na">values</span><span class="pi">:</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://aliciasykes.com'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://listed.to/@lissy93'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://github.com/lissy93'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://stackoverflow.com/users/979052/alicia'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://keybase.io/aliciasykes'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://www.linkedin.com/in/aliciasykes'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://www.reddit.com/user/lissy93'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://twitter.com/Lissy_Sykes'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://www.instagram.com/liss.sykes'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://www.facebook.com/liss.sykes'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://www.youtube.com/c/AliciaSykes'</span> <span class="pi">-</span> <span class="s1">'</span><span class="s">https://direct.me/liss'</span> </code></pre></div> <hr> <h3>Formulating Search Queries</h3> <p>There are browser extensions and web services that do this already (like DuckDuckGo bangs), but it's often useful to search a specific website, without having to first navigate to it. This function will formulate the URL, with the correct parameters ready for searching. You can also use <code class="prettyprint">Ctrl</code> + <code class="prettyprint">L</code> to focus the address bar.</p> <p>For example, <code class="prettyprint">:srch-wiki</code> will output <code class="prettyprint">https://en.wikipedia.org/w/?search=</code>. You can also search with the contents of your clipboard (<code class="prettyprint">swc</code>), where the query will be automatically filled.</p> <div class="highlight"><pre class="highlight yaml"><code><span class="c1"># Quick search, formulates the URL params for searching a given website</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-ddg</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-duckduckgo</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://duckduckgo.com/?q='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-wiki</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-wikipedia</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://en.wikipedia.org/w/?search='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-gh</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-github</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://github.com/search?q='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-so</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-stackoverflow</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://stackoverflow.com/search?q='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-dh</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-dockerhub</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://hub.docker.com/search?q='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-wa</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-wolframalpha</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://www.wolframalpha.com/input/?i='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-red</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-reddit</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://www.reddit.com/search/?q='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-bbc</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-bbc</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://www.bbc.co.uk/search?q='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-vt</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-virustotal</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://www.virustotal.com/gui/search/'</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-amz</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-amazon</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://amazon.co.uk/s?k='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-yt</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-youtube</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://youtube.com/results?q='</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-maps</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-maps</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://www.google.com/maps/search/'</span> <span class="pi">-</span> <span class="na">triggers</span><span class="pi">:</span> <span class="pi">[:</span><span class="nv">srch-goo</span><span class="pi">,</span> <span class="pi">:</span><span class="nv">search-google</span><span class="pi">]</span> <span class="na">replace</span><span class="pi">:</span> <span class="s1">'</span><span class="s">https://google.com/search?q='</span> <span class="c1"># Similar to above, but it uses the clipboard for the search query</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-ddg"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://duckduckgo.com/?q={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-wiki"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://en.wikipedia.org/w/?search='{{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-gh"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://github.com/search?q={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-so"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://stackoverflow.com/search?q={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-dh"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://hub.docker.com/search?q={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-wa"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://www.wolframalpha.com/input/?i={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-red"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://www.reddit.com/search/?q={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-bbc"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://www.bbc.co.uk/search?q={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-vt"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://www.virustotal.com/gui/search/{{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-amz"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://amazon.co.uk/s?k={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-yt"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://youtube.com/results?q={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-maps"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://www.google.com/maps/search/{{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> <span class="pi">-</span> <span class="na">trigger</span><span class="pi">:</span> <span class="s2">"</span><span class="s">:swc-goo"</span> <span class="na">replace</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://google.com/search?q={{clipboard}}"</span> <span class="na">vars</span><span class="pi">:</span> <span class="pi">[{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">clipboard"</span><span class="pi">}]</span> </code></pre></div> <hr> <h2>Additional Notes</h2> <p>This is just a tiny tiny selection of things you could use Espanso for, the possibilities are almost endless, and I keep finding new ways to use it to speed up my typing. I'm excited about the future of the project, as new features and improvements are being added all the time.</p> <p>Huge kudos to the author, <a href="https://federicoterzi.com/" rel="noopener nofollow" target="_blank">Federico Terzi</a>, who has done the bulk of the work himself.</p> <h3>Security</h3> <p>This is worth mentioning, as I am sure others will be wondering about it. Initially I was fearful of a system that could apparently intercept all of my keystrokes, but the author has highlighted that it has been built with <a href="https://github.com/federico-terzi/espanso/blob/master/SECURITY.md" rel="noopener nofollow" target="_blank">security in mind</a>, there is absolutely no logging, and Espanso has a memory of just 3 characters (in order for the backspace functionality to work). There's also no network requests, and I verified this myself, both in the source, any by running Wireshark.<br> The code is also extremely efficient, written in Rust, it uses virtually negligible system resources, even on a low-spec PC.</p> <style> img.demo { border-radius: 6px; margin: 0 auto; box-shadow: 1px 2px 4px 2px #000000cf; } </style> </p> My Life in Months ๐Ÿ—“๏ธ Alicia's Notes ๐Ÿš€ Tue, 13 Apr 2021 22:14:22 +0000 https://notes.aliciasykes.com/24701/my-life-in-months https://notes.aliciasykes.com/24701/my-life-in-months <p><p>Do you ever wonder how you're spending you're life? I do, and so I went through the main activities that I do on a daily, weekly or monthly basis and calculated the approximate total time I've spent on each of them. The following chart is a breakdown of time as a proportion of my total life (so far), where each square represents 1 month. </p> <p><img src="https://i.ibb.co/5sPCXDJ/how-i-spent-my-life-so-far-t.png" alt="My Life in Months"></p> <p>I am now having an mini existential crisis after seeing how much of my life I have spent on relatively meaningless activities!</p> <style> img{ margin: 0 auto 0.25rem auto; background: #ffffff0a; border: 2px solid #00ccb429; border-radius: 5px; } </style> </p> Errors and Solutions ๐Ÿคฌโžก๏ธ๐Ÿฅณ Alicia's Notes ๐Ÿš€ Thu, 25 Mar 2021 14:54:43 +0000 https://notes.aliciasykes.com/24099/errors-and-solutions https://notes.aliciasykes.com/24099/errors-and-solutions <p><blockquote> <p>Common error messages, along with their solutions.<br> Saves me having to figure the same thing out twice.</p> </blockquote> <h3>Categories</h3> <ul> <li><a href="#linux">Linux</a></li> <li><a href="#web-development">Web Development</a></li> <li><a href="#misc">Misc</a></li> </ul> <p></p><hr id="linux"><p></p> <h2>Linux</h2> <hr> <p>โŒ Error running a shell script with systemd: <code class="prettyprint">Failed to execute command: Exec format error</code><br> โœ… Solution: </p> <ul> <li>Caused by missing shebang at the start of the sh script</li> <li>Add the correct hash band identifier, e.g. <code class="prettyprint">#!/bin/bash</code></li> </ul> <hr> <p>โŒ Error: -bash: '\r': command not founxd<br> โœ… Solution:</p> <ul> <li>Caused by Windows-style newline character</li> <li>Run <code class="prettyprint">dos2unix</code> over the file</li> </ul> <hr> <p>โŒ Error with pakepkg: Cannot find the fakeroot binary<br> โœ… Install the base-devel package group: <code class="prettyprint">sudo pacman -S base-devel</code></p> <hr> <p>โŒ Yarn Error: There are no scenarios; must have at least one.<br> โœ… Caused by the wrong yarn being installed, lol. Just remove it and reinstall it</p> <ul> <li><code class="prettyprint">sudo apt remove yarn</code></li> <li><code class="prettyprint">curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -</code></li> <li><code class="prettyprint">echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list</code></li> <li><code class="prettyprint">sudo apt update &amp;&amp; sudo apt install yarn</code></li> </ul> <p>โ„น๏ธ Sources:</p> <ul> <li><a href="https://classic.yarnpkg.com/en/docs/install" rel="noopener nofollow" target="_blank">https://classic.yarnpkg.com/en/docs/install</a></li> <li><a href="https://github.com/yarnpkg/yarn/issues/2821" rel="noopener nofollow" target="_blank">https://github.com/yarnpkg/yarn/issues/2821</a></li> </ul> <hr> <p>โŒ FAILED (unknown public key XXXXX) - One or more PGP signatures could not be verified<br> โœ… Solution: Add the PGP public key to your keychain, <code class="prettyprint">gpg --recv-key [key ID]</code></p> <hr> <p>โŒ Docker, Service failed to build: cgroups: cgroup mountpoint does not exist: unknown<br> โœ… Temporary workaround:</p> <ul> <li><code class="prettyprint">sudo mkdir /sys/fs/cgroup/systemd</code></li> <li><code class="prettyprint">sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd</code></li> </ul> <hr> <p>โŒ Cargo: Failed to parse lock file at: path/to/Cargo.lock</p> <p>โœ… This is often caused by using an older version of Cargo. <code class="prettyprint">rustup</code> can be used to update both Cargo and Rust to their latest versions. So just run: <code class="prettyprint">rustup update stable</code></p> <hr> <p>โŒ Go: package build constraints exclude all Go files in...<br> โœ… Caused by packages being incorrectly cached, just run: <code class="prettyprint">go clean -modcache</code></p> <hr> <p>โŒ Pacman: [package-name]: [/usr/share/path/to/pakage@latest/file.compiled] exists in filesystem</p> <p>This is caused by a file already existing, and Pacman not being intended to replace files. It usually happens when you've installed something manually, or using a third-party package manager, and hence it is not being tracked by Pacman.</p> <p>โœ… Solutions:</p> <p><strong>Update Mirrors</strong><br> Sometimes this can be fixed by simply updating the mirrors, with: <br> <code class="prettyprint">sudo pacman-mirrors --fasttrack &amp;&amp; sudo pacman -Syyu</code></p> <p><strong>Move / Remove Conflicting File</strong><br> If not, then you can identify which packages owns the offending file, with:<br> <code class="prettyprint">pacman -Qo /path/to/file</code>.</p> <ul> <li>If the package is managed by Pacman, then you can move is with <code class="prettyprint">pacman -R</code>. </li> <li>Or if it's not linked to anything then either move or remove the file manually (renaming the file to <code class="prettyprint">*.backup</code> will enable you to roll back if needed).</li> </ul> <p><strong>Overwrite Files</strong><br> Alternatively there's also an <code class="prettyprint">--overwrite</code> option, that will force Pacman to replace any conflicting files. E.g. <code class="prettyprint">sudo pacman -S [package-name] --overwrite '*'</code>. This is useful when your local database has been "lost", causing every single installed package to throw a "conflicts" error.</p> <p><br><br> โ„น๏ธ For more information, see:</p> <ul> <li><a href="https://bbs.archlinux.org/viewtopic.php?id=56373" rel="noopener nofollow" target="_blank">https://bbs.archlinux.org/viewtopic.php?id=56373</a></li> <li><a href="https://forum.manjaro.org/t/update-or-package-installation-returns-failed-to-commit-transaction-conflicting-files-filename-exists-in-filesystem/3598" rel="noopener nofollow" target="_blank">https://forum.manjaro.org/t/update-or-package-installation-returns-failed-to-commit-transaction-conflicting-files-filename-exists-in-filesystem/3598</a></li> </ul> <p><strong>A note for preventing this in the future</strong>: When using a third-party installer, always specify an alternative installation location, e.g. <code class="prettyprint">/home</code>, <code class="prettyprint">/opt</code> or <code class="prettyprint">/usr/local/</code>. But never install directly under <code class="prettyprint">/</code> or <code class="prettyprint">/usr</code>.</p> <hr> <p>โŒ Pacman error: failed retrieving file '_<em>' from _</em> Connection timed out after 10001 milliseconds</p> <p>โœ… Update mirrors: <code class="prettyprint">sudo pacman-mirrors --country United_Kingdom</code></p> <hr> <p>โŒ Warning: High IOWait. Raspberry Pi 4, booted from a USB running incredibly slowly</p> <p>โœ… Run <code class="prettyprint">lsusb -t</code> if it shows <code class="prettyprint">usb-storage</code>, then UAS is not supported out of the box and you need to either enable it with quirks mode, or use a UAS-compatible drive.</p> <p>โ„น๏ธ More Info:</p> <ul> <li><a href="https://www.raspberrypi.org/forums/viewtopic.php?f=28&amp;t=245931" rel="noopener nofollow" target="_blank">https://www.raspberrypi.org/forums/viewtopic.php?f=28&amp;t=245931</a></li> <li><a href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md" rel="noopener nofollow" target="_blank">https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md</a></li> </ul> <hr> <p>โŒ Error: Using Powerlevel10k in ZSH on R Pi: <code class="prettyprint">gitstatus failed to initialize</code></p> <p>โœ… Solution:</p> <ul> <li>Caused by the binary for the gitstatusd module (used to show git into by P10K) not being available for the current architecture</li> <li>There are two solutions: <ul> <li>Either manually compile the binary, and set <code class="prettyprint">GITSTATUS_DAEMON=/path/to/gitstatusd</code> in <code class="prettyprint">~/.zshrc</code>. See: <a href="https://github.com/romkatv/gitstatus/blob/master/README.md#compiling" rel="noopener nofollow" target="_blank">https://github.com/romkatv/gitstatus/blob/master/README.md#compiling</a></li> <li>Or, if you don't need git display, then just comment out <code class="prettyprint">POWERLEVEL9K_LEFT_PROMPT_ELEMENTS</code> from the <code class="prettyprint">vcs</code> section in <code class="prettyprint">~/.p10k.zsh</code></li> </ul></li> </ul> <p>โ„น๏ธ More Info:</p> <ul> <li><a href="https://github.com/romkatv/gitstatus/issues/73#issuecomment-548046415" rel="noopener nofollow" target="_blank">https://github.com/romkatv/gitstatus/issues/73#issuecomment-548046415</a></li> <li><a href="https://github.com/romkatv/powerlevel10k/issues/246#issuecomment-765509082" rel="noopener nofollow" target="_blank">https://github.com/romkatv/powerlevel10k/issues/246#issuecomment-765509082</a></li> </ul> <hr> <p>โŒ wget: WGETRC points to /home/user/.config/wget/wgetrc, which couldn't be accessed because of error: No such file or directory.<br> โœ… Caused my missing config file, just: <code class="prettyprint">mkdir -p ~/.config/wget/ &amp;&amp; touch ~/.config/wget/wgetrc</code></p> <hr> <p>โŒ ".": Permission denied (os error 13)</p> <p>โœ… sudo chown -R $(whoami) ./</p> <hr> <p>โŒ <code class="prettyprint">/usr/lib/libc.so.6: version</code>GLIBC_2.34' not found`</p> <p>โœ… <code class="prettyprint">pacman -S glibc lib32-glibc</code></p> <hr> <p>โŒ Running ssh-add shows: <code class="prettyprint">Error connecting to agent: Connection refused</code></p> <p>โœ… Start the SSH Agent, by running: <code class="prettyprint">eval "$(ssh-agent)"</code></p> <hr> <p>โŒ Git error: only one config file at a time</p> <p>โœ… unset GIT_CONFIG</p> <hr> <p>โŒ Vercel site behind Cloudflare: <code class="prettyprint">err_too_many_redirects</code></p> <p>โœ… In Cloudflare dashboard, select your site, and under SSL/TLS, set encryption to "Full"</p> <p></p><hr id="web-development"><p></p> <h2>Web Development</h2> <hr> <p>โŒ Flutter Web: No devices detected.<br> โœ… Run <code class="prettyprint">which [browser-name]</code>, then store the path in <code class="prettyprint">CHROME_EXECUTABLE</code> environmental variable<br> E.g. in .zshrc: <code class="prettyprint">export CHROME_EXECUTABLE="/opt/brave.com/brave/brave-browser"</code></p> <hr> <p>โŒ Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime (88)<br> โœ… Solution: </p> <ul> <li>Caused by node-sass's binaries being built for a for a different architecture</li> <li>To fix this, just run: <code class="prettyprint">npm rebuild node-sass</code></li> </ul> <hr> <p>โŒ TypeError: Cannot assign to read only property 'exports' of object '#' error<br> โœ… Solution:<p></p> <ul> <li>Caused by using CommonJS syntax instead of ES Modules</li> <li>To fix it, just replace <code class="prettyprint">module.exports = myFunc;</code> with <code class="prettyprint">export default myFunc;</code></li> </ul> <hr> <p>โŒ Error: Cannot find module './_baseValues'</p> <p>โœ… Solution:</p> <ul> <li>Clearing the cache fixed this: <code class="prettyprint">yarn cache clean</code></li> <li>If the issue persists, remove (<code class="prettyprint">rm -rf node_modules\ yarn.lock</code>) and reinstall (<code class="prettyprint">yarn</code>) node_modules</li> </ul> <hr> <p>โŒ Error: Gatsby.js randomly decides that it cannot find a certain dependency<br> - e.g.: <code class="prettyprint">No files matching '\x\x\x\node_modules\@gatsbyjs\x\x\x.js' were found.</code><br> โœ… Solution: Remove the cache and restart. <code class="prettyprint">rm -rf .cache &amp;&amp; yarn develop</code></p> <hr> <p>โŒ 'React' was used before it was defined<br> โœ… Solution: Within .eslintrc under <code class="prettyprint">rules</code>, disable the base rule, and add a TypeScript specific rule<br> - <code class="prettyprint">"no-use-before-define": "off",</code><br> - <code class="prettyprint">"@typescript-eslint/no-use-before-define": ["error"]</code></p> <hr> <p>โŒ Error: Delete 'โ' prettier/prettier<br> โœ… Solution: <br> - Either change VS Codes end of line sequence from LF to CRLF<br> - Or add <code class="prettyprint">endOfLine: 'auto'</code> into .prettierrc</p> <hr> <p>โŒ JSX not allowed in files with extension '.tsx'<br> โœ… In <code class="prettyprint">eslintrc</code>, under the <code class="prettyprint">rules</code> section, add:<br> - <code class="prettyprint">'react/jsx-filename-extension': [2, { 'extensions': ['.js', '.jsx', '.ts', '.tsx'] }]</code></p> <hr> <p>โŒ Start/ end value has mixed support, consider using flex-end instead<br> โœ… When using flexbox layout, replace <code class="prettyprint">align-items: end;</code> with <code class="prettyprint">align-items: flex-end;</code></p> <hr> <p>โŒ Project published to GitHub pages using GitHub actions shows as a 404 (even though code is correct)<br> โœ… This seems to be a known reliability issues for new sites, and the following things (for some reason) help:</p> <ul> <li>Ensure that none of your files and sub-folders begin with an <code class="prettyprint">_</code>, as GitHub / Jekyll ignores these</li> <li>If you're not using Jekyll, then place a file called <code class="prettyprint">.nojekyll</code> in your projects root</li> <li>Remember that URLs are case-sensitive, ensure it's typed correctly, and that you're using <code class="prettyprint">https</code></li> <li>Check an older version is not cached, try clearing your site data, appending a string after <code class="prettyprint">?</code> in the URL, or use a different browser</li> <li>Double check that GitHub pages is enabled, pointing to the correct branch, and that there are no errors in the Actions logs</li> <li>Ensure your index.html is valid, has a doctype, e.g. <code class="prettyprint">&lt;!DOCTYPE html&gt;</code>, and doesn't include any non UTF-8 special characters</li> <li>Push an empty commit to trigger a rebuild: <code class="prettyprint">git commit --allow-empty -m "Trigger rebuild" &amp;&amp; git push origin master</code></li> <li>If you bound your domain, before GH pages was deployed, then GitHub caches the broken domain, try removing and re-adding your domain</li> <li>Try deleting and re-creating GH Pages branch: <code class="prettyprint">git checkout gh-pages &amp;&amp; git push origin --delete gh-pages &amp;&amp; git push origin</code></li> <li>Wait for a few hours... Sometimes this issue just fixes itself</li> <li>If nothing worked, then open a support ticket. This is a known issue with GitHub pages, and is usually quickly resolved by customer support from their end</li> </ul> <hr> <p>โŒ Npm Install global modules fails: Missing write access in mac to /usr/local/lib/node<em>modules<br> โœ… Just update the permissions of global node</em>modules<br> sudo chown -R $USER ~/.npm<br> sudo chown -R $USER /usr/lib/node<em>modules<br> sudo chown -R $USER /usr/local/lib/node</em>modules</p> <hr> <p>โŒ npm ERR! code UNABLE<em>TO</em>GET<em>ISSUER</em>CERT_LOCALLY<br> โœ… Run: <code class="prettyprint">npm config set registry http://registry.npmjs.org/</code></p> <hr> <p>โŒ Yarn Error: unable to get local issuer certificate<br> โœ… yarn config set "strict-ssl" false -g</p> <hr> <p>โŒ go.mod file not found in current directory or any parent directory<br> โœ… Run: <code class="prettyprint">go env -w GO111MODULE=off</code></p> <p></p><hr id="misc"><p></p> <h2>Misc</h2> <p>โŒ Cargo error <code class="prettyprint">no such subcommand: 'make'</code><br> โœ… Just install cargo make: <code class="prettyprint">cargo install --no-default-features --force cargo-make</code></p> <hr> <p>โŒ Error on Windows: error during connect: This error may indicate that the docker daemon is not running.: Get http://%2F%2F.%2Fpipe%2Fdocker<em>engine/v1.24/containers/json: open //./pipe/docker</em>engine: The system cannot find the file specified.<br> โœ… Solution:</p> <ul> <li>Update the security permissions for the docker.exe file, to include "Users" (Right click --&gt; Properties --&gt; Security). This file is usually located in <code class="prettyprint">C:\Program Files/Docker/Docker/</code></li> <li>Then restart Docker: As admin, run <code class="prettyprint">Net stop com.docker.service</code> and <code class="prettyprint">Net start com.docker.service</code></li> </ul> <p>Also, ensure that you have the latest version of Docker installed, and WSL is set to version 2 (with <code class="prettyprint">wsl --set-default-version 2</code>)</p> <hr> <p>โŒ Docker inspect throws error on Windows: Template parsing error: template: :1: unclosed action<br> โœ… Double quotes are required for the JSON keys, e.g. <code class="prettyprint">docker inspect --format="{{json .State.Health}}" my-container</code></p> <hr> <p>โŒ VirtualBox in Windows shows error: <code class="prettyprint">VERR_CPUM_RAISE_GP_0 with WSL2</code><br> โœ… Solution:</p> <ul> <li>As admin, run: <code class="prettyprint">bcdedit /set hypervisorlaunchtype off</code></li> <li>Then shutdown and restart the PC with <code class="prettyprint">shutdown -s -t 2</code></li> </ul> <hr> <p>โŒ Ngrok throws an error with react dev server: Invalid Host Header <br> โœ… Add the -host-header flag, e.g. <code class="prettyprint">ngrok http 8080 -host-header="localhost:8080"</code></p> <hr> <p>โŒ Gimp: Unable to apply Rounded Corners (Filters --&gt; Dรฉcor --&gt; xx)<br> โœ… Solution:<br> - Some filters cannot be used with an alpha layer.<br> - Right-click on the current layer, and "Remove Alpha Channel"</p> <hr> <p>โŒ Ledger: Stuck on "Touch Security Key" using MetaMask on Windows with Ledger Nano X<br> โœ… Solution:<br> - First, allow contract data in transactions (within the Eth app on the Ledger device)<br> - Disable Bluetooth, in order confirm transactions over USB (on Ledger's device Settings)</p> <hr> <p>โŒ Ledger: On Linux, cannot detect device<br> โœ… Solution: Install udev rules<br> - wget -q -O - <a href="https://raw.githubusercontent.com/LedgerHQ/udev-rules/master/add_udev_rules.sh" rel="noopener nofollow" target="_blank">https://raw.githubusercontent.com/LedgerHQ/udev-rules/master/add_udev_rules.sh</a> | sudo bash</p> <hr> <p>โŒ Listed.to - Custom domain does not work, even when DNS records are all correct<br> โœ… Ensure that DNS records are not proxied through Cloudflare's servers</p> <hr> <p>โŒ Standard Notes Linux - Unable to login, incorrect email and password even when correct<br> โœ… Manually update the app to the latest version</p> <hr> <p>โŒ Flutter Web - No devices found</p> <p>โœ… If you don't have Chrome installed, then you can use Chromium or any other Chromium-based browser instead. You'll need to set the <code class="prettyprint">CHROME_EXECUTABLE</code> environmental variable to point to it's executable so that Flutter can launch it.<br> E.g. <code class="prettyprint">export CHROME_EXECUTABLE=/usr/bin/brave</code></p> <hr> <style>p{margin-bottom: 0 !important;} ul{margin-top: 0 !important;}</style> </p></p> Quick How-To Guides ๐Ÿ’ซ Alicia's Notes ๐Ÿš€ Wed, 17 Mar 2021 20:05:24 +0000 https://notes.aliciasykes.com/23844/quick-how-to-guides https://notes.aliciasykes.com/23844/quick-how-to-guides <p><blockquote> <p>A mix of simple things that (despite doing regularly) I still forget, as well as more niche stuff that took me a little while to figure out. The purpose of documenting this, is both to help others and for future reference for myself</p> </blockquote> <h3>Servers</h3> <ul> <li><a href="https://listed.to/p/7TvtqtSBZg" rel="noopener nofollow" target="_blank">How to setup an SSH Tarpint with EndleShh</a></li> <li><a href="https://listed.to/@lissy93/18842/how-to-mullvad-vpn-using-wireguard-on-opnsense" rel="noopener nofollow" target="_blank">How to setup WireGuard on OPNSense for Mullvad VPN</a></li> <li><a href="https://notes.aliciasykes.com/p/qTquNEXaSf">How to setup SSL for OPNSense, with Let's Encrypt</a></li> <li><a href="https://notes.aliciasykes.com/p/J1K8TSTwWA">How to transfer a file to server, via SSH/SCP</a></li> <li><a href="https://listed.to/@lissy93/15742/how-to-use-ssh-for-server-authentication" rel="noopener nofollow" target="_blank">How to use SSH key Pairs for Authentication</a></li> <li><a href="https://listed.to/@lissy93/22798/my-server-setup" rel="noopener nofollow" target="_blank">How to setup and secure a new Debian-based server</a></li> <li><a href="https://listed.to/@lissy93/16801/how-to-compile-install-software-on-arch" rel="noopener nofollow" target="_blank">How to compile and install software on Arch</a></li> <li><a href="https://listed.to/p/frKPhkrWVq" rel="noopener nofollow" target="_blank">How to Install Docker on Ubuntu 20.04</a></li> <li><a href="https://listed.to/p/xyAgKFe7JL" rel="noopener nofollow" target="_blank">How to Install GoLang on Ubuntu 20.04</a></li> <li><a href="https://notes.aliciasykes.com/p/EzrYRxGLNB">How to Recover Broken OPNSense System</a></li> <li><a href="https://listed.to/@lissy93/19109/pi-zero-tor-routed-access-point" rel="noopener nofollow" target="_blank">How to create a Tor-routed wireless access point, on a Pi Zero W</a></li> </ul> <h3>General</h3> <ul> <li><a href="https://notes.aliciasykes.com/p/QjfD4UFXUS">How to start a web server in one-line</a></li> <li><a href="https://listed.to/@lissy93/23054/pimping-up-your-duckduckgo-search-results#usage" rel="noopener nofollow" target="_blank">How to create and apply styles to DuckDuckGo</a></li> <li><a href="https://listed.to/p/bPH2yHhC3f" rel="noopener nofollow" target="_blank">How to count number of lines of Code with Cloc</a></li> <li><a href="https://listed.to/@lissy93/14972/how-to-operate-the-sharkjack" rel="noopener nofollow" target="_blank">How to operate the Shark Jack</a></li> <li><a href="https://listed.to/p/ZOg4pw3J8k" rel="noopener nofollow" target="_blank">How to reload Prometheus's Config</a></li> <li><a href="https://listed.to/@lissy93/13402/how-to-enable-disable-pi-hole-from-cli" rel="noopener nofollow" target="_blank">How to enable/ disable Pi-Hole from the terminal</a></li> <li><a href="https://listed.to/p/nWcfB31ZTD" rel="noopener nofollow" target="_blank">How to Setup English Auto-Correct</a></li> <li><a href="https://listed.to/p/x9Sjv06o9i" rel="noopener nofollow" target="_blank">How to improve arrow-key keyboard navigation, using AHK</a></li> <li><a href="https://listed.to/@lissy93/18756/custom-styling-for-listed-blog" rel="noopener nofollow" target="_blank">How to use a grid layout for Listed.to Blogs</a></li> <li><a href="https://notes.aliciasykes.com/p/RUi22QSyWe">How to expose a port to the internet using Ngrok</a></li> <li><a href="https://notes.aliciasykes.com/p/yMqhzEVGAq">How to use your own domain for your Netlify apps</a></li> </ul> <h3>Coding</h3> <ul> <li><a href="https://listed.to/p/Tjdj2t6Ofi" rel="noopener nofollow" target="_blank">HTML: Easy-Peasy CSS Theme Switching</a></li> <li><a href="https://listed.to/p/YcUgsjeFPh" rel="noopener nofollow" target="_blank">JS: Saving preferences with Local Storage</a></li> <li><a href="https://listed.to/p/bSvDC86ebq" rel="noopener nofollow" target="_blank">JS: How to animate browser/ tab title</a></li> <li><a href="https://listed.to/p/2reTxF1s84" rel="noopener nofollow" target="_blank">Vue: How to respond to scroll position</a></li> <li><a href="https://listed.to/p/r3T4Sbk1QG" rel="noopener nofollow" target="_blank">CSS: Pure-CSS Footer Wave Animation</a></li> <li><a href="https://listed.to/@lissy93/20679/reference-using-variable-fonts-in-css" rel="noopener nofollow" target="_blank">CSS: How to use variable font axes</a></li> <li><a href="https://listed.to/@lissy93/16818/keep-mouse-movin-sh" rel="noopener nofollow" target="_blank">Shell: How to periodically move mouse</a></li> </ul> <h3>Code Management</h3> <ul> <li><a href="https://notes.aliciasykes.com/p/hqeCTdPZHj">How to GPG sign git commits</a></li> <li><a href="https://listed.to/p/HNyekxkuTC" rel="noopener nofollow" target="_blank">How to Mirror a Git Repo</a></li> <li><a href="https://listed.to/@lissy93/17996/quick-tip-git-submodules" rel="noopener nofollow" target="_blank">How to use Git Submodules</a></li> <li><a href="https://notes.aliciasykes.com/p/kqwVofIXQu">How to maintain NPM dependencies</a></li> <li><a href="https://listed.to/@lissy93/16988/how-to-remove-all-node_modules-folders" rel="noopener nofollow" target="_blank">How to easily remove all node_modules directories</a></li> </ul> <h3>See Also</h3> <ul> <li><a href="https://listed.to/p/OOPbVavcLQ" rel="noopener nofollow" target="_blank">Errors and Solutions</a></li> <li><a href="https://listed.to/p/ym6ouOts4E" rel="noopener nofollow" target="_blank">Code Snippets</a></li> <li><a href="https://listed.to/p/V50baRC2u8" rel="noopener nofollow" target="_blank">Handy Reference Info</a></li> <li><a href="https://listed.to/p/kuYHyRFOtH" rel="noopener nofollow" target="_blank">My Projects</a></li> </ul> <style> blockquote, ul li { font-size: 1.1rem; } </style> </p> SSH Tarpit with EndleSsh ๐Ÿชค๐Ÿ•ณ๏ธ Alicia's Notes ๐Ÿš€ Sat, 13 Mar 2021 18:17:30 +0000 https://notes.aliciasykes.com/23745/ssh-tarpit-with-endlessh https://notes.aliciasykes.com/23745/ssh-tarpit-with-endlessh <p><p><a href="https://github.com/skeeto/endlessh" rel="noopener nofollow" target="_blank">Endlessh</a> is an SSH tarpit to keep the automated bots hitting port 22 locked up, and waste script kiddies time.</p> <p>You can either get it from your package manager with <code class="prettyprint">sudo apt install endless</code>, or build from source. To build, ensure you have <code class="prettyprint">libc6-dev</code> installed, then <code class="prettyprint">git clone git@github.com:skeeto/endlessh.git</code>, <code class="prettyprint">cd endlessh</code>, <code class="prettyprint">make</code>, and move it to your path- <code class="prettyprint">sudo mv endlessh /usr/local/bin/</code>. </p> <p>Move the service to systemd, <code class="prettyprint">sudo cp util/endlessh.service /etc/systemd/system</code>, and enable it <code class="prettyprint">sudo systemctl enable endlessh</code>. Next, specify the configuration <code class="prettyprint">mkdir /etc/endlessh</code> and <code class="prettyprint">sudo vim /etc/endlessh/config</code><br> Add your desired config, e.g.</p> <div class="highlight"><pre class="highlight plaintext"><code>Port 22 Delay 10000 MaxLineLength 32 MaxClients 4096 LogLevel 0 BindFamily 0 </code></pre></div> <p>If you're using a low port number, ensure you update the <code class="prettyprint">endlessh.service</code> with <code class="prettyprint">AmbientCapabilities=CAP_NET_BIND_SERVICE</code>, and run <code class="prettyprint">sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/endlessh</code>.</p> <p>Finally, run <code class="prettyprint">sudo systemctl start endlessh</code> to start the service, you should now see the service running on your specified port when you run <code class="prettyprint">netstat -tulpn | grep endlessh</code>. If you need to check the logs, run <code class="prettyprint">sudo journalctl -u endlessh</code></p> </p> Pimping up Your DuckDuckGo Search Results ๐Ÿ’„ Alicia's Notes ๐Ÿš€ Sat, 20 Feb 2021 20:00:00 +0000 https://notes.aliciasykes.com/23054/pimping-up-your-duckduckgo-search-results https://notes.aliciasykes.com/23054/pimping-up-your-duckduckgo-search-results <p><ul> <li><a href="#intro">Intro</a></li> <li><a href="#navy-teal">Themes</a> <ul> <li><a href="#navy-teal">Navy + Teal</a></li> <li><a href="#titanium">Titanium</a></li> <li><a href="#cyberpunk">Cyberpunk</a></li> <li><a href="#dracula">Dracula</a></li> <li><a href="#hack">Hack</a></li> <li><a href="#neon">Neon</a></li> <li><a href="#nord">Nord</a></li> </ul></li> <li><a href="#usage">Usage</a></li> </ul> <p></p><hr id="intro"> <p></p> <p>Yet another awesome feature of DuckDuckGo, is that they make it really easy to modify your theme, just go to: <a href="https://duckduckgo.com/settings#appearance" rel="noopener nofollow" target="_blank">https://duckduckgo.com/settings#appearance</a>. From here you can customize your colors, fonts and layout of your search results and home page.</p> <p>I am no designer by any stretch of the imagination (as you can probably see!), but here are a couple of <a href="https://i.ibb.co/nMnjmcQ/Duck-Duck-Go-Themes.png" rel="noopener nofollow" target="_blank">themes</a> I made, along with their code if you want to use them. You can preview themes live without making any changes by clicking the link below each screenshot, or to apply a theme, see the JS snippet at the end of this post.</p> <p>Settings in DDG can either be applied temporarily with DuckDuckGo's <a href="https://duckduckgo.com/params" rel="noopener nofollow" target="_blank">URL parameters</a>, locally as cookies, or globally using DDG's Cloud Save feature. </p> <p></p><hr id="navy-teal"> <p></p> <h2>Callisto</h2> <p><img src="https://i.ibb.co/LvCnWRd/navy-turquoise-search.png" alt="Screenshot - Navy Turquoise"></p> <p><a href="https://duckduckgo.com/?kae=d&amp;k5=1&amp;kay=b&amp;kbc=1&amp;kax=v261-7&amp;kx=a8d3ff&amp;kaa=0a7355&amp;kj=080813&amp;k9=00af87&amp;k18=1&amp;ka=Hack&amp;k8=d3d5e5&amp;k21=080813&amp;k7=0b1021&amp;kt=v" rel="noopener nofollow" target="_blank">Try it Out!</a></p> <p><strong>Color Palette</strong>: <code class="prettyprint">#0b1021</code>, <code class="prettyprint">#080813</code>, , <code class="prettyprint">#00af87</code>, <code class="prettyprint">#0a7355</code>, <code class="prettyprint">#d3d5e5</code>, <code class="prettyprint">#a8d3ff</code></p> <p><strong>JSON</strong></p> <div class="highlight"><pre class="highlight json"><code><span class="p">{</span><span class="nl">"kae"</span><span class="p">:</span><span class="s2">"d"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k5"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kay"</span><span class="p">:</span><span class="s2">"b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kbc"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kax"</span><span class="p">:</span><span class="s2">"v261-7"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kx"</span><span class="p">:</span><span class="s2">"a8d3ff"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kaa"</span><span class="p">:</span><span class="s2">"0a7355"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kj"</span><span class="p">:</span><span class="s2">"080813"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k9"</span><span class="p">:</span><span class="s2">"00af87"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k18"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ka"</span><span class="p">:</span><span class="s2">"Hack"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k8"</span><span class="p">:</span><span class="s2">"d3d5e5"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k21"</span><span class="p">:</span><span class="s2">"080813"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k7"</span><span class="p">:</span><span class="s2">"0b1021"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kt"</span><span class="p">:</span><span class="s2">"v"</span><span class="p">}</span><span class="w"> </span></code></pre></div> <p><strong>Cookie Data</strong></p> <div class="highlight"><pre class="highlight plaintext"><code>5=1; ay=b; bc=1; ae=d; ax=v261-7; 18=1; aa=0a7355; x=a8d3ff; 8=d3d5e5; 9=00af87; j=080813; 7=0b1021; 21=080813; a=Hack; t=v </code></pre></div> <p></p><hr id="titanium"> <p></p> <h2>Titanium</h2> <p><img src="https://i.ibb.co/FgWqMX8/titanium-search.png" alt="Screenshot - Titanium"></p> <p><a href="https://duckduckgo.com/?kae=d&amp;k5=1&amp;kay=b&amp;kbc=1&amp;kax=v261-7&amp;kx=000000&amp;kaa=9b83db&amp;kj=9b83db&amp;k9=9b83db&amp;k18=1&amp;k8=000000&amp;k21=9b83db&amp;k7=dedede&amp;kt=b&amp;ku=1&amp;ka=Arial+Rounded+MT+Bold" rel="noopener nofollow" target="_blank">Try it Out!</a></p> <p><strong>Color Palette</strong>: <code class="prettyprint">#dedede</code>, <code class="prettyprint">#9b83db</code>, <code class="prettyprint">#000000</code></p> <p><strong>JSON</strong></p> <div class="highlight"><pre class="highlight json"><code><span class="p">{</span><span class="nl">"kae"</span><span class="p">:</span><span class="s2">"d"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k5"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kay"</span><span class="p">:</span><span class="s2">"b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kbc"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kax"</span><span class="p">:</span><span class="s2">"v261-7"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kx"</span><span class="p">:</span><span class="s2">"000000"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kaa"</span><span class="p">:</span><span class="s2">"9b83db"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kj"</span><span class="p">:</span><span class="s2">"9b83db"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k9"</span><span class="p">:</span><span class="s2">"9b83db"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k18"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k8"</span><span class="p">:</span><span class="s2">"000000"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k21"</span><span class="p">:</span><span class="s2">"9b83db"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k7"</span><span class="p">:</span><span class="s2">"dedede"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kt"</span><span class="p">:</span><span class="s2">"b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ku"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ka"</span><span class="p">:</span><span class="s2">"Arial Rounded MT Bold"</span><span class="p">}</span><span class="w"> </span></code></pre></div> <p><strong>Cookie Data</strong></p> <div class="highlight"><pre class="highlight plaintext"><code>5=1; ay=b; bc=1; ae=d; ax=v261-7; u=1; 18=1; j=9b83db; x=000000; 7=dedede; 8=000000; aa=9b83db; 9=9b83db; 21=9b83db; t=b; a=Arial%20Rounded%20MT%20Bold </code></pre></div> <p></p><hr id="cyberpunk"> <p></p> <h2>Cyberpunk</h2> <p><img src="https://i.ibb.co/fx1nWmr/cyberpunk-search.png" alt="Screenshot - Cyberpunk"></p> <p><a href="https://duckduckgo.com/?kae=d&amp;k5=1&amp;kay=b&amp;kbc=1&amp;kax=v261-7&amp;kx=FFFC58&amp;kaa=9254b5&amp;kj=FF0055&amp;k9=FF0055&amp;k18=1&amp;ka=Cyberpunk&amp;k8=785eef+&amp;k21=FFFC58&amp;k7=101116&amp;kt=e" rel="noopener nofollow" target="_blank">Try it Out!</a></p> <p><strong>Color Palette</strong>: <code class="prettyprint">#101116</code>, <code class="prettyprint">#ff0055</code>, <code class="prettyprint">#9254b5</code>, <code class="prettyprint">#785eef</code>, <code class="prettyprint">#fffc58</code></p> <p><strong>JSON</strong></p> <div class="highlight"><pre class="highlight json"><code><span class="p">{</span><span class="nl">"kae"</span><span class="p">:</span><span class="s2">"d"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k5"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kay"</span><span class="p">:</span><span class="s2">"b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kbc"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kax"</span><span class="p">:</span><span class="s2">"v261-7"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kx"</span><span class="p">:</span><span class="s2">"FFFC58"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kaa"</span><span class="p">:</span><span class="s2">"9254b5"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kj"</span><span class="p">:</span><span class="s2">"FF0055"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k9"</span><span class="p">:</span><span class="s2">"FF0055"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k18"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ka"</span><span class="p">:</span><span class="s2">"Cyberpunk"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k8"</span><span class="p">:</span><span class="s2">"785eef "</span><span class="p">,</span><span class="w"> </span><span class="nl">"k21"</span><span class="p">:</span><span class="s2">"FFFC58"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k7"</span><span class="p">:</span><span class="s2">"101116"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kt"</span><span class="p">:</span><span class="s2">"e"</span><span class="p">}</span><span class="w"> </span></code></pre></div> <p><strong>Cookie Data</strong></p> <div class="highlight"><pre class="highlight plaintext"><code>5=1; ay=b; bc=1; ae=d; ax=v261-7; 8=785eef%20; aa=9254b5; x=FFFC58; 18=1; j=FF0055; 21=FFFC58; 7=101116; 9=FF0055; a=Cyberpunk; t=e </code></pre></div> <p></p><hr id="dracula"> <p></p> <h2>Dracula</h2> <p><img src="https://i.ibb.co/MDmwMRk/dracula-search.png" alt="Screenshot - Dracula"></p> <p><a href="https://duckduckgo.com/?kae=t&amp;ks=m&amp;kw=n&amp;ko=s&amp;ku=-1&amp;ky=44475a&amp;k7=282a36&amp;k8=f8f8f2&amp;k9=50fa7b&amp;kt=p&amp;km=l&amp;kj=282a36&amp;ka=p&amp;kaa=bd93f9&amp;kx=f1fa8c&amp;kaf=1&amp;kai=1&amp;kf=1" rel="noopener nofollow" target="_blank">Try it Out!</a></p> <p><strong>Credit</strong>: This theme was inspired by <a href="https://draculatheme.com/" rel="noopener nofollow" target="_blank">Dracula</a></p> <p><strong>JSON</strong></p> <div class="highlight"><pre class="highlight json"><code><span class="p">{</span><span class="nl">"kae"</span><span class="p">:</span><span class="s2">"t"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ks"</span><span class="p">:</span><span class="s2">"m"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kw"</span><span class="p">:</span><span class="s2">"n"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ko"</span><span class="p">:</span><span class="s2">"s"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ku"</span><span class="p">:</span><span class="s2">"-1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ky"</span><span class="p">:</span><span class="s2">"44475a"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k7"</span><span class="p">:</span><span class="s2">"282a36"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k8"</span><span class="p">:</span><span class="s2">"f8f8f2"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k9"</span><span class="p">:</span><span class="s2">"50fa7b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kt"</span><span class="p">:</span><span class="s2">"p"</span><span class="p">,</span><span class="w"> </span><span class="nl">"km"</span><span class="p">:</span><span class="s2">"l"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kj"</span><span class="p">:</span><span class="s2">"282a36"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ka"</span><span class="p">:</span><span class="s2">"p"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kaa"</span><span class="p">:</span><span class="s2">"bd93f9"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kx"</span><span class="p">:</span><span class="s2">"f1fa8c"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kaf"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kai"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kf"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">}</span><span class="w"> </span></code></pre></div> <p><strong>Cookie Data</strong></p> <div class="highlight"><pre class="highlight javascript"><code><span class="nx">ae</span><span class="o">=</span><span class="nx">t</span><span class="p">;</span> <span class="nx">s</span><span class="o">=</span><span class="nx">m</span><span class="p">;</span> <span class="nx">w</span><span class="o">=</span><span class="nx">n</span><span class="p">;</span> <span class="nx">o</span><span class="o">=</span><span class="nx">s</span><span class="p">;</span> <span class="nx">u</span><span class="o">=-</span><span class="mi">1</span><span class="p">;</span> <span class="nx">y</span><span class="o">=</span><span class="mi">44475</span><span class="nx">a</span><span class="p">;</span> <span class="mi">7</span><span class="o">=</span><span class="mi">282</span><span class="nx">a36</span><span class="p">;</span> <span class="mi">8</span><span class="o">=</span><span class="nx">f8f8f2</span><span class="p">;</span> <span class="mi">9</span><span class="o">=</span><span class="mi">50</span><span class="nx">fa7b</span><span class="p">;</span> <span class="nx">t</span><span class="o">=</span><span class="nx">p</span><span class="p">;</span> <span class="nx">m</span><span class="o">=</span><span class="nx">l</span><span class="p">;</span> <span class="nx">j</span><span class="o">=</span><span class="mi">282</span><span class="nx">a36</span><span class="p">;</span> <span class="nx">a</span><span class="o">=</span><span class="nx">p</span><span class="p">;</span> <span class="nx">aa</span><span class="o">=</span><span class="nx">bd93f9</span><span class="p">;</span> <span class="nx">x</span><span class="o">=</span><span class="nx">f1fa8c</span><span class="p">;</span> <span class="nx">af</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="nx">ai</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="nx">f</span><span class="o">=</span><span class="mi">1</span> </code></pre></div> <p></p><hr id="hack"> <p></p> <h2>Hack</h2> <p><img src="https://i.ibb.co/Rzwf5Bv/hack-search.png" alt="Screenshot - Hack"></p> <p><a href="https://duckduckgo.com/?kae=d&amp;k5=1&amp;kay=b&amp;kbc=1&amp;kax=v261-7&amp;kx=FFFC58&amp;kaa=0cbd2b&amp;kj=070709&amp;k9=00ff2b&amp;k18=1&amp;ka=Courier+New&amp;k8=d1d1d1&amp;k21=118b25&amp;k7=101116&amp;kt=Courier" rel="noopener nofollow" target="_blank">Try it Out!</a></p> <p><strong>Color Palette</strong>: <code class="prettyprint">#101116</code>, <code class="prettyprint">#070709</code>, <code class="prettyprint">#00ff2b</code>, <code class="prettyprint">#d1d1d1</code>, <code class="prettyprint">#fffc58</code>, <code class="prettyprint">#118b25</code>, Font: <code class="prettyprint">Courier</code></p> <p><strong>JSON</strong></p> <div class="highlight"><pre class="highlight json"><code><span class="p">{</span><span class="nl">"kae"</span><span class="p">:</span><span class="s2">"d"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k5"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kay"</span><span class="p">:</span><span class="s2">"b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kbc"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kax"</span><span class="p">:</span><span class="s2">"v261-7"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kx"</span><span class="p">:</span><span class="s2">"FFFC58"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kaa"</span><span class="p">:</span><span class="s2">"0cbd2b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kj"</span><span class="p">:</span><span class="s2">"070709"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k9"</span><span class="p">:</span><span class="s2">"00ff2b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k18"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ka"</span><span class="p">:</span><span class="s2">"Courier New"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k8"</span><span class="p">:</span><span class="s2">"d1d1d1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k21"</span><span class="p">:</span><span class="s2">"118b25"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k7"</span><span class="p">:</span><span class="s2">"101116"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kt"</span><span class="p">:</span><span class="s2">"Courier"</span><span class="p">}</span><span class="w"> </span></code></pre></div> <p><strong>Cookie Data</strong></p> <div class="highlight"><pre class="highlight plaintext"><code>5=1; ay=b; bc=1; ae=d; ax=v261-7; j=070709; x=FFFC58; 18=1; 7=101116; 9=00ff2b; aa=0cbd2b; 21=118b25; 8=d1d1d1; t=Courier; a=Courier%20New </code></pre></div> <p></p><hr id="neon"> <p></p> <h2>Neon</h2> <p><img src="https://i.ibb.co/9wn45cT/neon-search.png" alt="Screenshot - Neon"></p> <p><a href="">Try it Out!</a></p> <p><strong>Color Palette</strong>: <code class="prettyprint">#261d49</code>, <code class="prettyprint">#2a1f48</code>, <code class="prettyprint">#df95ff</code>, <code class="prettyprint">#9254b5</code>, <code class="prettyprint">#1bccfd</code>, <code class="prettyprint">#21f6bc</code>, Font: <code class="prettyprint">Hack</code></p> <p><strong>JSON</strong></p> <div class="highlight"><pre class="highlight json"><code><span class="p">{</span><span class="nl">"kae"</span><span class="p">:</span><span class="s2">"d"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k5"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kay"</span><span class="p">:</span><span class="s2">"b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kbc"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ka"</span><span class="p">:</span><span class="s2">"Hack"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k7"</span><span class="p">:</span><span class="s2">"261d49"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k8"</span><span class="p">:</span><span class="s2">"1bccfd"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k21"</span><span class="p">:</span><span class="s2">"2a1f48"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k18"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kx"</span><span class="p">:</span><span class="s2">"21f6bc"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kaa"</span><span class="p">:</span><span class="s2">"9254b5"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kj"</span><span class="p">:</span><span class="s2">"2a1f48"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k9"</span><span class="p">:</span><span class="s2">"df95ff"</span><span class="p">}</span><span class="w"> </span></code></pre></div> <p><strong>Cookie Data</strong></p> <div class="highlight"><pre class="highlight plaintext"><code>5=1; ay=b; bc=1; ae=d; j=2a1f48; a=Hack; 18=1; aa=9254b5; 7=261d49; 9=df95ff; 8=1bccfd; 21=2a1f48; x=21f6bc </code></pre></div> <p></p><hr id="nord"> <p></p> <h2>Nord</h2> <blockquote> <p>Pale grey and dusty pastel</p> </blockquote> <p><img src="https://i.ibb.co/SyzVB9P/nord-search.png" alt="Screenshot - Nord"></p> <p><a href="https://duckduckgo.com/?kae=d&amp;k5=1&amp;kay=b&amp;kbc=1&amp;kax=v261-7&amp;kx=b28ead&amp;kaa=87c0d0&amp;kj=404855&amp;k9=%2381a1c1&amp;k18=1&amp;ka=Courier+New&amp;k8=%2381a1c1&amp;k21=%2381a1c1&amp;k7=2e3440&amp;kt=h" rel="noopener nofollow" target="_blank">Try it Out!</a></p> <p><strong>Color Palette</strong>: <code class="prettyprint">#2e3440</code>, <code class="prettyprint">#404855</code>, <code class="prettyprint">#81a1c1</code>, <code class="prettyprint">#87c0d0</code>, <code class="prettyprint">#b28ead</code></p> <p><strong>JSON</strong></p> <div class="highlight"><pre class="highlight json"><code><span class="p">{</span><span class="nl">"kae"</span><span class="p">:</span><span class="s2">"d"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k5"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kay"</span><span class="p">:</span><span class="s2">"b"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kbc"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kax"</span><span class="p">:</span><span class="s2">"v261-7"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kx"</span><span class="p">:</span><span class="s2">"b28ead"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kaa"</span><span class="p">:</span><span class="s2">"87c0d0"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kj"</span><span class="p">:</span><span class="s2">"404855"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k9"</span><span class="p">:</span><span class="s2">"#81a1c1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k18"</span><span class="p">:</span><span class="s2">"1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ka"</span><span class="p">:</span><span class="s2">"Courier New"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k8"</span><span class="p">:</span><span class="s2">"#81a1c1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k21"</span><span class="p">:</span><span class="s2">"#81a1c1"</span><span class="p">,</span><span class="w"> </span><span class="nl">"k7"</span><span class="p">:</span><span class="s2">"2e3440"</span><span class="p">,</span><span class="w"> </span><span class="nl">"kt"</span><span class="p">:</span><span class="s2">"h"</span><span class="p">}</span><span class="w"> </span></code></pre></div> <p><strong>Cookie Data</strong></p> <div class="highlight"><pre class="highlight plaintext"><code>5=1; ay=b; bc=1; ae=d; ax=v261-7; a=Courier%20New; 7=2e3440; 18=1; 9=81a1c1; 8=81a1c1; aa=87c0d0; x=b28ead; 21=81a1c1; j=404855; t=h </code></pre></div> <p></p><hr id="usage"> <p></p> <h2>Usage</h2> <p>There are three different methods of applying themes: Using cookies, URL parameters or DDG's cloud store</p> <p>For cookies, settings can be applied programmatically with JavaScript directly through the browser console (or using a dev tool or third-party extension). Settings are specified as individual cookies, with a single string identifier and a corresponding value. The following is a quick script to apply settings easily, just replace <code class="prettyprint">ddg_cookie_input</code> with your desired data (or use one of the examples above). Note that you must be on the DuckDuckGo domain for this to work.</p> <div class="highlight"><pre class="highlight javascript"><code><span class="c1">// Converts DDG cookie string into formatted JSON</span> <span class="kd">const</span> <span class="nx">makeCookieData</span> <span class="o">=</span> <span class="p">(</span><span class="nx">ddg_cookie_input</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="kd">let</span> <span class="nx">ddg_json</span> <span class="o">=</span> <span class="p">{};</span> <span class="kd">const</span> <span class="nx">items</span> <span class="o">=</span> <span class="nx">ddg_cookie_input</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="sr">/</span><span class="se">[</span><span class="sr"> ,</span><span class="se">]</span><span class="sr">+/</span><span class="p">);</span> <span class="nx">items</span><span class="p">.</span><span class="nx">forEach</span><span class="p">((</span><span class="nx">item</span><span class="p">)</span><span class="o">=&gt;</span><span class="p">{</span> <span class="kd">let</span> <span class="nx">parts</span> <span class="o">=</span> <span class="nx">item</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="dl">'</span><span class="s1">=</span><span class="dl">'</span><span class="p">);</span> <span class="nx">ddg_json</span><span class="p">[</span><span class="nx">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span> <span class="p">});</span> <span class="k">return</span> <span class="nx">ddg_json</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Iterates over JSON, and adds to browser cookie store</span> <span class="kd">const</span> <span class="nx">setCookies</span> <span class="o">=</span> <span class="p">(</span><span class="nx">ddg_json</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">ddg_json</span><span class="p">).</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span> <span class="nb">document</span><span class="p">.</span><span class="nx">cookie</span><span class="o">=</span><span class="s2">`</span><span class="p">${</span><span class="nx">key</span><span class="p">}</span><span class="s2">=</span><span class="p">${</span><span class="nx">ddg_json</span><span class="p">[</span><span class="nx">key</span><span class="p">]}</span><span class="s2">`</span><span class="p">;</span> <span class="p">});</span> <span class="p">}</span> <span class="c1">// Paste your cookie data here</span> <span class="kd">const</span> <span class="nx">ddg_cookie_input</span> <span class="o">=</span> <span class="s2">`5=1; ay=b; bc=1; ae=d; ax=v261-7; 18=1; aa=0a7355; x=a8d3ff; 8=d3d5e5; 9=00af87; j=080813; 7=0b1021; 21=080813; a=Hack; t=v`</span><span class="p">;</span> <span class="c1">// Call set cookies, passing in formated cookie data</span> <span class="nx">setCookies</span><span class="p">(</span><span class="nx">makeCookieData</span><span class="p">(</span><span class="nx">ddg_cookie_input</span><span class="p">));</span> <span class="c1">// All done, reload page for changes to take effect :)</span> <span class="nx">location</span><span class="p">.</span><span class="nx">reload</span><span class="p">();</span> </code></pre></div> <p>This is handy, because once you've got DDG setup just how you like, you can make note of these values, and then easily apply them to any other system or browser with a single command.</p> <p>If you would rather not set cookies, then you can use URL GET parameters (but note that the identifiers are different, see the full <a href="https://duckduckgo.com/params" rel="noopener nofollow" target="_blank">list of options here</a>). You can find pre-formatted URL under Settings --&gt; Appearance --&gt; Show Bookmarklet and Settings Data. Here you can also enable cloud save, where you pick a password which is encoded into a URL so that you can access your setup on a different browser/ device. </p> <p>Alternatively, if you're already using <a href="https://www.tampermonkey.net/" rel="noopener nofollow" target="_blank">TamperMonkey</a>, then you can manage this with JavaScript. Similarly if you're comfortable with CSS, then you have a lot more flexibility, and extensions like <a href="https://userstyles.org/" rel="noopener nofollow" target="_blank">Stylish</a> can make it easy to manage CSS overrides (here are some <a href="https://userstyles.org/styles/browse?search_terms=DuckDuckGo&amp;type=false" rel="noopener nofollow" target="_blank">examples</a>). - But the great thing about DDG, is that no extensions of hacks are required. (Also note that browser extensions can be pretty bad for privacy- they make your fingerprint much more unique, and occasionally are plain malicious)</p> <style> pre.highlight code{ white-space: pre-line; } .highlight pre { min-width: 500px; overflow: unset; } p img { width: 100%; max-width: 800px !important; margin: 0 auto; border-radius: 5px; box-shadow: 0 2px 5px rgb(0 0 0 / 70%), 3px 2px 2px rgb(0 0 0 / 50%); } </style> </p> My Server Setup โš™๏ธ Alicia's Notes ๐Ÿš€ Fri, 12 Feb 2021 20:00:00 +0000 https://notes.aliciasykes.com/22798/my-server-setup https://notes.aliciasykes.com/22798/my-server-setup <p><p>This article outlines the steps I take on any new server, to configure it for security, consistency and convenience. It is written specifically for Debian, but will also directly apply to derivatives (such as Ubuntu), and will likely be very similar for for other distros.</p> <p>I am in the process of writing automation scripts to cover all of these steps, in the form of Ansible Playbooks.</p> <p>This guide is split into 10 sections:</p> <ol> <li><a href="#system-update">System Update</a> - Upgrade the OS and enable automated security updates</li> <li><a href="#system-setup">System Setup</a> - Specify hostname, add users, configure server time etc</li> <li><a href="#configure-ssh">Configure SSH</a> - Setup keys, configure sshd_config and set permissions</li> <li><a href="#install-packages">Install Essential Software</a> - Including git, vim, zsh, tmux, ranger etc</li> <li><a href="#firewall">Enable Firewall</a> - Manage allowed inbound/ outbound connections with UFW</li> <li><a href="#intrusion-prevention">Setup Intrusion Prevention</a> - Protect from brute force attacks with Fail2Ban</li> <li><a href="#malicious-traffic-detection">Configure Malicious Traffic Detection</a> - Flag malicious packets with MalTrail</li> <li><a href="#security-audit">Implement Security Auditing and Scanning</a> - With ClamAV, Lynis and RKhunter</li> <li><a href="#setup-dotfiles">Fetch Dotfiles</a> for Vim, ZSH, Tmux etc to make SSH sessions more comfortable</li> <li><a href="#borg-backup">Automated Backups</a> - Using Borg for incremental, off-site, encrypted backups</li> <li><a href="#setup-system-monitoring">Setup System Monitoring</a></li> <li><a href="#final-steps">Final Steps</a> - Optional items (Go, Rust, Node, Python, Docker, NGINX etc..)</li> </ol> <p></p><hr id="system-update"><p></p> <h2>System Update</h2> <p>Update the System and Packages</p> <ul> <li><code class="prettyprint">apt update</code> - Update system packages</li> <li><code class="prettyprint">apt -y upgrade</code> - Upgrade OS</li> <li><code class="prettyprint">apt autoremove</code> and <code class="prettyprint">apt clean</code> - Remove locally downloaded deb packages and apt-get caches</li> </ul> <p>Enable Unattended Upgrades</p> <ul> <li><code class="prettyprint">apt install unattended-upgrades</code> - Install package (if not already installed)</li> <li><code class="prettyprint">dpkg-reconfigure --priority=high unattended-upgrades</code> - Enable automatic upgrades</li> <li><code class="prettyprint">vi /etc/apt/apt.conf.d/50unattended-upgrades</code> to update the configuration</li> </ul> <p></p><hr id="system-setup"><p></p> <h2>System Setup</h2> <p>Specify Host Name</p> <ul> <li><code class="prettyprint">sudo hostnamectl set-hostname [new-host-name]</code> - Set the machines host name (view with <code class="prettyprint">hostname</code>)</li> <li>Add <code class="prettyprint">127.0.0.1 [hostname]</code> into <code class="prettyprint">/etc/hosts</code> - Add host name to the hosts file</li> </ul> <p>Add New Users</p> <ul> <li><code class="prettyprint">useradd -m [username] -c "[user full name]"</code> - Create a new user (<code class="prettyprint">-c</code> Allows an associated name or comment)</li> <li><code class="prettyprint">passwd [username]</code> - Specify a password for new user</li> <li><code class="prettyprint">sudo usermod -a -G sudo [username]</code> - Gives the user root privileges (only apply if needed)</li> </ul> <p>Set the Server Time</p> <ul> <li><code class="prettyprint">sudo timedatectl set-timezone Europe/London</code></li> <li><code class="prettyprint">sudo vi /etc/systemd/timesyncd.conf</code> and add the address of the local NTP server</li> <li><code class="prettyprint">sudo systemctl restart systemd-timesyncd.service</code> - Restart the time sync service</li> </ul> <p></p><hr id="configure-ssh"><p></p> <h2>Configure SSH</h2> <p>Setup SSH Keys for Authentication</p> <ul> <li><code class="prettyprint">sudo apt install openssh-server</code> - Install OpenSSH Server on remote host</li> <li><code class="prettyprint">ssh-keygen -t rsa -b 4096</code> - On the local system. Generates a new SSH key pair (enter a strong passphrase when prompted)</li> <li><code class="prettyprint">ssh-copy-id root@[0.0.0.0]</code> - Uploads to the remote server, and update the hosts file</li> <li><code class="prettyprint">chmod go-w ~ ~/.ssh ~/.ssh/authorized_keys</code> - On the remote host, updated permissions</li> <li><code class="prettyprint">sudo ufw allow ssh</code> - If UFW is enabled, then allow SSH access</li> </ul> <p>Next we're going configure a couple of SSH security essentials</p> <ul> <li><code class="prettyprint">vim /etc/ssh/sshd_config</code> - To open the SSH daemon's config file , and update: <ul> <li><code class="prettyprint">Protocol 2</code> # Only use SSH 2 Protocol</li> <li><code class="prettyprint">PermitRootLogin no</code> # Disable root SSH login</li> <li><code class="prettyprint">PasswordAuthentication no</code> # Disable password-based SSH login</li> <li><code class="prettyprint">Compression delayed</code> # Compression could be dangerous, only allow it once authenticated</li> <li><code class="prettyprint">MaxAuthTries 5</code> # Limit the maximum authentication attempts</li> <li><code class="prettyprint">PrintLastLog yes</code> # Display last login date for an extra check (should be default)</li> <li><code class="prettyprint">PermitEmptyPasswords no</code> # Disallow empty passwords (Not relevant for SSH Keys, but still good to have)</li> <li><code class="prettyprint">IgnoreRhosts yes</code> # Disallow access via rhosts, which is rarely used anymore</li> <li><code class="prettyprint">IgnoreUserKnownHosts yes</code> # Only trust the global known hosts list</li> <li><code class="prettyprint">HostBasedAuthentication no</code> # Similar to rhosts, this is rarely used</li> <li><code class="prettyprint">Port 2200</code> # Set SSH access to a non-standard port</li> <li><code class="prettyprint">StrictModes yes</code> # Prevent users from accidentally leaving their directories/ files as writable</li> <li><code class="prettyprint">UsePrivilegeSeparation sandbox</code> # Prevent privilege escalation</li> <li><code class="prettyprint">PubkeyAuthentication yes</code> # Public key authentication should be preferred (should be default)</li> <li><code class="prettyprint">GSSAPIAuthentication no</code> # If you are not using GSSAPI authentication, this should be disabled</li> <li><code class="prettyprint">KerberosAuthentication no</code> # If you are not using Kerberos authentication, this again should be disabled</li> <li><code class="prettyprint">Ciphers aes128-ctr,aes192-ctr,aes256-ctr</code> # Use FIPS 140-2 compliant ciphers, to avoid weak encryption algorithms</li> <li><code class="prettyprint">MACs hmac-sha2-256,hmac-sha2-512</code> # Use FIPS 140-2 Compliant MACs, to avoid weak cryptographic hashes</li> <li><code class="prettyprint">HashKnownHosts yes</code> - Storing host data in plaintext gives an attacker a clear picture of the network</li> </ul></li> </ul> <p>The SSH daemon must be restarted, in order for these config changes to take effect: <code class="prettyprint">sudo systemctl restart ssh</code></p> <p>Protect SSH Host Keys</p> <ul> <li><code class="prettyprint">sudo chmod 0600 /etc/ssh/*key</code> - Set permissions for private keys</li> <li><code class="prettyprint">sudo chmod 0644 /etc/ssh/*pub</code> - Set permissions for public keys</li> </ul> <p>If your system stores keys in a different directory, you can find them with <code class="prettyprint">grep -i hostkey /etc/ssh/sshd_config</code>. You can list the permissions of keys with <code class="prettyprint">ls -l /etc/ssh/*key</code> (or <code class="prettyprint">*pub</code> for public keys)</p> <p>Optionally, <a href="https://listed.to/p/7TvtqtSBZg" rel="noopener nofollow" target="_blank">configure an SSH tarpit</a>, to lock up the bots hammering port 22, with Endlessh</p> <p></p><hr id="install-packages"><p></p> <h2>Install Essential Software</h2> <p>Install Packages</p> <ul> <li><code class="prettyprint">sudo apt update</code> - Ensure the package list is up-to-date</li> <li><code class="prettyprint">sudo apt install -y git vim tmux zsh ranger</code> - Install essentials: vim, git, tmux, ZSH and ranger</li> <li><code class="prettyprint">sudo apt install -y make curl</code> - Install utilities</li> <li><code class="prettyprint">sudo apt install -y fzf exa</code> - Install command line improvements</li> <li><code class="prettyprint">sudo apt install -y ctags xsel glances fonts-powerline</code> - Install visual improvements</li> <li><code class="prettyprint">sudo apt install -y clamav rkhunter lynis</code> - Install security audit tools</li> <li><code class="prettyprint">sudo apt install -y neofetch figlet lolcat</code> - Optionally, install fun stuff</li> </ul> <p>Optionally,</p> <ul> <li>If needed, <a href="https://listed.to/p/frKPhkrWVq" rel="noopener nofollow" target="_blank">install Docker</a></li> <li>If needed, <a href="https://listed.to/p/xyAgKFe7JL" rel="noopener nofollow" target="_blank">install Go Lang</a></li> <li>If needed, install Rust and Cargo, with <code class="prettyprint">sudo curl https://sh.rustup.rs -sSf | sh</code> (check the script first!)</li> <li>If needed, install Python and PIP, with <code class="prettyprint">sudo apt install python3 python3-pip</code></li> <li>If needed, install Node.js and NPM, with <code class="prettyprint">sudo apt install nodejs npm</code> <ul> <li>Or use <a href="https://github.com/nodesource/distributions" rel="noopener nofollow" target="_blank">NodeSource</a>'s Node.js PPA: <code class="prettyprint">curl -fsSL https://deb.nodesource.com/setup_current.x | bash -</code></li> </ul></li> </ul> <p></p><hr id="firewall"><p></p> <h2>Configure Firewall with UFW</h2> <ul> <li><code class="prettyprint">sudo apt install ufw</code> - Install UFW</li> <li><code class="prettyprint">sudo vi /etc/default/ufw</code> and set <code class="prettyprint">IPV6=yes</code> to use IPv6</li> <li><code class="prettyprint">sudo ufw default deny incoming</code> and <code class="prettyprint">sudo ufw default allow outgoing</code> to deny all incoming traffic, and allow outgoing</li> <li><code class="prettyprint">sudo ufw allow 2200/tcp</code> to for example, allow incoming SSH traffic on port 2200</li> <li><code class="prettyprint">sudo ufw disable</code> and <code class="prettyprint">sudo ufw enable</code> (or <code class="prettyprint">systemctl restart ufw</code>) to restart UFW</li> <li><code class="prettyprint">sudo ufw status</code> - Check the current status</li> </ul> <p>Whenever a new application is configured, UFW needs to be updated to allow incoming traffic to that port and protocol. </p> <p></p><hr id="intrusion-prevention"><p></p> <h2>Intrusion Prevention with Fail2Ban</h2> <ul> <li><code class="prettyprint">sudo apt install fail2ban</code> - Install Fail2ban</li> <li><code class="prettyprint">sudo cp /etc/fail2ban/jail.{conf,local}</code> - Copy <code class="prettyprint">jail.conf</code> to <code class="prettyprint">jail.local</code></li> <li><code class="prettyprint">sudo vi /etc/fail2ban/jail.local</code> - To edit the local config file, and add: <ul> <li><code class="prettyprint">ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24</code> - with local IP addresses</li> <li><code class="prettyprint">bantime = 1d</code> - Increase the ban time to 1 day</li> <li><code class="prettyprint">findtime = 10m</code> - Time between each attempt</li> <li><code class="prettyprint">maxretry = 7</code> - Number of failures before IP is banned</li> </ul></li> <li><code class="prettyprint">sudo systemctl restart fail2ban</code> - Restart Fail2ban, for changes to take effect</li> <li><code class="prettyprint">sudo systemctl status fail2ban</code> - Show the current status</li> </ul> <p>The <code class="prettyprint">fail2ban-client</code> can also be used to interact with the Fail2ban service from the CLI</p> <p></p><hr id="malicious-traffic-detection"><p></p> <h2>Malicious Traffic Detection with MalTrail</h2> <p>For systems that have services exposed to the internet, or for a firewall device that protects internal devices, then MalTrail can be really useful for flagging anything out of the ordinary.</p> <p>Install dependencies and get the MalTrail source</p> <ul> <li><code class="prettyprint">sudo apt install schedtool python-pcapy git</code> - SchedTool for better CPU scheduling, and Python for MalTrail</li> <li><code class="prettyprint">git clone https://github.com/stamparm/maltrail.git</code> - Get the MalTrail code</li> <li><code class="prettyprint">cd maltrail</code> - Navigate into the directoru</li> </ul> <p>Run MalTrail. There are two components, a sensor and a server.</p> <ul> <li><code class="prettyprint">sudo python sensor.py &amp;</code> - Start the sensor (<code class="prettyprint">&amp;</code> will run it in the background)</li> <li><code class="prettyprint">python server.py &amp;</code> - Start the server, in order to log results and allow access through a GUI</li> </ul> <p>Access the GUI</p> <ul> <li>Navigate to <code class="prettyprint">http://[ip]:8338</code> and enter username: <code class="prettyprint">admin</code> and password: <code class="prettyprint">changeme!</code></li> <li>To test things are working correctly, try <code class="prettyprint">ping -c 1 136.161.101.53</code> or, for DNS capturing <code class="prettyprint">nslookup morphed.ru</code> <ul> <li>Results for both should display on the dashboard and in the logs: <code class="prettyprint">/var/log/maltrail/</code></li> <li>To view today's logs, run <code class="prettyprint">cat /var/log/maltrail/$(date +"%Y-%m-%d").log</code></li> </ul></li> </ul> <p>Configure MalTrail's Settings</p> <ul> <li><code class="prettyprint">echo -n '[your-desired-password]' | sha256sum | cut -d " " -f 1</code> - Choose a strong password and hash it</li> <li><code class="prettyprint">sudo vim /home/tech/maltrail/maltrail.conf</code> - Open the configuration file</li> <li>Under <code class="prettyprint">USERS</code> section, replace the current <code class="prettyprint">Admin:05a181f00c15...</code> with <code class="prettyprint">Admin:[your-hashed-password]</code></li> <li>From within the <code class="prettyprint">maltrail.conf</code> you can configure other settings for the server component</li> <li><code class="prettyprint">pkill -f server.py &amp;&amp; python server.py &amp;</code> - Restart MalTrail</li> <li>Under normal circumstances the logs are fairly sparse, so it is possible to use a system like <a href="https://github.com/eradman/entr" rel="noopener nofollow" target="_blank">entr</a> to monitor them for changes and notify you using a channel of your choice.</li> </ul> <p></p><hr id="security-audit"><p></p> <h2>Security Scanning with ClamAV, Lynis and RKhunter</h2> <p>For security monitoring, I am using Lynis to audit general system config, ClamAV for detecting malware and rkhunter for checking for root kits. </p> <p>Install Packages</p> <ul> <li><code class="prettyprint">sudo apt install -y clamav rkhunter lynis</code> - Install security audit tools</li> <li><code class="prettyprint">sudo rkhunter --propupd</code> - Update rkhunter's file properties database</li> </ul> <p>Run a System Audit</p> <ul> <li><code class="prettyprint">sudo lynis audit system</code> - Run a full security audit</li> <li><code class="prettyprint">sudo clamscan / -r</code> - Scan for malware</li> <li><code class="prettyprint">sudo rkhunter -c --sk --rwo</code> - Check for rootkits (c for check, sk for skip keypress and rwo for report wanrings only)</li> </ul> <p>These commands can also be put into an <code class="prettyprint">.sh</code> file, and run periodically as a scheduled cron job, sending results to your email.</p> <p></p><hr id="setup-dotfiles"><p></p> <h2>Setup Dotfiles</h2> <ul> <li>If not already done, set ZSH as default shell: <code class="prettyprint">chsh -s /usr/bin/zsh</code></li> <li><code class="prettyprint">git clone https://github.com/Lissy93/dotfiles.git --recursive</code> - Download my dotfiles</li> <li><code class="prettyprint">cd ./dotfiles</code> - Navigate to directory</li> <li><code class="prettyprint">./install.sh</code> - Run the install script</li> </ul> <p></p><hr id="borg-backup"><p></p> <h2>Automated Backups</h2> <p><a href="https://www.borgbackup.org/" rel="noopener nofollow" target="_blank">Borg</a> is a deduplicating archiver with compression and encryption, it's space efficient, secure and easy. <a href="https://www.borgbase.com/" rel="noopener nofollow" target="_blank">BorgBase</a> provides affordable, performant, simple and safe Borg repositories (10 GB free or 100 GB for $24/year). I am also using <a href="https://healthchecks.io/" rel="noopener nofollow" target="_blank">HealthChecks.io</a> for monitoring backup status.</p> <ol> <li>Install dependencies: <code class="prettyprint">sudo apt install borgbackup borgmatic</code></li> <li>Generate SSH key pair: <ul> <li><code class="prettyprint">ssh-keygen -t ed25519 -a 100</code></li> <li>Make note of the public key, within <code class="prettyprint">~/.ssh/</code></li> </ul></li> <li>Sign up + create a new repo on <a href="https://www.borgbase.com/" rel="noopener nofollow" target="_blank">BorgBase</a> (or your provider of choice) <ul> <li>Import the public key generated previously</li> <li>Make note of the repo address</li> </ul></li> <li>Create a Borgmatic config file in <code class="prettyprint">/etc/borgmatic/config.yaml</code>. You can create a sample file, with <code class="prettyprint">generate-borgmatic-config</code>, then populate it with your preferences (files to backup, source of BorgBase repo, etc)</li> <li>Make backup <ul> <li>Initilize your repo with: <code class="prettyprint">sudo borgmatic init --encryption repokey-blake2</code></li> <li>Make your first backup with: <code class="prettyprint">borgmatic</code> (add <code class="prettyprint">--verbosity 1</code> to see logs)</li> </ul></li> <li>Automate with a cron job <ul> <li>First allow borgmatic to be run without needing password, run <code class="prettyprint">sudo visudo</code>, and paste <code class="prettyprint">my-username ALL=(root) NOPASSWD: /usr/bin/borgmatic</code></li> <li>Then run <code class="prettyprint">crontab -e</code>, and paste <code class="prettyprint">0 0 * * * sudo borgmatic</code></li> </ul></li> </ol> <p></p><hr id="final-steps"><p></p> <h2>Final Steps</h2> <p>Setup Welcome Banner</p> <ul> <li><code class="prettyprint">sudo cp ~/dotfiles/utils/welcome-banner.sh /etc/profile.d/motd.sh</code> - Copy welcome banner from utils to system</li> <li><code class="prettyprint">sudo chmod +x /etc/profile.d/motd.sh</code> - Update permissions for all users</li> </ul> <p>Install NetData, for web-based resource monitoring</p> <ul> <li><code class="prettyprint">bash &lt;(curl -Ss https://my-netdata.io/kickstart.sh) --stable-channel --disable-telemetry</code> - Install NetData</li> <li>You will need to allow firewall access, <code class="prettyprint">sudo ufw allow from [your-static-ip] to any port 19999</code></li> <li>If using a cloud platform (like AWS, Azure, GCP) then you may need specify an inbound port rule to allow access</li> </ul> <p>Setup Glances</p> <ul> <li>Install: <code class="prettyprint">sudo apt install glances</code></li> <li>To enable Glances to start up at boot time, run it as a service with <code class="prettyprint">systemd</code>. See <a href="https://github.com/nicolargo/glances/wiki/Start-Glances-through-Systemd" rel="noopener nofollow" target="_blank">docs</a> for more info</li> <li>If you need to access Glances remotely, either VPN into your server (recommended), or setup a reverse proxy to the Glances web page, as per <a href="https://github.com/nicolargo/glances/wiki/Reverse-proxy-to-the-Glances-Web-UI" rel="noopener nofollow" target="_blank">docs</a></li> </ul> <p>Install Bpytop</p> <ul> <li><code class="prettyprint">sudo pip3 install bpytop --upgrade</code></li> </ul> <p>In some situations, Cockpit might be useful. It's an efficient, extendable, all-in-one web-based server management app. It's useful for carrying out basic tasks, without having to SSH into a rarely used box and re-familiarize yourself all over again.</p> <ul> <li><code class="prettyprint">echo 'deb http://deb.debian.org/debian buster-backports main' &gt; /etc/apt/sources.list.d/backports.list</code> - Enable the backports repository</li> <li><code class="prettyprint">sudo apt update</code> and <code class="prettyprint">sudo apt install -t buster-backports cockpit</code> - Update and install</li> </ul> <p>If you're using Ubuntu, Cockpit is already included as an official backport, to install just run <code class="prettyprint">sudo apt install cockpit</code></p> <p>If needed, use <a href="https://www.smartmontools.org/" rel="noopener nofollow" target="_blank">Smartmontool</a> to monitor the status of you're disks. </p> <ul> <li><code class="prettyprint">sudo apt install smartmontools</code> - Install smartmontool, which includes <code class="prettyprint">smartctl</code></li> <li><code class="prettyprint">sudo fdisk -l</code> - Find the disk(s) you wish to ceck</li> <li><code class="prettyprint">sudo smartctl -t short /dev/sdX</code> - Run a quick check, where X is you're drive number</li> <li>For more info regarding the output, see <a href="https://linuxhandbook.com/check-ssd-health/#understanding-the-output-of-smartctl-command" rel="noopener nofollow" target="_blank">this post</a></li> </ul> <p>Optionally, setup Bash Hub for indexed and searchable terminal history in the cloud</p> <ul> <li><code class="prettyprint">curl -OL https://bashhub.com/setup &amp;&amp; zsh setup</code> - Check the installation script first, then install</li> <li>When prompted, log into your account. Restart your session, and run <code class="prettyprint">bh</code> to access the help menu</li> <li>Add an environmental variable, indicating which commands should not be saved, e.g. <code class="prettyprint">export BH_FILTER="(scp|ssh|--password)"</code></li> <li>Precede any command that contains sensitive information with <code class="prettyprint">#ignore</code> to prevent it being saved</li> <li>See usage docs: <a href="https://bashhub.com/usage" rel="noopener nofollow" target="_blank">https://bashhub.com/usage</a></li> </ul> <p>Optionally, setup <a href="https://github.com/alseambusher/crontab-ui" rel="noopener nofollow" target="_blank">Crontab UI</a>, for web-based management of cron jobs</p> <ul> <li><code class="prettyprint">npm install -g crontab-ui</code> - Install</li> <li><code class="prettyprint">HOST=0.0.0.0 PORT=9000 CRON_DB_PATH=/home/user/path/to/folder crontab-ui</code> - Start crontab UI</li> </ul> <p>Additional Tasks:</p> <ul> <li>If needed, <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-debian-10" rel="noopener nofollow" target="_blank">Setup VNC with Tight VNC Server and XFCE4 DE</a></li> </ul> <p><a href="https://devcenter.heroku.com/articles/heroku-cli#other-installation-methods" rel="noopener nofollow" target="_blank">Install Heroku</a></p> <hr> </p> Spelling Auto-Correct System โœ๏ธโŒ Alicia's Notes ๐Ÿš€ Mon, 01 Feb 2021 00:00:00 +0000 https://notes.aliciasykes.com/22944/spelling-auto-correct-system https://notes.aliciasykes.com/22944/spelling-auto-correct-system <p><blockquote> <p>TDLR; Auto-correct is a lot more efficient than manually correcting misspelled words. Espanso is awesome. <br> Beyond that, this isn't too interesting - I just documented this so I can refer back to it in the future.<br> If you're just looking for a generic word list, see <a href="https://listed.to/p/nWcfB31ZTD" rel="noopener nofollow" target="_blank">this post</a>, which contains 4,200 common misspellings.</p> </blockquote> <ol> <li><a href="#intro">Intro</a></li> <li><a href="#word-list">Word List</a></li> <li><a href="#convertor">Converter</a></li> <li><a href="#usage">Usage</a></li> </ol> <p></p><hr id="intro"><p></p> <h2>Intro</h2> <p>I am terrible at spelling. About 15% of what I've typed will be underlined in red. It's usually the same couple hundred words that I forget how to write. The best solution would probably be to learn how to spell, but I've instead I use a system to auto-correct my mistakes.</p> <p>I use <a href="https://espanso.org/" rel="noopener nofollow" target="_blank">Espanso</a> to implement this.</p> <p>There are of course standalone applications that do exactly this (like <a href="https://github.com/client9/misspell" rel="noopener nofollow" target="_blank">client9/misspell</a>, <a href="https://github.com/streetsidesoftware/cspell" rel="noopener nofollow" target="_blank">streetsidesoftware/cspell</a> and <a href="https://github.com/sedm0784/vim-you-autocorrect" rel="noopener nofollow" target="_blank">sedm0784/vim-you-autocorrect</a>), but I have other Espanso scripts for various tasks, so it made sense to bundle it all into one simple, cross-platform solution. I've previously used <a href="https://www.autohotkey.com/" rel="noopener nofollow" target="_blank">Auto-Hot-Key</a> which is also very good, but only available for Windows systems. Esprano's <a href="https://espanso.org/docs/matches/" rel="noopener nofollow" target="_blank">matching system</a> makes it an extremely powerful tool, this is a very trivial task compared to all the other awesome stuff you can use it for.</p> <p></p><hr id="word-list"><p></p> <h2>My Auto-Correction List</h2> <p>These are just the 220-ish words that I most often miss type/ spell, along with their <a href="https://listed.to/p/0zNFIsk6mk" rel="noopener nofollow" target="_blank">correct spellings</a>. It is written as an AHK script (because it's easier to maintain), but I made a <a href="https://ahk-to-espanso.as93.net" rel="noopener nofollow" target="_blank">quick utility</a> to convert AHK into YAML for use with Espanso.</p> <p>For a more comprehensive list of 4,200 crowd source common misspellings, see here: <a href="https://listed.to/p/nWcfB31ZTD" rel="noopener nofollow" target="_blank">https://listed.to/p/nWcfB31ZTD</a></p> <div class="highlight"><pre class="highlight plaintext"><code>; This is my personal list of words I commonly misspelled plus auto-corrections ; Licensed under MIT - (C) Alicia Sykes, 2021 &lt;https://aliciasykes.com/&gt; ; Format: '::[Incorrect Word]::[Correct Word]' ::acount::account ::acsent::accent ::activley::actively ::adress::address ::advesary::adversary ::alchol::alcohol ::alein::alien ::alighn::align ::alternativley::alternatively ::alterntive::alternative ::anivesary::anniversary ::anonimity::anonymity ::anual::annual ::appologies::apologies ::appropriatley::appropriately ::arbitary::arbitrary ::arbitory::arbitrary ::arcitecture::architecture ::artifecial::artificial ::atatchment::attachment ::athalete::athlete ::attatched::attached ::availible::available ::availiblity::availability ::bandwith::bandwidth ::beginer::beginner ::behaviour::behavior ::boredem::boredom ::borogh::borough ::braile::braille ::caffine::caffeine ::cancelation::cancellation ::capsual::capsule ::celestrial::celestial ::cerial::cereal ::chanel::channel ::chrisis::crisis ::chrismas::Christmas ::christmas::Christmas ::collabrotive::collaborative ::collapsable::collapsible ::coloumn::column ::coloumns::columns ::comercial::commercial ::concious::conscious ::concisley::concisely ::consistant::consistent ::consistenctcy::consistency ::contributers::contributors ::controll::control ::controversal::controversial ::convertor::converter ::convinience::convenience ::convinient::convenient ::conviniently::conveniently ::coppied::copied ::createing::creating ::critisise::criticize ::cypher::cipher ::deafault::default ::deamon::daemon ::decentralised::decentralized ::decission::decision ::dedacated::dedicated ::deffinitive::definitive ::definatley::definitely ::definetive::definitive ::deinal::denial ::deleteing::deleting ::delivaring::delivering ::diferent::different ::digestable::digestible ::direcitve::directive ::direcroty::directory ::disapear::disappear ::disapearing::disappearing ::disastear::disaster ::disopointed::disappointed ::donut::doughnut ::duplecate::duplicate ::dupplicate::duplicate ::earnt::earned ::easyiest::easiest ::eddition::edition ::effectivley::effectively ::elderley::elderly ::embeding::embedding ::embrase::embrace ::emited::emitted ::emiting::emitting ::entirley::entirely ::entropey::entropy ::entrpreners::entrepreneurs ::entrpreneures::entrepreneurs ::entrpreneurs::entrepreneurs ::enviroment::environment ::errased::erased ::erruption::eruption ::esculation::escalation ::everythings::everything's ::Etherium::Ethereum ::exactley::exactly ::existance::existence ::experence::experience ::expirey::expiry ::expirienced::experienced ::exstersential::existential ::extendible::extendable ::extremley::extremely ::extrmley::extremely ::failrly::fairly ::favourite::favorite ::filiment::filament ::flavour::flavour ::gaurantee::guarantee ::geomatry::geometry ::grammer::grammar ::greatful::grateful ::guurantee::guarantee ::habbit::habit ::happines::happiness ::hault::halt ::hense::hence ::hiearachy::hierarchy ::honney::honey ::hummility::humility ::hygine::hygiene ::immediatley::immediately ::immidiate::immediate ::imune::immune ::indapendent::independent ::indefinatley::indefinitely ::indeinetley::indefinitely ::independant::independent ::infomation::information ::inherintly::inherently ::inteligence::intelligence ::interpritations::interpretations ::intiger::integer ::joyfull::joyful ::kernal::kernel ::lavendar::lavender ::lengh::length ::lenght::length ::lentgh::length ::lettice::lettuce ::leveles::levels ::likley::likely ::lonley::lonely ::lunimance::luminescence ::luxary::luxury ::maintanance::maintenance ::managment::management ::maximising::maximizing ::merley::merely ::messanger::messenger ::metior::meteor ::microfibre::microfiber ::minamal::minimal ::misarey::misery ::missuse::misuse ::moulding::molding ::mundaine::mundane ::mystries::mysteries ::mystry::mystery ::neatley::neatly ::neaural::neural ::neautral::neutral ::neccisity::necessity ::necissarily::necessarily ::necissary::necessary ::neighbours::neighbors ::nicley::nicely ::noicse::noise ::noticable::noticeable ::ocassion::occasion ::occour::occur ::occoured::occurred ::occours::occurs ::ofline::offline ::ommited::omited ::ommiting::omitting ::oppertunities::opportunities ::ourself::our self ::overidden::overridden ::overidding::overriding ::overide::override ::overiding::overriding ::overridding::overriding ::overriden::overridden ::pallette::palette ::pannel::panel ::panpha::panther ::pantfer::panther ::pantpha::panther ::paramaters::parameters ::particuarly::particularly ::particulary::particularly ::peice::piece ::percieive::perceive ::permant::permanent ::permenent::permanent ::permenently::permanently ::permently::permanently ::persiverence::perseverance ::poisen::poison ::poridge::porridge ::practicle::practical ::prefering::preferring ::prerequsites::prerequisites ::presance::presence ::privilage::privilege ::privilages::privileges ::profesional::professional ::profesor::professor ::programatically::programmatically ::proove::prove ::propietry::propriety ::propiety::propriety ::protacol::protocol ::protien::protein ::purley::purely ::quater::quarter ::razer::razor ::reccomend::recommend ::reccomended::recommended ::receits::receipts ::receiveing::receiving ::receve::receive ::recipie::recipe ::recognise::recognize ::recomended::recommended ::relevent::relevant ::remotley::remotely ::reoccoouring::reoccurring ::repeatidly::repeatedly ::repositry::repository ::restraunt::restaurant ::revele::reveal ::revoction::revocation ::reythem::rhythm ::rubish::rubbish ::safley::safely ::saftey::safety ::sandwitch::sandwich ::satallite::satellite ::satelite::satellite ::sattelite::satellite ::scafold::scaffold ::scafolding::scaffolding ::scafolds::scaffolds ::scenerio::scenario ::secondry::secondary ::securley::securely ::semmi::semi ::semmy::semi ::senario::scenario ::sensetive::sensitive ::sentance::sentence ::sepena::subpoena ::seperate::separate ::sercinctly::succinctly ::sersincltly::succinctly ::shaddow::shadow ::shiney::shiny ::siezed::seized ::sighn::sign ::signirure::signature ::signiture::signature ::signitures::signatures ::similary::similarly ::simultaniously::simultaneously ::siutably::suitably ::spair::spare ::sparce::sparse ::specalist::specialist ::squirel::squirrel ::streatch::stretch ::strengh::strength ::stright::straight ::subpena::subpoena ::subsintley::succinctly ::succesfully::successfully ::sucinctley::succinctly ::sucinctly::succinctly ::sufice::suffice ::supena::subpoena ::suppliment::supplement ::survelance::surveillance ::susincltley::succinctly ::susincltly::succinctly ::symol::symbol ::synonim::synonym ::synonims::synonyms ::targetted::targeted ::tatoo::tattoo ::tedius::tedious ::teh::the ::teir::tier ::thouh::though ::tourch::torch ::tracable::traceable ::trafic::traffic ::triaged:: ::trophey::trophy ::unauthorised::unauthorized ::uneque::unique ::unfortunently::unfortunately ::unlikly::unlikely ::unnecissary::unnecessary ::ussage::usage ::utilisation::utilization ::vacencies::vacancies ::vacency::vacancy ::vegtable::vegetable ::vegtables::vegetables ::versitile::versatile ::visualisations::visualizations ::voulenteering::volunteering ::vulnerabilites::vulnerabilities ::weekley::weekly ::werabouts::whereabouts ::wheather::whether ::yeild::yield ::youghurt::yogurt </code></pre></div> <p>For more words, see: <a href="https://listed.to/p/nWcfB31ZTD" rel="noopener nofollow" target="_blank">https://listed.to/p/nWcfB31ZTD</a></p> <hr> <iframe id="convertor" title="UI" src="https://ahk-to-espanso.as93.net/" style="border:none;width:100%;height:800px;"></iframe> <p>Source code for <a href="https://repl.it/@Lissy93/Word-List-Convertor#index.js" rel="noopener nofollow" target="_blank">Converter Script</a> on Repl.it</p> <p></p><hr id="usage"><p></p> <h2>Usage</h2> <p>For Espanso, first convert your source into YAML, then run <code class="prettyprint">espanso path</code> to find your config file location, drop the script into that directory, and restart Espanso, it should now be running.</p> <p>For the Auto Hot Key script, once you have AHK installed, then just download the above script (save it with the <code class="prettyprint">.ahk</code> extension), double click on it and it will be running.</p> <hr> <style>blockquote p { font-size: 0.9rem;}</style> </p> Top 25 Raspberry Pi Projects ๐Ÿฅง Alicia's Notes ๐Ÿš€ Fri, 15 Jan 2021 00:00:00 +0000 https://notes.aliciasykes.com/23239/top-25-raspberry-pi-projects https://notes.aliciasykes.com/23239/top-25-raspberry-pi-projects <p><p><img src="https://i.ibb.co/LP1wZtc/Top-Raspberry-Pi-Projects.png" alt="Banner Image - Raspberry Pi Projects" title="Icons from various Raspberry Pi Projects" class="banner"></p> <h3>Intro</h3> <p>Ever since the first version was released in 2012, the Raspberry Pi has been a staple piece of kit for professionals, hobbyists, educators and everyone in between. And for good reason, it's small, low power, affordable but extremely versatile. There are of course other single board computers on the market, but the Pi has a strong community behind it and provides a good balance between capabilities, form factor and price.</p> <hr> <h3>Raspberry Pi Projects</h3> <p>Here is a curated list of projects that I have used, enjoyed and would recommend for anyone looking to put their Pi to use. For links to each projects GitHub repo, see: <a href="https://github.com/stars/Lissy93/lists/raspberry-pi" rel="noopener nofollow" target="_blank">https://github.com/stars/Lissy93/lists/raspberry-pi</a></p> <p>There's nothing too complicated here, so this should also provide a good starting point for beginners. Everything here is fully open source and backed by strong communities with large user bases. <br> <br></p> <ul> <li><a href="https://pi-hole.net/" rel="noopener nofollow" target="_blank">Pi-Hole</a> - Network-wide DNS-based ad blocker</li> <li><a href="https://retropie.org.uk/" rel="noopener nofollow" target="_blank">RetroPi</a> - Retro game emulator</li> <li><a href="https://magicmirror.builders/" rel="noopener nofollow" target="_blank">Magic Mirror</a> - Easy modular smart mirror project</li> <li><a href="https://pikvm.org/" rel="noopener nofollow" target="_blank">Pi-KVM</a> - Easy and fully-featured KVM-over-IP</li> <li><a href="https://octoprint.org/" rel="noopener nofollow" target="_blank">OctoPrint</a> - 3D printer remote controller interface</li> <li><a href="https://www.pimusicbox.com/" rel="noopener nofollow" target="_blank">PiMusicBox</a> - An all-in-one streaming device with Spotify support (see also <a href="https://www.picoreplayer.org/" rel="noopener nofollow" target="_blank">PiCorePlayer</a> or <a href="https://sound.balenalabs.io/" rel="noopener nofollow" target="_blank">Balena Sound</a>)</li> <li><a href="https://sonic-pi.net/" rel="noopener nofollow" target="_blank">SonicPi</a> - Code-based music creation tool</li> <li><a href="https://www.kiwix.org/en/downloads/kiwix-hotspot/" rel="noopener nofollow" target="_blank">Kiwix Hotspot</a> - An off-grid WiFi hotspot serving up all the world's knowledge (Wikipedia, StackExchange, TED, the Gutenburg Library and more)</li> <li><a href="https://raspap.com/" rel="noopener nofollow" target="_blank">RaspAP</a> - Fully-features wireless access point, with GUI user interface. Supports ad-blocking, VPN, data usage, and more</li> <li><a href="https://pivpn.io/" rel="noopener nofollow" target="_blank">PiVPN</a> - Super simple OpenVPN or WireGuard server</li> <li><a href="https://github.com/RoganDawes/P4wnP1_aloa" rel="noopener nofollow" target="_blank">P4wnP1_aloa</a> - All-in-one highly customizable Pi Zero attack platform (see also <a href="http://pwnpi.sourceforge.net/" rel="noopener nofollow" target="_blank">PwnPi</a>, a pen test drop box)</li> <li><a href="https://github.com/ccrisan/motioneyeos/wiki" rel="noopener nofollow" target="_blank">MotionEye</a> - Easy multi-camera CCTV surveillance system (see also <a href="https://github.com/SvenVD/rpisurv" rel="noopener nofollow" target="_blank">Rpisurv</a>)</li> <li><a href="https://github.com/rootzoll/raspiblitz" rel="noopener nofollow" target="_blank">RaspiBlitz</a> - Run a BTC lightning node (see also <a href="https://getumbrel.com/" rel="noopener nofollow" target="_blank">Umbrel</a> or <a href="https://raspnode.com/diyBitcoin.html" rel="noopener nofollow" target="_blank">RaspNode</a> and <a href="https://stadicus.github.io/RaspiBolt/" rel="noopener nofollow" target="_blank">this tutorial</a>)</li> <li><a href="https://ownyourbits.com/nextcloudpi/" rel="noopener nofollow" target="_blank">NextCloudPi</a> - Self-host a local file server, with tons of useful plugins available</li> <li><a href="https://github.com/scottlawsonbc/audio-reactive-led-strip" rel="noopener nofollow" target="_blank">Audio-Reactive-LED-Strip</a> - Create lighting effects in time with music</li> <li><a href="https://www.brewpi.com/" rel="noopener nofollow" target="_blank">BrewPi</a> - Fully automated brewery controller</li> <li><a href="https://raspberryshake.org/" rel="noopener nofollow" target="_blank">RaspberryShake</a> - Earthquake monitoring with seismographs and infrasound</li> <li><a href="https://sensor.community/en/" rel="noopener nofollow" target="_blank">Sensor.Community</a> - Host a Pi environment sensor, using the <a href="https://shop.pimoroni.com/products/enviro?variant=31155658457171" rel="noopener nofollow" target="_blank">Enviro Air Quality</a> pHAT</li> <li><a href="https://github.com/FD-/RPiPlay" rel="noopener nofollow" target="_blank">RPiPlay</a> - Turn a Raspberry Pi into an Airplay server to enable screen mirroring on TVs, monitors and projectors</li> <li><a href="https://github.com/F5OEO/rpitx" rel="noopener nofollow" target="_blank">RpiITX</a> - RF transmitter 5 KHz to 1500 MHz</li> <li><a href="https://uk.flightaware.com/adsb/piaware/" rel="noopener nofollow" target="_blank">PiAware</a> - ADS-B aircraft tracking from FlightAware (see also <a href="http://stratux.me/" rel="noopener nofollow" target="_blank">Startus ADS-B</a>)</li> <li><a href="https://piratebox.cc/raspberry_pi:diy" rel="noopener nofollow" target="_blank">Pirate Box</a> - Anonymous offline mobile file-sharing and communications system </li> <li><a href="https://www.mod-bros.com/" rel="noopener nofollow" target="_blank">MoBro</a> - An external resource monitor screen for your PC</li> <li><a href="https://mycroft.ai/" rel="noopener nofollow" target="_blank">Mycroft AI</a> - Privacy-respecting AI voice assistant similar to Alexa. You can also <a href="https://www.instructables.com/Mycroft-Mark-II-Developer-Kit-Assembly/" rel="noopener nofollow" target="_blank">build a full enclosure</a> out of the developer kit. (Alternatively, build a Google Home, using <a href="https://aiyprojects.withgoogle.com/voice/" rel="noopener nofollow" target="_blank">Voice Kit</a> or an <a href="https://mytechbuild.com/2021/03/07/build-a-raspberry-pi-amazon-echo-in-7-steps/" rel="noopener nofollow" target="_blank">Alexa</a>)</li> </ul> <p>There is almost no limit to what you can do with a Pi, this list is just intended to serve as an example and a provide a starting point.</p> <hr> <h3>Operating Systems</h3> <p>Raspberry Pi can also be used as a normal computer; either a desktop, mini handheld or headless as a server. You're not just limited to <a href="https://www.raspberrypi.org/software/" rel="noopener nofollow" target="_blank">Raspberry Pi OS</a>, it also works very well with <a href="https://www.debian.org/ports/arm/" rel="noopener nofollow" target="_blank">Debian</a>, <a href="https://wiki.freebsd.org/action/show/arm/Raspberry%20Pi?action=show&amp;redirect=FreeBSD%2Farm%2FRaspberry+Pi" rel="noopener nofollow" target="_blank">FreeBSD</a>, <a href="https://archlinuxarm.org/" rel="noopener nofollow" target="_blank">Arch</a>, <a href="https://www.offensive-security.com/kali-linux-arm-images/" rel="noopener nofollow" target="_blank">Kali</a>, <a href="https://rpi.fatdog.eu/" rel="noopener nofollow" target="_blank">Slackware</a> and <a href="https://ubuntu.com/raspberry-pi" rel="noopener nofollow" target="_blank">Ubuntu</a> to name a few.</p> <p>For more specific use cases, there's also <a href="https://dietpi.com/" rel="noopener nofollow" target="_blank">Diet Pi</a> (super light-weight OS specifically for single-board computers), <a href="https://openelec.tv/" rel="noopener nofollow" target="_blank">OpenElec</a> (lightweight system for running a Kodi media center), <a href="https://www.microsoft.com/en-us/software-download/windows10iotcore" rel="noopener nofollow" target="_blank">Windows IoT Core</a>, <a href="https://osmc.tv/" rel="noopener nofollow" target="_blank">OCMC</a> (media center), <a href="https://emteria.com/" rel="noopener nofollow" target="_blank">Emteria Android</a> (for Android) and <a href="https://sourceforge.net/projects/chromnium-os-for-all-sbc/files/Raspberry%20Pi%20Images/" rel="noopener nofollow" target="_blank">Chromium OS</a> (similar to open source alternative to Chrome OS), <a href="https://nemslinux.com/download/nagios-for-raspberry-pi-4.php" rel="noopener nofollow" target="_blank">Nems</a> (for network monitoring) and <a href="https://raspberrypi.stackexchange.com/questions/534/definitive-list-of-operating-systems" rel="noopener nofollow" target="_blank">many more</a></p> <hr> <h3>Self-Hosted Applications</h3> <p>Once running an OS of your choice, the Pi is also perfect for self-hosting Linux applications. For example;</p> <ul> <li><a href="https://www.home-assistant.io/getting-started/" rel="noopener nofollow" target="_blank">Home Assistant</a> - Smart home dashboard and controller</li> <li><a href="https://www.openmediavault.org/" rel="noopener nofollow" target="_blank">OpenMediaVault</a> - Network attached storage with plugins</li> <li><a href="https://nextcloud.com/" rel="noopener nofollow" target="_blank">NextCloud</a> - Full productivity platform</li> <li><a href="https://www.plex.tv/" rel="noopener nofollow" target="_blank">Plex</a> - Media server</li> <li><a href="https://sonarr.tv/" rel="noopener nofollow" target="_blank">Sonar</a> - Smart Media Downloading for BitTorrent</li> <li><a href="https://www.netdata.cloud" rel="noopener nofollow" target="_blank">NetData</a> - Real-time system resource monitoring</li> <li><a href="https://howchoo.com/pi/how-to-set-up-steam-link-on-raspberry-pi" rel="noopener nofollow" target="_blank">StreamLink</a> - Stream your PC games to your TV (or your Plex content, with <a href="http://www.rasplex.com/" rel="noopener nofollow" target="_blank">RasPlex</a>)</li> </ul> <p>... and <a href="https://github.com/awesome-selfhosted/awesome-selfhosted" rel="noopener nofollow" target="_blank">tons more</a> </p> <p>If you're interested in self-hosting multiple apps, or using your Pi as a little home server, then check out <a href="https://homelabos.com/" rel="noopener nofollow" target="_blank">Home Lab OS</a> by <a href="https://gitlab.com/NickBusey" rel="noopener nofollow" target="_blank">Nick Busey</a>, it makes correctly configuring a complex lab as easy as running a single command.</p> <hr> <h3>Tools for Flashing SD Card/ USB</h3> <p>For flashing an OS to you're Pi's SD card or USB: <a href="https://www.raspberrypi.org/software/" rel="noopener nofollow" target="_blank">Official Pi Imager</a>, <a href="https://www.balena.io/etcher/" rel="noopener nofollow" target="_blank">Etcher</a> or use the <a href="https://www.computerhope.com/unix/dd.htm" rel="noopener nofollow" target="_blank">dd</a> (CLI utility on Unix systems). <a href="https://rufus.ie/" rel="noopener nofollow" target="_blank">Rufus</a> and <a href="https://sourceforge.net/projects/win32diskimager/" rel="noopener nofollow" target="_blank">Win32 Disk Imager</a> are also good utilities, but only available on Windows.</p> <p>To backup you're Pi's SD card of USB, you can also use <code class="prettyprint">dd</code> (the same as cloning, but in reverse). For example:</p> <ul> <li>Backup: <code class="prettyprint">sudo dd bs=4M if=/dev/sdb of=PiOS.img</code></li> <li>Restore: <code class="prettyprint">sudo dd bs=4M if=PiOS.img of=/dev/sdb</code></li> </ul> <p>For more information, see <a href="https://www.cyberpunk.rs/clone-micro-sd-card" rel="noopener nofollow" target="_blank">this tutorial</a>. Alternatively, on Windows systems, you can use <a href="https://sourceforge.net/projects/win32diskimager/" rel="noopener nofollow" target="_blank">Win32 Disk Imager</a> to clone the SD card.</p> <hr> <h3>More Project Ideas &amp; Tutorials</h3> <p>The following projects are a bit more hands-on</p> <ul> <li>Truly WiFi extender - A very performant and inexpensive WiFi repeater solution: via <a href="https://www.instructables.com/Truly-WiFi-Extender/" rel="noopener nofollow" target="_blank">Instructables</a> by @mrtejas99</li> <li>Print Server - Turn any old printer into an internet-connected WiFi printer: via <a href="https://www.makeuseof.com/tag/make-wireless-printer-raspberry-pi/" rel="noopener nofollow" target="_blank">makeuseof.com</a> by Christian Cawley</li> <li>YouTube Streaming Bird Box: via <a href="https://www.instructables.com/YouTube-Streaming-Bird-Box/" rel="noopener nofollow" target="_blank">Instructables</a> by @buestad</li> <li>Smart Glasses with a treansparent OLED display: via <a href="https://www.instructables.com/Smart-Glasses-V2/" rel="noopener nofollow" target="_blank">Instructables</a> by @Bradley_Campbell</li> <li>3D-Printed Mini Macintosh PC: via <a href="https://www.instructables.com/Making-a-Tiny-Mac-From-a-Raspberry-Pi-Zero/" rel="noopener nofollow" target="_blank">Instructables</a></li> <li>Mini Desktop PC with the Pi 4: via <a href="https://www.instructables.com/DIY-Raspberry-Pi-Desktop-Case-With-Stats-Display/" rel="noopener nofollow" target="_blank">Instructables</a> by @thediylife</li> <li>Internet Radio Player - Stream content from Pandora's Radio: via <a href="https://www.instructables.com/Pandoras-Box-An-Internet-Radio-player-made-with/" rel="noopener nofollow" target="_blank">Instructables</a> by @Ayy</li> <li>Raspberry Pi Zero Cherry MX Split Mechanical Keyboard: via <a href="https://www.instructables.com/Cherry-Pi-Split-Mechanical-Keyboard/" rel="noopener nofollow" target="_blank">Instructables</a> by Gosse Adema</li> <li>Step-by-step Pi NAS with OpenMediaVault: via <a href="https://www.instructables.com/PiNAS-the-Raspberry-Pi-NAS/" rel="noopener nofollow" target="_blank">Instructables</a> by @araymbox</li> <li>Distraction-Free Writing Machine: via <a href="https://www.instructables.com/FeatherQuill-34-Hours-of-Distraction-Free-Writing/" rel="noopener nofollow" target="_blank">Instructables</a> by @CameronCoward</li> </ul> <style> img.banner { width: 100%; max-width: 600px; margin: 0 auto; } </style> </p> My Top 50 Windows Apps ๐Ÿ–ฅ Alicia's Notes ๐Ÿš€ Fri, 01 Jan 2021 21:00:00 +0000 https://notes.aliciasykes.com/21879/my-top-50-windows-apps https://notes.aliciasykes.com/21879/my-top-50-windows-apps <p><p><img src="https://i.ibb.co/yqQcGGm/windows-open-source-apps-banner.png" alt="Open Source Apps on Microsoft Windows"></p> <p>This is my personal reference list of useful software for Microsoft Windows.<br> Typically I only install what I need, and uninstall software that hasn't been used for a while. Where possible I prefer to run containerized or portable apps. There's nothing installed on my system that isn't on this list.</p> <p>Before setting anything up, the first task is to disable telemetry, remove pre-installed bloatware and make a few security tweaks. For this I use a series of PowerShell scripts provided by <a href="https://privacy.sexy/" rel="noopener nofollow" target="_blank">Privacy.Sexy</a>.</p> <p><small>Items marked with 'โŒ' are not fully open source, and '๐Ÿ’ฒ' indicates either not free, or has premium tier</small></p> <h3>Networking</h3> <ul> <li><strong><a href="https://www.torproject.org/" rel="noopener nofollow" target="_blank">Tor Browser</a></strong> - For more anonymous browsing + access to the Tor network <a href="https://gitlab.torproject.org/tpo"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><strong><a href="https://www.virtualbox.org/" rel="noopener nofollow" target="_blank">VirtualBox</a></strong> - x86, AMD64, and Intel64 virtual machines <a href="https://www.virtualbox.org/wiki/Source_code_organization"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><strong><a href="https://winscp.net/" rel="noopener nofollow" target="_blank">WinSCP</a></strong> - SFTP client and remote access file manager <a href="https://github.com/winscp/winscp"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.qbittorrent.org/" rel="noopener nofollow" target="_blank">qBittorrent</a></strong> - BitTorrent client <a href="https://github.com/qbittorrent/qBittorrent"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.wireshark.org/" rel="noopener nofollow" target="_blank">WireShark</a></strong> - Packet analyzer <a href="https://github.com/wireshark/wireshark"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://angryip.org/" rel="noopener nofollow" target="_blank">Angry IP Scanner</a></strong> - Quickly find IPs within a range, open ports and other info <a href="https://github.com/angryip/ipscan"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.netlimiter.com/" rel="noopener nofollow" target="_blank">NetLimiter</a></strong> - โŒ๐Ÿ’ฒ Network traffic monitoring tool with simple firewall functionality</li> <li><strong><a href="https://github.com/jopohl/urh" rel="noopener nofollow" target="_blank">Universal Radio Hacker</a></strong> - SDR client for investigating wireless protocols <a href="https://github.com/jopohl/urh"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>General Apps</h3> <ul> <li><strong><a href="https://www.hwinfo.com/" rel="noopener nofollow" target="_blank">HWiNFO64</a></strong> - โŒ System info and diagnostics</li> <li><strong><a href="https://processhacker.sourceforge.io/" rel="noopener nofollow" target="_blank">Process Hacker</a></strong> - Monitor system resources and analyse currently running processes <a href="https://github.com/processhacker/processhacker"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.balena.io/etcher/" rel="noopener nofollow" target="_blank">Etcher</a></strong> - For flashing ISOs onto USB drives with a overly-fancy UI <a href="https://github.com/balena-io/etcher"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://github.com/szTheory/exifcleaner" rel="noopener nofollow" target="_blank">ExifCleaner</a></strong> - Tool to easily remove metadata from images and media <a href="https://github.com/szTheory/exifcleaner"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://x410.dev/" rel="noopener nofollow" target="_blank">X410</a></strong> - โŒ๐Ÿ’ฒ Fork of <a href="https://x.org/" rel="noopener nofollow" target="_blank">X.org</a> to run Linux GUI apps in Xfce via WSL</li> <li><strong><a href="https://new.linphone.org/technical-corner/linphone" rel="noopener nofollow" target="_blank">LinPhone</a></strong> - VOIP client for making/ receiving phone calls and SMS messages <a href="https://gitlab.linphone.org/BC/public/linphone-desktop"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> </ul> <h3>Security Utilities</h3> <ul> <li><strong><a href="https://cryptomator.org/" rel="noopener nofollow" target="_blank">Cryptomator</a></strong> - Fast file encryption for cloud storage <a href="https://github.com/cryptomator/cryptomator"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.veracrypt.fr/" rel="noopener nofollow" target="_blank">VeraCrypt</a></strong> - Strong disk, container and file encryption <a href="https://github.com/veracrypt/VeraCrypt"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://keepassxc.org/" rel="noopener nofollow" target="_blank">KeePassXC</a></strong> - Password manager for KeePass files <a href="https://github.com/keepassxreboot/keepassxc"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://apps.kde.org/en/kleopatra" rel="noopener nofollow" target="_blank">Kleopatra</a></strong> - Certificate manager and PGP file encryption suit <a href="https://github.com/KDE/kleopatra"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.wireguard.com/" rel="noopener nofollow" target="_blank">WireGuard</a></strong> - VPN connection client using WireGuard protocol <a href="https://github.com/WireGuard"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.clamav.net/" rel="noopener nofollow" target="_blank">CalmAV</a></strong> - Anti-virus scanner (See also, <a href="http://www.clamwin.com/" rel="noopener nofollow" target="_blank">ClamWin</a> GUI app) <a href="https://www.clamav.net/downloads#sourcecode"><img src="https://i.ibb.co/Xjqpn77/Website-icon.png" alt="Website"></a></li> <li><strong><a href="https://www.bleachbit.org/" rel="noopener nofollow" target="_blank">BleachBit</a></strong> - Frees up disk space by deleting unneeded data in the cache and temporary files <a href="https://github.com/bleachbit/bleachbit"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://crazymax.dev/WindowsSpyBlocker/" rel="noopener nofollow" target="_blank">Windows Spy Blocker</a></strong> - Block Microsoft telemetry and data collection and manage application access <a href="https://github.com/crazy-max/WindowsSpyBlocker"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://github.com/securitywithoutborders/hardentools" rel="noopener nofollow" target="_blank">Harden Tools</a></strong> - Easily turn off undesired or privacy-invasive Windows features <a href="https://github.com/securitywithoutborders/hardentools"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://github.com/wokhansoft/WFN" rel="noopener nofollow" target="_blank">WFN</a></strong> - Firewall notifier to monitor outgoing connections <a href="https://github.com/wokhansoft/WFN"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>UI Utilities</h3> <ul> <li><strong><a href="https://hluk.github.io/CopyQ/" rel="noopener nofollow" target="_blank">CopyQ</a></strong> - Advanced clipboard manager <a href="https://github.com/hluk/CopyQ"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://github.com/federico-terzi/espanso" rel="noopener nofollow" target="_blank">Espanso</a></strong> - Text expander with powerful matching system (similar to AHK) <a href="https://github.com/federico-terzi/espanso"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.autohotkey.com/" rel="noopener nofollow" target="_blank">AutoHotKey</a></strong> - Keyboard remapping, macros and automation scripting <a href="https://github.com/Lexikos/AutoHotkey_L"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://pooi.moe/QuickLook/" rel="noopener nofollow" target="_blank">Quick Look</a></strong> - Small utility that lets you quickly preview a file by pressing <code class="prettyprint">Space</code> <a href="https://github.com/QL-Win/QuickLook"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://eartrumpet.app/" rel="noopener nofollow" target="_blank">EarTrumpet</a></strong> - A utility that provides better volume control on a per app basis <a href="https://github.com/File-New-Project/EarTrumpet"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://colorpicker.fr/" rel="noopener nofollow" target="_blank">ColorPicker</a></strong> - Minimal but complete color picker <a href="https://github.com/Toinane/colorpicker"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://docs.microsoft.com/en-us/windows/powertoys/" rel="noopener nofollow" target="_blank">Power Toys</a></strong> - Color picker, fancy zones, run dialog, rename utility, shortcuts and more <a href="https://github.com/microsoft/PowerToys"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://github.com/ArcadeRenegade/SidebarDiagnostics" rel="noopener nofollow" target="_blank">SidebarDiagnostics</a></strong> - Customizable desktop widget showing system resource and hardware info <a href="https://github.com/ArcadeRenegade/SidebarDiagnostics"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="http://www.wox.one/" rel="noopener nofollow" target="_blank">Wox</a></strong> - Global search, run commands and execute actions with <code class="prettyprint">Alt</code> + <code class="prettyprint">Space</code> <a href="https://github.com/Wox-launcher/Wox"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.stardock.com/products/groupy/" rel="noopener nofollow" target="_blank">Groupy</a></strong> โŒ- Group multiple windows into browser-like tabs, while preserving Alt + Tab switching</li> </ul> <h3>Creativity</h3> <ul> <li><strong><a href="https://www.gimp.org/" rel="noopener nofollow" target="_blank">Gimp</a></strong> - Image and photo editing application <a href="https://gitlab.gnome.org/GNOME/gimp"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><strong><a href="https://www.darktable.org/" rel="noopener nofollow" target="_blank">DarkTable</a></strong> - Organize and bulk edit photos (similar to Lightroom) <a href="https://github.com/darktable-org/darktable"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://inkscape.org/" rel="noopener nofollow" target="_blank">InkScape</a></strong> - Digital drawing/ illustration <a href="https://gitlab.com/inkscape/inkscape"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><strong><a href="https://www.audacityteam.org/" rel="noopener nofollow" target="_blank">Audacity</a></strong> - Multi-track audio editor and recording <a href="https://github.com/audacity/audacity"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://obsproject.com/" rel="noopener nofollow" target="_blank">OBS Studio</a></strong> - High performance streaming/ broadcasting and recording <a href="https://github.com/obsproject/obs-studio"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.videolan.org/vlc/" rel="noopener nofollow" target="_blank">VLC Player</a></strong> - Multimedia player and play back framework <a href="https://github.com/videolan/vlc"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://shotcut.org/" rel="noopener nofollow" target="_blank">Shotcut</a></strong> - Video editing platform <a href="https://github.com/mltframework/shotcut"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://handbrake.fr/" rel="noopener nofollow" target="_blank">HandBrake</a></strong> - For converting video from any format to a selection of modern codecs <a href="https://github.com/HandBrake/HandBrake"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.synfig.org/" rel="noopener nofollow" target="_blank">Synfig Studio</a></strong> - 2D animation <a href="https://github.com/synfig/synfig"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.blender.org/" rel="noopener nofollow" target="_blank">Blender</a></strong> - 3D modelling, rendering and sculpting <a href="https://github.com/blender/blender"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://ultimaker.com/software/ultimaker-cura" rel="noopener nofollow" target="_blank">Cura</a></strong> - 3D Printing software, for slicing models <a href="https://github.com/Ultimaker/Cura"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://wiki.gnome.org/Apps/Dia" rel="noopener nofollow" target="_blank">Dia</a></strong> - Versatile diagramming tool, useful for UML (similar to MS Visio) <a href="https://gitlab.gnome.org/GNOME/dia"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><strong><a href="https://getsharex.com/" rel="noopener nofollow" target="_blank">ShareX</a></strong> - Quick and easy screen recorder <a href="https://github.com/ShareX/ShareX"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.smugmug.com/" rel="noopener nofollow" target="_blank">SmugMug</a></strong> โŒ๐Ÿ’ฒ- Premium photography backup, sync, sharing and publishing service <a href="https://github.com/smugmug"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>Media</h3> <ul> <li><strong><a href="https://freetubeapp.io/" rel="noopener nofollow" target="_blank">FreeTube</a></strong> - YouTube client <a href="https://github.com/FreeTubeApp/FreeTube"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://nuclear.js.org/" rel="noopener nofollow" target="_blank">Nuclear</a></strong> - Free music streaming &amp; downloads <a href="https://github.com/nukeop/nuclear"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.spotify.com/" rel="noopener nofollow" target="_blank">Spotify</a></strong> โŒ- Premium music subscription</li> <li><strong><a href="https://amarok.kde.org/" rel="noopener nofollow" target="_blank">Amarok</a></strong> - Powerful local music player <a href="https://github.com/KDE/amarok"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><strong><a href="https://www.pocketcasts.com/" rel="noopener nofollow" target="_blank">Pocket Casts</a></strong> โŒ- Podcast player</li> <li><strong><a href="https://www.plex.tv/" rel="noopener nofollow" target="_blank">Plex Client</a></strong> - Client for accessing self-hosted media server</li> <li><strong><a href="https://steampowered.com/" rel="noopener nofollow" target="_blank">Steam</a></strong> โŒ- PC game store</li> </ul> <h3>Productivity</h3> <ul> <li><strong><a href="https://standardnotes.org/" rel="noopener nofollow" target="_blank">Standard Notes</a></strong> - Encrypted, synced notes application</li> <li><strong><a href="https://www.thunderbird.net/en-US/" rel="noopener nofollow" target="_blank">Thunderbird</a></strong> - Email, calendar and contacts client</li> <li><strong><a href="https://protonmail.com/bridge/" rel="noopener nofollow" target="_blank">ProtonMail Bridge</a></strong> - Allows for ProtonMail to be used with client</li> <li><strong><a href="https://tresorit.com/" rel="noopener nofollow" target="_blank">Tresorit</a></strong> โŒ- Cloud storage sync and backup</li> <li><strong><a href="https://1password.com/" rel="noopener nofollow" target="_blank">1Password</a></strong> โŒ- Cloud-synced, multi-device password manager and auto-fill</li> <li><strong><a href="https://www.mozilla.org/en-GB/firefox/" rel="noopener nofollow" target="_blank">Firefox</a></strong> - Web browser with containers</li> <li><strong><a href="https://brave.com/" rel="noopener nofollow" target="_blank">Brave Browser</a></strong> - Chromium-based web browser</li> <li><strong><a href="https://www.binance.com/en/support/articles/115002585651" rel="noopener nofollow" target="_blank">Binance</a></strong> โŒ- Full-screen crypto trading</li> <li><strong><a href="https://www.libreoffice.org/" rel="noopener nofollow" target="_blank">LibreOffice</a></strong> - Basic Office suit</li> </ul> <h3>Development</h3> <ul> <li><strong><a href="https://code.visualstudio.com/" rel="noopener nofollow" target="_blank">VS Code</a></strong> - Customizable code editor, with InteliSense, built-in compilers, git and plugins</li> <li><strong><a href="https://cmder.net/" rel="noopener nofollow" target="_blank">Cmder</a></strong> - Better console emulator for Windows, with Tmux-like features, great for SSH sessions</li> <li><strong><a href="https://www.postman.com/" rel="noopener nofollow" target="_blank">PostMan</a></strong> - For testing and developing API endpoints</li> <li><strong><a href="https://developer.android.com/studio/" rel="noopener nofollow" target="_blank">Android Studio</a></strong> - For native Android development with Java/ Kotlin</li> <li><strong><a href="https://www.arduino.cc/en/Main.Software" rel="noopener nofollow" target="_blank">Arduino IDE</a></strong> - Compile and upload for IoT devices</li> <li><strong><a href="https://processing.org/" rel="noopener nofollow" target="_blank">Processing</a></strong> - IDE and compiler for creative coding with the Processing language</li> <li><strong><a href="https://sqlitebrowser.org/" rel="noopener nofollow" target="_blank">DB Browser for SQLite</a></strong> - Create, design, and edit database files for SQLite</li> <li><strong><a href="https://github.com/lukehaas/RunJS" rel="noopener nofollow" target="_blank">RunJS</a></strong> - Real-time JavaScript playground, useful for writing quick scripts</li> <li><strong><a href="https://www.docker.com/products/docker-desktop" rel="noopener nofollow" target="_blank">Docker Desktop</a></strong> - Easy way to containerize applications</li> <li><strong><a href="https://notepad-plus-plus.org/" rel="noopener nofollow" target="_blank">Notepad++</a></strong> - Lightweight text editor with syntax highlighting</li> <li><strong><a href="https://www.zaproxy.org/" rel="noopener nofollow" target="_blank">Zap</a></strong> - Web app security analyzer</li> <li><strong><a href="https://subgraph.com/vega/index.en.html" rel="noopener nofollow" target="_blank">Vega</a></strong> - Automated security testing to find XXS, SQL injection and other issues</li> <li><strong><a href="https://git-scm.com/" rel="noopener nofollow" target="_blank">Git</a></strong> - Version control system</li> </ul> <h3>Device-Specific</h3> <ul> <li><strong><a href="https://www.yubico.com/products/services-software/download/yubikey-manager/" rel="noopener nofollow" target="_blank">YubiKey Manager</a></strong> - Configuring YubeKey devices</li> <li><strong><a href="https://onlykey.io/" rel="noopener nofollow" target="_blank">OnlyKey</a></strong> - For configuring the OnlyKey with PGP, SSH, Passwords, 2FA, Crypto and secure data</li> <li><strong><a href="https://www.elgato.com/en/gaming/stream-deck" rel="noopener nofollow" target="_blank">StreamDeck</a></strong> - Setting up macros on the StreamDeck</li> <li><strong><a href="https://www.razer.com/" rel="noopener nofollow" target="_blank">Razer Synapse</a></strong> โŒ- Customize the RGB for Razer products</li> <li><strong><a href="https://us.creative.com/p/sound-blaster/sound-blaster-audigy-fx" rel="noopener nofollow" target="_blank">SoundBlaster Audigy FX</a></strong> โŒ- Drivers and audio level customization for sound card</li> <li><strong><a href="https://www.amd.com/en/support" rel="noopener nofollow" target="_blank">AMD Radeon Settings</a></strong> โŒ- Drivers for customizing graphics card for different tasks</li> <li><strong><a href="https://github.com/emsec/ChameleonMini" rel="noopener nofollow" target="_blank">Chameleon</a></strong> - For programming the ChameleonMini NFC / RFID contactless smartcard emulator </li> <li><strong><a href="https://www.ledger.com/ledger-live" rel="noopener nofollow" target="_blank">Ledger Live</a></strong> โŒ - App for managing assets stored on Ledger Hardware Wallet <a href="https://github.com/LedgerHQ/ledger-live-desktop"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <hr> <h2>Installation</h2> <p>On new installs, <a href="https://docs.microsoft.com/en-us/windows/package-manager/winget/" rel="noopener nofollow" target="_blank">Microsoft's Package Manager</a> can be useful for quickly installing required software.</p> <p>See also, my <a href="https://winstall.app/packs/xXFsNYmbT" rel="noopener nofollow" target="_blank">Winstall Collection</a> of the above apps.</p> <details> <summary class="expandable">Example <code>winget</code> Script</summary> <p> </p><pre><code> winget install --id=Lexikos.AutoHotkey -e winget install --id=REALiX.HWiNFO -e winget install --id=GNURadio.GNURadio -e winget install --id=Balena.Etcher -e winget install --id=WiresharkFoundation.Wireshark -e winget install --id=Mozilla.Firefox -e winget install --id=angryziber.AngryIPScanner -e winget install --id=Microsoft.PowerToys -e winget install --id=Docker.DockerDesktop -e winget install --id=Oracle.VirtualBox -e winget install --id=WinSCP.WinSCP -e winget install --id=qBittorrent.qBittorrent -e winget install --id=Cryptomator.Cryptomator -e winget install --id=Keybase.Keybase -e winget install --id=KeePassXCTeam.KeePassXC -e winget install --id=StandardNotes.StandardNotes -e winget install --id=Mozilla.Thunderbird -e winget install --id=ProtonTechnologies.ProtonMailBridge -e winget install --id=AgileBits.1Password -e winget install --id=BraveSoftware.BraveBrowser -e winget install --id=thehandbraketeam.handbrake -e winget install --id=LibreOffice.LibreOffice -e winget install --id=GIMP.GIMP -e winget install --id=Inkscape.Inkscape -e winget install --id=darktable.darktable -e winget install --id=Audacity.Audacity -e winget install --id=OBSProject.OBSStudio -e winget install --id=VideoLAN.VLC -e winget install --id=Meltytech.Shotcut -e winget install --id=BlenderFoundation.Blender -e winget install --id=Ultimaker.Cura -e winget install --id=Spotify.Spotify -e winget install --id=Valve.Steam -e winget install --id=Postman.Postman -e winget install --id=Arduino.Arduino -e winget install --id=SQLiteBrowser.SQLiteBrowser -e winget install --id=Notepad++.Notepad++ -e winget install --id=elgato.streamdeck -e </code></pre> <p></p> </details> <p><br></p> <p><strong>Note</strong>: It's very important to always carefully check the URL for each download before proceeding. Only install applications from their official source. </p> <style> ul li { font-size: 1.1rem; } img[alt=GitHub],img[alt=Git],img[alt=Website] { width: 24px; display: inline !important; margin: 0 2px !important; background: #70ffee; padding: 3px; border-radius: 16px; float: right; } a:hover img[alt=GitHub],a:hover img[alt=Git],a:hover img[alt=Website] { background: #00ccb4 !important; border: 2px โ€‹solid #9660e !important; } summary.expandable { cursor: pointer; border: 2px solid #00ccb4; width: fit-content; padding: 0.25rem 0.5rem; border-radius: 12px; } summary.expandable:hover { background: #00ccb4; color: #060913; font-weight: bold; } </style> </p> [REFERENCE] Using Variable Fonts in CSS ๐Ÿ”ค Alicia's Notes ๐Ÿš€ Thu, 10 Dec 2020 18:16:52 +0000 https://notes.aliciasykes.com/20679/reference-using-variable-fonts-in-css https://notes.aliciasykes.com/20679/reference-using-variable-fonts-in-css <p><blockquote> <p>This is just a short reference to using fonts with Variable Axes in CSS</p> </blockquote> <hr> <h3>What are Variable Fonts?</h3> <p>Variable fonts are font files that encapsulate the entire family, and allow for custom attributes (regarding things like weight, slant, grade, character-width) to be set. This brings several benefits:</p> <ul> <li>Much higher quality rendering of fonts, without browser distortions</li> <li>Greater control over customization, as you can specify each value separably</li> <li>The need only for a single font file (rather than a version for each style). Great for performance due to reduced file size and fewer requests</li> </ul> <p>Variable fonts were <a href="https://medium.com/variable-fonts/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369" rel="noopener nofollow" target="_blank">announced in 2016</a>, and now are officially supported by all <a href="https://caniuse.com/?search=font-variation-settings" rel="noopener nofollow" target="_blank">modern browsers</a> and most major operating systems, as an extension to the <a href="https://docs.microsoft.com/en-us/typography/opentype/spec/" rel="noopener nofollow" target="_blank">OpenType Specification</a>. There are now <a href="https://fonts.google.com/?vfonly=true" rel="noopener nofollow" target="_blank">many fonts</a> that support variable axes.</p> <hr> <h3>Official Variation Axes</h3> <h4>Weight (<code class="prettyprint">wght</code>)</h4> <ul> <li>Corresponding CSS attribute: to <code class="prettyprint">font-weight</code></li> <li>Example usage: <code class="prettyprint">font-variation-settings: 'wght' 625;</code></li> <li>Typical range: 100 - 900</li> </ul> <h4>Italic (<code class="prettyprint">ital</code>)</h4> <ul> <li>Corresponding CSS attribute: to <code class="prettyprint">font-style</code></li> <li>Example usage: <code class="prettyprint">font-variation-settings: 'ital' 1;</code></li> <li>Typical range: 0 - 1 (Indicating upright or italic)</li> </ul> <h4>Slant (<code class="prettyprint">slnt</code>)</h4> <ul> <li>Similar to italics, but allows you to specify an exact value (in a degree continuum) and it does not include glyph substitution</li> <li>Corresponding CSS attribute: to <code class="prettyprint">font-style</code></li> <li>Example usage: <code class="prettyprint">font-variation-settings: 'slnt' 14;</code></li> <li>Typical range: -90 โ€“ 90 degrees</li> </ul> <h4>Optical Size (<code class="prettyprint">opsz</code>)</h4> <ul> <li>This allows adding or removing detail to improve legibility on small or large screen sizes. Set to <code class="prettyprint">auto</code> by default, and usually this is adequate</li> <li>Corresponding CSS attribute: to <code class="prettyprint">font-optical-sizing</code></li> <li>Example usage: <code class="prettyprint">font-variation-settings: 'opsz' 36;</code></li> <li>Typical range: value usually matches font-size</li> </ul> <h4>Width(<code class="prettyprint">wdth</code>)</h4> <ul> <li>Corresponding CSS attribute: to <code class="prettyprint">font-stretch</code></li> <li>Example usage: <code class="prettyprint">font-variation-settings: 'wdth' 115;</code></li> <li>Typical range: 75% - 125%</li> </ul> <hr> <h3>Custom Axes</h3> <p>Many fonts also have a number of custom axes that can be modified. Typically these are represented with capitals. The below are several common custom axis, but Nick Sherman's project <a href="https://v-fonts.com/" rel="noopener nofollow" target="_blank">v-fonts.com</a> provides an interactive playground, where you can properly check out many more of these axes.</p> <h4>Grade (<code class="prettyprint">GRAD</code>)</h4> <ul> <li>Lets you modify the weight, without effecting width. Useful for responding to low-resolution screens</li> <li>Example usage: <code class="prettyprint">font-variation-settings: 'GRAD' 88;</code></li> <li>Typical range: Decimal, between -1 - 1</li> </ul> <h4>Ascenders and Descenders (<code class="prettyprint">YTAS</code> &amp; <code class="prettyprint">YTDE</code>)</h4> <ul> <li>Alters of height of the stems and tails of each character</li> <li>Example usage: <code class="prettyprint">font-variation-settings: 'YTAS' 800, 'YTDE' -350;</code></li> <li>Typical range: YTAS 650 - 850. YTDE -500 - -138</li> </ul> <hr> <h3>Combining Properties</h3> <p>To use multiple variable font properties, you must combine them into a single line, using a comma-separated list.<br> (Note: When overriding a single font-variation property, you must re-define all of the other properties.)</p> <div class="highlight"><pre class="highlight css"><code><span class="nt">font-variation-settings</span><span class="o">:</span> <span class="s2">'wght'</span> <span class="err">375</span><span class="o">,</span> <span class="s2">'GRAD'</span> <span class="err">88</span><span class="o">;</span> </code></pre></div> <hr> <h3>Supporting Older Browsers</h3> <p>In order to support older browsers, use the <code class="prettyprint">@supports</code> mixin to override text with variable font properties. For example:</p> <div class="highlight"><pre class="highlight css"><code><span class="nt">h1</span> <span class="p">{</span> <span class="nl">font-family</span><span class="p">:</span> <span class="n">some-non-variable-font-family</span><span class="p">;</span> <span class="p">}</span> <span class="k">@supports</span> <span class="p">(</span><span class="n">font-variation-settings</span><span class="p">:</span> <span class="s2">'wdth'</span> <span class="m">115</span><span class="p">)</span> <span class="p">{</span> <span class="nt">h1</span> <span class="p">{</span> <span class="nl">font-family</span><span class="p">:</span> <span class="n">some-variable-font-family</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> </code></pre></div> <hr> <h3>Quick Tips</h3> <h4>Slant &amp; Italics</h4> <p>It is possible to use both slant (<code class="prettyprint">slnt</code>) and italics (<code class="prettyprint">ital</code>) at the same time. This enabled you to separate the angle change from the glyph substitution. <br> i.e the italics font property replaces some characters with a different glyph, usually for ascetics. Turning italics off, and then using slant to italicize the text, means that no characters are replaced. The reserve is also true, enabling italics and setting the slant to 0 will replace the glyths. This makes a much bigger than expected difference.</p> <p>For example:</p> <div class="highlight"><pre class="highlight css"><code><span class="nt">font-variation-settings</span><span class="o">:</span> <span class="s2">'slnt'</span> <span class="err">10</span><span class="o">,</span> <span class="s2">'ital'</span> <span class="err">0</span><span class="o">;</span> </code></pre></div> <hr> <h3>Additional Resources</h3> <ul> <li>Interactive Guide: via <a href="https://variablefonts.io/about-variable-fonts/" rel="noopener nofollow" target="_blank">variablefonts.io</a></li> <li>A resource for finding and trying variable fonts: via <a href="https://v-fonts.com/" rel="noopener nofollow" target="_blank">V-Fonts</a></li> <li>Variable Font Documentation: via <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide" rel="noopener nofollow" target="_blank">MDN Web Docs</a></li> <li>Browser Support: via <a href="https://caniuse.com/?search=font-variation-settings" rel="noopener nofollow" target="_blank">Can I Use?</a></li> <li>Fonts that Support Variable Axes: via <a href="https://fonts.google.com/?vfonly=true" rel="noopener nofollow" target="_blank">Google Fonts</a></li> <li>Microsoft Edge Demo: via <a href="https://googlefonts.github.io/microsoft-edge-variable-fonts-demo/" rel="noopener nofollow" target="_blank">Google</a></li> </ul> <p>Articles:</p> <ul> <li>The Official Announcement: via <a href="https://medium.com/variable-fonts/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369" rel="noopener nofollow" target="_blank">OpenType/ John Hudson</a></li> <li>Variable Fonts: via <a href="https://en.wikipedia.org/wiki/Variable_fonts" rel="noopener nofollow" target="_blank">Wikipedia</a></li> <li>Variable Fonts Are Here to Stay: via <a href="https://design.google/library/variable-fonts-are-here-to-stay/" rel="noopener nofollow" target="_blank">Google Design</a></li> <li>Variable Fonts Are the Next Generation: via <a href="https://www.commarts.com/columns/variable-fonts-are-the-next-generation" rel="noopener nofollow" target="_blank">Communication Arts/ Thomas Phinney</a></li> </ul> <p><img src="https://i.ibb.co/n3xQtxp/variable-font-demo.gif" class="screen-rec"></p> <style> img.screen-rec { margin: 0.5rem auto; border-radius: 7px; box-shadow: 1px 2px 4px 2px #000000cf; } </style> </p> Try. ๐Ÿ’ฏ Alicia's Notes ๐Ÿš€ Sun, 15 Nov 2020 20:00:00 +0000 https://notes.aliciasykes.com/25192/try https://notes.aliciasykes.com/25192/try <p><ol> <li>Try</li> <li>Try again</li> <li>Try harder</li> <li>Try differently</li> <li>Try again tomorrow</li> <li>Try again the next day</li> <li>Try to find another way</li> <li>Try to fix what's not working</li> <li>Try to find someone who has done it</li> <li>Just keep trying, until you succeed </li> </ol> </p> Pi Zero Tor-Routed Access Point ๐Ÿ“ถ Alicia's Notes ๐Ÿš€ Sat, 17 Oct 2020 15:28:19 +0000 https://notes.aliciasykes.com/19109/pi-zero-tor-routed-access-point https://notes.aliciasykes.com/19109/pi-zero-tor-routed-access-point <p><blockquote> <p>Quick guide on creating an always-on Tor-routed secondary wireless access point on a Pi Zero</p> </blockquote> <h2>Set up the Pi</h2> <ol> <li>Download and Extract <a href="https://www.raspberrypi.org/downloads/raspberry-pi-os/" rel="noopener nofollow" target="_blank">Raspberry Pi OS Lite</a></li> <li>Flash the ISO onto a MicroSD Card, with <a href="https://www.etcher.net/" rel="noopener nofollow" target="_blank">Etcher</a> or similar software</li> <li>Place a file called <code class="prettyprint">ssh</code> into the boot dir (to allow for SSH access)</li> <li>Insert SD card into Pi, plug in the Ethernet and power it up</li> <li>Determine the IP of the new Pi with <a href="https://nmap.org/" rel="noopener nofollow" target="_blank">nmap</a>, or in your router settings</li> <li>SSH into ssh <code class="prettyprint">pi@&lt;ip&gt;</code>, the password is <code class="prettyprint">raspberry</code></li> <li>Change the password with: <code class="prettyprint">sudo passwd</code></li> </ol> <hr> <h2>Set up the Access Point</h2> <ol> <li><p>Update packages, and get dependencies:<br> <code class="prettyprint">sudo apt-get update</code><br> <code class="prettyprint">sudo apt-get install iptables-persistent git</code></p></li> <li><p>Get Pi Hostpot setup script:<br> <code class="prettyprint">git clone https://github.com/unixabg/RPI-Wireless-Hotspot.git</code></p></li> <li><p>Begin the Install Process<br> <code class="prettyprint">cd RPI-Wireless-Hotspot</code><br> <code class="prettyprint">sudo ./install</code><br> <em>The script will walk you through setting up a WiFi network, choosing a name, authentication type and password</em></p></li> </ol> <hr> <h2>Configure Tor</h2> <ol> <li><p>Install Tor<br> <code class="prettyprint">sudo apt-get install tor</code></p></li> <li><p>Configure<br> <code class="prettyprint">sudo nano /etc/tor/torrc</code></p> <div class="highlight"><pre class="highlight shell"><code><span class="c"># Then enter the following at the bottom of the file</span> Log notice file /var/log/tor/notices.log VirtualAddrNetwork 10.192.0.0/10 AutomapHostsSuffixes .onion,.exit AutomapHostsOnResolve 1 TransPort 9040 TransListenAddress 192.168.42.1 DNSPort 53 DNSListenAddress 192.168.42.1 <span class="c"># Save and exit</span> </code></pre></div></li> <li><p>Update IP Tables<br> <code class="prettyprint">sudo iptables -F</code><br> <code class="prettyprint">sudo iptables -t nat -F</code><br> <code class="prettyprint">sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 22 -j REDIRECT --to-ports 22</code><br> <code class="prettyprint">sudo iptables -t nat -A PREROUTING -i wlan0 -p udp --dport 53 -j REDIRECT --to-ports 53</code><br> <code class="prettyprint">sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp --syn -j REDIRECT --to-ports 9040</code><br> <code class="prettyprint">sudo sh -c iptables-save &gt; /etc/iptables/rules.v4</code></p></li> </ol> <hr> <h2>Start Tor Service</h2> <ol> <li><p>Start the Tor service<br> <code class="prettyprint">sudo service tor start</code></p></li> <li><p>Check if it's running okay<br> <code class="prettyprint">sudo service tor status</code></p></li> <li><p>Start tor on boot<br> <code class="prettyprint">sudo update-rc.d tor enable</code></p></li> <li><p>Finally, reboot the device<br> <code class="prettyprint">sudo reboot</code></p></li> </ol> <p>Done!</p> <style>code { color: #57e5ec !important; }</style> </p> [HOW-TO] Mullvad VPN using WireGuard on OPNsense ๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ Alicia's Notes ๐Ÿš€ Sun, 04 Oct 2020 11:51:12 +0000 https://notes.aliciasykes.com/18842/how-to-mullvad-vpn-using-wireguard-on-opnsense https://notes.aliciasykes.com/18842/how-to-mullvad-vpn-using-wireguard-on-opnsense <p><blockquote> <p>I am new to OPNsense, and got totally stuck on this. There wasn't a lot of information online about this, so after I'd (finally) got it working, I wrote this step-by-step guide</p> </blockquote> <hr> <h3>1. Install WireGuard</h3> <p>Navigate to System --&gt; Firmware --&gt; Plug-ins, and select and install 'os-wireguard'.<br> Now you can refresh the page, and go to, go to VPN --&gt; Wireguard</p> <hr> <h3>2. Create a Local Instance</h3> <p>Under VPN --&gt; WireGuard --&gt; Local, create a new instance which looks like this:</p> <ul> <li>Name: Mullvad</li> <li>Public Key: (Automatically Generated)</li> <li>Private Key: (Automatically Generated)</li> <li>Listen Port: 51820 (must be unique)</li> <li>DNS Server: 193.138.218.74 (this is Mullvad's privacy DNS service. If you are using a different VPN, use their DNS here instead)</li> <li>Tunnel Address: Leave blank for now, we'll come back to this</li> </ul> <p>Hit save</p> <hr> <h3>3. Get Your Account Tunnel IP</h3> <p>Once your local config is saved, click edit, and a private and public key should have been automatically generated. Make note of the public key.</p> <p>SSH into your box, and run the following command, where account number is your 16-digit Mullvad key (without dashes), and public key is from your newly created local instance.</p> <p><code class="prettyprint">curl -sSL https://api.mullvad.net/wg/ -d account=[mullvad-account-number] --data-urlencode pubkey=[mullvad-public-key]</code></p> <p>This will give you an output with 2 IP addresses, like: <code class="prettyprint">00.xx.xxx.xx/xx,fc00:bbbb:bbbb:bb00::0:0x00/128$</code></p> <p>It's linked to your account, so keep it safe.</p> <hr> <h3>4. Add Tunnel Address to Local Instance</h3> <p>Go back to your Local Instance, and under Tunnel Address, add both the IPs returned from the above curl command</p> <hr> <h3>5. Choose a Mullvad Server</h3> <p>Navigate to <a href="https://mullvad.net/en/servers/" rel="noopener nofollow" target="_blank">https://mullvad.net/en/servers/</a> and select a WireGuard server that meets your requirements. Make note of it's name/ proxy address, public key and port.</p> <hr> <h3>6. Create an Endpoint</h3> <p>Under VPN --&gt; WireGuard --&gt; Endpoints, and create a new instance, with the following data:</p> <ul> <li>Name: MullvadInstance</li> <li>Enabled: true</li> <li>Public Key: (public key from your chosen Mullvad instance)</li> <li>Shared Secret: [blank]</li> <li>Allowed IPs: 0.0.0.0/0</li> <li>Endpoint Port: (multihop port from your chosen Mullvad instance)</li> <li>Keepalive: 20</li> </ul> <p>Your Endpoint should look something like this:<br> <img src="https://i.ibb.co/y8cCSdC/2-endpoint-instance.png" alt="Endpoint Instance"></p> <hr> <h3>7. Assign Endpoint to Local Instance</h3> <p>Navigate back to VPN --&gt; WireGuard --&gt; Local, and click edit for your instance. Under Peers, select the name of your newly created endpoint</p> <p>Your Local Instance should now look like this:<br> <img src="https://i.ibb.co/4gkK10h/1-local-instance.png" alt="Local Instance"></p> <hr> <h3>8. Add Outbound Rule</h3> <p>Under Firewall --&gt; NAT --&gt; Outbound, switch the Rule Generation mode to Hybrid (from automatic).</p> <p>Next, create a new manual rule, with the following details:</p> <ul> <li>Interface: WireGuard</li> <li>Source Address: LAN net</li> <li>Translation / Target: Interface address</li> </ul> <p>And all other fields can be left as default</p> <p><img src="https://i.ibb.co/mvL8yqK/3-firewall-nat-outbound-rule.png" alt="Firewall NAT Outbound Rule"></p> <hr> <h3>9. Enable VPN</h3> <p>Finally, go back to VPN --&gt; WireGuard --&gt; General - and hit Enable WireGuard VPN - Done!</p> <p>Under VPN --&gt; WireGuard --&gt; List Configuration, you should now see the connection details</p> <hr> <h3>10. Test</h3> <p>To test your connection to Mullvad, navigate to <a href="https://mullvad.net/en/check/" rel="noopener nofollow" target="_blank">https://mullvad.net/en/check/</a><br> Here you can also confirm that your IP is not blacklisted, and that there are no DNS or WebRTC leaks.</p> <p><img src="https://i.ibb.co/2Syfh52/mullvad-connected.png" alt="Mullvad Check"></p> <p>Mullvad also has a simple API, that you can call to, and confirm your connection. This is useful for automation.</p> <div class="highlight"><pre class="highlight ssh"><code><span class="err">$</span> <span class="k">curl</span> https://am.i.mullvad.net/connected </code></pre></div><div class="highlight"><pre class="highlight plaintext"><code>$ curl https://am.i.mullvad.net/json </code></pre></div> <p>Now that everything's up and working, it's worth noting that if you haven't yet configured automated backups, don't forget to export your working config, under System --&gt; Configuration --&gt; Backups :)</p> <hr> <h2>Additional Notes</h2> <p>Disabling and re-enabling WireGuard from the General tab does <strong>not</strong> refresh updated data from the Local or Endpoints tab. For that, you need to disable, re-enable and save changes in these pages accordingly. This is useful to know for if your troubleshooting and unsure why your changes are not taking effect!</p> <h4>SOCKS5 Proxy</h4> <p>Optionally, you can use SOCKS5 on client devices or browsers, for additional protection, and improved performance. It's also possible to use the SOCKS5 proxies to multihop, enabling the client to exit from a server that is different from the one you connected to. Mullvad's WireGuard proxy can be found at <strong>10.64.0.1</strong> port <strong>1080</strong>.</p> <ul> <li>For more detailed info, see the <a href="https://mullvad.net/en/help/socks5-proxy/" rel="noopener nofollow" target="_blank">SOCKS5 Proxy Guide</a> on Mullvad's Docs.</li> </ul> <h4>Port Forwarding</h4> <p>If you need to expose a service to the internet from behind Mullvad, then you need to individually assign the ports in your Mullvad account. Log into your Mullvad account, and navigate to <a href="https://mullvad.net/en/account/#/ports" rel="noopener nofollow" target="_blank">mullvad.net/account/ports</a>. From here you'll see a list of your public keys, simply press the "Add New" icon under the Ports section of your desired instance, and specify the port your internal service is running on.</p> <ul> <li>For more detailed info, see the <a href="https://mullvad.net/en/help/port-forwarding-and-mullvad/" rel="noopener nofollow" target="_blank">Port Forwarding Guide</a> on Mullvad's Docs.</li> </ul> <hr> <p>Primary sources I used:</p> <ul> <li>OPNsense Docs <a href="https://wiki.opnsense.org/manual/how-tos/wireguard-client-mullvad.html" rel="noopener nofollow" target="_blank">WireGuard MullvadVPN Road Warrior Setup</a></li> <li>OPNsense Forum <a href="https://forum.opnsense.org/index.php?topic=15105.0" rel="noopener nofollow" target="_blank">Wireguard &amp; Mullvad - I'm lost.....</a></li> <li>Jonny's Screenshot Guide, via <a href="https://imgur.com/gallery/JBf2RF6" rel="noopener nofollow" target="_blank">Imgur</a></li> <li>Thomas Krenn's guide to <a href="https://www.thomas-krenn.com/en/wiki/OPNsense_WireGuard_VPN_for_Road_Warrior_configuration" rel="noopener nofollow" target="_blank">OPNsense WireGuard Configuration</a></li> </ul> <p>Thanks to the users over at the <a href="https://forum.opnsense.org/" rel="noopener nofollow" target="_blank">OPNsense forum</a>, who were also a big help.</p> <style>.post-body img{border-radius:5px;box-shadow:0 3px 10px rgba(0, 0, 0, 0.83), 0 3px 1px rgba(0, 0, 0, 0.57);margin:0.5rem auto}</style> </p> Custom Styling for Listed Blog ๐Ÿ’… Alicia's Notes ๐Ÿš€ Thu, 01 Oct 2020 14:29:13 +0000 https://notes.aliciasykes.com/18756/custom-styling-for-listed-blog https://notes.aliciasykes.com/18756/custom-styling-for-listed-blog <p><p>Here's <a href="https://listed.to/p/cp4JphXIAv" rel="noopener nofollow" target="_blank">the stylesheet</a> that I'm using currently.</p> <p>This theme is for the new version of Listed. For older versions see <a href="https://listed.to/p/CnFbLUep7C" rel="noopener nofollow" target="_blank">this post</a></p> <hr> <h2>Colors</h2> <div class="wrapper"> <div class="color-block"> <h3>Main</h3> <section class="color-pallet"> <div class="color" style="background: #0b1021;"> <span class="color-name">Background</span> <span class="color-code">#0b1021</span> </div> <div class="color" style="background: #060913;"> <span class="color-name">Background Darken</span> <span class="color-code">#060913</span> </div> <div class="color" style="background: #141b33;"> <span class="color-name">Background Lighten</span> <span class="color-code">#141b33</span> </div> <div class="color" style="background: #00CCB4; color: #0b1021;"> <span class="color-name">Primary</span> <span class="color-code">#00CCB4</span> </div> <div class="color" style="background: #092935;"> <span class="color-name">Primary Dark</span> <span class="color-code">#092935</span> </div> <p></p></section><br> </div><p></p> <div class="color-block"> <h3>Action Colors</h3> <section class="color-pallet"> <div class="color" style="background: #04e4f4; color: #0b1021;"> <span class="color-name">Info</span> <span class="color-code">#04e4f4</span> </div> <div class="color" style="background: #20e253; color: #0b1021;"> <span class="color-name">Success</span> <span class="color-code">#20e253</span> </div> <div class="color" style="background: #f6f000; color: #0b1021;"> <span class="color-name">Warning</span> <span class="color-code">#f6f000</span> </div> <div class="color" style="background: #f80363; color: #0b1021;"> <span class="color-name">Danger</span> <span class="color-code">#f80363</span> </div> <div class="color" style="background: #272f4d;"> <span class="color-name">Neutral</span> <span class="color-code">#272f4d</span> </div> <p></p></section><br> </div><p></p> <div class="color-block"> <h3>Greyscale</h3> <section class="color-pallet"> <div class="color" style="background: #ffffff; color: #0b1021;"> <span class="color-name">Bright White</span> <span class="color-code">#ffffff</span> </div> <div class="color" style="background: #f0f0f0; color: #0b1021;"> <span class="color-name">Off-White</span> <span class="color-code">#f0f0f0</span> </div> <div class="color" style="background: #dcdcdc; color: #0b1021;"> <span class="color-name">Pale Grey</span> <span class="color-code">#dcdcdc</span> </div> <div class="color" style="background: #a9a9a9; color: #0b1021;"> <span class="color-name">Mid-Grey</span> <span class="color-code">#a9a9a9</span> </div> <div class="color" style="background: #414141;"> <span class="color-name">Dark Grey</span> <span class="color-code">#414141</span> </div> <div class="color" style="background: #202020;"> <span class="color-name">Off-Black</span> <span class="color-code">#202020</span> </div> <div class="color" style="background: #000000;"> <span class="color-name">Pitch-Black</span> <span class="color-code">#000000</span> </div> <p></p></section><br> </div><br> </div><p></p> <hr> <h2>Typefaces</h2> <ul> <li><strong>Body</strong>: <a href="https://fonts.google.com/specimen/Roboto+Mono" rel="noopener nofollow" target="_blank">Roboto Mono</a></li> <li><strong>Headings</strong>: <a href="https://fonts.google.com/specimen/Roboto+Slab" rel="noopener nofollow" target="_blank">Roboto Slab</a></li> </ul> <hr> <h2>Example Screenshots</h2> <div class="screenshot-wrapper"> <img alt="Home Page" src="https://i.ibb.co/Jn4MjxZ/standard-notes-home.png" class="callisto-screenshot"><img alt="Post Page 1" src="https://i.ibb.co/XYtH4Yh/standard-notes-post1.png" class="callisto-screenshot"><img alt="Post Page 2" src="https://i.ibb.co/n0VpxgT/standard-notes-post2.png" class="callisto-screenshot"><img alt="Post Page 3" src="https://i.ibb.co/fFyQ6bZ/standard-notes-post3.png" class="callisto-screenshot"><img alt="Settings Page" src="https://i.ibb.co/mvTFvP9/standard-notes-settings.png" class="callisto-screenshot"><img alt="Thank Page" src="https://i.ibb.co/4dBjhNv/standard-notes-thank.png" class="callisto-screenshot"> </div> <style> div.wrapper { display: flex; flex-wrap: wrap; justify-content: space-evenly; } div.color-block { margin: 0 0.5rem; } section.color-pallet { width: fit-content; border: 1px solid #ffffff47; border-radius: 2px; } section.color-pallet div.color { padding: 0.1rem 0.5rem; min-width: 275px; display: flex; flex-wrap: wrap; justify-content: space-between; font-size: 1rem; } section.color-pallet div.color span.color-name { font-weight: bold; } section.color-pallet div.color span.color-code{ font-family: monospace; } @media (min-width: 800px) and (max-width: 1250px) { section.color-pallet div.color { flex-direction: column; text-align: center; min-width: 200px; } } @media (max-width: 800px) { div.wrapper { flex-direction: column; align-items: center; } } img.callisto-screenshot { border: 1px solid #ffffffcc !important; box-shadow: 2px 4px 3px 2px #00000070; margin: 0.25rem 0.5rem !important; display: inline-block !important; border-radius: 2px !important; height: 330px !important; width: 47% !important; } div.screenshot-wrapper { text-align: center; background: #092935; border-radius: 4px; padding: 1rem 0; } @media (max-width: 900px) { div.screenshot-wrapper { background: none; } img.callisto-screenshot { width: 400px !important; height: auto !important; } } </style> </p> Epic Internet Stuff! โœจ Alicia's Notes ๐Ÿš€ Wed, 30 Sep 2020 11:37:36 +0000 https://notes.aliciasykes.com/18724/epic-internet-stuff https://notes.aliciasykes.com/18724/epic-internet-stuff <p><p>Bored? Here's a collection of stuff I stumbled upon on the internet, and thought was pretty epic ๐ŸŒˆ</p> <p>Full credit to the legends behind each of these sites ๐Ÿฆธโ€โ™‚๏ธ</p> <p>Enjoy! ๐Ÿคฉ<br> <br></p> <ul> <li><a href="https://stars.chromeexperiments.com/" rel="noopener nofollow" target="_blank">100,000 Stars</a> - A WebGL 3D Visualization of out Solar System, Galaxy and Universe</li> <li><a href="https://1001albumsgenerator.com" rel="noopener nofollow" target="_blank">1001 Albums Generator</a> - Gives you a new album to listen to everyday</li> <li><a href="https://www.acapella-extractor.com/" rel="noopener nofollow" target="_blank">Acapella Extractor</a> - Isolates voice from any track/ removes music and background</li> <li><a href="https://asknature.org/" rel="noopener nofollow" target="_blank">Ask Nature</a> - Search for a query, to find how nature has adapted to solve problems</li> <li><a href="https://agoodmovietowatch.com/" rel="noopener nofollow" target="_blank">A Good Movie to Watch</a> - Find top-rated TV and Movies, for your chosen streaming services and country</li> <li><a href="https://apod.nasa.gov/" rel="noopener nofollow" target="_blank">APOD</a> - NASA's astronomy picture of the day - High quality, beautiful space images updated daily</li> <li><a href="https://www.abbreviations.com/" rel="noopener nofollow" target="_blank">Abbreviations.com</a> - The World's largest collection of abbreviations and acronyms</li> <li><a href="https://sketch.metademolab.com/canvas" rel="noopener nofollow" target="_blank">Animated Drawings</a> - Upload a sketch or drawing, and have it be animated with AI</li> <li><a href="https://www.ancient.eu/" rel="noopener nofollow" target="_blank">Ancient History Encyclopedia</a> - Professionally curated online encyclopedia for research, teaching and travel</li> <li><a href="http://www.ritsumei.ac.jp/%7Eakitaoka/index-e.html" rel="noopener nofollow" target="_blank">Akiyoshi's Illusion's</a> - Static visual illusions that appear to be moving</li> <li><a href="https://amazondating.co/" rel="noopener nofollow" target="_blank">Amazon Dating</a> - Order a date with free next day delivery and buyer protection (satire)</li> <li><a href="https://www.atlasobscura.com/" rel="noopener nofollow" target="_blank">AtlasObscura</a> - Hidden things to see and do around the world</li> <li><a href="https://www.autodraw.com/" rel="noopener nofollow" target="_blank">AutoDraw</a> - Drawing, but AI guesses what you drew and can auto-complete it</li> <li><a href="http://bbcsfx.acropolis.org.uk/" rel="noopener nofollow" target="_blank">BBC Sound Effects</a> - A database of all 16,000+ sound effects as .wav, created &amp; used by the UK's BBC</li> <li><a href="https://mixedname.com/" rel="noopener nofollow" target="_blank">Bilingual baby name finder</a> - Useful to find names that can be pronounced</li> <li><a href="https://outrider.org/nuclear-weapons/interactive/bomb-blast/?airburst=false&amp;bomb=2&amp;lat=51.50722&amp;location=London%2C%20Greater%20London%2C%20England%2C%20United%20Kingdom&amp;long=-0.1275" rel="noopener nofollow" target="_blank">Bomb Blast</a> - Search a location, and nuclear weapon, to see the damage area</li> <li><a href="https://betterexplained.com/" rel="noopener nofollow" target="_blank">Better Explained</a> - Clear, easy to understand and engaging math tutorials (by Kalid Azad)</li> <li><a href="https://bops.fm/" rel="noopener nofollow" target="_blank">Bops.fm</a> - Click a year, and here a song from that time</li> <li><a href="https://bongo.cat/" rel="noopener nofollow" target="_blank">Bongo Cat</a> - Hit the bongos like Bongo Cat!</li> <li><a href="https://www.boredpanda.com/" rel="noopener nofollow" target="_blank">Bored Panda</a> - Slightly click-batey articles from around the web, great for destroying boredom</li> <li><a href="http://britneyspears.ac/lasers.htm" rel="noopener nofollow" target="_blank">Britney Spears' Guide to Semiconductor Physics</a> - A humorous play on the teaching of physics (by Carl Hepburn)</li> <li><a href="https://www.calligrapher.ai/" rel="noopener nofollow" target="_blank">Calligrapher.ai</a> - Convert text to real-looking hand writing, with AI</li> <li><a href="https://www.cameronsworld.net/" rel="noopener nofollow" target="_blank">Camerons World</a> - View real Geo Cities sites, from the archive</li> <li><a href="https://www.capitoltrades.com/" rel="noopener nofollow" target="_blank">CapitolTrades</a> - View which stocks US politicians are buying</li> <li><a href="https://channelcrawler.com/" rel="noopener nofollow" target="_blank">Channel Crawler</a> - Discover new YouTube channels by keywords and filters (by Geoffrey Reemer)</li> <li><a href="https://cinetrii.com/" rel="noopener nofollow" target="_blank">Cinetrii</a> - Analyses reviews to infer possible inspirations behind a film</li> <li><a href="http://cityextremes.com/" rel="noopener nofollow" target="_blank">City Extremes</a> - Lookup any city, and find the closest and furthest geographic cities</li> <li><a href="https://citizen-dj.labs.loc.gov/" rel="noopener nofollow" target="_blank">Citizen DJ</a> - Make music using the free-to-use audio and video materials from the Library of Congress</li> <li><a href="https://clash.me/" rel="noopener nofollow" target="_blank">Clash</a> - Type in any sentence and have it sung back to you using a variety of artists</li> <li><a href="https://classicreload.com/Windows-1-01.html" rel="noopener nofollow" target="_blank">Classic Reload</a> - A series of retro emulators in the browser</li> <li><a href="https://www.classcentral.com/" rel="noopener nofollow" target="_blank">Class Central</a> - Huge collection of free courses and certifications from top Universities and companies</li> <li><a href="https://www.connectedpapers.com/" rel="noopener nofollow" target="_blank">Connected Papers</a> - Visually shows connections between academic journals</li> <li><a href="https://conversao.net/eng/" rel="noopener nofollow" target="_blank">Conversao</a> - Instantly convert a unit to all others</li> <li><a href="https://www.quiverquant.com/sources/corporateflights" rel="noopener nofollow" target="_blank">Corporate Private Jet Tracker</a> - See live locations of the rich and famous's private jets in the US</li> <li><a href="https://www.cryptovoxels.com/" rel="noopener nofollow" target="_blank">Cryptovoxels</a> - A virtual world</li> <li><a href="http://cursordanceparty.com/" rel="noopener nofollow" target="_blank">Cursor Dance Party</a> - Real-time cursor dance party</li> <li><a href="https://datenightmovies.com/" rel="noopener nofollow" target="_blank">DateNightMovies</a> - Input a movie each of you like, to find a movie you'll likely both like</li> <li><a href="https://denigma.app/" rel="noopener nofollow" target="_blank">Denigma</a> - Paste in a block of code, and Denigma will use AI to explain what it does in plain English</li> <li><a href="https://deskspacing.com" rel="noopener nofollow" target="_blank">Desk Spacing</a> - Create your own virtual desk setup (or r/BattleStation!)</li> <li><a href="https://www.desolhar-philo.com/" rel="noopener nofollow" target="_blank">Desolhar Philosophy</a> - Simplifying hundreds of Philosophy books into easy-to-follow formulas (by Patrick Milani)</li> <li><a href="https://www.deepl.com/translator" rel="noopener nofollow" target="_blank">Deepl</a> - A surprisingly good, AI-powered online translator- much smarter than Google Translate!</li> <li><a href="https://www.dimensions.com/" rel="noopener nofollow" target="_blank">Dimensions.com</a> - Huge reference database containing the exact dimensions of products and objects</li> <li><a href="https://www.drmemes.com/" rel="noopener nofollow" target="_blank">Dr Meme</a> - Meme generator (without watermarks, ads or sign up)</li> <li><a href="https://hey.science/dumpster-fire/" rel="noopener nofollow" target="_blank">Dumpster Fire</a> - Watch your message being burnt in real flames!!</li> <li><a href="http://www.dontevenreply.com/" rel="noopener nofollow" target="_blank">Don't Even Reply</a> - Some hilariously funny email chains</li> <li><a href="https://www.doesthedogdie.com/" rel="noopener nofollow" target="_blank">Does the dog die?</a> - Crowdsourced content warnings for movies, tv, books and more</li> <li><a href="https://bouncingdvdlogo.com/" rel="noopener nofollow" target="_blank">DVD Screensaver</a> - Brings back memories, that classic bouncing DVD screen</li> <li><a href="https://epic.gsfc.nasa.gov/" rel="noopener nofollow" target="_blank">Earth Polychromatic Imaging Camera</a> - Hourly photos of the Earth from NASA</li> <li><a href="https://aatishb.com/entropy/" rel="noopener nofollow" target="_blank">Entropy by Aatish Bhatia</a> - Interactive article, explaining entropy with sheep</li> <li><a href="https://emupedia.net/beta/emuos/" rel="noopener nofollow" target="_blank">EmuOS</a> - A very nostalgic web-based emulation of Windows 98 (by Emupedia)</li> <li><a href="https://eyes.nasa.gov/apps/orrery/" rel="noopener nofollow" target="_blank">Eyes.Nasa.gov</a> - Interactive 3D solar system, showing info about NASA missions</li> <li><a href="https://fsymbols.com/emoticons/" rel="noopener nofollow" target="_blank">FSymbols Emoticons</a> - Copy/ Paste text-based emojis</li> <li><a href="https://www.fbi.gov/history/famous-cases" rel="noopener nofollow" target="_blank">FBI Infamous Cases &amp; Criminals</a> - A collection of the most infamous criminals &amp; cases investigated</li> <li><a href="https://krikienoid.github.io/flagwaver/" rel="noopener nofollow" target="_blank">Flag Waver</a> - Generates a waving flag for any image (some very clever coding, by @krikienoid)</li> <li><a href="https://findaspring.com/" rel="noopener nofollow" target="_blank">Find a Spring</a> - A tool to locate a fresh water spring near you, or anywhere in the World, plus info about it</li> <li><a href="https://flipanim.com/" rel="noopener nofollow" target="_blank">Flipanim</a> - Create flipbook animations</li> <li><a href="https://2.flexiple.com/scale/all-illustrations" rel="noopener nofollow" target="_blank">Scale Illustrations</a> - Royalty-free, high-quality vectors (by @KarthikS2206 + Flexiple)</li> <li><a href="https://fakeupdate.net/win8" rel="noopener nofollow" target="_blank">Fake Windows Update</a> - This is a great prank to play on your colleges when they don't lock their laptop!</li> <li><a href="https://paveldogreat.github.io/WebGL-Fluid-Simulation/" rel="noopener nofollow" target="_blank">Fluid Simulation</a> - Impressive, and kinda relaxing, WebGL dynamic simulation of fluid</li> <li><a href="https://www.fontgeneratoronline.com/" rel="noopener nofollow" target="_blank">Font Generator</a> - Convert a string into various plain text ASCII fonts (Great for Social Media + Messaging)</li> <li><a href="https://forekast.com/" rel="noopener nofollow" target="_blank">Forekast</a> - Upcoming dates of notable internet events</li> <li><a href="https://forgotify.com/" rel="noopener nofollow" target="_blank">Forgotify</a> - Listen to a song that's never been heard before on Spotify (produces some questionable tracks)</li> <li><a href="https://forvo.com/" rel="noopener nofollow" target="_blank">Forvo</a> - Pronunciation Dictionary</li> <li><a href="https://freelearninglist.org/" rel="noopener nofollow" target="_blank">Free Learning List</a> - A collection of awesome educational resources from around the internet</li> <li><a href="https://grep.app/" rel="noopener nofollow" target="_blank">Grep.app</a> - Allows you to search the contents of files within GitHub repos, with a RegEx option too</li> <li><a href="https://gethuman.com/" rel="noopener nofollow" target="_blank">Get Human</a> - Bypass automated phone menus and long hold times, and get put through to a human</li> <li><a href="https://www.goodtricks.net/" rel="noopener nofollow" target="_blank">Good Tricks</a> - Tons of magic tricks</li> <li><a href="https://akash.dev/clock/" rel="noopener nofollow" target="_blank">Gradient Clock</a> - Beautiful real-time clock of the big screen</li> <li><a href="https://hackertyper.net/" rel="noopener nofollow" target="_blank">Hacker Typer</a> - A classic.. pretend to be a hacker</li> <li><a href="https://helpmap.io/" rel="noopener nofollow" target="_blank">HelpMap</a> - A website that lets you find local charities to support</li> <li><a href="http://www.hemingwayapp.com/" rel="noopener nofollow" target="_blank">Hemingway</a> - Analyses a writing, and suggests edits to make it easier to read</li> <li><a href="https://howlongtoread.com/" rel="noopener nofollow" target="_blank">How long to Read</a> - Tells you how long it will take to read a certain book</li> <li><a href="https://hostrider.com/" rel="noopener nofollow" target="_blank">HostRider</a> - Lo-fi music for coding, with a coding-kitty as a companion</li> <li><a href="https://www.hotspot3d.com/" rel="noopener nofollow" target="_blank">HotSpot 3D</a> - Compare any 2 smart phones, in a size-accurate 3D environment, to easily visualize dimensions</li> <li><a href="https://www.fieggen.com/shoelace/" rel="noopener nofollow" target="_blank">Ian's Shoelace Site</a> - An internet classic, everything you've ever wanted to know about laces</li> <li><a href="https://engaging-data.com/iceberger-remixed" rel="noopener nofollow" target="_blank">Icebergr Remixed</a> - Draw an iceberg to visualize how it will float</li> <li><a href="https://ikeamuseum.com/sv/ikea-kataloger/" rel="noopener nofollow" target="_blank">Ikea Museum</a> - Every Ikea catalog since 1950</li> <li><a href="https://imagecolorizer.com/colorize.html" rel="noopener nofollow" target="_blank">Image Colorize</a> - Free tool that uses AI to add color to black and white photos</li> <li><a href="https://daumann.github.io/imdb-compare-shows/?shows=Dark,Black%20Mirror" rel="noopener nofollow" target="_blank">IMDB Compare Shows</a> - Compares ratings over time of TV shows</li> <li><a href="https://www.importyeti.com/" rel="noopener nofollow" target="_blank">Import Yeti</a> - Find any companies suppliers, using data from U.S Customs Sea Shipment Records</li> <li><a href="https://illustrationkit.com/illustrations" rel="noopener nofollow" target="_blank">Illustration Kit</a> - Hundreds of free and open source illustrations, with customizable colors</li> <li><a href="http://www.isleoftune.com/" rel="noopener nofollow" target="_blank">Isle of Tune</a> - Fun game where you make music from a street plan</li> <li><a href="https://inviterick.com/" rel="noopener nofollow" target="_blank">Invite Rick</a> - Invite Rick Astlet to Rick Roll your Zoom meetings</li> <li><a href="https://iwastesomuchtime.com/" rel="noopener nofollow" target="_blank">I Waste so much Time</a> - Just some funny pictures, to waste your time</li> <li><a href="https://www.justtherecipe.app/" rel="noopener nofollow" target="_blank">Just the Recipe</a> - Removes all the clutter from cooking websites, just paste a URL to a recipe</li> <li><a href="https://www.judyrecords.com/" rel="noopener nofollow" target="_blank">Judy Records</a> - Instantly search over 400 million US Court Records</li> <li><a href="https://defonic.com/jungle-rain-generator.html" rel="noopener nofollow" target="_blank">Jungle Simulator</a> - Nice relaxing, and customizable jungle sounds</li> <li><a href="https://killedbygoogle.com/" rel="noopener nofollow" target="_blank">Killed by Google</a> - Google has killed off over 200 of their services - checkout the grave yard</li> <li><a href="https://discotraystudios.github.io/my-life-in-months/" rel="noopener nofollow" target="_blank">Life in Months</a> - Create a grid of your life</li> <li><a href="https://lines.chromeexperiments.com/" rel="noopener nofollow" target="_blank">Lines</a> - Draw a line, and let Google Earth complete the picture</li> <li><a href="https://listeningtogether.atspotify.com/" rel="noopener nofollow" target="_blank">ListeningTogether</a> - Shows when two people start listening to the same song, at the same time, via Spotify</li> <li><a href="https://www.litsolutions.org/" rel="noopener nofollow" target="_blank">LitSolutions</a> - Find step-by-step solutions to the questions in your textbook</li> <li><a href="https://www.lofi.cafe/" rel="noopener nofollow" target="_blank">Lofi.Cafe</a> - Just non-stop lofi, with several stations/ genres to pick from</li> <li><a href="https://localingual.com/" rel="noopener nofollow" target="_blank">Localingual</a> - A map that you can click on, to hear voices from around the world</li> <li><a href="https://littlealchemy2.com/" rel="noopener nofollow" target="_blank">Little Alchemy 2</a> - Weirdly addictive simple element-mixing game</li> <li><a href="https://mcbroken.com/" rel="noopener nofollow" target="_blank">McBroken</a> - A map which keeps track of which McFlurry machines are broken across the US (by @rashiq)</li> <li><a href="https://pcottle.github.io/MSOutlookit/" rel="noopener nofollow" target="_blank">MSOutlook-Reddis</a> - Makes Reddit look like Microsoft Outlook (useful for work)</li> <li><a href="https://www.bluebulbprojects.com/measureofthings/default.php" rel="noopener nofollow" target="_blank">Measure of Things</a> - See real-world comparisons of a measurement</li> <li><a href="https://www.menneske.no/sudoku/" rel="noopener nofollow" target="_blank">Menneske</a> - Clean site to find, print and solve sudokus of all sizes and difficulties, and other puzzles</li> <li><a href="https://moontoday.jatan.space/" rel="noopener nofollow" target="_blank">Moon Today</a> - Browse the moons craters, mountains and lava channels</li> <li><a href="morsecode.me">MorseCode.me</a> - Morse Code-only chat room</li> <li><a href="https://www.micro-pano.com/pearl/" rel="noopener nofollow" target="_blank">MicroPano</a> - Zoom into Vermeer's masterpiece with this 10 billion pixel scan</li> <li><a href="https://musclewiki.com/" rel="noopener nofollow" target="_blank">Muscle Wiki</a> - Select a muscle, for exercises on how to work it</li> <li><a href="https://www.musicroamer.com/" rel="noopener nofollow" target="_blank">Music Roamer</a> - Finds music from similar artists you love: </li> <li><a href="https://www.my90stv.com" rel="noopener nofollow" target="_blank">My90sTV</a> - Simulates a 90's TV - so nostalgic! See also <a href="https://my60stv.com/" rel="noopener nofollow" target="_blank">My60sTV</a>, <a href="https://my70stv.com/" rel="noopener nofollow" target="_blank">My70sTv</a> and <a href="https://my80stv.com/" rel="noopener nofollow" target="_blank">My80sTV</a></li> <li><a href="https://mysterysear.ch/" rel="noopener nofollow" target="_blank">Mystery Search</a> - Search for something, and get results of what the previous person searched for</li> <li><a href="https://nobody.live/" rel="noopener nofollow" target="_blank">Nobody.live</a> - Shows live Twitch streams, that currently don't have any viewers (by Charles Stross)</li> <li><a href="https://neural.love/" rel="noopener nofollow" target="_blank">Neural Love</a> - Uses AI to restore old photos (or videos) to modern quality</li> <li><a href="https://www.nitrotype.com/" rel="noopener nofollow" target="_blank">NitroType</a> - Multi-player typing car racing game</li> <li><a href="http://www.spoonbill.org/n+7/" rel="noopener nofollow" target="_blank">N+7</a> - Replaces every noun in a body of text, with the seventh word following it in the dictionary</li> <li><a href="https://neave.tv/" rel="noopener nofollow" target="_blank">Neave.tv</a> - TV without context. Click to channel hop</li> <li><a href="https://www.openculture.com/" rel="noopener nofollow" target="_blank">Open Culture</a> - Free cultural &amp; educational content from across the web</li> <li><a href="https://opslagify.deruever.nl/" rel="noopener nofollow" target="_blank">Opslagify</a> - Calculates how much storage you'll need to download your Spotify playlists</li> <li><a href="https://orb.farm/" rel="noopener nofollow" target="_blank">Orb.Farm</a> - Relaxing lil game, where you create your own eco-system</li> <li><a href="https://ownersman.com/" rel="noopener nofollow" target="_blank">OwnersMan</a> - All car manuals</li> <li><a href="https://felixboiii.github.io/paper-plotter/#create-function" rel="noopener nofollow" target="_blank">Paper Plotter</a> - Create math functions out of paper</li> <li><a href="https://paint.wtf/" rel="noopener nofollow" target="_blank">Paint.wtf</a> - Draw something and get scored based on AI</li> <li><a href="https://www.myphysicslab.com/" rel="noopener nofollow" target="_blank">Physics Simulations</a> - Physics simulations</li> <li><a href="https://dood.al/pinktrombone/" rel="noopener nofollow" target="_blank">Pink Trombone</a> - An oral cavity and vocal tract simulator, for helping with speech disorders</li> <li><a href="https://playphrase.me/" rel="noopener nofollow" target="_blank">PlayPhrase.me</a> - Search any phrase, to see all the movies it appears in</li> <li><a href="http://boilthefrog.playlistmachinery.com/" rel="noopener nofollow" target="_blank">Playlist Machinery</a> - Create a (nearly) seamless playlist between (almost) any two artists</li> <li><a href="https://pointerpointer.com/" rel="noopener nofollow" target="_blank">Pointer Pointer</a> - Displays a random photo, of someone pointing to exactly where your cursor is</li> <li><a href="https://printer.tools/" rel="noopener nofollow" target="_blank">Printer Tools</a> - 3D Printer Utilities, including a 3D QR Code Generator</li> <li><a href="https://www.qrpicture.com/" rel="noopener nofollow" target="_blank">QR Picture</a> - Turn any picture into a working QR code</li> <li><a href="https://quickdraw.withgoogle.com/" rel="noopener nofollow" target="_blank">Quick Draw AI Game</a> - See if the neural network can recognize what you've drawn</li> <li><a href="https://quillbot.com/" rel="noopener nofollow" target="_blank">QuillBot</a> - AI tool that rephrases text</li> <li><a href="http://radio.garden/" rel="noopener nofollow" target="_blank">Radio Garden</a> - Listen to Live Radio from all over the world</li> <li><a href="https://radiooooo.com/" rel="noopener nofollow" target="_blank">Radiooooo</a> - Pick a country, and a decade, to hear the songs that would have been on the radio</li> <li><a href="https://rainbowhunt.com/?droprainz" rel="noopener nofollow" target="_blank">RainbowHunt</a> - Amazing rain simulation, built with WebGL</li> <li><a href="https://relaxcalm.netlify.app/" rel="noopener nofollow" target="_blank">RelaxCalm</a> - Do nothing for 90 Seconds</li> <li><a href="https://www.remove.bg/" rel="noopener nofollow" target="_blank">Remove BG</a> - Automatically removes the background of any image</li> <li><a href="https://808303.studio/" rel="noopener nofollow" target="_blank">Roland 808303 Studio</a> - Computer Controlled Rhythm Composer, built with HTML5</li> <li><a href="https://www.rubiksolve.com/" rel="noopener nofollow" target="_blank">RubikSolve</a> - Rrbik's Cube Solver</li> <li><a href="https://stephaneginier.com/sculptgl/" rel="noopener nofollow" target="_blank">SculptGL</a> - Digital Sculpting Web App</li> <li><a href="http://www.shadyurl.com/" rel="noopener nofollow" target="_blank">ShadyURL</a> - A URL Shortener, that makes legitimate websites sound dodgy</li> <li><a href="https://www.sharedrop.io/" rel="noopener nofollow" target="_blank">ShareDrop</a> - Share files with other local clients on your network (by Cowbell Labs)</li> <li><a href="https://alexanderperrin.com.au/paper/shorttrip/#" rel="noopener nofollow" target="_blank">Short Trip</a> - A beautiful interactive, hand-illustrated short animation (by Alexander Perrin)</li> <li><a href="https://www.shortlyai.com/" rel="noopener nofollow" target="_blank">ShortlyAI</a> - This one is really epic! Enter a title, start writing, and the AI will write you an essay</li> <li><a href="https://shortcuts.design/" rel="noopener nofollow" target="_blank">Shortcuts</a> - Keyboard shortcuts for lots of apps</li> <li><a href="https://sidewaysdictionary.com/#/" rel="noopener nofollow" target="_blank">Sideways Dictionary</a> - Like a dictionary, but uses analogies to simply explain infosec definitions </li> <li><a href="https://signalstickers.com/" rel="noopener nofollow" target="_blank">Signal Stickers</a> - An unofficial directory for Signal (messaging app) sticker packs</li> <li><a href="https://neal.fun/size-of-space/" rel="noopener nofollow" target="_blank">Size of Space</a> - Shows the relative size of items in space (Tldr; we're really really small)</li> <li><a href="https://sketch2code.azurewebsites.net/" rel="noopener nofollow" target="_blank">Sketch 2 Code</a> - Convert any hand-drawn wireframe, into HTML code</li> <li><a href="https://snapdrop.net/" rel="noopener nofollow" target="_blank">SnapDrop</a> - Share files with other devices on your network, no signup or software required</li> <li><a href="https://playsnake.org/" rel="noopener nofollow" target="_blank">Snake</a> - Play snake, the classic retro phone game rebuilt by Paul Neave</li> <li><a href="https://soundescape.io/" rel="noopener nofollow" target="_blank">SoundeScape</a> - 3-Dimensional, generative sound environments for Focus, Relax or Sleep</li> <li><a href="http://spacetelescopelive.org/" rel="noopener nofollow" target="_blank">Space Telescope Live</a> - See what the Hubble space telescope is looking at right now</li> <li><a href="https://www.spacejam.com/" rel="noopener nofollow" target="_blank">Space Jam</a> - The original Space Jam site from 1996, still online!</li> <li><a href="https://strobe.cool/" rel="noopener nofollow" target="_blank">Strobe.Cool</a> - Weirdly hypothesizing illusion (WARNING: Contains fast-flickering/ strobe lighting)</li> <li><a href="https://www.supercook.com/#/recipes" rel="noopener nofollow" target="_blank">Super Cook</a> - Search recipes based on what's in your fridge</li> <li><a href="https://engaging-data.com/sunlight-latitude/" rel="noopener nofollow" target="_blank">Sunlight Hours per Day</a> - Visualize the number of hours of sunlight parts of the Earth receive per day</li> <li><a href="https://remarkapp.io/" rel="noopener nofollow" target="_blank">Temark</a> - Convert any bit of long writing, into a short summary</li> <li><a href="https://tosdr.org/" rel="noopener nofollow" target="_blank">Terms of Service; Didn't Read</a> - Professionally written, short summaries of important Terms of Service</li> <li><a href="http://www.thefacesoffacebook.com/" rel="noopener nofollow" target="_blank">The Faces of Facebook</a> - Shows tons of public facebook profile pictures (broken)</li> <li><a href="https://gcemetery.co/" rel="noopener nofollow" target="_blank">The Google Cemetery</a> - Collection of all 162+ products that Google killed</li> <li><a href="https://theskullery.net/" rel="noopener nofollow" target="_blank">The Skullery</a> - Collection of free, well-presented and easy-to-follow recipes</li> <li><a href="https://www.merriam-webster.com/time-traveler" rel="noopener nofollow" target="_blank">TimeTraveler</a> - Shows which new words, were first used in print for each year</li> <li><a href="https://titlescraper.herokuapp.com/" rel="noopener nofollow" target="_blank">TitleScraper</a> - Scrapes any given sub-reddit, and looks for commonly used words and upvotes</li> <li><a href="https://torrent.parts/" rel="noopener nofollow" target="_blank">Torrent.parts</a> - Inspect and edit what's in your Torrent file or Magnet link (by Leo herzog)</li> <li><a href="http://www.arvindguptatoys.com/toys.html" rel="noopener nofollow" target="_blank">Toys from Trash</a> - Hundreds of Science projects using common household items &amp; trash</li> <li><a href="https://app.traveltime.com/search/" rel="noopener nofollow" target="_blank">Travel Time</a> - Travel time calculator, great for finding somewhere to live for a commute</li> <li><a href="https://trumpizer.com/" rel="noopener nofollow" target="_blank">Trumpizer</a> - An AI trained to answer questions like Donald Trump</li> <li><a href="https://www.tunemymusic.com/" rel="noopener nofollow" target="_blank">Tune my Music</a> - Free tool for exporting or transferring music playlists from one service to another</li> <li><a href="https://www.typelit.io/" rel="noopener nofollow" target="_blank">TypeLit</a> - Practice touch typing, by typing out classic novels</li> <li><a href="https://www.umeetmehere.com/" rel="noopener nofollow" target="_blank">U Meet Me</a> - Find meeting places between 2 addresses</li> <li><a href="https://unim.press/" rel="noopener nofollow" target="_blank">Unim.Press</a> - Read Reddit like a newspaper</li> <li><a href="https://unogs.com/" rel="noopener nofollow" target="_blank">Unogs</a> - Search for a movie, to find which country Netflix it is on (useful for choosing VPN location)</li> <li><a href="https://virtualvacation.us/guess" rel="noopener nofollow" target="_blank">Virtual Vacation - City Guesser Game</a> - Shows parts of cities, to guess location (great for quizzes)</li> <li><a href="https://visualping.io/" rel="noopener nofollow" target="_blank">VisualPing</a> - Monitor website for changes</li> <li><a href="http://weavesilk.com/" rel="noopener nofollow" target="_blank">WeaveSilk.com</a> - Mesmerizing generative art</li> <li><a href="https://webamp.org/" rel="noopener nofollow" target="_blank">WebAmp</a> - HTML5 implementation of WinAmp in-browser</li> <li><a href="https://whattowatchon.tv/" rel="noopener nofollow" target="_blank">What to Watch on TV</a> - Find TV shows, based on IMDB ratings</li> <li><a href="https://www.whatshouldireadnext.com/" rel="noopener nofollow" target="_blank">What Should I read Next</a> - Discover books, based on other books you've enjoyed</li> <li><a href="https://www.africam.com/wildlife/live-african-wildlife-safari-channels/" rel="noopener nofollow" target="_blank">Wildlife Africam</a> - Live wildlife cameras in Africa</li> <li><a href="https://skins.webamp.org/" rel="noopener nofollow" target="_blank">Winamp Skin Museum</a> - I don't know why...</li> <li><a href="https://window-swap.com/window" rel="noopener nofollow" target="_blank">Window Swap</a> - Look through a random window- shows videos out of peoples windows</li> <li><a href="https://ybenbihi.github.io/windows-error-worm/" rel="noopener nofollow" target="_blank">Windows Error Worm</a> - Have fun dragging Windows XP-style crashed Windows once again</li> <li><a href="https://www.concerthotels.com/worlds-greatest-vocal-ranges" rel="noopener nofollow" target="_blank">Worlds Greatest Singers</a> - Vocal ranges of the top singers visualized</li> <li><a href="https://xkcd.com/" rel="noopener nofollow" target="_blank">Xkcd</a> - The original source of xkcd's classic comic strips, on Romance, Sarcasm, Math, Computing &amp; Language</li> <li><a href="https://okay.wasv.me/" rel="noopener nofollow" target="_blank">You Okay?</a> - A little something to take your mind of things (by Billy Stevens)</li> <li><a href="https://zoom.earth/#view=51,0.6,4z/date=2020-09-28,16:00,+1" rel="noopener nofollow" target="_blank">Zoom Earth</a> - Live satellite photos of Earth</li> </ul> <p>Thanks for visiting ๐Ÿฅฐ</p> <hr> <p>This list serves as a boredom destroyer, or something to take your mind of things- I look for sites that are either amazing, genius, funny, random or useful. There's currently over 200 websites, but this list is still very much a work in progress, and I continue to add new stuff ๐Ÿšง</p> <p>I always love discovering new eipc internet stuff, so if you know of something I should check out, drop me a line at <code class="prettyprint">alicia at omg dot lol</code> - Thanks for all the messages and suggestions so far!</p> <style>ul li{font-size: 1rem !important;}</style> </p> Fun with Real-Time Data ๐ŸŒ  Alicia's Notes ๐Ÿš€ Fri, 25 Sep 2020 17:26:12 +0000 https://notes.aliciasykes.com/18611/fun-with-real-time-data https://notes.aliciasykes.com/18611/fun-with-real-time-data <p><p><img src="https://i.ibb.co/cDyDCY4/fun-with-live-data-banner.png" alt="Fun with live data_banner"></p> <p><em>A curated collection of data-related awesomeness, with a focus on internet, communication &amp; security</em><br> <em>Work in progress- I'm continuing to update the list, whenever I come across something epic</em></p> <p>My respect goes out to the legends behind each of these projects ๐Ÿ‘</p> <hr> <h2>Awesome Real-Time Data Visualizations</h2> <ul> <li><strong>Internet</strong> <ul> <li><a href="https://torflow.uncharted.software" rel="noopener nofollow" target="_blank">Tor Flow</a> - Real-time data flow between Tor nodes</li> <li><a href="http://census2012.sourceforge.net/images/geovideo.gif" rel="noopener nofollow" target="_blank">Internet Census</a> - 24-hour world map of average utilization of IPv4 addresses <ul> <li> ICMP ping requests sent out with <a href="https://en.wikipedia.org/wiki/Carna_botnet" rel="noopener nofollow" target="_blank">Carna botnet</a>. Learn more on the <a href="http://census2012.sourceforge.net" rel="noopener nofollow" target="_blank">Official Site</a> / see similar <a href="https://ant.isi.edu/datasets/all.html" rel="noopener nofollow" target="_blank">datasets</a></li> </ul></li> <li><a href="https://labs.mapbox.com/labs/twitter-gnip/brands/" rel="noopener nofollow" target="_blank">Map of Mobile Internet</a> - Shows world data coverage, according to Twitter data</li> <li><a href="https://iknowwhatyoudownload.com/en/stat/GB/daily" rel="noopener nofollow" target="_blank">IKnow</a> - Live data showing what content is being downloaded + distributed via torrents</li> <li><a href="http://internet-map.net" rel="noopener nofollow" target="_blank">Semantic Internet Map</a> - Shows how different websites link together</li> <li><a href="https://wigle.net" rel="noopener nofollow" target="_blank">Wiggle</a> - Worlds largest WiFi Map showing personal hotspot statistics geographically</li> <li><a href="https://bgpstream.com" rel="noopener nofollow" target="_blank">BGP Stream</a> - Shows all current outages (see also live maps from <a href="https://livemap.pingdom.com/" rel="noopener nofollow" target="_blank">Pingdom</a>, <a href="https://www.thousandeyes.com/outages/" rel="noopener nofollow" target="_blank">Thousand Eyes</a>)</li> <li><a href="https://research.domaintools.com/statistics" rel="noopener nofollow" target="_blank">DomainTools Statistics</a> - Domain registration Numbers and Charts</li> <li><a href="https://freedomhouse.org/explore-the-map" rel="noopener nofollow" target="_blank">Freedom House - Censorship Map</a> - Global internet freedom and democracy status per country, over time</li> <li><a href="http://www.insecam.org" rel="noopener nofollow" target="_blank">Insecam</a> - A directory and feed of insecure or public live webcams</li> </ul></li> <li><strong>Air &amp; Sea</strong> <ul> <li><a href="https://satellitemap.space/" rel="noopener nofollow" target="_blank">StarLink Satellite Map</a> - Real-time positions of StarLink and OneWeb Satellites, showing heights, IDs and more</li> <li><a href="https://www.submarinecablemap.com" rel="noopener nofollow" target="_blank">Submarine Cable Map</a> - An up-to-date map of major global internet cables (see also <a href="https://he.net/3d-map" rel="noopener nofollow" target="_blank">he.net</a> and <a href="https://submarine-cable-map-2016.telegeography.com" rel="noopener nofollow" target="_blank">this</a>)</li> <li><a href="https://www.flightradar24.com" rel="noopener nofollow" target="_blank">FlightRadar24</a> - World-wide map of live aircraft positions (see also <a href="https://opensky-network.org/network/explorer" rel="noopener nofollow" target="_blank">opensky-network</a>)</li> <li><a href="https://www.marinetraffic.com/" rel="noopener nofollow" target="_blank">Marine Traffic</a> - World-wide map of live ships, tankers, cargo &amp; passenger vessels and more</li> <li><a href="http://stuffin.space" rel="noopener nofollow" target="_blank">Stuff in Space</a> - Shows objects orbiting Earth</li> <li><a href="http://www.asterank.com/" rel="noopener nofollow" target="_blank">Asterank</a> - A scientific and economic database of over 600,000 asteroids</li> <li><a href="https://uk.flightaware.com/miserymap/" rel="noopener nofollow" target="_blank">Flight Misery Map</a> - Real-time US geographical flight delay &amp; cancellation trends</li> <li><a href="https://www.meteorshowers.org/" rel="noopener nofollow" target="_blank">Meteor Showers</a> - Shows commit locations, simulating meteor showers with time</li> <li><a href="https://www.google.com/maps/d/u/0/viewer?mid=1Z1dI8hoBZSJNWFx2xr_MMxSxSxY" rel="noopener nofollow" target="_blank">Airport WiFi Map</a> - Shows WiFi networks and their passwords for airports around the world</li> </ul></li> <li><strong>Crypto</strong> <ul> <li><a href="https://fiatleak.com/" rel="noopener nofollow" target="_blank">FiatLeak</a> - Real-time crypto asset movement stats</li> <li><a href="https://coin360.com/" rel="noopener nofollow" target="_blank">Coin360</a> - Customizable heatmap shows the current state of prices and market caps across the Cryptoverse</li> <li><a href="http://bitcoinrain.io/" rel="noopener nofollow" target="_blank">BitCoin Rain</a> - Real BTC transactions and values falling from the sky</li> <li><a href="https://bitnodes.io/nodes/network-map/" rel="noopener nofollow" target="_blank">BitNodes</a> - Network map of all currently reachable nodes in the BTC network, can also be viewed on a <a href="https://bitnodes.io/nodes/live-map/" rel="noopener nofollow" target="_blank">geographical map</a></li> <li><a href="https://www.bitlisten.com/" rel="noopener nofollow" target="_blank">BitListen</a> - The sound of BitCoin, live transactions represented by bubbles and tones</li> <li><a href="https://symphony.iohk.io/en/" rel="noopener nofollow" target="_blank">Symphony</a> - BTC transactions rendered in a 3D outer-space virtual world, with flight simulator mode</li> <li><a href="https://cryptowat.ch/" rel="noopener nofollow" target="_blank">Crypto Watch</a> - Real-time professional crypto market dashboards and trading data</li> <li><a href="https://www.livecoinwatch.com/crypto-market-cap" rel="noopener nofollow" target="_blank">LiveCoinWatch</a> - Crypto coin listings, and customizable dashboards and widgets</li> <li><a href="https://mempool.space/" rel="noopener nofollow" target="_blank">Mempool</a> - A BTC block explorer with real-time stats inferred from recent blocks, with a <a href="https://mempool.ninja/tv" rel="noopener nofollow" target="_blank">TV mode</a></li> <li><a href="https://buyhodlsell.com/tx-watch/" rel="noopener nofollow" target="_blank">TX Watch</a> - Live BCH and BTC transactions</li> <li><a href="https://txstreet.com/" rel="noopener nofollow" target="_blank">TxStreet</a> - a live blockchain and mempool visualizer, where data is represented by crowds on the street</li> <li><a href="https://mempool.space/" rel="noopener nofollow" target="_blank">Mempool</a> - Real-time visualization of the Bitcoin transaction fee market</li> <li><a href="https://telemetry.polkadot.io/#map/Polkadot" rel="noopener nofollow" target="_blank">Polkadot Telemetry</a> - Live Polkadot staking and transaction blocks</li> <li><a href="https://utxo.live/" rel="noopener nofollow" target="_blank">utxo</a> - Static charts generated daily, showing inputs, outputs and spend dates</li> </ul></li> <li><strong>Social</strong> <ul> <li><a href="https://onemilliontweetmap.com/" rel="noopener nofollow" target="_blank">One in a Million</a> - A real-time Twitter map</li> <li><a href="https://sentiment-sweep.com/now" rel="noopener nofollow" target="_blank">Sentiment Sweep</a> - Geographic sentiment analysis on real-time Twitter data (- I made this one)</li> </ul></li> <li><strong>Misc</strong> <ul> <li><a href="http://listen.hatnote.com/" rel="noopener nofollow" target="_blank">ListenToWikipedia</a> - Wikipedia edits, represented by a tone, depending on size, built by Hatnote</li> <li><a href="https://trends.google.com/trends/hottrends/visualize?pn=p9&amp;nrow=4&amp;ncol=4" rel="noopener nofollow" target="_blank">Google Search Terms</a> - Hourly Google Search Trends, in your location</li> <li><a href="http://histography.io/" rel="noopener nofollow" target="_blank">Three Thousand Years</a> - Shows major events throughout history, using Wikipedia data</li> <li><a href="https://wiki-atlas.org/" rel="noopener nofollow" target="_blank">Wiki-Atlas</a> - Wikipedia articles, categorized and plotted on a map</li> <li><a href="https://ncov2019.live/" rel="noopener nofollow" target="_blank">ncov2019/live</a> - Real-time Covid-19 data, map and dashboard (by Avi Schiffmann)</li> <li><a href="http://grid.iamkate.com/" rel="noopener nofollow" target="_blank">National Grid: Live Status</a> - Real-time UK energy stats (by Kate Morley) (similar to <a href="https://www.gridwatch.templar.co.uk/" rel="noopener nofollow" target="_blank">Grid Watch</a>)</li> <li><a href="http://globe.cid.harvard.edu/" rel="noopener nofollow" target="_blank">Globe of Economic Complexity</a> - Visualize's 15 Trillion dollars of world trade, where each dot is $100,000,000 of export</li> <li><a href="https://github.audio/" rel="noopener nofollow" target="_blank">GitHub Audio</a> - Real-time GitHub commits and PR merges, represented by audio and bubbles</li> </ul></li> <li><strong>Cyber</strong> <ul> <li><a href="https://www.comparitech.com/ransomware-attack-map/" rel="noopener nofollow" target="_blank">Comparitech Ransomware Attack Map</a> - Geographically plotted ransomware attacks</li> <li><a href="https://threatmap.checkpoint.com" rel="noopener nofollow" target="_blank">Checkpoint</a> - Geographical plotting of Malware, Phishing and Exploits</li> <li><a href="https://threatmap.fortiguard.com" rel="noopener nofollow" target="_blank">FortiGuard</a> - Incoming &amp; Outgoing Attacks per Country</li> <li><a href="https://artmotion.eu/en/insights/cloud-security-risks-map.html" rel="noopener nofollow" target="_blank">Cloud Security Risk Map</a> - Map of the world's safest and riskiest data locations</li> <li><a href="https://cybermap.kaspersky.com/stats" rel="noopener nofollow" target="_blank">Kaspersky Stats</a> - Shows detailed threats per second from a variety of categories</li> <li><a href="https://apt.securelist.com" rel="noopener nofollow" target="_blank">Kaspersky LogBook</a> - Historic Threat Time Line</li> <li>See also <ul> <li>Every AV-provider and wannabe security company has a matrix-style cyber map nowadays, here are some less-spectacular ones, which didn't make it onto the list: <a href="https://www.fireeye.com/cyber-map/threat-map.html" rel="noopener nofollow" target="_blank">Fire Eye</a>, <a href="https://threatmap.bitdefender.com" rel="noopener nofollow" target="_blank">BitDefender</a>, <a href="https://www.virusradar.com" rel="noopener nofollow" target="_blank">ESET</a>, <a href="https://map.lookingglasscyber.com" rel="noopener nofollow" target="_blank">Looking Glass Cyber Map</a>, <a href="https://www.digitalattackmap.com" rel="noopener nofollow" target="_blank">Digital Attack Map</a></li> <li><a href="https://github.com/hrbrmstr/pewpew" rel="noopener nofollow" target="_blank">pewpew</a> is a sweet web component, that you can use to build your own threat map (with sound effects!)</li> </ul></li> </ul></li> </ul> <hr> <h2>Info Sec - Databases, APIs, References</h2> <p>Want to build your own live data visualization? The below data sources may be of help</p> <ul> <li><a href="https://reports.exodus-privacy.eu.org/en/trackers/stats" rel="noopener nofollow" target="_blank">Exodus</a> - Trackers in Android Apps</li> <li><a href="https://www.exploit-db.com" rel="noopener nofollow" target="_blank">Exploit Database</a> - A database or Current software vulnerabilities</li> <li><a href="https://urlscan.io" rel="noopener nofollow" target="_blank">URLScan</a> - Service scanning for malicious domains, with historical results</li> <li><a href="https://www.dehashed.com/breach" rel="noopener nofollow" target="_blank">Dehashed</a> - Data Breaches and Credentials</li> <li><a href="https://developers.virustotal.com/v3.0/reference" rel="noopener nofollow" target="_blank">VirusTotal</a> - Detailed virus scans of software</li> <li><a href="https://www.abuseipdb.com" rel="noopener nofollow" target="_blank">Abuse IP DB</a> - Database of IPs reported for abuse</li> <li><a href="https://snusbase.com" rel="noopener nofollow" target="_blank">SnusBase</a> - Long standing database hosting breached data</li> <li><a href="https://openphish.com" rel="noopener nofollow" target="_blank">OpenPhish</a> - A feed of current phishing endpoints</li> <li><a href="http://hashtoolkit.com" rel="noopener nofollow" target="_blank">HashToolkit</a> - Database of 'cracked' hashes</li> <li><a href="https://github.com/danielmiessler/SecLists" rel="noopener nofollow" target="_blank">SecLists</a> - Starter list of leaked databases, passwords, usernames etc (Great for programming)</li> <li><a href="https://www.ssllabs.com/ssl-pulse/" rel="noopener nofollow" target="_blank">Qualys SSL Pulse</a> - A continuous and global dashboard for monitoring the quality of SSL / TLS support over time across 150,000 SSL- and TLS-enabled websites, based on Alexaโ€™s list of the most popular sites in the world</li> <li><a href="https://check.torproject.org/torbulkexitlist" rel="noopener nofollow" target="_blank">Tor Bulk Exit List</a> - List of all exit nodes (IP) in use on the Tor network</li> <li><a href="https://mempool.space/api" rel="noopener nofollow" target="_blank">Mempool API</a> - API for Bitcoin addresses, blocks, feed, memory, transactions and a real-time websocket feed</li> </ul> <hr> <h2>Info Sec - Data Research &amp; Results</h2> <p>A collection of interesting studies that have collected, analysed and presented findings using internet data</p> <ul> <li><a href="https://ant.isi.edu/datasets" rel="noopener nofollow" target="_blank">Internet Census Data</a> - Includes data on address space allocation, traffic, DNS, service enumeration, internet outages and other internet topology data</li> <li><a href="https://webtransparency.cs.princeton.edu/webcensus/#data" rel="noopener nofollow" target="_blank">Web Tracking Data</a> by Princeton University - This is the largest and most detailed analysis of online tracking to date, and measures both stateful (cookie-based) and stateless (fingerprinting-based) tracking. The crawls were made with <a href="https://github.com/mozilla/OpenWPM" rel="noopener nofollow" target="_blank">OpenWPM</a></li> <li><a href="https://www.eff.org/files/2019/06/11/whyb_2019_report.pdf" rel="noopener nofollow" target="_blank">Who has your Back?</a> by EFF - Anual report assessing how companies handle personal data <ul> <li>Historic Reports: <a href="https://www.eff.org/files/who-has-your-back-2012_0.pdf" rel="noopener nofollow" target="_blank">2012</a> | <a href="https://www.eff.org/sites/default/files/who-has-your-back-2013-report-20130513.pdf" rel="noopener nofollow" target="_blank">2013</a> | <a href="https://www.eff.org/files/2014/05/15/who-has-your-back-2014-govt-data-requests.pdf" rel="noopener nofollow" target="_blank">2014</a> | <a href="https://www.eff.org/files/2015/06/18/who_has_your_back_2015_protecting_your_data_from_government_requests_20150618.pdf" rel="noopener nofollow" target="_blank">2015</a> | <a href="https://www.eff.org/files/2016/05/04/who-has-your-back-2016.pdf" rel="noopener nofollow" target="_blank">2016</a> | <a href="https://www.eff.org/files/2017/07/08/whohasyourback_2017.pdf" rel="noopener nofollow" target="_blank">2017</a> | <a href="https://www.eff.org/files/2018/05/31/whyb_2018_report.pdf" rel="noopener nofollow" target="_blank">2018</a> | <a href="https://www.eff.org/files/2019/06/11/whyb_2019_report.pdf" rel="noopener nofollow" target="_blank">2019</a></li> </ul></li> <li><a href="https://webtransparency.cs.princeton.edu/no_boundaries/session_replay_sites.html" rel="noopener nofollow" target="_blank">Lists of Websites Abusing Session Replay</a> - Third-party sesssion replay scripts, record all your acions and allow them to be watched by a human. This list of websites include this <ul> <li>See also, the accompaniing <a href="https://freedom-to-tinker.com/2017/11/15/no-boundaries-exfiltration-of-personal-data-by-session-replay-scripts/" rel="noopener nofollow" target="_blank">blog post</a> and the <a href="https://webtap.princeton.edu/" rel="noopener nofollow" target="_blank">WebTAP</a> project</li> </ul></li> <li><a href="https://databank.illinois.edu/datasets/IDB-9213932" rel="noopener nofollow" target="_blank">Sensor Access Data</a> - A Crawl of the Mobile Web Measuring Sensor Accesses, Illinois</li> <li><a href="https://www.canalys.com/newsroom" rel="noopener nofollow" target="_blank">Canalys Newsroom</a> - Research Studies on Security, Privacy, Technology and Finance</li> <li><a href="https://web-assets.domo.com/blog/wp-content/uploads/2019/07/data-never-sleeps-7-896kb.jpg" rel="noopener nofollow" target="_blank">Data Never Sleeps</a> - An infographic visualizing how much data is generated every minute (2019)</li> <li><a href="https://external-preview.redd.it/KU3pS4LIhLWqeYSluiYyJMhLQW1fEjTdh8lEKL2jafc.png?auto=webp&amp;s=fe015c1e32731bc61cd0d57313f5a261173846ca" rel="noopener nofollow" target="_blank">What they Know about You</a> - An Infographic showing what information are Giant Tech Companies collecting from you (2020)</li> </ul> <hr> <p>Finally- Here's a selection of pretty screenshots...</p> <p><a href="https://i.ibb.co/HqJ77Mf/Fun-with-live-data-banner.png"><img src="https://i.ibb.co/HqJ77Mf/Fun-with-live-data-banner.png" alt="A selection of pretty screenshots"></a></p> </p> [REFERENCE] InfoSec Abbreviations ๐Ÿ”ก Alicia's Notes ๐Ÿš€ Tue, 22 Sep 2020 16:36:36 +0000 https://notes.aliciasykes.com/18536/reference-infosec-abbreviations https://notes.aliciasykes.com/18536/reference-infosec-abbreviations <p><p>Background: While getting started in information security, I kept coming across acronyms I wasn't familiar with/ had forgotten. So I have started compiling a list, for future reference. I will keep this list updated, as I go along ๐Ÿ˜š</p> <h3>Common InfoSec Abbreviations</h3> <ul> <li><strong>AES</strong>: Advanced Encryption Standard</li> <li><strong>C2</strong>: Command &amp; Control (sometimes CC)</li> <li><strong>CBSP</strong>: Cloud-Based Security Providers</li> <li><strong>CSP</strong>: Content Security Policy</li> <li><strong>CORS</strong>: Cross-Origin Resource Sharing</li> <li><strong>CVSS</strong>: Common Vulnerability Scoring System</li> <li><strong>DAST</strong>: Dynamic Application Security Testing</li> <li><strong>DLP</strong>: Data-loss Prevention</li> <li><strong>DDoS</strong>: Distributed Denial of Service</li> <li><strong>DES</strong>: Data Encryption Standard</li> <li><strong>DOS</strong>: Dinial of Service</li> <li><strong>DSA</strong>: Digital Signature Algorithm</li> <li><strong>EDR</strong>: Endpoint Detection &amp; Response</li> <li><strong>IPSec</strong>: Internet Protocol Security</li> <li><strong>IIoT</strong>: (Industrial) Internet of Things</li> <li><strong>MFA</strong>: Multi-Factor Authentication</li> <li><strong>PAM</strong>: Privilege Access Management</li> <li><strong>PIM</strong>: Privilege Identity Management</li> <li><strong>RAT</strong>: Remote Adimistration Tool</li> <li><strong>SAST</strong>: Static Application Security Testing</li> <li><strong>SPF</strong>: Sender Policy Framework</li> <li><strong>SSE</strong>: Server-Side Encryption</li> <li><strong>STS</strong>: Security Token Service</li> <li><strong>TLS</strong>: Transport Layer Security</li> <li><strong>WAF</strong>: Web Application Firewall</li> <li><strong>WAP</strong>: Web Application Protection</li> <li><strong>XSS</strong>: Cross-Site Scripting</li> </ul> <hr> <p>Of course, there are other, much more complete glossaries, but they can get overwhelming- these are the basics, and my personal resource. For some much more complete lists, see:</p> <p>๐Ÿก† A lot of acronyms: via <a href="https://www.infosecmatter.com/infosec-glossary/" rel="noopener nofollow" target="_blank">InfoSec Matter</a><br> ๐Ÿก† Glossary of Terms: via <a href="https://niccs.us-cert.gov/about-niccs/cybersecurity-glossary" rel="noopener nofollow" target="_blank">NICCS</a> <em>(National Initiative for Cybersecurity Careers and Studies in the US)</em></p> <style>.post-body ul{border:1px solid #ffffff54;border-radius:4px;padding:0.5rem 1rem;width:max-content;background:#ffffff0f;list-style:inside circle}</style> </p> [REFERENCE] Wireshark Display Filters ๐Ÿ’ป Alicia's Notes ๐Ÿš€ Sun, 20 Sep 2020 14:20:21 +0000 https://notes.aliciasykes.com/18452/reference-wireshark-display-filters https://notes.aliciasykes.com/18452/reference-wireshark-display-filters <p><blockquote> <p>Wirechark has some comprehensive packet filtering capabilities, and display filters let you utilize these multi-pass packet processing capabilities. This goes far beyond just filtering based on IP, port and protocol.</p> </blockquote> <p>Essential Links:</p> <ul> <li>Getting Started Guide: <a href="https://www.maketecheasier.com/use-display-filters-in-wireshark/" rel="noopener nofollow" target="_blank">https://www.maketecheasier.com/use-display-filters-in-wireshark/</a></li> <li>Basic Filter Syntax: <a href="https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html" rel="noopener nofollow" target="_blank">https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html</a></li> <li>Full Display Filter Docs: <a href="https://www.wireshark.org/docs/dfref/" rel="noopener nofollow" target="_blank">https://www.wireshark.org/docs/dfref/</a></li> <li>Full Protocol References: <a href="https://wiki.wireshark.org/ProtocolReference" rel="noopener nofollow" target="_blank">https://wiki.wireshark.org/ProtocolReference</a></li> </ul> <p>You can debug filters using the <a href="https://www.wireshark.org/docs/man-pages/dftest.html" rel="noopener nofollow" target="_blank">dftest</a> command</p> <h2>Cheat Sheet</h2> <p>I created this list from the Wiki, to be a Ctrl + F personal reference to common display filters</p> <h3>Operators</h3> <ul> <li><code class="prettyprint">eq</code> or <code class="prettyprint">==</code></li> <li><code class="prettyprint">ne</code> or <code class="prettyprint">!=</code></li> <li><code class="prettyprint">gt</code> or <code class="prettyprint">&gt;</code></li> <li><code class="prettyprint">lt</code> or <code class="prettyprint">&lt;</code></li> <li><code class="prettyprint">ge</code> or <code class="prettyprint">&gt;=</code></li> <li><code class="prettyprint">le</code> or <code class="prettyprint">&lt;=</code></li> </ul> <h3>Logic</h3> <ul> <li><code class="prettyprint">and</code> or <code class="prettyprint">&amp;&amp;</code> - Logical AND</li> <li><code class="prettyprint">or</code> or <code class="prettyprint">||</code> - Logical OR</li> <li><code class="prettyprint">xor</code> or <code class="prettyprint">^^</code> - Logical XOR</li> <li><code class="prettyprint">not</code> or <code class="prettyprint">!</code> - Logical NOT</li> <li><code class="prettyprint">[n] [โ€ฆ]</code> - Sub-String Operator</li> </ul> <h3>Ethernet</h3> <ul> <li><code class="prettyprint">eth.addr</code></li> <li><code class="prettyprint">eth.dst</code></li> <li><code class="prettyprint">eth.ig</code></li> <li><code class="prettyprint">eth.len</code></li> <li><code class="prettyprint">eth.lg</code></li> <li><code class="prettyprint">eth.multicast</code></li> <li><code class="prettyprint">eth.src</code></li> <li><code class="prettyprint">eth.trailer</code></li> <li><code class="prettyprint">eth.type</code></li> </ul> <h3>IEEE 802.1Q</h3> <ul> <li><code class="prettyprint">vlan.cfi</code></li> <li><code class="prettyprint">vlan.etype</code></li> <li><code class="prettyprint">vlan.id</code></li> <li><code class="prettyprint">vlan.len</code></li> <li><code class="prettyprint">vlan.priority</code></li> <li>`vlan.trailer</li> </ul> <h3>IPv4</h3> <ul> <li><code class="prettyprint">ip.addr</code></li> <li><code class="prettyprint">ip.checksum_bad</code></li> <li><code class="prettyprint">ip.checksum_good</code></li> <li><code class="prettyprint">ip.checksum</code></li> <li><code class="prettyprint">ip.dsfield.ce</code></li> <li><code class="prettyprint">ip.dsfield.dscp</code></li> <li><code class="prettyprint">ip.dsfield.ect</code></li> <li><code class="prettyprint">ip.dsfield</code></li> <li><code class="prettyprint">ip.dst_host</code></li> <li><code class="prettyprint">ip.dst</code></li> <li><code class="prettyprint">ip.flags.df</code></li> <li><code class="prettyprint">ip.flags.mf</code></li> <li><code class="prettyprint">ip.flags.rb</code></li> <li><code class="prettyprint">ip.flags</code></li> <li><code class="prettyprint">ip.frag_offset</code></li> <li><code class="prettyprint">ip.fragment.error</code></li> <li><code class="prettyprint">ip.fragment.multipletails</code></li> <li><code class="prettyprint">ip.fragment.overlap.conflict</code></li> <li><code class="prettyprint">ip.fragment.overlap</code></li> <li><code class="prettyprint">ip.fragment.toolongfragment</code></li> <li><code class="prettyprint">ip.fragment</code></li> <li><code class="prettyprint">ip.fragments</code></li> <li><code class="prettyprint">ip.hdr_len</code></li> <li><code class="prettyprint">ip.host</code></li> <li><code class="prettyprint">ip.id</code></li> <li><code class="prettyprint">ip.len</code></li> <li><code class="prettyprint">ip.proto</code></li> <li><code class="prettyprint">ip.reassembled_in</code></li> <li><code class="prettyprint">ip.src_host</code></li> <li><code class="prettyprint">ip.src</code></li> <li><code class="prettyprint">ip.tos.cost</code></li> <li><code class="prettyprint">ip.tos.delay</code></li> <li><code class="prettyprint">ip.tos.precedence</code></li> <li><code class="prettyprint">ip.tos.reliability</code></li> <li><code class="prettyprint">ip.tos.throughput</code></li> <li><code class="prettyprint">ip.tos</code></li> <li><code class="prettyprint">ip.ttl</code></li> <li><code class="prettyprint">ip.version</code></li> </ul> <h3>IPv6</h3> <ul> <li><code class="prettyprint">ipv6.addr</code></li> <li><code class="prettyprint">ipv6.class</code></li> <li><code class="prettyprint">ipv6.dst_host</code></li> <li><code class="prettyprint">ipv6.dst_opt</code></li> <li><code class="prettyprint">ipv6.dst</code></li> <li><code class="prettyprint">ipv6.flow</code></li> <li><code class="prettyprint">ipv6.fragment.error</code></li> <li><code class="prettyprint">ipv6.fragment.id</code></li> <li><code class="prettyprint">ipv6.fragment.more</code></li> <li><code class="prettyprint">ipv6.fragment.multipletails</code></li> <li><code class="prettyprint">ipv6.fragment.offset</code></li> <li><code class="prettyprint">ipv6.fragment.overlap.conflict</code></li> <li><code class="prettyprint">ipv6.fragment.overlap</code></li> <li><code class="prettyprint">ipv6.fragment.toolongfragment</code></li> <li><code class="prettyprint">ipv6.fragment</code></li> <li><code class="prettyprint">ipv6.fragments</code></li> <li><code class="prettyprint">ipv6.hlim</code></li> <li><code class="prettyprint">ipv6.hop_opt</code></li> <li><code class="prettyprint">ipv6.host</code></li> <li><code class="prettyprint">ipv6.mipv6_home_address</code></li> <li><code class="prettyprint">ipv6.mipv6_length</code></li> <li><code class="prettyprint">ipv6.mipv6_type</code></li> <li><code class="prettyprint">ipv6.nxt</code></li> <li><code class="prettyprint">ipv6.opt.pad1</code></li> <li><code class="prettyprint">ipv6.opt.padn</code></li> <li><code class="prettyprint">ipv6.plen</code></li> <li><code class="prettyprint">ipv6.reassembled_in</code></li> <li><code class="prettyprint">ipv6.routing_hdr.addr</code></li> <li><code class="prettyprint">ipv6.routing_hdr.left</code></li> <li><code class="prettyprint">ipv6.routing_hdr.type</code></li> <li><code class="prettyprint">ipv6.routing_hdr</code></li> <li><code class="prettyprint">ipv6.src_host</code></li> <li><code class="prettyprint">ipv6.src</code></li> <li><code class="prettyprint">ipv6.version</code></li> </ul> <h3>ARP</h3> <ul> <li><code class="prettyprint">arp.dst.hw_mac</code></li> <li><code class="prettyprint">arp.dst.proto_ipv4</code></li> <li><code class="prettyprint">arp.hw.size</code></li> <li><code class="prettyprint">arp.hw.type</code></li> <li><code class="prettyprint">arp.opcode</code></li> <li><code class="prettyprint">arp.proto.size</code></li> <li><code class="prettyprint">arp.proto.type</code></li> <li><code class="prettyprint">arp.src.hw_mac</code></li> <li><code class="prettyprint">arp.src.proto_ipv4</code></li> </ul> <h3>TCP</h3> <ul> <li><code class="prettyprint">tcp.ack</code></li> <li><code class="prettyprint">tcp.checksum_bad</code></li> <li><code class="prettyprint">tcp.checksum_good</code></li> <li><code class="prettyprint">tcp.checksum</code></li> <li><code class="prettyprint">tcp.continuation_to</code></li> <li><code class="prettyprint">tcp.dstport</code></li> <li><code class="prettyprint">tcp.flags.ack</code></li> <li><code class="prettyprint">tcp.flags.cwr</code></li> <li><code class="prettyprint">tcp.flags.ecn</code></li> <li><code class="prettyprint">tcp.flags.fin</code></li> <li><code class="prettyprint">tcp.flags.push</code></li> <li><code class="prettyprint">tcp.flags.reset</code></li> <li><code class="prettyprint">tcp.flags.syn</code></li> <li><code class="prettyprint">tcp.flags.urg</code></li> <li><code class="prettyprint">tcp.flags</code></li> <li><code class="prettyprint">tcp.hdr_len</code></li> <li><code class="prettyprint">tcp.len</code></li> <li><code class="prettyprint">tcp.nxtseq</code></li> <li><code class="prettyprint">tcp.options.cc</code></li> <li><code class="prettyprint">tcp.options.ccecho</code></li> <li><code class="prettyprint">tcp.options.ccnew</code></li> <li><code class="prettyprint">tcp.options.echo_reply</code></li> <li><code class="prettyprint">tcp.options.echo</code></li> <li><code class="prettyprint">tcp.options.md5</code></li> <li><code class="prettyprint">tcp.options.mss_val</code></li> <li><code class="prettyprint">tcp.options.mss</code></li> <li><code class="prettyprint">tcp.options.qs</code></li> <li><code class="prettyprint">tcp.options.sack_le</code></li> <li><code class="prettyprint">tcp.options.sack_perm</code></li> <li><code class="prettyprint">tcp.options.sack_re</code></li> <li><code class="prettyprint">tcp.options.sack</code></li> <li><code class="prettyprint">tcp.options.time_stamp</code></li> <li><code class="prettyprint">tcp.options.wscale_val</code></li> <li><code class="prettyprint">tcp.options.wscale</code></li> <li><code class="prettyprint">tcp.options</code></li> <li><code class="prettyprint">tcp.pdu.last_frame</code></li> <li><code class="prettyprint">tcp.pdu.size</code></li> <li><code class="prettyprint">tcp.pdu.time</code></li> <li><code class="prettyprint">tcp.port</code></li> <li><code class="prettyprint">tcp.reassembled_in</code></li> <li><code class="prettyprint">tcp.segment.error</code></li> <li><code class="prettyprint">tcp.segment.multipletails</code></li> <li><code class="prettyprint">tcp.segment.overlap.conflict</code></li> <li><code class="prettyprint">tcp.segment.overlap</code></li> <li><code class="prettyprint">tcp.segment.toolongfragment</code></li> <li><code class="prettyprint">tcp.segment</code></li> <li><code class="prettyprint">tcp.segments</code></li> <li><code class="prettyprint">tcp.seq</code></li> <li><code class="prettyprint">tcp.srcport</code></li> <li><code class="prettyprint">tcp.time_delta</code></li> <li><code class="prettyprint">tcp.time_relative</code></li> <li><code class="prettyprint">tcp.urgent_pointer</code></li> <li><code class="prettyprint">tcp.window_size</code></li> </ul> <h3>UDP</h3> <ul> <li><code class="prettyprint">udp.checksum_bad</code></li> <li><code class="prettyprint">udp.checksum_good</code></li> <li><code class="prettyprint">udp.checksum</code></li> <li><code class="prettyprint">udp.dstport</code></li> <li><code class="prettyprint">udp.length</code></li> <li><code class="prettyprint">udp.port</code></li> <li><code class="prettyprint">udp.srcport</code></li> </ul> <h3>Frame Relay</h3> <ul> <li><code class="prettyprint">fr.becn</code></li> <li><code class="prettyprint">fr.chdlctype</code></li> <li><code class="prettyprint">fr.control.f</code></li> <li><code class="prettyprint">fr.control.ftype</code></li> <li><code class="prettyprint">fr.control.n_r</code></li> <li><code class="prettyprint">fr.control.n_s</code></li> <li><code class="prettyprint">fr.control.p</code></li> <li><code class="prettyprint">fr.control.s_ftype</code></li> <li><code class="prettyprint">fr.control.u_modifier_cmd</code></li> <li><code class="prettyprint">fr.control.u_modifier_resp</code></li> <li><code class="prettyprint">fr.control</code></li> <li><code class="prettyprint">fr.cr</code></li> <li><code class="prettyprint">fr.dc</code></li> <li><code class="prettyprint">fr.de</code></li> <li><code class="prettyprint">fr.dlci</code></li> <li><code class="prettyprint">fr.dlcore_control</code></li> <li><code class="prettyprint">fr.ea</code></li> <li><code class="prettyprint">fr.fecn</code></li> <li><code class="prettyprint">fr.lower_dlci</code></li> <li><code class="prettyprint">fr.nlpid</code></li> <li><code class="prettyprint">fr.second_dlci</code></li> <li><code class="prettyprint">fr.snap.oui</code></li> <li><code class="prettyprint">fr.snap.pid</code></li> <li><code class="prettyprint">fr.snaptype</code></li> <li><code class="prettyprint">fr.third_dlci</code></li> <li><code class="prettyprint">fr.upper_dlci</code></li> </ul> <h3>ICMPv6</h3> <ul> <li><code class="prettyprint">icmpv6.all_comp</code></li> <li><code class="prettyprint">icmpv6.checksum_bad</code></li> <li><code class="prettyprint">icmpv6.checksum</code></li> <li><code class="prettyprint">icmpv6.code</code></li> <li><code class="prettyprint">icmpv6.comp</code></li> <li><code class="prettyprint">icmpv6.haad.ha_addrs</code></li> <li><code class="prettyprint">icmpv6.identifier</code></li> <li><code class="prettyprint">icmpv6.option.cga</code></li> <li><code class="prettyprint">icmpv6.option.length</code></li> <li><code class="prettyprint">icmpv6.option.name_type.fqdn</code></li> <li><code class="prettyprint">icmpv6.option.name_type</code></li> <li><code class="prettyprint">icmpv6.option.name_x501</code></li> <li><code class="prettyprint">icmpv6.option.rsa.key_hash</code></li> <li><code class="prettyprint">icmpv6.option.type</code></li> <li><code class="prettyprint">icmpv6.option</code></li> <li><code class="prettyprint">icmpv6.ra.cur_hop_limit</code></li> <li><code class="prettyprint">icmpv6.ra.reachable_time</code></li> <li><code class="prettyprint">icmpv6.ra.retrans_timer</code></li> <li><code class="prettyprint">icmpv6.ra.router_lifetime</code></li> <li><code class="prettyprint">icmpv6.recursive_dns_serv</code></li> <li><code class="prettyprint">icmpv6.type</code></li> </ul> <h3>PPP</h3> <ul> <li><code class="prettyprint">ppp.address</code></li> <li><code class="prettyprint">ppp.control</code></li> <li><code class="prettyprint">ppp.direction</code></li> <li><code class="prettyprint">ppp.protocol</code></li> </ul> <h3>RIP</h3> <ul> <li><code class="prettyprint">rip.auth.passwd</code></li> <li><code class="prettyprint">rip.auth.type</code></li> <li><code class="prettyprint">rip.command</code></li> <li><code class="prettyprint">rip.family</code></li> <li><code class="prettyprint">rip.ip</code></li> <li><code class="prettyprint">rip.metric</code></li> <li><code class="prettyprint">rip.netmask</code></li> <li><code class="prettyprint">rip.next_hop</code></li> <li><code class="prettyprint">rip.route_tag</code></li> <li><code class="prettyprint">rip.routing_domain</code></li> <li><code class="prettyprint">rip.version</code></li> </ul> <h3>MPLS</h3> <ul> <li><code class="prettyprint">mpls.bottom</code></li> <li><code class="prettyprint">mpls.cw.control</code></li> <li><code class="prettyprint">mpls.cw.res</code></li> <li><code class="prettyprint">mpls.exp</code></li> <li><code class="prettyprint">mpls.label</code></li> <li><code class="prettyprint">mpls.oam.bip16</code></li> <li><code class="prettyprint">mpls.oam.defect_location</code></li> <li><code class="prettyprint">mpls.oam.defect_type</code></li> <li><code class="prettyprint">mpls.oam.frequency</code></li> <li><code class="prettyprint">mpls.oam.function_type</code></li> <li><code class="prettyprint">mpls.oam.ttsi</code></li> <li><code class="prettyprint">mpls.ttl</code></li> </ul> <h3>BGP</h3> <ul> <li><code class="prettyprint">bgp.aggregator_as</code></li> <li><code class="prettyprint">bgp.aggregator_origin</code></li> <li><code class="prettyprint">bgp.as_path</code></li> <li><code class="prettyprint">bgp.cluster_identifier</code></li> <li><code class="prettyprint">bgp.cluster_list</code></li> <li><code class="prettyprint">bgp.community_as</code></li> <li><code class="prettyprint">bgp.community_value</code></li> <li><code class="prettyprint">bgp.local_pref</code></li> <li><code class="prettyprint">bgp.mp_nlri_tnl_id</code></li> <li><code class="prettyprint">bgp.mp_reach_nlri_ipv4_prefix</code></li> <li><code class="prettyprint">bgp.mp_unreach_nlri_ipv4_prefix</code></li> <li><code class="prettyprint">bgp.multi_exit_disc</code></li> <li><code class="prettyprint">bgp.next_hop</code></li> <li><code class="prettyprint">bgp.nlri_prefix</code></li> <li><code class="prettyprint">bgp.origin</code></li> <li><code class="prettyprint">bgp.originator_id</code></li> <li><code class="prettyprint">bgp.type</code></li> <li><code class="prettyprint">bgp.withdrawn_prefix</code></li> </ul> <h3>ICMP</h3> <ul> <li><code class="prettyprint">icmp.checksum_bad</code></li> <li><code class="prettyprint">icmp.checksum</code></li> <li><code class="prettyprint">icmp.code</code></li> <li><code class="prettyprint">icmp.ident</code></li> <li><code class="prettyprint">icmp.mtu</code></li> <li><code class="prettyprint">icmp.redir_gw</code></li> <li><code class="prettyprint">icmp.seq</code></li> <li><code class="prettyprint">icmp.type</code></li> </ul> <h3>DTP</h3> <ul> <li><code class="prettyprint">dtp.neighbor</code></li> <li><code class="prettyprint">dtp.tlv_len</code></li> <li><code class="prettyprint">dtp.tlv_type</code></li> <li><code class="prettyprint">dtp.version</code></li> <li><code class="prettyprint">vtp.neighbor</code></li> </ul> <h3>VTP</h3> <ul> <li><code class="prettyprint">vtp.code</code></li> <li><code class="prettyprint">vtp.conf_rev_num</code></li> <li><code class="prettyprint">vtp.followers</code></li> <li><code class="prettyprint">vtp.md5_digest</code></li> <li><code class="prettyprint">vtp.md_len</code></li> <li><code class="prettyprint">vtp.md</code></li> <li><code class="prettyprint">vtp.seq_num</code></li> <li><code class="prettyprint">vtp.start_value</code></li> <li><code class="prettyprint">vtp.upd_id</code></li> <li><code class="prettyprint">vtp.upd_ts</code></li> <li><code class="prettyprint">vtp.version</code></li> <li><code class="prettyprint">vtp.vlan_info.802_10_index</code></li> <li><code class="prettyprint">vtp.vlan_info.isl_vlan_id</code></li> <li><code class="prettyprint">vtp.vlan_info.len</code></li> <li><code class="prettyprint">vtp.vlan_info.mtu_size</code></li> <li><code class="prettyprint">vtp.vlan_info.status.vlan_susp</code></li> <li><code class="prettyprint">vtp.vlan_info.tlv_len</code></li> <li><code class="prettyprint">vtp.vlan_info.tlv_type</code></li> <li><code class="prettyprint">vtp.vlan_info.vlan_name_len</code></li> <li><code class="prettyprint">vtp.vlan_info.vlan_name</code></li> <li><code class="prettyprint">vtp.vlan_info.vlan_type</code></li> </ul> <h3>HTTP</h3> <ul> <li><code class="prettyprint">http.accept_encoding</code></li> <li><code class="prettyprint">http.accept_language</code></li> <li><code class="prettyprint">http.accept</code></li> <li><code class="prettyprint">http.authbasic</code></li> <li><code class="prettyprint">http.authorization</code></li> <li><code class="prettyprint">http.cache_control</code></li> <li><code class="prettyprint">http.connection</code></li> <li><code class="prettyprint">http.content_encoding</code></li> <li><code class="prettyprint">http.content_length</code></li> <li><code class="prettyprint">http.content_type</code></li> <li><code class="prettyprint">http.cookie</code></li> <li><code class="prettyprint">http.date</code></li> <li><code class="prettyprint">http.host</code></li> <li><code class="prettyprint">http.last_modified</code></li> <li><code class="prettyprint">http.location</code></li> <li><code class="prettyprint">http.notification</code></li> <li><code class="prettyprint">http.proxy_authenticate</code></li> <li><code class="prettyprint">http.proxy_authorization</code></li> <li><code class="prettyprint">http.proxy_connect_host</code></li> <li><code class="prettyprint">http.proxy_connect_port</code></li> <li><code class="prettyprint">http.referer</code></li> <li><code class="prettyprint">http.request.method</code></li> <li><code class="prettyprint">http.request.uri</code></li> <li><code class="prettyprint">http.request.version</code></li> <li><code class="prettyprint">http.request</code></li> <li><code class="prettyprint">http.response.code</code></li> <li><code class="prettyprint">http.response</code></li> <li><code class="prettyprint">http.server</code></li> <li><code class="prettyprint">http.set_cookie</code></li> <li><code class="prettyprint">http.transfer_encoding</code></li> <li><code class="prettyprint">http.user_agent</code></li> <li><code class="prettyprint">http.www_authenticate</code></li> <li><code class="prettyprint">http.x_forwarded_for</code></li> </ul> <h2>Example Usage</h2> <p>(Adapted from Chris Greer's Blog Post)</p> <ul> <li><code class="prettyprint">ip.addr == 10.0.0.1</code> - <em>Sets a filter for any packet with 10.0.0.1, as either the source or dest</em><br></li> <li><code class="prettyprint">ip.addr==10.0.0.1 &amp;&amp; ip.addr==10.0.0.2</code> - <em>sets a conversation filter between the two defined IP addresses</em></li> <li><code class="prettyprint">tcp.time_delta &gt; .250</code> - <em>sets a filter to display all tcp packets that have a delta time of greater than 250mSec in the context of their stream</em></li> <li><code class="prettyprint">tcp.port==4000</code> - <em>Sets a filter for any TCP packet with 4000 as a source or dest port</em></li> <li><code class="prettyprint">tcp.flags == 0x012</code> - <em>Displays all TCP SYN/ACK packets - shows the connections that had a positive response. Related to this is tcp.flags.syn==1</em></li> <li><code class="prettyprint">ip.addr == 10.0.0.0/24</code> - <em>Shows packets to and from any address in the 10.0.0.0/24 space</em></li> <li><code class="prettyprint">frame contains traffic</code> - <em>Displays all packets that contain the word โ€˜trafficโ€™. Excellent when searching on a specific string or user ID</em></li> <li><code class="prettyprint">!(arp or icmp or stp)</code> - <em>Masks out arp, icmp, stp, or whatever other protocols may be background noise. Allowing you to focus on the traffic of interest</em></li> <li><code class="prettyprint">eth[0x47:2] == 01:80</code> - <em>This is an example of an offset filter. It sets a filter for the HEX values of 0x01 and 0x80 specifically at the offset location of 0x47</em></li> <li><code class="prettyprint">tcp.analysis.flags &amp;&amp; !tcp.analysis.window_update</code> - <em>Displays all retransmissions, duplicate acks, zero windows, and more in the trace. Helps when tracking down slow application performance and packet loss. It will not include the window updates, since these aren't really important for me to see in most cases</em></li> </ul> </p> My Top 50 Android Apps ๐Ÿ“ฑ Alicia's Notes ๐Ÿš€ Tue, 15 Sep 2020 19:32:33 +0000 https://notes.aliciasykes.com/18336/my-top-50-android-apps https://notes.aliciasykes.com/18336/my-top-50-android-apps <p><style> img.banner-image { margin: 0 auto; width: 100%; } img[alt=F-Droid], img[alt=Google-Play], img[alt=GitHub], img[alt=Git], img[alt=Website] { width: 22px !important; display: inline !important; margin: 0 2px !important; } .post-body ul { margin-top: 0; } .post-body ul li a { font-weight: bold; } span.quick-note { font-size: 0.8rem; font-style: italic; } .post-body {margin-top: 1rem; } p { margin-top: 0; } h4 { margin-bottom: 0; } </style> <p><img title="A selection of Android applications that I use often" class="banner-image" src="https://i.ibb.co/cc8WP4K/App-icons-banner-medium.png"></p> <p>These are all the Android applications that I use often, each app on this list serves a purpose and adds value to my day. The developers behind every one of these apps have done an amazing job, and for that, I am thankful. This in part is my motivation for writing this list</p> <p>This is, in no way a list of ultra-secure, privacy-respecting or fully FOSS apps. In fact, the very idea of having 50 apps on your device goes against the minimalist security principle, and increases attack surface. However, I do carefully manage permissions and connectivity features, blocking internet access for all apps that shouldn't need it</p> <p><span class="quick-note">Click the App Name to visit website, the GitHub icon to view source code, and the F-Droid/ Google Play icon to download APK</span> ๐Ÿ˜Š<br> <span class="quick-note"><b>Note</b>: Any non-opensource apps are indicated with a red cross</span> โŒ</p> <h3>Essentials:</h3> <ul> <li><a href="https://getaegis.app/" rel="noopener nofollow" target="_blank">Aegis</a> - 2-Factor Authentication Token Manager <a href="https://f-droid.org/en/packages/com.beemdevelopment.aegis/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/beemdevelopment/Aegis"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.keepassdx.com/" rel="noopener nofollow" target="_blank">KeePassDX</a> - Password Manager for KeePass files <a href="https://f-droid.org/en/packages/com.kunzisoft.keepass.libre/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/Kunzisoft/KeePassDX"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://standardnotes.org/" rel="noopener nofollow" target="_blank">Standard Notes</a> - Secure, Encrypted Cross-Platform Notes <a href="https://f-droid.org/en/packages/com.standardnotes/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/standardnotes"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://k9mail.app/" rel="noopener nofollow" target="_blank">K-9 Mail</a> - IMAP Mail Client with Multi-Account Support <a href="https://f-droid.org/en/packages/com.fsck.k9/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/k9mail/k-9"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://protonmail.com/" rel="noopener nofollow" target="_blank">ProtonMail</a> - Official Client for ProtonMail (PGP Encrypted Email) <a href="https://play.google.com/store/apps/details?id=ch.protonmail.android"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> <a href="https://github.com/ProtonMail"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://simplelogin.io/" rel="noopener nofollow" target="_blank">SimpleLogin</a> - PGP Encrypted Mail Forwarder for Multiple Aliases <a href="https://f-droid.org/en/packages/io.simplelogin.android.fdroid/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/simple-login"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.etesync.com/" rel="noopener nofollow" target="_blank">EteSync</a> - Secure, Encrypted Sync Engine for Calendar, Contacts and Tasks <a href="https://f-droid.org/en/packages/com.etesync.syncadapter/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/etesync"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.xbrowsersync.org/" rel="noopener nofollow" target="_blank">xBrowserSync</a> - Secure Bookmark Storage and Browser Syncing <a href="https://f-droid.org/en/packages/com.xBrowserSync.android/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/xbrowsersync"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.openkeychain.org/" rel="noopener nofollow" target="_blank">OpenKeychain</a> - OpenPGP for encrypting files and communications <a href="https://f-droid.org/en/packages/org.sufficientlysecure.keychain/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/open-keychain/open-keychain"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://sovworks.com/eds/" rel="noopener nofollow" target="_blank">EDS Lite</a> - Managing files in encrypted containers <a href="https://f-droid.org/en/packages/com.sovworks.edslite/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/sovworks/edslite"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>Networking:</h3> <ul> <li><a href="https://netguard.me/" rel="noopener nofollow" target="_blank">NetGuard</a> - Firewall supporting per-app internet blocking and advanced rules <a href="https://f-droid.org/en/packages/eu.faircode.netguard/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/M66B/NetGuard"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://guardianproject.info/apps/orbot/" rel="noopener nofollow" target="_blank">Orbot</a> - Routes traffic via Tor network <a href="https://f-droid.org/en/packages/org.torproject.android/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://gitweb.torproject.org/orbot.git"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><a href="https://mullvad.net/en/" rel="noopener nofollow" target="_blank">Mullvad</a> - My VPN of choice <a href="https://f-droid.org/en/packages/net.mullvad.mullvadvpn/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/mullvad"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.wireguard.com/" rel="noopener nofollow" target="_blank">WireGuard</a> - VPN for connecting to private networks <a href="https://f-droid.org/en/packages/com.wireguard.android/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://git.zx2c4.com/wireguard-android/"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><a href="https://play.google.com/store/apps/details?id=com.eakteam.networkmanager.pro" rel="noopener nofollow" target="_blank">Network Manager Pro</a> - Complete suit of Network tools <a href="https://play.google.com/store/apps/details?id=com.eakteam.networkmanager.pro"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> </ul> <h3>Communication</h3> <ul> <li><a href="https://signal.org/" rel="noopener nofollow" target="_blank">Signal</a> - E2E Encrypted Messaging, (not anonymous, as it's linked to mobile number) <a href="https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> <a href="https://github.com/signalapp"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://briarproject.org/" rel="noopener nofollow" target="_blank">Briar</a> - Extremity secure and robust communication which can also work locally (via WiFi or Bluetooth) <a href="https://f-droid.org/en/packages/org.briarproject.briar.android/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://code.briarproject.org/briar/briar"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><a href="https://element.io/" rel="noopener nofollow" target="_blank">Element</a> - Matrix Client (Matrix is a privacy-respecting P2P encrypted multi-user chat platform) <a href="https://f-droid.org/en/packages/im.vector.app/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/vector-im"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>Productivity Basics</h3> <ul> <li><a href="https://support.mozilla.org/en-US/kb/focus" rel="noopener nofollow" target="_blank">FireFox Focus</a> - Fast &amp; Private browser, with no persistent history and automatic tracker blocking <a href="https://f-droid.org/en/packages/org.mozilla.klar/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/mozilla-mobile/focus-android"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://github.com/mobile/" rel="noopener nofollow" target="_blank">GitHub</a> - Official GitHub client, for managing issues, pull-requests and browsing repositories <a href="https://play.google.com/store/apps/details?id=com.github.android"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a></li> <li><a href="https://www.eledev.digital/work/hour-blocks" rel="noopener nofollow" target="_blank">Hour Blocks</a> - Simple hour-by-hour day planner, with calendar support <a href="https://play.google.com/store/apps/details?id=com.jtsaeed.neon"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://opencamera.org.uk/" rel="noopener nofollow" target="_blank">Open Camera</a> - Full-featured, privacy-respecting camera app with good feature support <a href="https://f-droid.org/en/packages/net.sourceforge.opencamera/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://sourceforge.net/p/opencamera/code/ci/master/tree/"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><a href="https://osmand.net/" rel="noopener nofollow" target="_blank">OsmAnd~ Maps</a> - Maps with offline support, public transport directions and turn-by-turn navigation <a href="https://f-droid.org/en/packages/net.osmand.plus/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/osmandapp/Osmand"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.simplemobiletools.com/calendar/" rel="noopener nofollow" target="_blank">Simple Calendar</a> - Highly customizable, privacy-respecting, offline, easy calendar app <a href="https://f-droid.org/en/packages/com.simplemobiletools.calendar.pro/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/SimpleMobileTools/Simple-Calendar"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.simplemobiletools.com/" rel="noopener nofollow" target="_blank">Simple Calculator</a> - Just a Calculator app <a href="https://f-droid.org/en/packages/com.simplemobiletools.calculator/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/SimpleMobileTools/Simple-Calculator"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.simplemobiletools.com/contacts/" rel="noopener nofollow" target="_blank">Simple Contacts</a> - Privacy-respecting contacts manager <a href="https://f-droid.org/en/packages/com.simplemobiletools.contacts.pro/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/SimpleMobileTools/Simple-Contacts"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.simplemobiletools.com/" rel="noopener nofollow" target="_blank">Simple Dialer</a> - Privacy-respecting cellular phone application <a href="https://f-droid.org/en/packages/com.simplemobiletools.dialer/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/SimpleMobileTools/Simple-Dialer"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://tasks.org/" rel="noopener nofollow" target="_blank">Tasks</a> - Secure Todo List App with CalDav Sync Capabilities <a href="https://f-droid.org/en/packages/org.tasks/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/tasks/tasks"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://play.google.com/store/apps/details?id=wangdaye.com.geometricweather" rel="noopener nofollow" target="_blank">Geometric Weather</a> - Simple weather app, with clean UI, 15-day forecast and detailed outlook <a href="https://play.google.com/store/apps/details?id=wangdaye.com.geometricweather"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> <a href="https://github.com/WangDaYeeeeee/GeometricWeather"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.thetileapp.com/en-us/how-it-works" rel="noopener nofollow" target="_blank">Tile</a> - Companion app for Tile Bluetooth Finders (useful for finding keys, wallet, phone, TV remote etc) <a href="https://play.google.com/store/apps/details?id=com.thetileapp.tile"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://www.realvnc.com/en/" rel="noopener nofollow" target="_blank">VNC Viewer</a> - Virtual remote desktop app, to access and control PC, Server or other device <a href="https://play.google.com/store/apps/details?id=com.realvnc.viewer.android"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://www.youversion.com/" rel="noopener nofollow" target="_blank">Bible</a> - An offline Bible app, with audio and daily plans <a href="https://play.google.com/store/apps/details?id=com.sirma.mobile.bible.android"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://github.com/brarcher/loyalty-card-locker" rel="noopener nofollow" target="_blank">Loyalty Card Keychain</a> - Securely stores and displays store loyalty cards, with good protocol support <a href="https://f-droid.org/en/packages/protect.card_locker/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/brarcher/loyalty-card-locker"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>Utilities</h3> <ul> <li><a href="https://adaway.org/" rel="noopener nofollow" target="_blank">AdAway</a> - Ad and tracker blocker that uses hosts file (requires root) <a href="https://f-droid.org/en/packages/org.adaway/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/AdAway/AdAway"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://f-droid.org/en/packages/superfreeze.tool.android" rel="noopener nofollow" target="_blank">SuperFreezZ</a> - Entirely freeze all background activities on a per-app basis <a href="https://f-droid.org/en/packages/superfreeze.tool.android"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://gitlab.com/SuperFreezZ/SuperFreezZ"><img src="https://i.ibb.co/1z1PPKK/Git.png" alt="Git"></a></li> <li><a href="https://f-droid.org/en/packages/eu.faircode.xlua/" rel="noopener nofollow" target="_blank">XPrivacyLua</a> - Mocks app permissions fake data (solving the issues caused by revoking permissions) <a href="https://f-droid.org/en/packages/eu.faircode.xlua/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/M66B/XPrivacyLua"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://muntashirakon.github.io/AppManager/" rel="noopener nofollow" target="_blank">App Manager</a> - Package manager &amp; viewer, with useful privacy &amp; security features <a href="https://f-droid.org/en/packages/io.github.muntashirakon.AppManager/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/MuntashirAkon/AppManager"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://muntashirakon.github.io/AppManager/" rel="noopener nofollow" target="_blank">OAndBackupX</a> - Backup apps and data, without the need for Google <a href="https://f-droid.org/en/packages/com.machiav3lli.backup/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/machiav3lli/oandbackupx"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://github.com/Fr4gorSoftware/SecScanQR" rel="noopener nofollow" target="_blank">SecScanQR</a> - Fully-featured, privacy-respecting QR code &amp; barcode scanner &amp; generator <a href="https://f-droid.org/en/packages/de.t_dankworth.secscanqr/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/Fr4gorSoftware/SecScanQR"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://island.oasisfeng.com/" rel="noopener nofollow" target="_blank">Island</a> - Isolate and compartmentalize apps for privacy <a href="https://play.google.com/store/apps/details?id=com.oasisfeng.island&amp;hl=en_US"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> <a href="https://github.com/oasisfeng/island"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://play.google.com/store/apps/details?id=com.glgjing.marvel" rel="noopener nofollow" target="_blank">Powerful Monitor</a> - Fully-featured system monitor and RAM cleaner, no trackers <a href="https://play.google.com/store/apps/details?id=com.glgjing.marvel"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://reports.exodus-privacy.eu.org/en/reports/" rel="noopener nofollow" target="_blank">Exodus</a> - Shows which trackers each app has within it's APK <a href="https://f-droid.org/en/packages/org.eu.exodus_privacy.exodusprivacy/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/Exodus-Privacy/exodus-android-app"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>Home Control</h3> <ul> <li><a href="https://f-droid.org/en/packages/sterrenburg.github.flutterhole/" rel="noopener nofollow" target="_blank">FlutterHole</a> - Easy control over local Pi Hole instance <a href="https://f-droid.org/en/packages/sterrenburg.github.flutterhole/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/sterrenburg/flutterhole"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.home-assistant.io/" rel="noopener nofollow" target="_blank">Home Assistant</a> - Control all smart home and IoT devices, via self-hosted HASS.io server <a href="https://f-droid.org/en/packages/io.homeassistant.companion.android.minimal/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/home-assistant/android"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.fing.com/products/fing-app" rel="noopener nofollow" target="_blank">Fing</a> - Home Network Security <a href="https://play.google.com/store/apps/details?id=com.overlook.android.fing"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://pingtools.org/" rel="noopener nofollow" target="_blank">Ping Tools</a> - Basic uptime monitor for your servers <a href="https://play.google.com/store/apps/details?id=ua.com.streamsoft.pingtools"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> </ul> <h3>Media</h3> <ul> <li><a href="https://www.plex.tv/" rel="noopener nofollow" target="_blank">Plex</a> - Stream media from home Plex Server <a href="https://play.google.com/store/apps/details?id=com.plexapp.android"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> <a href="https://github.com/plexinc/"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://www.pocketcasts.com/" rel="noopener nofollow" target="_blank">PocketCasts</a> - Podcast Player with Advanced Listening Tools and OPML Support <a href="https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://www.spotify.com/us/download/other/" rel="noopener nofollow" target="_blank">Spotify</a> - Music Streaming and Downloads (Premium) <a href="https://play.google.com/store/apps/details?id=com.spotify.music"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> <a href="https://github.com/spotify"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a> โŒ</li> <li><a href="http://www.y20k.org/transistor/" rel="noopener nofollow" target="_blank">Transistor</a> - Internet Radio <a href="https://f-droid.org/en/packages/org.y20k.transistor/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/y20k/transistor"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://newpipe.schabi.org/" rel="noopener nofollow" target="_blank">NewPipe</a> - YouTube Player <a href="https://f-droid.org/en/packages/org.schabi.newpipe/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/TeamNewPipe/NewPipe"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>Misc:</h3> <ul> <li><a href="http://appsisle.com/project/developer-assistant/" rel="noopener nofollow" target="_blank">Developer Assistance</a> - Powerful debugging app for Android development <a href="https://play.google.com/store/apps/details?id=com.appsisle.developerassistant&amp;hl=en_US"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> <a href="https://github.com/jwisniewski/android-developer-assistant"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://github.com/TimeShining/Android-Dev-Tools" rel="noopener nofollow" target="_blank">Dev Tools</a> - Essential toolkit for Android development, including decompiling <a href="https://play.google.com/store/apps/details?id=cn.trinea.android.developertools&amp;hl=en_US"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> <a href="https://github.com/TimeShining/Android-Dev-Tools"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> <li><a href="https://cloudmare.jtsalva.dev/" rel="noopener nofollow" target="_blank">CloudMare</a> - CloudFlare Application Management <a href="https://f-droid.org/en/packages/dev.jtsalva.cloudmare/"><img src="https://i.ibb.co/dGM2xfJ/F-droid.png" alt="F-Droid"></a> <a href="https://github.com/jtsalva/cloudmare"><img src="https://i.ibb.co/hWcSmVN/Github-logo.png" alt="GitHub"></a></li> </ul> <h3>Device Customization</h3> <ul> <li><a href="https://play.google.com/store/apps/details?id=com.ss.launcher2" rel="noopener nofollow" target="_blank">Total Launcher</a> - Highly Customizable Android Launcher <a href="https://play.google.com/store/apps/details?id=com.ss.launcher2"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://help.kustom.rocks/" rel="noopener nofollow" target="_blank">KWGT</a> - Advanced Widget Creator <a href="https://play.google.com/store/apps/details?id=org.kustom.widget"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> <li><a href="https://llamalab.com/automate/" rel="noopener nofollow" target="_blank">Automate</a> - Device Macros and Automation, with Home Assistant Compatibility <a href="https://play.google.com/store/apps/details?id=com.llamalab.automate"><img src="https://i.ibb.co/ySbmhkY/Google-play.png" alt="Google-Play"></a> โŒ</li> </ul> <hr> <h2>Notes</h2> <h4>Exodus Privacy</h4> <p><a href="https://reports.exodus-privacy.eu.org/en/" rel="noopener nofollow" target="_blank">ฮตxodus</a> is an awesome service, I don't know how I managed before it came about. It's a privacy audit platform that scans Android APKs for links to known trackers, and generated up-to-date reports for most apps available through Google Play. You can either <a href="https://reports.exodus-privacy.eu.org/en/reports/" rel="noopener nofollow" target="_blank">search an app though their website</a>, or use the <a href="https://f-droid.org/en/packages/org.eu.exodus_privacy.exodusprivacy/" rel="noopener nofollow" target="_blank">Exodus App</a> that scans all installed apps, showing which trackers and permissions they include</p> <h4>NetGuard</h4> <p>I heavily rely on NetGuard, which I use to completely block internet access for all apps that don't absolutely require a network connection. For the remaining applications I control how and when they can connect, usually blocking any network access when the screen is off. An alternative to NetGuard, is <a href="https://f-droid.org/en/packages/net.kollnig.missioncontrol.fdroid/" rel="noopener nofollow" target="_blank">TrackerControl</a>, that allows the blocking of individual trackers on a per-app basis, however I use Pi Hole for blocking adds &amp; trackers instead. </p> <h4>Faraday</h4> <p>Typically, when I'm not activity using my phone, I keep it in my Silent Pocket Faraday case, which has the added benefit of preserving battery life.</p> <h4>VPN</h4> <p>When I do connect, I VPN into my home network (I wish I could use WireGuard for this, but currently NetGuard only supports OpenVPN protocol). This provides some additional protection thanks to my firewall, and Pi-Hole is used to block ads and some trackers, it also allows secure access to my locally self-hosted services. All traffic on my home network is routed though Mullvad VPN. Even though this adds several extra hops to my phone's traffic, it doesn't seem to affect speed too much, and the above benefits make it worthwhile.</p> <h4>Orbot</h4> <p>Sometimes I use Orbot as backup service, but I do find this to be slower, and with a lot of extra CAPTCHAs. Another similar app, but with greater controls is <a href="https://orwall.org/" rel="noopener nofollow" target="_blank">orWall</a>, by <a href="https://github.com/EthACKdotOrg" rel="noopener nofollow" target="_blank">@EthACKdotOrg</a>, which is useful for forcing selected apps to use Tor.</p> <h4>Automate</h4> <p>Automate is a really handy app for running simple macros and device automation (however it is unfortunately not open source). One of the things I use it for, is turning off WiFi and other connectivity features when I'm not using them. I also have my phone enter airplane mode at nighttime, in order to not distract me (requires root). (<a href="https://f-droid.org/en/packages/ryey.easer/" rel="noopener nofollow" target="_blank">Easer</a> an <a href="https://f-droid.org/en/packages/libretasks.app/" rel="noopener nofollow" target="_blank">LibreTasks</a> are open source alternatives, but with less functionality)</p> <h4>Island</h4> <p>Island is a really useful sandbox environment, allowing you to clone selected apps and run them in an isolated box, preventing it from accessing your personal data, or device information, and it lets you freeze apps, preventing background tasks from running. It works by utilizing Androids Work Profile feature. It's certainly not fool-proof though, any security bugs in the Android system could lead to data leaks. It's currently not available on F-Droid, an alternative app is <a href="https://f-droid.org/en/packages/net.typeblog.shelter/" rel="noopener nofollow" target="_blank">Shelter</a>, built by <a href="https://github.com/PeterCxy" rel="noopener nofollow" target="_blank">@PeterCxy</a> although I have found it to be less stable.</p> <h4>Monitoring Apps</h4> <p>The more apps installed on a device, the larger the attack surface. 50 is probably too many. The average smart phone user has 100 apps installed on their device- that's defiantly too many. It's important to know what is running in the background, remove apps you no longer use often or that have invasive trackers. <a href="https://muntashirakon.github.io/AppManager/" rel="noopener nofollow" target="_blank">App Manager</a> is a really useful package manager, that makes uninstalling unneeded apps easy. <a href="https://reports.exodus-privacy.eu.org/en/reports/" rel="noopener nofollow" target="_blank">Exodus</a> is useful for finding out which trackers are included in each app.</p> <hr> <p><span class="quick-note"><br> โŒ<strong>The following apps are not fully open-source</strong>, and depending on your threat model, you may wish to avoid them:<br> Network Manager Pro, Hour Blocks, Tile, VNC Viewer, YouVision Bible, Fing, Ping Tools, PocketCasts, Spotify, Total Launcher, KWGT, Automate<br> </span><br> <span class="quick-note"><br> โš ๏ธThe following apps <strong>are</strong> open source, but <strong>not available on F-Droid</strong>, again, this may be a deal breaker for you:<br> Island, ProtonMail, Signal, GitHub, Geometric Weather, Plex, Developer Assistant, Dev Tools<br> </span></p> </p> [QUICK-TIP] Git Submodules Alicia's Notes ๐Ÿš€ Wed, 02 Sep 2020 12:35:37 +0000 https://notes.aliciasykes.com/17996/quick-tip-git-submodules https://notes.aliciasykes.com/17996/quick-tip-git-submodules <p><p>In Git, a submodule is like a Git repository inside another Git repository. This can be useful for splitting work, or for including someone else's code within your project dynamically. </p> <p>As an example, see the <a href="https://github.com/duckduckgo/Android/tree/develop/submodules" rel="noopener nofollow" target="_blank">DuckDuckGo Android App</a> and the corresponding <a href="https://github.com/duckduckgo/Android/blob/develop/.gitmodules" rel="noopener nofollow" target="_blank">.gitmodules</a> file.</p> <h3>Quick Start</h3> <p>It's simple to add a submodule into your repository, with the following line:</p> <div class="highlight"><pre class="highlight plaintext"><code>git submodule add https://github.com/&lt;user&gt;/&lt;repo&gt; &lt;path/to/save/at&gt; </code></pre></div> <p>This will add a new file named <code class="prettyprint">.gitmodules</code> within your projects root, that included the path to the source repo, along with the destination of where within your project it should be mapped to.</p> <p>Note that to clone a repository along with it's sub modules, you must use the <code class="prettyprint">--recursive</code> option. Similarly, to update the code within the submodules, you will need to run <code class="prettyprint">git submodule update --init --recursive</code>.</p> <p>For example, here (in my <a href="https://github.com/Lissy93/dotfiles/blob/master/.gitmodules" rel="noopener nofollow" target="_blank">.gitmodules</a>) I am adding the dotbot repo into the root of my dotfiles project:</p> <div class="highlight"><pre class="highlight plaintext"><code>[submodule ".dotbot"] path = .dotbot url = https://github.com/anishathalye/dotbot </code></pre></div> <hr> <h3>Problems with Submodules</h3> <p>It's worth nothing, that this may work well for simple use cases, but would not be practical at all for referencing multiple packages. Usually a dependency management system (such as Cargo, NPM, RubyGems, Go Modules etc.) is a better solution. </p> <p>Git doesn't automatically download submodules after clone (unless you use the <code class="prettyprint">--recursive</code> flag), so if this is required for the project to run, you'll need to either document this, or add something into your build script to grab the submodules. Same goes for updates- submodules will not be fetched with a git pull, so <code class="prettyprint">git submodule update</code> needs to be run. </p> <p>There are also the potential security and stability issues this could cause, if you do not manage the repo being included. All in all, submodules are awesome, but for only a very particular use case.</p> <hr> <h3>Further Links</h3> <p>Example: <a href="https://github.com/duckduckgo/Android/tree/develop/submodules" rel="noopener nofollow" target="_blank">https://github.com/duckduckgo/Android/tree/develop/submodules</a><br> Git Documentation: <a href="https://git-scm.com/book/en/v2/Git-Tools-Submodules" rel="noopener nofollow" target="_blank">https://git-scm.com/book/en/v2/Git-Tools-Submodules</a><br> Git Module File Documentation: <a href="https://www.git-scm.com/docs/gitmodules" rel="noopener nofollow" target="_blank">https://www.git-scm.com/docs/gitmodules</a><br> Git Submodule Documentation: <a href="http://www.git-scm.com/docs/git-submodule" rel="noopener nofollow" target="_blank">http://www.git-scm.com/docs/git-submodule</a><br> GitModules File Documentation: <a href="https://www.git-scm.com/docs/gitmodules" rel="noopener nofollow" target="_blank">https://www.git-scm.com/docs/gitmodules</a><br> GitHub Modules: <a href="https://github.blog/2016-02-01-working-with-submodules" rel="noopener nofollow" target="_blank">https://github.blog/2016-02-01-working-with-submodules</a></p> </p> Introduction to Digital Privacy & Security ๐Ÿ” Alicia's Notes ๐Ÿš€ Thu, 13 Aug 2020 16:29:32 +0000 https://notes.aliciasykes.com/17371/introduction-to-digital-privacy-security https://notes.aliciasykes.com/17371/introduction-to-digital-privacy-security <p><p><strong>TLDR;</strong> Privacy is a fundamental right, and essential to democracy, liberty, and freedom of speech. Our privacy is being abused by governments (with mass-surveillance), corporations (profiting from selling personal data), and cyber criminals (stealing our poorly-secured personal data and using it against us). Security is needed in order to keep your private data private, and good digital security is critical to stay protected from the growing risks associated with the war on data.</p> <hr> <h2>What is Personal Data?</h2> <p>Personal data is any information that relates to an identified or identifiable living individual. Even data that has been de-identified or anonymized can often still be used to re-identify a person, especially when combined with a secondary data set.</p> <p>This could be sensitive documents (such as medical records, bank statements, card numbers, etc), or user-generated content (messages, emails, photos, search history, home CCTV, etc) or apparently trivial metadata (such as mouse clicks, typing patterns, time spent on each web page, etc)</p> <h2>How is Data Collected?</h2> <p>One of the most common data collection methods is web tracking. This is when websites use cookies, device fingerprints, and other methods to identify you, and follow you around the web. It is often done for advertising, analytics, and personalization. When aggregated together, this data can paint a very detailed picture of who you are.</p> <h2>How is Data Stored?</h2> <p>Data that has been collected is typically stored in databases on a server. These servers are rarely owned by the companies managing them, <a href="https://www.canalys.com/newsroom/global-cloud-market-Q3-2019" rel="noopener nofollow" target="_blank">56% of servers</a> are owned by Amazon AWS, Google Cloud, and Microsoft Azure. If stored correctly the data will be encrypted, and authentication required to gain access. However that usually isn't the case, and large data leaks <a href="https://selfkey.org/data-breaches-in-2019/" rel="noopener nofollow" target="_blank">occour almost dailey</a>. As well as that data breaches occur, when an adversary compromises a database storing personal data. In fact, you've probably already been caught up in a data breach (check your email, at <a href="https://haveibeenpwned.com" rel="noopener nofollow" target="_blank">have i been pwned</a>)</p> <h2>What is Personal Data Used For?</h2> <p>Data is collected, stored and used by governments, law enforcement, corporations and sometimes criminals:</p> <h3>Government Mass Surveillance</h3> <p>Intelligence and law enforcement agencies need surveillance powers to tackle serious crime and terrorism. However, since the Snowden revelations, we now know that this surveillance is not targeted at those suspected of wrongdoing- but instead the entire population. All our digital interactions are being logged and tracked by our very own governments.</p> <p>Mass surveillance is a means of control and suppression, it takes away our inerrant freedoms and breeds conformity. When we know we are being watched, we subconsciously change your behavior. A society of surveillance is just 1 step away from a society of submission.</p> <h3>Corporations</h3> <p>On the internet the value of data is high. Companies all want to know exactly who you are and what you are doing. They collect data, store it, use it and sometimes sell it on.</p> <p>Everything that each of us does online leaves a trail of data. These traces make up a goldmine of information full of insights into people on a personal level as well as a valuable read on larger cultural, economic and political trends. Tech giants (such as Google, Facebook, Apple, Amazon, and Microsoft) are leveraging this, building billion-dollar businesses out of the data that are interactions with digital devices create. We, as users have no guarantees that what is being collected is being stored securely, we often have no way to know for sure that it is deleted when we request so, and we don't have access to what their AI systems have refered from our data.</p> <p>Our computers, phones, wearables, digital assistants and IoT have been turned into tracking bugs that are plugged into a vast corporate-owned surveillance network. Where we go, what we do, what we talk about, who we talk to, and who we see โ€“ everything is recorded and, at some point, leveraged for value. They know us intimately, even the things that we hide from those closest to us. In our modern internet ecosystem, this kind of private surveillance is the norm.</p> <h3>Cybercriminals</h3> <p>Hackers and cybercriminals pose an ongoing and constantly evolving threat. With the ever-increasing amount of our personal data being collected and logged - we are more vulnerable to data breaches and identity fraud than ever before.</p> <p>In the same way, criminals will go to great lengths to use your data against you: either through holding it ransom, impersonating you, stealing money or just building up a profile on you and selling it on, to another criminal entity.</p> <hr> <h2>Why Data Privacy Matters</h2> <h4>Data Privacy and Freedom of Speech</h4> <p>Privacy is a fundamental right, and you shouldn't need to prove the necessity of fundamental right to anyone. As Edward Snowden said, "Arguing that you don't care about the right to privacy because you have nothing to hide is no different than saying you don't care about free speech because you have nothing to say". There are many scenarios in which privacy is crucial and desirable like intimate conversations, medical procedures, and voting. When we know we are being watched, our behavior changes, which in turn suppresses things like free speech.</p> <h4>Data Can Have Control Over You</h4> <p>Knowledge is power; Knowledge about you is power over you. Your information will be used to anticipate your actions and manipulate the way you shop, vote, and think. When you know you are being watched, you subconsciously change your behavior. Mass surveillance is an effective, means of fostering compliance with social norms or with social orthodoxy. Without privacy, you might be afraid of being judged by others, even if you're not doing anything wrong. It can be a heavy burden constantly having to wonder how everything we do will be perceived by others.</p> <h4>Data Can Be Used Against You</h4> <p>Your personal information and private communications can be "cherry-picked" to paint a certain one-sided picture. It can make you look like a bad person, or criminal, even if you are not. Data often results in people not being judged fairly- standards differ between cultures, organisations, and generations. Since data records are permanent, behavior that is deemed acceptable today, may be held against you tomorrow. Further to this, even things we don't think are worth hiding today, may later be used against us in unexpected ways.</p> <h4>Data Collection Has No Respect For Boundaries</h4> <p>Data collection has no respect for social boundaries, you may wish to prevent some people (such as employers, family or former partners) from knowing certain things about you. Once you share personal data, even with a party you trust, it is then out of your control forever, and at risk of being hacked, leaked or sold. An attack on our privacy, also hurts the privacy of those we communicate with.</p> <h4>Data Discriminates</h4> <p>When different pieces of your data is aggregated together, it can create a very complete picture of who you are. This data profile, is being used to influence decisions made about you: from insurance premiums, job prospects, bank loan eligibility and license decisions. It can determine whether we are investigated by the government, searched at the airport, or blocked from certain services. Even what content you see on the internet is affected by our personal data. This typically has a bigger impact on minority groups, who are unfairly judged the most. Without having the ability to know or control what, how, why and when our data is being used, we loose a level of control. One of the hallmarks of freedom is having autonomy and control over our lives, and we canโ€™t have that if so many important decisions about us are being made in the dark, without our awareness or participation.</p> <h4>The "I Have Nothing to Hide" Argument</h4> <p>Privacy isnโ€™t about hiding information; privacy is about protecting information, and everyone has information that theyโ€™d like to protect. Even with nothing to hide, you still put blinds on your window, locks on your door, and passwords on your email account.- Nobody would want their search history, bank statements, photos, notes or messages to be publicly available to the world.</p> <h4>Data Privacy needs to be for Everyone</h4> <p>For online privacy to be effective, it needs to be adopted my the masses, and not just the few. By exercising your right to privacy, you make it easier for others, such as activists and journalists, to do so without sticking out.</p> <hr> <h2>So What Should we Do?</h2> <ul> <li>Educate yourself about what's going on and why it matters</li> <li>Be aware of changes to policies, revelations, recent data breaches and related news</li> <li>Take steps to secure your online accounts and protect your devices</li> <li>Understand how to communicate privately, and how use the internet anonymously</li> <li>Use software and services that respect your privacy, and keep your data safe</li> <li>Support organisations that fight for your privacy and internet freedom</li> <li>Find a way to make your voice heard, and stand up for what you believe in</li> </ul> <hr> <p>Thanks for reading :)</p> <p>Recently I have been working on writing up a <a href="https://github.com/Lissy93/personal-security-checklist/blob/master/README.md" rel="noopener nofollow" target="_blank">checklist of privacy and security tips</a>, as well as a <a href="https://github.com/Lissy93/personal-security-checklist/blob/master/5_Privacy_Respecting_Software.md" rel="noopener nofollow" target="_blank">list of privacy-respecting software</a>. Both are hosted on GitHub, so that anyone can contribute to it: <a href="https://github.com/Lissy93/personal-security-checklist" rel="noopener nofollow" target="_blank">https://github.com/Lissy93/personal-security-checklist</a></p> </p> [HOW-TO] Remove all node_modules folders ๐Ÿ—‘๏ธ Alicia's Notes ๐Ÿš€ Sat, 01 Aug 2020 20:27:57 +0000 https://notes.aliciasykes.com/16988/how-to-remove-all-node_modules-folders https://notes.aliciasykes.com/16988/how-to-remove-all-node_modules-folders <p><p>Node Modules killing your hard drive space? Manually finding and removing is a pain, so here are some simple solutions</p> <h3>Option #1 - Natively</h3> <p>From your desired entry point, all you need to do, is run: </p> <div class="highlight"><pre class="highlight shell"><code><span class="nv">$ </span>find <span class="nb">.</span> <span class="nt">-name</span> <span class="s1">'node_modules'</span> <span class="nt">-type</span> d <span class="nt">-prune</span> <span class="nt">-print</span> <span class="nt">-exec</span> <span class="nb">rm</span> <span class="nt">-rf</span> <span class="s1">'{}'</span> <span class="se">\;</span> </code></pre></div> <p>โš ๏ธ <em>This will <b>delete</b> all nested node_modules directories, and their contents</em> โš ๏ธ</p> <p>If you'd first like to list of all <code class="prettyprint">node_modules</code> within your current directory, you can run:</p> <div class="highlight"><pre class="highlight shell"><code><span class="nv">$ </span>find <span class="nb">.</span> <span class="nt">-name</span> <span class="s2">"node_modules"</span> <span class="nt">-type</span> d <span class="nt">-prune</span> <span class="nt">-print</span> | xargs <span class="nb">du</span> <span class="nt">-chs</span> </code></pre></div> <p><em>This'll output the path, and total size of each occurrence of <code class="prettyprint">node_modules</code>, and finish of by showing to cumulative total size</em></p> <hr> <h3>Option #2 - NPKill</h3> <p><a href="https://npkill.js.org/" rel="noopener nofollow" target="_blank">NPKill</a> is a simple, yet effective package that finds and removes all node_modules folders within your system.</p> <p>After installing (with <code class="prettyprint">npm i -g npkill</code>), just run <code class="prettyprint">npkill</code> to start the CLI. From there you will be able to see all node_modules directories, along with their size and other meta data. You can then choose to delete them one-by-one, or all instances within certain parameters.</p> <div style="text-align: center;"> <img src="https://npkill.js.org/img/start%20search.gif" alt="Gif: Searching for all node_modules" style="width: 47%; display: inline-block; border-radius: 10px; box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);"> <img src="https://npkill.js.org/img/deleting.gif" alt="Gif: Deleting selected, or all node_modules" style="width: 47%; display: inline-block; border-radius: 10px; box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);"> </div> <hr> <h2>Note for Windows users</h2> <p>The above options are for Unix systems (Linux/ MacOS), if you need to do this natively, try the following commands, (thanks to <a href="https://winsmarts.com/delete-all-node-modules-folders-recursively-on-windows-edcc9a9c079e" rel="noopener nofollow" target="_blank">Sahil Malik</a>). </p> <p>View which folders will be deleted:</p> <div class="highlight"><pre class="highlight plaintext"><code>FOR /d /r . %d in (node_modules) DO @IF EXIST "%d" echo %d" </code></pre></div> <p>Initiate the Extermination:</p> <div class="highlight"><pre class="highlight plaintext"><code>FOR /d /r . %d in (node_modules) DO @IF EXIST "%d" rm -rf "%d" </code></pre></div> <hr> <p>Done ๐Ÿ˜€</p> </p> keep-mouse-movin.sh ๐Ÿ–ฑ๏ธ Alicia's Notes ๐Ÿš€ Sun, 26 Jul 2020 15:41:12 +0000 https://notes.aliciasykes.com/16818/keep-mouse-movin-sh https://notes.aliciasykes.com/16818/keep-mouse-movin-sh <p><p>Working remotley? Sick and tired of having to get out of bed every 20 minutes to move your mouse, to prevent Slack/ Skype/ Teams from showing your status as <code class="prettyprint">Away</code>? Well with a couple lines of bash, you can have your mouse pointer periodically move, ensureing your status will always remain <code class="prettyprint">Active</code>. Your boss will be none the wiser</p> <div class="highlight"><pre class="highlight shell"><code><span class="c"># LENGTH is the amount of px the mouse will move</span> <span class="c"># 0 = not moving at all, 1 = tiny movement, 100 = giant movement</span> <span class="nv">LENGTH</span><span class="o">=</span>50 <span class="c"># DELAY is the time period between movements, in seconds</span> <span class="nv">DELAY</span><span class="o">=</span>5 <span class="k">while </span><span class="nb">true </span><span class="k">do for </span>ANGLE <span class="k">in </span>0 90 180 270 <span class="k">do </span>xdotool mousemove_relative <span class="nt">--polar</span> <span class="nv">$ANGLE</span> <span class="nv">$LENGTH</span> <span class="nb">sleep</span> <span class="nv">$DELAY</span> <span class="k">done done</span> </code></pre></div> <p>The pointer will move around its current position on the screen (i.e where you last placed it). However, if you prefer it to move around the centre of the screen, just change <code class="prettyprint">mousemove_relative</code> to <code class="prettyprint">mousemove</code> in the <code class="prettyprint">xdotool</code> command.</p> <p><img src="https://media.giphy.com/media/Y0xzoLrs1bQAJWlhL7/giphy.gif" style="width: 180px; margin: 5px auto;"></p> </p> [HOW-TO] Compile & Install Software on Arch ๐Ÿ—๏ธ Alicia's Notes ๐Ÿš€ Sat, 25 Jul 2020 15:16:53 +0000 https://notes.aliciasykes.com/16801/how-to-compile-install-software-on-arch https://notes.aliciasykes.com/16801/how-to-compile-install-software-on-arch <p><p>Quick reference of the common commands, to install packages on Arch Linux <img src="https://emoji.gg/assets/emoji/4744_arch.png" style="display: inline; margin: 0; width: 22px;"></p> <h3>Option #1 - Pacman</h3> <p><em>If the app is availible through <a href="https://aur.archlinux.org" rel="noopener nofollow" target="_blank">AUR</a>, then you can simply use the <a href="https://wiki.archlinux.org/index.php/pacman" rel="noopener nofollow" target="_blank">pacman</a> package manager</em></p> <div class="highlight"><pre class="highlight shell"><code><span class="c">## Install</span> <span class="nv">$ </span><span class="nb">sudo </span>pacman <span class="nt">-S</span> <span class="o">{</span>package-name<span class="o">(</span>s<span class="o">)}</span> <span class="c">## Get Details</span> <span class="nv">$ </span>pacman <span class="nt">-Qi</span> <span class="o">{</span>package-name<span class="o">}</span> <span class="c">## Remove</span> <span class="nv">$ </span><span class="nb">sudo </span>pacman <span class="nt">-R</span> <span class="o">{</span>package-name<span class="o">}</span> </code></pre></div> <hr> <h3>Option #2 - Manually</h3> <p><em>Using the <a href="https://wiki.archlinux.org/index.php/Makepkg" rel="noopener nofollow" target="_blank">makepkg</a> script to build the package from source</em></p> <div class="highlight"><pre class="highlight shell"><code><span class="c">## 1. Get the code (E.g. from AUR, GitHub)</span> <span class="nv">$ </span>wget https://aur.archlinux.org/packages/<span class="o">{</span>package-name<span class="o">}</span>.tar.gz <span class="nv">$ </span><span class="nb">tar</span> <span class="nt">-xvzf</span> <span class="o">{</span>package-name<span class="o">}</span>.tar.gz <span class="nv">$ </span><span class="nb">cd</span> <span class="o">{</span>package-name<span class="o">}</span> <span class="c">## 2. Compile the package</span> <span class="nv">$ </span>makepkg <span class="nt">-s</span> <span class="c">## 3. Install the app</span> <span class="nv">$ </span><span class="nb">sudo </span>pacman <span class="nt">-U</span> <span class="k">*</span>xz </code></pre></div> <hr> <h3>Option #2 - from .deb</h3> <p><em>If only a .deb file is availible, you can convert it using <a href="https://github.com/helixarch/debtap" rel="noopener nofollow" target="_blank">debtap</a></em></p> <div class="highlight"><pre class="highlight shell"><code><span class="c">## 1. Get debtap (first time), and optionally create an alias</span> <span class="nv">$ </span>git clone https://github.com/helixarch/debtap <span class="nv">$ </span><span class="nb">alias </span><span class="nv">debtap</span><span class="o">=</span><span class="s1">'. .path/to/debtap'</span> <span class="c">## 1. Download the .deb package you wish to install, e.g.</span> <span class="nv">$ </span>git clone <span class="o">{</span>url-to-package.git<span class="o">}</span> <span class="nv">$ </span><span class="nb">cd</span> <span class="o">{</span>package-name<span class="o">}</span> <span class="c">## 3. Convert .deb to Arch package</span> <span class="nv">$ </span>debtap packagetoconvert.deb <span class="c">## 4. Install the converted package to system</span> <span class="nv">$ </span>debtap <span class="nt">-U</span> <span class="k">*</span> </code></pre></div> <hr> <h3>Usefull Info:</h3> <ul> <li>AUR Listings: <a href="https://aur.archlinux.org/" rel="noopener nofollow" target="_blank">https://aur.archlinux.org/</a></li> <li>Building Docs: <a href="https://wiki.archlinux.org/index.php/Makepkg" rel="noopener nofollow" target="_blank">https://wiki.archlinux.org/index.php/Makepkg</a></li> <li>PacMan Docs: <a href="https://wiki.archlinux.org/index.php/pacman" rel="noopener nofollow" target="_blank">https://wiki.archlinux.org/index.php/pacman</a></li> <li>For trouble shooting errors: <a href="https://dev.to/nabbisen/troubleshooting-around-installing-aur-packages-neg" rel="noopener nofollow" target="_blank">https://dev.to/nabbisen/troubleshooting-around-installing-aur-packages-neg</a></li> <li>Before installing check: licence, popularity, last updated, dependencies</li> </ul> </p> key-mirror.ts ๐Ÿชž Alicia's Notes ๐Ÿš€ Thu, 23 Jul 2020 17:31:03 +0000 https://notes.aliciasykes.com/16769/key-mirror-ts https://notes.aliciasykes.com/16769/key-mirror-ts <p><p><strong>A quick function to construct an enumeration which has keys the same as their value</strong></p> <p>This used to be part of React, but since it's now been removed (See commit: <a href="https://git.io/fjdWw" rel="noopener nofollow" target="_blank">#56f5115</a>), and some older packages throw an error without it, I've updated it, and uploading in case anyone else needs it while working with older React packages. A copy of React's original, JavaScript version can be found <a href="https://gist.github.com/Lissy93/acf635701bf5812431ec07d67d798095#file-react-key-mirror-js" rel="noopener nofollow" target="_blank">here</a>.</p> <div class="highlight"><pre class="highlight typescript"><code><span class="cm">/** * (C) Alicia Sykes &lt;https://aliciasykes.com&gt; * Licensed under MIT X11: https://git.io/Jew4i * * Constructs an enumeration with keys equal to their value. * @param {object} obj * @return {object} */</span> <span class="k">export</span> <span class="kd">function</span> <span class="nx">keyMirror</span><span class="p">(</span><span class="nx">originObj</span><span class="p">:</span> <span class="nx">object</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">originObj</span> <span class="o">!==</span> <span class="dl">'</span><span class="s1">object</span><span class="dl">'</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">'</span><span class="s1">keMirror(...): Argument must be an object</span><span class="dl">'</span><span class="p">);</span> <span class="kd">const</span> <span class="nx">obj</span><span class="p">:</span> <span class="kr">any</span> <span class="o">=</span> <span class="p">{};</span> <span class="k">for</span> <span class="p">(</span><span class="kd">const</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">originObj</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">originObj</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">key</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">obj</span> <span class="p">}</span> </code></pre></div></p> React Grid System โš›๏ธ Alicia's Notes ๐Ÿš€ Wed, 15 Jul 2020 17:01:24 +0000 https://notes.aliciasykes.com/16564/react-grid-system https://notes.aliciasykes.com/16564/react-grid-system <p><p>A simple React component for implementing responsive grid-based layouts, without any dependencies. It uses the native <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout" rel="noopener nofollow" target="_blank">CSS Grid Layout</a> properties to align elements into columns and rows. It is written in TypeScript as a Styled-Component for React or React Native projects.</p> <div class="highlight"><pre class="highlight typescript"><code><span class="cm">/* * Entry point for React grid system * React implementation of CSS grid layout written in TypeScript as a styled-component * Licensed under MIT - (C) Alicia Sykes 2020 &lt;https://aliciasykes.com&gt; */</span> <span class="c1">// FILE 1 - layout/index.ts</span> <span class="k">import</span> <span class="nx">Grid</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./Grid</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="nx">Cell</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./Cell</span><span class="dl">'</span><span class="p">;</span> <span class="k">export</span> <span class="p">{</span> <span class="nx">Grid</span><span class="p">,</span> <span class="nx">Cell</span> <span class="p">};</span> </code></pre></div><div class="highlight"><pre class="highlight typescript"><code><span class="c1">// FILE 2 - layout/cell.ts</span> <span class="k">import</span> <span class="nx">styled</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">styled-components</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">maxWidth</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@styles/media-queries</span><span class="dl">'</span><span class="p">;</span> <span class="kr">interface</span> <span class="nx">CellProps</span> <span class="p">{</span> <span class="nl">left</span><span class="p">?:</span> <span class="kr">number</span><span class="p">;</span> <span class="c1">// The horizontal starting position</span> <span class="nl">width</span><span class="p">?:</span> <span class="kr">number</span><span class="p">;</span> <span class="c1">// How many cells to span, horizontally</span> <span class="nl">top</span><span class="p">?:</span> <span class="kr">number</span><span class="p">;</span> <span class="c1">// The vertical starting position</span> <span class="nl">height</span><span class="p">?:</span> <span class="kr">number</span><span class="p">;</span> <span class="c1">// How many cells to span, vertically</span> <span class="nl">className</span><span class="p">?:</span> <span class="kr">string</span><span class="p">;</span> <span class="c1">// So Cell can optionally be used as a styled container</span> <span class="p">}</span> <span class="kd">const</span> <span class="nx">Cell</span> <span class="o">=</span> <span class="nx">styled</span><span class="p">.</span><span class="nx">div</span><span class="o">&lt;</span><span class="nx">CellProps</span><span class="o">&gt;</span><span class="s2">` </span><span class="p">${</span><span class="nx">props</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="kd">const</span> <span class="p">{</span> <span class="nx">left</span><span class="p">,</span> <span class="nx">width</span><span class="p">,</span> <span class="nx">top</span><span class="p">,</span> <span class="nx">height</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">props</span><span class="p">;</span> <span class="k">return</span> <span class="s2">` grid-column-start: </span><span class="p">${</span><span class="nx">left</span> <span class="o">||</span> <span class="dl">'</span><span class="s1">unset</span><span class="dl">'</span><span class="p">}</span><span class="s2">; grid-column-end: </span><span class="p">${</span><span class="nx">width</span> <span class="p">?</span> <span class="s2">`span </span><span class="p">${</span><span class="nx">width</span><span class="p">}</span><span class="s2">`</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">unset</span><span class="dl">'</span><span class="p">}</span><span class="s2">; grid-row-start: </span><span class="p">${</span><span class="nx">top</span> <span class="o">||</span> <span class="dl">'</span><span class="s1">unset</span><span class="dl">'</span><span class="p">}</span><span class="s2">; grid-row-end: </span><span class="p">${</span><span class="nx">height</span> <span class="p">?</span> <span class="s2">`span </span><span class="p">${</span><span class="nx">height</span><span class="p">}</span><span class="s2">`</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">unset</span><span class="dl">'</span><span class="p">}</span><span class="s2">; overflow-x: hidden; overflow-wrap: break-word; word-wrap: break-word; </span><span class="p">${</span><span class="nx">maxWidth</span><span class="p">.</span><span class="nx">tablet</span><span class="p">(</span><span class="s2">` // For tablet and above grid-column-start: unset; grid-row-start: unset; `</span><span class="p">)}</span><span class="s2">; `</span><span class="p">;</span> <span class="p">}}</span><span class="s2"> `</span><span class="p">;</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">Cell</span><span class="p">;</span> </code></pre></div><div class="highlight"><pre class="highlight typescript"><code><span class="c1">// FILE 3 - layout/grid.ts</span> <span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="nx">styled</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">styled-components</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">gridValues</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@styles/sizes</span><span class="dl">'</span><span class="p">;</span> <span class="k">import</span> <span class="p">{</span> <span class="nx">minWidth</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@styles/media-queries</span><span class="dl">'</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">GridWrapper</span> <span class="o">=</span> <span class="nx">styled</span><span class="p">.</span><span class="nx">div</span><span class="o">&lt;</span><span class="p">{</span> <span class="nx">columns</span><span class="p">?:</span> <span class="kr">number</span><span class="p">;</span> <span class="nl">gutterOutside</span><span class="p">?:</span> <span class="nx">boolean</span> <span class="p">}</span><span class="o">&gt;</span><span class="s2">` </span><span class="p">${({</span> <span class="nx">columns</span><span class="p">,</span> <span class="nx">gutterOutside</span> <span class="p">})</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="kd">const</span> <span class="p">{</span> <span class="nx">maxGridWidth</span><span class="p">,</span> <span class="nx">gutter</span><span class="p">,</span> <span class="nx">minRowHeight</span><span class="p">,</span> <span class="nx">minColWidth</span><span class="p">,</span> <span class="nx">numCols</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">gridValues</span><span class="p">(</span><span class="nx">columns</span><span class="p">);</span> <span class="kd">const</span> <span class="nx">desktop</span> <span class="o">=</span> <span class="nx">gridValues</span><span class="p">(</span><span class="nx">columns</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span> <span class="k">return</span> <span class="s2">` max-width: </span><span class="p">${</span><span class="nx">maxGridWidth</span><span class="p">}</span><span class="s2">; margin: 0 auto; display: grid; grid-gap: </span><span class="p">${</span><span class="nx">gutter</span><span class="p">}</span><span class="s2">; padding: 0 </span><span class="p">${</span><span class="nx">gutterOutside</span> <span class="p">?</span> <span class="nx">gutter</span> <span class="p">:</span> <span class="mi">0</span><span class="p">}</span><span class="s2"> grid-auto-rows: minmax(</span><span class="p">${</span><span class="nx">minRowHeight</span><span class="p">}</span><span class="s2">, auto); grid-template-columns: repeat(auto-fit, minmax(</span><span class="p">${</span><span class="nx">minColWidth</span><span class="p">}</span><span class="s2">, 1fr)); // For tablet and above </span><span class="p">${</span><span class="nx">minWidth</span><span class="p">.</span><span class="nx">tablet</span><span class="p">(</span><span class="s2">` grid-template-columns: repeat(</span><span class="p">${</span><span class="nx">numCols</span><span class="p">}</span><span class="s2">, 1fr); `</span><span class="p">)}</span><span class="s2">; // For desktop and above </span><span class="p">${</span><span class="nx">minWidth</span><span class="p">.</span><span class="nx">desktop</span><span class="p">(</span><span class="s2">` max-width: </span><span class="p">${</span><span class="nx">desktop</span><span class="p">.</span><span class="nx">maxGridWidth</span><span class="p">}</span><span class="s2">; grid-gap: </span><span class="p">${</span><span class="nx">desktop</span><span class="p">.</span><span class="nx">gutter</span><span class="p">}</span><span class="s2">; `</span><span class="p">)}</span><span class="s2"> `</span><span class="p">;</span> <span class="p">}}</span><span class="s2"> `</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">Grid</span><span class="p">:</span> <span class="nx">React</span><span class="p">.</span><span class="nx">FC</span><span class="o">&lt;</span><span class="p">{</span> <span class="nx">className</span><span class="p">?:</span> <span class="kr">string</span><span class="p">;</span> <span class="nl">columns</span><span class="p">?:</span> <span class="kr">number</span><span class="p">;</span> <span class="nl">gutterOutside</span><span class="p">?:</span> <span class="nx">boolean</span> <span class="p">}</span><span class="o">&gt;</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">className</span><span class="p">,</span> <span class="nx">columns</span><span class="p">,</span> <span class="nx">children</span><span class="p">,</span> <span class="nx">gutterOutside</span><span class="p">,</span> <span class="p">})</span> <span class="o">=&gt;</span> <span class="p">(</span> <span class="o">&lt;</span><span class="nx">GridWrapper</span> <span class="nx">className</span><span class="o">=</span><span class="p">{</span><span class="nx">className</span><span class="p">}</span> <span class="nx">columns</span><span class="o">=</span><span class="p">{</span><span class="nx">columns</span><span class="p">}</span> <span class="nx">gutterOutside</span><span class="o">=</span><span class="p">{</span><span class="nx">gutterOutside</span><span class="p">}</span><span class="o">&gt;</span> <span class="p">{</span><span class="nx">children</span><span class="p">}</span> <span class="o">&lt;</span><span class="sr">/GridWrapper</span><span class="err">&gt; </span><span class="p">);</span> <span class="k">export</span> <span class="k">default</span> <span class="nx">Grid</span><span class="p">;</span> </code></pre></div><div class="highlight"><pre class="highlight typescript"><code><span class="c1">// FILE 4 - layout/grid-dimensions.ts</span> <span class="nx">expoert</span> <span class="kd">const</span> <span class="nx">gridValues</span> <span class="o">=</span> <span class="p">(</span><span class="nx">columns</span> <span class="o">=</span> <span class="mi">12</span><span class="p">,</span> <span class="nx">colWidth</span> <span class="o">=</span> <span class="mi">8</span><span class="p">,</span> <span class="nx">gutterWidth</span> <span class="o">=</span> <span class="mi">2</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">({</span> <span class="na">maxGridWidth</span><span class="p">:</span> <span class="nx">sizeUnit</span><span class="p">(</span><span class="nx">columns</span> <span class="o">*</span> <span class="nx">colWidth</span> <span class="o">+</span> <span class="p">(</span><span class="nx">columns</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="nx">gutterWidth</span><span class="p">),</span> <span class="na">gutter</span><span class="p">:</span> <span class="nx">sizeUnit</span><span class="p">(</span><span class="nx">gutterWidth</span><span class="p">),</span> <span class="na">minRowHeight</span><span class="p">:</span> <span class="nx">sizeUnit</span><span class="p">(</span><span class="mi">5</span><span class="p">),</span> <span class="na">minColWidth</span><span class="p">:</span> <span class="nx">sizeUnit</span><span class="p">(</span><span class="nx">colWidth</span><span class="p">),</span> <span class="na">numCols</span><span class="p">:</span> <span class="nx">columns</span><span class="p">,</span> <span class="p">});</span> </code></pre></div> <style>.highlight{width:100%;}</style> </p> Fave YouTube Chanels ๐Ÿ“ผ Alicia's Notes ๐Ÿš€ Mon, 13 Jul 2020 14:31:25 +0000 https://notes.aliciasykes.com/16496/fave-youtube-chanels https://notes.aliciasykes.com/16496/fave-youtube-chanels <p><p><img src="https://i.ibb.co/185MLZq/youtube-channels-banner.png" title="Random selection of my recently watch channels"></p> <h3>Contents</h3> <ul> <li>๐Ÿ”จ Hardware/ Electronics/ DIY</li> <li>๐Ÿ” Cyber Security/ Privacy/ Hacking</li> <li>๐Ÿ’ฟ Linux / Servers / Sys Admin</li> <li>๐Ÿ‘ฉโ€๐Ÿ’ป Coding/ Algorithms/ Software Development</li> <li>๐Ÿ’ป Computer Science/ AI/ Machine Learning</li> <li>๐Ÿ“ฑ Technology/ PCs/ Consumer Electronics</li> <li>๐Ÿช™ Cryptocurrency / Blockchain / Fintech / Investment</li> <li>๐Ÿ‘พ Retro Computing / Gaming</li> <li>๐ŸŒ Internet Culture / Memes / Internet Mysteries/ Trolling Scammers</li> <li>๐Ÿช Astronomy / Space / Planetary Science</li> <li>๐Ÿงช Science/ Engineering/ Math</li> <li>โœ Bible/ Jesus/ Religion</li> <li>๐Ÿš… Trains / Maps / Travel</li> <li>๐Ÿƒโ€โ™‚๏ธ Motivational/ Lifestyle</li> <li>โ›บ Sports / Outdoors/ Street Running</li> <li>๐Ÿ–จ๏ธ 3D Printing</li> <li>๐Ÿ“š Tutorials / Courses</li> <li>๐ŸŒˆ Fun/ Sometimes Educational</li> <li>๐Ÿฆš Other Topics</li> <li>๐Ÿš“ True Crime</li> <li>๐Ÿ“บ Animations/ Cartoons</li> <li>๐Ÿ“ฝ๏ธ TV Shows</li> <li>๐ŸŽถ Music</li> <li>๐Ÿ—ณ๏ธ Misc</li> </ul> <h3>๐Ÿ”จ Hardware/ Electronics/ DIY</h3> <ul> <li><a href="https://www.youtube.com/channel/UCUQo7nzH1sXVpzL92VesANw" rel="noopener nofollow" target="_blank">DIYPerks</a> - Design and building electronic &amp; DIY projects, presented by Matthew Perks</li> <li><a href="https://www.youtube.com/channel/UC6mIxFTvXkWQVEHPsEdflzQ" rel="noopener nofollow" target="_blank">GreatScott</a> - Awesome Electronics Tutorials, Projects and How To's</li> <li><a href="https://www.youtube.com/channel/UCp_5PO66faM4dBFbFFBdPSQ" rel="noopener nofollow" target="_blank">Bitluni's Lab</a> - Entertaining electronics and IoT hacks</li> <li><a href="https://www.youtube.com/channel/UCvrLvII5oxSWEMEkszrxXEA" rel="noopener nofollow" target="_blank">N-O-D-E</a> - Awesome hardware security devices, and electronics</li> <li><a href="https://www.youtube.com/channel/UCFmjA6dnjv-phqrFACyI8tw" rel="noopener nofollow" target="_blank">Spacehuhn</a> - The legendary creator behind many hardware security products</li> <li><a href="https://www.youtube.com/channel/UCW6xlqxSY3gGur4PkGPEUeA" rel="noopener nofollow" target="_blank">Seytonic</a> - Hacking-related tutorials, diy projects and raspberry pi/ Arduino mods</li> <li><a href="https://www.youtube.com/c/ZackFreedman" rel="noopener nofollow" target="_blank">Zack Freedman</a> - Humorous guy, very knowledgeable about electronics, 3D Printing and building stuff</li> <li><a href="https://www.youtube.com/channel/UC3jc4X-kEq-dEDYhQ8QoYnQ" rel="noopener nofollow" target="_blank">DIY Machines</a> - Building easy to re-create machines with affordable components</li> <li><a href="https://www.youtube.com/c/AndreasSpiess" rel="noopener nofollow" target="_blank">Andreas Spiess</a> - Building small electronics IoT projects</li> <li><a href="https://www.youtube.com/channel/UC1HROb1JCteiftaWwq7Hhhg" rel="noopener nofollow" target="_blank">Grensom</a> - IoT and Raspberry Pi smart mirror projects</li> <li><a href="https://www.youtube.com/channel/UCtHaxi4GTYDpJgMSGy7AeSw" rel="noopener nofollow" target="_blank">Michael Reeves</a> - Building robots that do dumb but really smart stuff</li> <li><a href="https://www.youtube.com/c/mitxela" rel="noopener nofollow" target="_blank">Mitxela</a> - Small maker with some really awesome projects about electronics, synthesizers, and other neat things</li> <li><a href="https://www.youtube.com/channel/UCafxR2HWJRmMfSdyZXvZMTw" rel="noopener nofollow" target="_blank">Look Mum no Computer</a> - Electronic music creation with low level computers</li> <li><a href="https://www.youtube.com/channel/UCFJibhZ9FOjbsZIr6AxR0AQ" rel="noopener nofollow" target="_blank">Learn Embedded Systems</a> - Tutorials on programming basic electronics</li> <li><a href="https://www.youtube.com/channel/UCtM5z2gkrGRuWd0JQMx76qA" rel="noopener nofollow" target="_blank">BigCliveDotCom</a> - Reviews and experimentation with cheap Chinese components</li> </ul> <p>Also: <a href="https://www.youtube.com/channel/UCe1Aj6VEO299Yq4WkXdoD3Q" rel="noopener nofollow" target="_blank">Alexandre Chappel</a>, <a href="https://www.youtube.com/c/simonegiertz" rel="noopener nofollow" target="_blank">Simone Giertz</a></p> <h3>๐Ÿ” Cyber Security/ Privacy/ Hacking</h3> <ul> <li><a href="https://www.youtube.com/channel/UCW6MNdOsqv2E9AjQkv9we7A" rel="noopener nofollow" target="_blank">PwnFunction</a> - Animated computer security issues</li> <li><a href="https://www.youtube.com/channel/UCgTNupxATBfWmfehv21ym-g" rel="noopener nofollow" target="_blank">Null Byte</a> - Pentesting, Ethical hacking, Linux</li> <li><a href="https://www.youtube.com/channel/UClcE-kVhqyiHCcjYwcpfj9w" rel="noopener nofollow" target="_blank">LiveOverflow</a> - CFT walkthroughs, security and hacking</li> <li><a href="https://www.youtube.com/channel/UC3s0BtrBJpwNDaflRSoiieQ" rel="noopener nofollow" target="_blank">Hak5</a> - The makers of the Rubber Ducky, Bash Bunny and other awesome gadgets</li> <li><a href="https://www.youtube.com/channel/UCjr2bPAyPV7t35MvcgT3W8Q" rel="noopener nofollow" target="_blank">The Hated One</a> - Anti-censorship and privacy videos</li> <li><a href="https://www.youtube.com/c/JohnHammond010" rel="noopener nofollow" target="_blank">John Hammond</a> - CTF walk-throughs and pentesting tutorials</li> <li><a href="https://www.youtube.com/c/Techlore" rel="noopener nofollow" target="_blank">Techlore</a> - Privacy &amp; Security Tutorials for the masses, and VPN Reviews</li> <li><a href="https://www.youtube.com/c/HackerSploit/featured" rel="noopener nofollow" target="_blank">HackerSploit</a> - Pen Testing, Hacking and Security Tutorials + Walk throughs</li> <li><a href="https://www.youtube.com/c/SunKnudsen" rel="noopener nofollow" target="_blank">Sun Knudsen</a> - Short privacy-related tutorials, from a small security researcher</li> <li><a href="https://www.youtube.com/c/MentalOutlaw" rel="noopener nofollow" target="_blank">Mental Outlaw</a> - Online privacy, Linux, security, crypto and memes</li> <li><a href="https://www.youtube.com/channel/UCXJWKuGh0qedrYviGEJmlWw" rel="noopener nofollow" target="_blank">Tom Spark Reviews</a> - A guy who reviews privacy products</li> </ul> <h3>๐Ÿ’ฟ Linux / Servers / Sys Admin</h3> <ul> <li><a href="https://www.youtube.com/channel/UCOk-gHyjcWZNj3Br4oxwh0A" rel="noopener nofollow" target="_blank">Techno Tim</a> - Well explained basic home server applications</li> <li><a href="https://www.youtube.com/channel/UCsnGwSIHyoYN0kiINAGUKxg" rel="noopener nofollow" target="_blank">Wolfgang's Channel</a> - Self-hosting, Linux, Privacy, Security and keyboards</li> <li><a href="https://www.youtube.com/user/NetworkChuck" rel="noopener nofollow" target="_blank">Network Chuck</a> - Networking, Security and Certifications</li> <li><a href="https://www.youtube.com/user/JtheLinuxguy" rel="noopener nofollow" target="_blank">LearnLinuxTV</a> - Linux tutorials and distro reviews (sometimes a bit slow, and basic)</li> <li><a href="https://www.youtube.com/c/LukeSmithxyz" rel="noopener nofollow" target="_blank">Luke Smith</a> - Terminal tricks, Linux apps, Arch Linux stuff and chat</li> <li><a href="https://youtube.com/c/JeffGeerling" rel="noopener nofollow" target="_blank">Jeff Geerling</a> - Raspberry Pi, Sys Admin and other tech stuff</li> <li><a href="https://www.youtube.com/c/NovaspiritTech" rel="noopener nofollow" target="_blank">Novaspirit Tech</a> - Small Raspberry Pi home server projects, but quite basic</li> <li><a href="https://www.youtube.com/c/DBTechYT" rel="noopener nofollow" target="_blank">DB Tech</a> - Self-Hosted services and homelabs</li> <li><a href="https://www.youtube.com/channel/UCB2TRuFjwgWdbHEaGHP1kfw" rel="noopener nofollow" target="_blank">Byte my Bits</a> - Videos about Plex, and occasionally other homelab stuff</li> <li><a href="https://www.youtube.com/channel/UCp3yVOm6A55nx65STpm3tXQ" rel="noopener nofollow" target="_blank">Craft Computing</a> - Networking, gaming hardware, graphics, Raspberry Pi, PCs</li> <li><a href="https://www.youtube.com/c/Tinkernut" rel="noopener nofollow" target="_blank">Tinkernut</a> - Raspberry Pis, networking, basic hacking and communications</li> </ul> <h3>๐Ÿ‘ฉโ€๐Ÿ’ป Coding/ Algorithms/ Software Development</h3> <ul> <li><a href="https://www.youtube.com/channel/UC9-y-6csu5WGm29I7JiwpnA" rel="noopener nofollow" target="_blank">Computerphile</a> - Detailed introductions to algorithms, data structures and architecture</li> <li><a href="https://www.youtube.com/channel/UCnxrdFPXJMeHru_b4Q_vTPQ" rel="noopener nofollow" target="_blank">Simply Explained</a> - Simply explaining many computer topics</li> <li><a href="https://www.youtube.com/user/thenewboston" rel="noopener nofollow" target="_blank">The New Boston</a> - An original internet legend, beginner-friendly tutorials in a laid-back style</li> <li><a href="https://www.youtube.com/channel/UCZUyPT9DkJWmS_DzdOi7RIA" rel="noopener nofollow" target="_blank">Caleb Curry</a> - Complete coding courses, simply explained, Python, Java, C++, Crypto + more</li> <li><a href="https://www.youtube.com/c/TheNetNinja" rel="noopener nofollow" target="_blank">The Net Ninja</a> - Easy to follow web development tutorials</li> <li><a href="https://www.youtube.com/c/Fireship" rel="noopener nofollow" target="_blank">FireShip</a> - Web Development Coding Snippets, Tutorials and Tricks</li> <li><a href="https://www.youtube.com/c/Freecodecamp/" rel="noopener nofollow" target="_blank">Free Code Camp</a> - High quality programming tutorials</li> <li><a href="https://www.youtube.com/c/DevTipsForDesigners" rel="noopener nofollow" target="_blank">DevTips</a> - Show web development tips and some introductory tutorials </li> <li><a href="https://www.youtube.com/channel/UC9x4yW2SIoX4-2eaDvqP0iA" rel="noopener nofollow" target="_blank">Mathew Rayfield</a> - Builds short, pointless but funny web projects</li> <li><a href="https://www.youtube.com/channel/UCLXAviTgz5MuJrR_rbLGNWg" rel="noopener nofollow" target="_blank">Federico Terzi</a> - Short videos about Rust, coding and keyboard productivity (creator of Espanso)</li> <li><a href="https://www.youtube.com/channel/UCdngmbVKX1Tgre699-XLlUA" rel="noopener nofollow" target="_blank">TechWorld with Nana</a> - DevOps Simply Explained</li> </ul> <h3>๐Ÿ’ป Computer Science/ Blockchain/ AI/ Machine Learning</h3> <ul> <li><a href="https://www.youtube.com/channel/UC0e3QhIYukixgh5VVpKHH9Q" rel="noopener nofollow" target="_blank">Code Bullet</a> - Building epic AI projects, and training AI to play games</li> <li><a href="https://www.youtube.com/jordanharrod" rel="noopener nofollow" target="_blank">Jordan Harrod</a> - Interesting videos about how we interact with AI, from a Harvard MIT PhD Student</li> </ul> <h3>๐Ÿ“ฑ Technology/ PCs/ Consumer Electronics</h3> <ul> <li><a href="https://www.youtube.com/user/marquesbrownlee" rel="noopener nofollow" target="_blank">Marques Brownlee</a> - Quality, Trustworthy reviews and analysis of the latest tech</li> <li><a href="https://www.youtube.com/channel/UChIZGfcnjHI0DG4nweWEduw" rel="noopener nofollow" target="_blank">TechSource</a> - Setup Wars &amp; Cool PC Builds</li> <li><a href="https://www.youtube.com/user/LinusTechTips" rel="noopener nofollow" target="_blank">Linus Tech Tips</a> - No description needed</li> <li><a href="https://www.youtube.com/c/Dave2D" rel="noopener nofollow" target="_blank">Dave Lee</a> - Videos about smart phones, laptops and tech gadgets</li> <li><a href="https://www.youtube.com/channel/UC4Z8mPYjn6Dhr6n531YDh0Q" rel="noopener nofollow" target="_blank">UFD Tech</a> - News and Reviews of PC Components</li> <li><a href="https://www.youtube.com/channel/UCwOBG77Tm8cE24FPxHb_abw" rel="noopener nofollow" target="_blank">Smart Home Solver</a> - Home Automation Ideas, How-To's and Reviews</li> <li><a href="https://www.youtube.com/c/Mrwhosetheboss" rel="noopener nofollow" target="_blank">Mrwhosetheboss</a> - Smart phone reviews and discussions</li> <li><a href="https://www.youtube.com/c/DankPods/" rel="noopener nofollow" target="_blank">DankPods</a> - Audiophile reviews and mods</li> <li><a href="https://www.youtube.com/c/ByteReview/" rel="noopener nofollow" target="_blank">Byte Review</a> - Reviews of mainstream tech, from a small creator</li> <li><a href="https://www.youtube.com/c/SquashyBoy/" rel="noopener nofollow" target="_blank">SquashyBoy</a> - Mechanical keyboards and stuff</li> <li><a href="https://www.youtube.com/c/ThrillSeekerVR/" rel="noopener nofollow" target="_blank">ThrillSeekerVR</a> - Virtual reality stuff</li> <li><a href="https://www.youtube.com/c/HipyoTech" rel="noopener nofollow" target="_blank">Hipyo Tech</a> - Cool mechanical keyboard stuff</li> </ul> <h3>๐Ÿช™ Cryptocurrency / Blockchain / Fintech / Investment</h3> <ul> <li><a href="https://www.youtube.com/c/CoinBureau" rel="noopener nofollow" target="_blank">Coin Bureau</a> - Information about crypto and earning through staking</li> <li><a href="https://www.youtube.com/c/Finematics/" rel="noopener nofollow" target="_blank">Finematics</a> - Videos about the math behind DeFi, very informative. Slightly annoying accent, but great content</li> <li><a href="https://www.youtube.com/channel/UCRvqjQPSeaWn-uEx-w0XOIg" rel="noopener nofollow" target="_blank">Benjamin Cowen</a> - Great, unbiased technical analysis over long timelines</li> <li><a href="https://www.youtube.com/channel/UCJgHxpqfhWEEjYH9cLXqhIQ" rel="noopener nofollow" target="_blank">Digital Asset News</a> - Daily news on crypto markets and trends</li> <li><a href="https://www.youtube.com/channel/UC4fg8o6oUkkZDLaC6eAZKwQ" rel="noopener nofollow" target="_blank">Heresy Financial</a> - Explaining traditional finance, in order to understand modern finance</li> <li><a href="https://www.youtube.com/channel/UCFIioyI1rBmv7A4Nn6xhu-A" rel="noopener nofollow" target="_blank">Legal Briefs</a> - Everything you need to know about the legal side of crypto, and regulations</li> <li><a href="https://www.youtube.com/user/aantonop" rel="noopener nofollow" target="_blank">Aantonop</a> - Long-form videos all about BitCoin and technical stuff</li> <li><a href="https://www.youtube.com/channel/UCjpkwsuHgYx9fBE0ojsJ_-w" rel="noopener nofollow" target="_blank">Thinking Crypto</a> - Interviews with big players in the crypto space, and some crypto news</li> <li><a href="https://www.youtube.com/channel/UC0zGwzu0zzCImC1BwPuWyXQ" rel="noopener nofollow" target="_blank">Bob Loukas</a> - Long-form technical analysis videos (play on 2x speed)</li> <li><a href="https://www.youtube.com/c/TheCryptoBubble/" rel="noopener nofollow" target="_blank">Lil Bubble</a> - Crypto memes and parody songs</li> <li><a href="https://www.youtube.com/c/EdsFinanceCorner" rel="noopener nofollow" target="_blank">Eds Finance Corner</a> - British finance, investing and cryptocurrency channel</li> <li><a href="https://www.youtube.com/channel/UCFCEuCsyWP0YkP3CZ3Mr01Q" rel="noopener nofollow" target="_blank">Plain Bagel</a> - Finance and investing analysis</li> <li><a href="https://www.youtube.com/channel/UCL0J4MLEdLP0-UyLu0hCktg" rel="noopener nofollow" target="_blank">The Defiant</a> - Variety of content, from interviews, educational content and podcasts</li> <li><a href="https://www.youtube.com/c/DividendBull" rel="noopener nofollow" target="_blank">Dividend Bull</a> - Channel dedicated to high yielding dividend investments</li> </ul> <h3>๐Ÿ‘พ Retro Computing / Gaming</h3> <ul> <li><a href="https://www.youtube.com/user/adric22" rel="noopener nofollow" target="_blank">The 8-Bit Guy</a> - Exploring the inner workings of tech from the 80's, 90's and 2000's</li> <li><a href="https://www.youtube.com/channel/UCjFaPUcJU1vwk193mnW_w1w" rel="noopener nofollow" target="_blank">Modern Vintage Gamer</a> - Retro gaming and the homebrew community</li> <li><a href="https://www.youtube.com/c/ETAPRIME" rel="noopener nofollow" target="_blank">ETA Prime</a> - Handheld, console and Raspberry Pi emulation and other tech stuff</li> <li><a href="https://www.youtube.com/user/XboxAhoy" rel="noopener nofollow" target="_blank">Ahoy</a> - Nicely produced videos about modern gaming</li> <li><a href="https://www.youtube.com/channel/UCIabPXjvT5BVTxRDPCBBOOQ" rel="noopener nofollow" target="_blank">Dani</a> - Game developer</li> <li><a href="https://www.youtube.com/c/RobertThomsonDev" rel="noopener nofollow" target="_blank">Robert Thomson Dev</a> - Game dev</li> </ul> <h3>๐ŸŒ Internet Culture / Memes / Historical Internet Mysteries/ Fighting Internet Scammers</h3> <ul> <li><a href="https://www.youtube.com/c/BarelySociable" rel="noopener nofollow" target="_blank">Barely Sociable</a> - Analysis of internet mysteries</li> <li><a href="https://www.youtube.com/channel/UCR1D15p_vdP3HkrH8wgjQRw" rel="noopener nofollow" target="_blank">Internet Historian</a> - Memes and the history of various internet memes</li> <li><a href="https://www.youtube.com/channel/UCg4vDcovXPJTcTcYxQ9iCrw" rel="noopener nofollow" target="_blank">WavyWebSurf</a> - Covering past and present internet stories</li> <li><a href="https://www.youtube.com/c/PleasantGreen" rel="noopener nofollow" target="_blank">Pleasant Green</a> - Guy who likes talking to Nigerian scammers </li> <li><a href="https://www.youtube.com/channel/UCBNG0osIBAprVcZZ3ic84vw" rel="noopener nofollow" target="_blank">Jim Browning</a> - The ultimate bad-ass scam baiter</li> <li><a href="https://www.youtube.com/channel/UCgmI-uiLLAg--vDe7FFdekA" rel="noopener nofollow" target="_blank">Slightly Sociable</a> - Mysteries and analysis of scams and stuff</li> <li><a href="https://www.youtube.com/channel/UCf5POn4NNKIIGmXOu6qhbsQ" rel="noopener nofollow" target="_blank">Inside a Mind</a> - Mysteries from around the Internet</li> <li><a href="https://www.youtube.com/c/Nexpo" rel="noopener nofollow" target="_blank">Nexpo</a> - Videos focused on dark stories from around the internet</li> <li><a href="https://www.youtube.com/channel/UCaGOgwGKnDVOKY0DrFsBAiA" rel="noopener nofollow" target="_blank">Scare Theater</a> - The discussion of slightly scary things</li> <li><a href="https://www.youtube.com/channel/UCchWU8ta6L-Dy3rGIxPINzw" rel="noopener nofollow" target="_blank">ReignBot</a></li> <li><a href="https://www.youtube.com/c/tamago2474" rel="noopener nofollow" target="_blank">tamago2474</a> - Games, internet stuff and things</li> </ul> <h3>๐Ÿช Astronomy / Space / Planetary Science</h3> <ul> <li><a href="https://www.youtube.com/channel/UCYNbYGl89UUowy8oXkipC-Q" rel="noopener nofollow" target="_blank">Dr. Becky</a> - Space news and concepts explained by a friendly astrophysicist<br></li> <li><a href="https://www.youtube.com/user/DeepSkyVideos" rel="noopener nofollow" target="_blank">DeepSkyVideos</a> - Videos exporing deep space objects</li> <li><a href="https://www.youtube.com/user/sixtysymbols" rel="noopener nofollow" target="_blank">Sixty Symbols</a> - Physics and Astronomy videos, with a focus on Symbols</li> <li><a href="https://www.youtube.com/c/NASA" rel="noopener nofollow" target="_blank">NASA</a> - The official NASA Channel and Live Stream</li> <li><a href="https://www.youtube.com/user/VideoFromSpace" rel="noopener nofollow" target="_blank">Space.com</a> - The latest space exploration news and info</li> <li><a href="https://www.youtube.com/vintagespace" rel="noopener nofollow" target="_blank">The Vintage Space</a> - All about the history of spaceflight</li> </ul> <h3>๐Ÿงช Science/ Engineering/ Math</h3> <ul> <li><a href="https://www.youtube.com/user/onemeeeliondollars" rel="noopener nofollow" target="_blank">Mark Robber</a> - Awesome science videos, from an ex-NASA engineer</li> <li><a href="https://www.youtube.com/c/PracticalEngineeringChannel" rel="noopener nofollow" target="_blank">Practical Engineering</a> - Engineering concepts explained visually with mini experiments</li> <li><a href="https://www.youtube.com/channel/UCSju5G2aFaWMqn-_0YBtq5A" rel="noopener nofollow" target="_blank">Stand-Up Maths</a> - Maths-related topics, by Matt Parker, sometimes funny too</li> <li><a href="https://www.youtube.com/user/1veritasium" rel="noopener nofollow" target="_blank">Veritasium</a> - Really interesting science videos</li> <li><a href="https://www.youtube.com/channel/UCtwKon9qMt5YLVgQt1tvJKg" rel="noopener nofollow" target="_blank">Objectivity</a> - Videos about ancient science treasures</li> <li><a href="https://www.youtube.com/user/steventhebrave" rel="noopener nofollow" target="_blank">Steve Mould</a> - Science videos (he's also one of the presenters on a Podcast of Unnecessary Detail)</li> <li><a href="https://www.youtube.com/c/TheBackyardScientist" rel="noopener nofollow" target="_blank">The Backyard Scientist</a> - Cool science experiments, done in his backyard</li> <li><a href="https://www.youtube.com/user/minutephysics/" rel="noopener nofollow" target="_blank">Minute Physics</a> - Animated, interesting physics principles</li> <li><a href="https://www.youtube.com/c/DomainofScience" rel="noopener nofollow" target="_blank">Domain of Science</a> - Maths and Physics</li> <li><a href="https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw" rel="noopener nofollow" target="_blank">3Blue1Brown</a> - Lots of maths concepts, beautifully detailed</li> <li><a href="https://www.youtube.com/channel/UC_1lGqsvho7SLdxsN7dRwaw" rel="noopener nofollow" target="_blank">Better Explained</a> - Clear and well explained math concepts</li> <li><a href="https://www.youtube.com/user/numberphile" rel="noopener nofollow" target="_blank">NumberPhile</a> - Videos about Numbers</li> <li><a href="https://www.youtube.com/user/standupmaths" rel="noopener nofollow" target="_blank">Stand-up Maths</a> - Maths from real-world scenarios and the news</li> <li><a href="https://www.youtube.com/channel/UCV5vCi3jPJdURZwAOO_FNfQ" rel="noopener nofollow" target="_blank">The Thought Emporium</a> - From biohacking and biology, to nuclear physics and nanotech</li> <li><a href="https://www.youtube.com/c/TechnologyConnections" rel="noopener nofollow" target="_blank">Technology Connections</a> - The science behind how everyday things actually work</li> </ul> <h3>โœ Bible/ Jesus/ Religion</h3> <ul> <li><a href="https://www.youtube.com/channel/UCVfwlh9XpX2Y_tQfjeln9QA" rel="noopener nofollow" target="_blank">Bible Project</a> - Overview of how an entire chapter fits together</li> <li><a href="https://www.youtube.com/user/bibledex" rel="noopener nofollow" target="_blank">BibleDex</a> - Short videos about verses from the Bible</li> </ul> <h3>๐Ÿš… Trains</h3> <ul> <li><a href="https://www.youtube.com/user/geofftech2" rel="noopener nofollow" target="_blank">Geoff Marshall</a></li> <li><a href="https://www.youtube.com/channel/UCcHuNKYzVMc06FXqsBEAV3A" rel="noopener nofollow" target="_blank">Jago Hazzard</a></li> </ul> <h3>๐Ÿƒโ€โ™‚๏ธ Motivational/ Lifestyle</h3> <ul> <li><a href="https://www.youtube.com/c/BetterIdeas" rel="noopener nofollow" target="_blank">Better Ideas</a></li> <li><a href="https://www.youtube.com/c/MattDAvella" rel="noopener nofollow" target="_blank">Matt D'Avella</a></li> <li><a href="https://www.youtube.com/c/aliabdaal" rel="noopener nofollow" target="_blank">Ali Abdaal</a></li> <li><a href="https://www.youtube.com/c/nathanieldrewofficial" rel="noopener nofollow" target="_blank">Nathaniel Drew</a></li> </ul> <h3>โ›บ Sports / Outdoors/ Street Running</h3> <ul> <li><a href="https://www.youtube.com/c/shiey" rel="noopener nofollow" target="_blank">Shiey</a> Illegal Freedom - Train surfing, urban exploring and climbing</li> <li><a href="https://www.youtube.com/channel/UC88oKpyXNid09t1m_PZlvfQ" rel="noopener nofollow" target="_blank">DyingLlama</a> - Some epic street climbs</li> <li><a href="https://www.youtube.com/user/harrymain/" rel="noopener nofollow" target="_blank">Harry Main</a> - Mountain Biking Stuff</li> <li><a href="https://www.youtube.com/c/AlfieAesthetics/" rel="noopener nofollow" target="_blank">AlfieAesthetics</a> - Outdoor survival tips, comedic guy</li> <li><a href="https://www.youtube.com/user/thebodycoach1" rel="noopener nofollow" target="_blank">The Body Coach TV</a> - Joe Wicks, home workout videos from a British icon</li> <li><a href="https://www.youtube.com/c/MrDeified" rel="noopener nofollow" target="_blank">MrDeified</a> - Scary true stories about divers, cavers, etc</li> <li><a href="https://www.youtube.com/c/MrDeified/" rel="noopener nofollow" target="_blank">MrDeified</a> - Parkour and climbing tall things</li> </ul> <h3>๐Ÿ–จ๏ธ 3D Printing</h3> <ul> <li><a href="https://www.youtube.com/user/ThomasSanladerer" rel="noopener nofollow" target="_blank">Thomas Sanladerer</a> - All kinds of 3D printing content</li> <li><a href="https://www.youtube.com/channel/UCqfMW0tMZEciSXQym8x0EoQ" rel="noopener nofollow" target="_blank">Proper Printing</a></li> </ul> <h3>๐Ÿ“š Tutorials</h3> <ul> <li><a href="https://www.youtube.com/channel/UCEQXp_fcqwPcqrzNtWJ1w9w" rel="noopener nofollow" target="_blank">Logos By Nick</a> - Inkscape and GIMP Tutorials</li> <li><a href="https://www.youtube.com/user/ThomasSanladerer" rel="noopener nofollow" target="_blank">Thomas Sanladerer</a> - 3D Printing Tutorials, from beginner to advanced</li> <li><a href="https://www.youtube.com/c/Brackeys/" rel="noopener nofollow" target="_blank">Brackeys</a> - Game Dev Tutorials in Unity and C#</li> <li><a href="https://www.youtube.com/channel/UCNYL0ZF2j8-OSGZ4iHBLNPA" rel="noopener nofollow" target="_blank">d3Vienno</a> - A bit dated now, but still one of the best beginner D3.js tutorials out there </li> </ul> <h3>๐Ÿฆš Other Topics</h3> <ul> <li><a href="https://www.youtube.com/user/ProfessorShoelace" rel="noopener nofollow" target="_blank">Professor Shoelace</a> - Ian off of the legendary <a href="https://www.fieggen.com/shoelace/index.htm" rel="noopener nofollow" target="_blank">Ian's Shoelaces</a>, explaining cool ways to tie your laces</li> <li><a href="https://www.youtube.com/channel/UCm9K6rby98W8JigLoZOh6FQ" rel="noopener nofollow" target="_blank">Lock Picking Lawyer</a> - Short videos where he just picks lots of locks</li> <li><a href="https://www.youtube.com/channel/UCd0ZD4iCXRXf18p3cA7EQfg" rel="noopener nofollow" target="_blank">Taran Van Hemert</a> - King of macros, creator a the ultimate video editing course</li> <li><a href="https://www.youtube.com/channel/UC88tlMjiS7kf8uhPWyBTn_A" rel="noopener nofollow" target="_blank">Captain Joe</a> - Everything you've ever wanted to ask a Pilot of a Boeing 787</li> <li><a href="https://www.youtube.com/c/HamRadioCrashCourse" rel="noopener nofollow" target="_blank">Ham Radio Crash Course</a> - Videos about various SDRs and other transmitting things</li> <li><a href="https://www.youtube.com/c/NileRed" rel="noopener nofollow" target="_blank">NileRed</a> - Interesting Chemistry experiments</li> </ul> <h3>๐ŸŒˆ Fun/ Sometimes Educational</h3> <ul> <li><a href="https://www.youtube.com/channel/UC4QZ_LsYcvcq7qOsOhpAX4A" rel="noopener nofollow" target="_blank">ColdFusion</a> - High quality documentaries about science, technology, business and more</li> <li><a href="https://www.youtube.com/user/CGPGrey" rel="noopener nofollow" target="_blank">CGP Grey</a> - Engaging and unique videos covering history, politics, science, people and the world</li> <li><a href="https://www.youtube.com/channel/UCbbQalJ4OaC0oQ0AqRaOJ9g" rel="noopener nofollow" target="_blank">Jay Foreman</a> - The comedian and creator of Map Men, Unfinished London and Politics Unboringed</li> <li><a href="https://www.youtube.com/c/OrdinaryThings" rel="noopener nofollow" target="_blank">Ordinary Things</a> - Ironic explanations of everyday stuff</li> <li><a href="https://www.youtube.com/channel/UCHsRtomD4twRf5WVHHk-cMw" rel="noopener nofollow" target="_blank">TierZoo</a> - The World explained as if it were a video game</li> <li><a href="https://www.youtube.com/channel/UCRcgy6GzDeccI7dkbbBna3Q" rel="noopener nofollow" target="_blank">Lemmino</a> - Top 10 facts, internet mysteries and interesting things</li> <li><a href="https://www.youtube.com/c/Tapakapa" rel="noopener nofollow" target="_blank">Tapakapa</a> - Friendly stick man giving you interesting facts about the world </li> <li><a href="https://www.youtube.com/channel/UC1DTYW241WD64ah5BFWn4JA" rel="noopener nofollow" target="_blank">Sam O'Nella Academy</a> - Slightly educational, funny videos</li> <li><a href="https://www.youtube.com/user/colinfurze" rel="noopener nofollow" target="_blank">Collin Furze</a> - Crazy back yard inventions and often fire </li> <li><a href="https://www.youtube.com/channel/UCajXeitgFL-rb5-gXI-aG8Q" rel="noopener nofollow" target="_blank">Great Big Story</a> - Amazing People, doing Improbable Things </li> <li><a href="https://www.youtube.com/channel/UCIRiWCPZoUyZDbydIqitHtQ" rel="noopener nofollow" target="_blank">Mike Boyd</a> - A guy who learns a new skill every week or so</li> <li><a href="https://www.youtube.com/user/willunicycleforfood" rel="noopener nofollow" target="_blank">exurba</a> - Videos that make you think, from the meaning of life to physics mysteries </li> <li><a href="https://www.youtube.com/c/austinmcconnell" rel="noopener nofollow" target="_blank">Austin McConnell</a> - Random, slightly funny videos from a film maker </li> <li><a href="https://www.youtube.com/user/enyay" rel="noopener nofollow" target="_blank">Tom Scott</a> - An arrogant British guy telling you things he thinks you may not know</li> <li><a href="https://www.youtube.com/c/inanutshell/" rel="noopener nofollow" target="_blank">Kurzgesagt</a> - Uniquely animated science videos </li> <li><a href="https://www.youtube.com/channel/UCuCkxoKLYO_EQ2GeFtbM_bw" rel="noopener nofollow" target="_blank">Half as Interesting</a> - Stuff that is quite literally only half interesting </li> <li><a href="https://www.youtube.com/c/Wendoverproductions" rel="noopener nofollow" target="_blank">Wendover Productions</a> - Videos that explain how stuff in the world works </li> <li><a href="https://www.youtube.com/c/xplrd" rel="noopener nofollow" target="_blank">xplrd</a> - General videos loosely related to democracy around the world</li> <li><a href="https://www.youtube.com/c/PolyMatter" rel="noopener nofollow" target="_blank">Poly Matter</a> - More videos about random things that aren't actually as interesting as they look</li> <li><a href="https://www.youtube.com/c/SolarSands" rel="noopener nofollow" target="_blank">SolarSands</a> - videos about art and society</li> <li><a href="https://www.youtube.com/c/neoyoutube" rel="noopener nofollow" target="_blank">Neo</a> - Clear and understandable analysis of geopolitical conflicts, politics and business </li> <li><a href="https://www.youtube.com/user/itsokaytobesmart" rel="noopener nofollow" target="_blank">Its Okay to be Smart</a> - Exploring the science behind everything with Joe Hanson PhD</li> <li><a href="https://www.youtube.com/user/bigthink" rel="noopener nofollow" target="_blank">Think Big</a> - Ideas about humans, science, history and the future </li> <li><a href="https://www.youtube.com/user/TEDxTalks" rel="noopener nofollow" target="_blank">Tedx Talks</a> - Talks that didn't quite make the bar to be actual Ted talks </li> <li><a href="https://www.youtube.com/channel/UCAiEWppTvoNSHU939xhMb2g" rel="noopener nofollow" target="_blank">h0ser</a> - Geography videos, animated, mostly middle-East</li> <li><a href="https://www.youtube.com/channel/UCbCq5Y0WPGimG2jNXhoQxGw" rel="noopener nofollow" target="_blank">Atomic Frontier</a> - Short BBC-style science and engineering documentaries from a small creator</li> <li><a href="https://www.youtube.com/channel/UCTvRcHO5jJ_JKcekLacLMuQ" rel="noopener nofollow" target="_blank">Leon Hendrix</a> - Videos about startups that made loads, or failed</li> <li><a href="https://www.youtube.com/channel/UC22BdTgxefuvUivrjesETjg" rel="noopener nofollow" target="_blank">History Matters</a> - Short animated history videos</li> <li><a href="https://www.youtube.com/c/HalfAsleepChris/" rel="noopener nofollow" target="_blank">Half-Asleep Chris</a> - Interesting coins &amp; banknotes, travel, stop-motion. Nice guy, very calming voice</li> <li><a href="https://www.youtube.com/c/KentoBento" rel="noopener nofollow" target="_blank">Kento Bento</a> - Animated documentaries about Asian historical events and lifestyle</li> <li><a href="https://www.youtube.com/channel/UCSC6F-cM6_Xm3aJnHs6ZDVA" rel="noopener nofollow" target="_blank">Joeseppi</a> - Funny "In a Nutshell" theme videos</li> <li><a href="https://www.youtube.com/c/NameExplain" rel="noopener nofollow" target="_blank">Name Explain</a> - All about the origins of names</li> <li><a href="https://www.youtube.com/c/Robslondon" rel="noopener nofollow" target="_blank">Robslondon</a> - All about historic London</li> </ul> <h3>๐Ÿš“ True Crime and Horror</h3> <ul> <li><a href="https://www.youtube.com/channel/UCcUf33cEPky2GiWBgOP-jQA" rel="noopener nofollow" target="_blank">Coffeehouse Crime</a> - Analysis of solved and unsolved events</li> <li><a href="https://www.youtube.com/channel/UCoOjH8D2XAgjzQlneM2W0EQ" rel="noopener nofollow" target="_blank">Jake Tran</a> - Documentaries on money, power, war, &amp; crime</li> <li><a href="https://www.youtube.com/c/Coffeezilla" rel="noopener nofollow" target="_blank">Coffeezilla</a> - Uncovering scams, fraudsters and fake gurus</li> <li><a href="https://www.youtube.com/c/ShroudedHand" rel="noopener nofollow" target="_blank">Shrouded Hand</a> - True horror stories about different topics</li> <li><a href="https://www.youtube.com/c/CodeBlueCam" rel="noopener nofollow" target="_blank">Code Blue Cam</a> - Live footage from American cops, sometimes interesting</li> </ul> <h3>๐Ÿ“บ Animations/ Cartoons</h3> <ul> <li><a href="https://www.youtube.com/channel/UCo8bcnLyZH8tBIH9V1mLgqQ" rel="noopener nofollow" target="_blank">TheOdd1sOut</a></li> <li><a href="https://www.youtube.com/channel/UCGwu0nbY2wSkW8N-cghnLpA" rel="noopener nofollow" target="_blank">Jaiden Animations</a></li> <li><a href="https://www.youtube.com/channel/UCOsATJw-IZgqGT8MFrHjKGg" rel="noopener nofollow" target="_blank">Ice Cream Sandwich</a></li> <li><a href="https://www.youtube.com/c/MattPilh" rel="noopener nofollow" target="_blank">Mattias Pilhede</a> - Kinda random, short sketched stories</li> <li><a href="https://www.youtube.com/channel/UCWXCrItCF6ZgXrdozUS-Idw" rel="noopener nofollow" target="_blank">ExplosmEntertainment</a> - Cyanide &amp; Happiness Shorts and other classic comics</li> <li><a href="https://www.youtube.com/channel/UChddokv0fxIN3BS-KZpxFfA" rel="noopener nofollow" target="_blank">Veggit Tales</a> - Animated vegetables, because why not</li> </ul> <h3>๐Ÿ“ฝ๏ธ TV Shows</h3> <ul> <li><a href="https://www.youtube.com/channel/UCRAAdF42hZcTHAorbbDuivw" rel="noopener nofollow" target="_blank">ITV Wonder</a> - Some incredible survival stories (<a href="https://www.youtube.com/watch?v=xym5KUJrvsY" rel="noopener nofollow" target="_blank">this one</a> blew my mind!)</li> <li><a href="https://www.youtube.com/channel/UCDAzmE9V4Xw5CdLkn3pvO3A" rel="noopener nofollow" target="_blank">The Dragons Den</a> - Start-up entrepreneurs getting roasted</li> <li><a href="https://www.youtube.com/channel/UCkjiTk_CqZLmIqjuc-dlTiw" rel="noopener nofollow" target="_blank">Ninja Warrior UK</a> - Just impressive Ninja climbing skills</li> <li><a href="https://www.youtube.com/c/TheRealHustleOfficial" rel="noopener nofollow" target="_blank">The Real Hustle</a> - Three fraudsters demonstrating how common scams work</li> <li><a href="https://www.youtube.com/channel/UCLQCdIAgnxUsWlOdacFgscg" rel="noopener nofollow" target="_blank">Funny TV UK</a> - I shouldn't laugh at this crap, but I do</li> <li><a href="https://www.youtube.com/channel/UCcjoLhqu3nyOFmdqF17LeBQ" rel="noopener nofollow" target="_blank">BBC Three</a> - Trashy TV shorts from the BBC</li> <li><a href="https://www.youtube.com/c/TED" rel="noopener nofollow" target="_blank">TED Talks</a> - Short talks from 5 - 15 minutes about intellectual sounding stuff</li> </ul> <h3>๐ŸŽถ Music</h3> <ul> <li><a href="https://www.youtube.com/user/MrSuicideSheep" rel="noopener nofollow" target="_blank">Mr Suicide Sheep</a> - A compilation of electronic music </li> <li><a href="https://www.youtube.com/c/EddyKenzo" rel="noopener nofollow" target="_blank">EddyKenzo</a> - African (Ugandan) Music Artist and Exec </li> <li><a href="https://www.youtube.com/channel/UC194cPvPaGJjhJBEGwG6vxg" rel="noopener nofollow" target="_blank">OK Go</a> - Awful music, but amazing videos </li> <li><a href="https://www.youtube.com/c/PomplamooseMusic" rel="noopener nofollow" target="_blank">Pomplamoose</a> - American duo, indie pop and funk pop rock</li> <li><a href="https://www.youtube.com/user/LEMMiNOMusic" rel="noopener nofollow" target="_blank">LENNiNO Music</a> - Small music producer</li> <li><a href="https://www.youtube.com/channel/UCYEK6xds6eo-3tr4xRdflmQ" rel="noopener nofollow" target="_blank">deadmau5 </a> - Epic electronic music</li> </ul> <h3>๐Ÿ—ณ๏ธ Misc</h3> <ul> <li><a href="https://www.youtube.com/c/DrewGooden1" rel="noopener nofollow" target="_blank">Drew Gooden</a> - Comedic commentary on TV shows and stuff</li> <li><a href="https://www.youtube.com/channel/UCcjx6m03fZwtRBFn1Cf7kKQ" rel="noopener nofollow" target="_blank">The Zac and Jay Show</a> - 2 British lads getting up to all sorts in London</li> <li><a href="https://www.youtube.com/c/excessorizeme" rel="noopener nofollow" target="_blank">EXCESSORIZE ME</a> - Over-priced EDC and gadgets that you don't need </li> <li><a href="https://www.youtube.com/channel/UCggHsHce2n3vvbJf_8YKrMA" rel="noopener nofollow" target="_blank">Nerd Forge</a> - Fantast, Crafts and Sci-Fi Painting </li> <li><a href="https://www.youtube.com/c/LaurisBeinerts/" rel="noopener nofollow" target="_blank">Lauris Beinerts</a> - Short comedy sketches about corporate life</li> </ul> <h3>๐ŸŒŸ Personal Favorite Favorites</h3> <p><a href="https://www.youtube.com/user/CGPGrey" rel="noopener nofollow" target="_blank">CGP Grey</a>, <a href="https://www.youtube.com/channel/UC4QZ_LsYcvcq7qOsOhpAX4A" rel="noopener nofollow" target="_blank">ColdFusion</a>, <a href="https://www.youtube.com/channel/UCUQo7nzH1sXVpzL92VesANw" rel="noopener nofollow" target="_blank">DIYPerks</a>, <a href="https://www.youtube.com/channel/UC6mIxFTvXkWQVEHPsEdflzQ" rel="noopener nofollow" target="_blank">GreatScott</a>, <a href="https://www.youtube.com/channel/UCbbQalJ4OaC0oQ0AqRaOJ9g" rel="noopener nofollow" target="_blank">Jay Foreman</a>, <a href="https://www.youtube.com/user/onemeeeliondollars" rel="noopener nofollow" target="_blank">Mark Robber</a>, <a href="https://www.youtube.com/channel/UCvrLvII5oxSWEMEkszrxXEA" rel="noopener nofollow" target="_blank">N-O-D-E</a>, <a href="https://www.youtube.com/user/ZackFreedman" rel="noopener nofollow" target="_blank">Zach Freedman</a>, <a href="https://www.youtube.com/channel/UCW6xlqxSY3gGur4PkGPEUeA" rel="noopener nofollow" target="_blank">Seytonic</a>, <a href="https://www.youtube.com/channel/UCjr2bPAyPV7t35MvcgT3W8Q" rel="noopener nofollow" target="_blank">The Hated One</a></p> <h2>Notes</h2> <p>These are my personal favorite YouTube channels, the talent and hard work behind each of these creators is very inspirational. Since I can't feasibly financially support all of them, I am instead sharing links to their content here.</p> <p>I try to avoid using the official YouTube app and website (due to ads, terrible suggestions and Google having a total disregard for basic privacy), so I instead use <a href="https://invidio.us/" rel="noopener nofollow" target="_blank">Invidious</a> (web) / <a href="https://freetubeapp.io/" rel="noopener nofollow" target="_blank">FreeTube</a> (desktop) / <a href="https://newpipe.schabi.org/" rel="noopener nofollow" target="_blank">NewPipe</a> (mobile). Therefore I need to manage my subscriptions externally, and that in part, is why I maintain this list.</p> <p>Useful Links:</p> <ul> <li><a href="https://channelcrawler.com/" rel="noopener nofollow" target="_blank">Channel Crawler</a> - Useful tool to find and discover new YouTube Channels, based on specific parameters</li> <li><a href="https://github.com/ytdl-org/youtube-dl" rel="noopener nofollow" target="_blank">YouTube-dl</a> - A Python script to download videos from YouTube and some other platforms from a given URL. Can be used from the command-line, or incorporated into your project. It provides many optional parameters to specify video options. There's also <a href="https://github.com/MrS0m30n3/youtube-dl-gui" rel="noopener nofollow" target="_blank">YouTube-dl-GUI</a> if you prefer a user interface</li> <li><a href="https://www.turnoffthelights.com/" rel="noopener nofollow" target="_blank">Turn off the Lights</a> - Open source browser extension that dims the webpage around a video while it is playing</li> </ul> </p> [HOW-TO] Use SSH for Server Authentication ๐Ÿ”“ Alicia's Notes ๐Ÿš€ Tue, 16 Jun 2020 20:41:29 +0000 https://notes.aliciasykes.com/15742/how-to-use-ssh-for-server-authentication https://notes.aliciasykes.com/15742/how-to-use-ssh-for-server-authentication <p><h3>Generating a new SSH Key Pair</h3> <ol> <li>Run <code class="prettyprint">ssh-keygen -t rsa -b 4096</code></li> <li>When prompted, enter a passphrase</li> <li>SSH keys should be stored in <code class="prettyprint">~/.ssh/</code></li> </ol> <hr> <h3>Importing Public Key to Remote Machine</h3> <h4>Option #1 - Manual Configuration</h4> <ol> <li>SSH into remote server, with username + password</li> <li><code class="prettyprint">cd</code> into your <code class="prettyprint">/home</code> directory, and <code class="prettyprint">mkdir .ssh</code></li> <li>Copy public key from local to remote machine <code class="prettyprint">scp ~/.ssh/my_key.pub user@0.0.0.0:/home/username/.ssh/my_key.pub</code></li> <li>Append SSH public key to authorized hosts file <code class="prettyprint">cat ~/.ssh/my_key.pub &gt;&gt; ~/.ssh/authorized_keys</code></li> <li>Set permissions for <ul> <li>the .ssh directory (read, write, execute): <code class="prettyprint">chmod 700 ~/.ssh/</code> </li> <li>and the SSH keys (read, write): <code class="prettyprint">chmod 600 ~/.ssh/*</code></li> </ul></li> </ol> <h4>Option #2 - SSH Copy ID Command</h4> <p>Alternatively, the SSH Copy ID command will upload your public key to the remote server and update <code class="prettyprint">.ssh/authorized_keys</code><br> After generating an SSH key pair, simply run <code class="prettyprint">ssh-copy-id user@0.0.0.0</code> (with your username, IP and any other SSH flags)</p> <hr> <h3>Disable Password Authentication</h3> <ol> <li>Make a backup of the sshd<em>config file, before modifying it `sudo cp /etc/ssh/sshd</em>config.backup`</li> <li>Turn off password authentication <ul> <li><code class="prettyprint">sudo vim /etc/ssh/sshd_config</code></li> <li>Find <code class="prettyprint">#PasswordAuthentication yes</code> and replace with <code class="prettyprint">PasswordAuthentication no</code></li> <li>Save and exit</li> </ul></li> <li>Restart SSH service <code class="prettyprint">sudo service ssh restart</code></li> </ol> <hr> <h3>Further Links</h3> <ul> <li>The OpenSSH Project: <a href="https://www.openssh.com" rel="noopener nofollow" target="_blank">https://www.openssh.com</a></li> <li>SSH-KeyGen Documentation: <a href="https://linux.die.net/man/1/ssh-keygen" rel="noopener nofollow" target="_blank">https://linux.die.net/man/1/ssh-keygen</a></li> <li>Detailed tutorial for SSH-KeyGen: <a href="https://www.ssh.com/ssh/keygen" rel="noopener nofollow" target="_blank">https://www.ssh.com/ssh/keygen</a></li> <li>Short Video Guide, by Corey Schafer: <a href="https://youtu.be/vpk_1gldOAE" rel="noopener nofollow" target="_blank">https://youtu.be/vpk_1gldOAE</a></li> </ul> </p> [HOW-TO] Operate the SharkJack ๐Ÿฆˆ Alicia's Notes ๐Ÿš€ Wed, 20 May 2020 17:40:55 +0000 https://notes.aliciasykes.com/14972/how-to-operate-the-sharkjack https://notes.aliciasykes.com/14972/how-to-operate-the-sharkjack <p><p><em>A Quick-Start Guide for the Hak5 <a href="https://shop.hak5.org/products/shark-jack" rel="noopener nofollow" target="_blank">SharkJack</a>, a portable network attack tool</em></p> <h2>Access the SharkJack</h2> <ol> <li>Switch to Arming Mode (center), and connect to PC via Ethernet</li> <li>Find the IP: Default is <code class="prettyprint">172.16.24.1</code>, run <code class="prettyprint">ifconfig</code> to check</li> <li>Login: <code class="prettyprint">ssh root@172.16.24.1</code>, using password <code class="prettyprint">hak5shark</code></li> <li>On first setup, change the default password, run <code class="prettyprint">passwd</code></li> </ol> <h2>Navigating the SharkJack</h2> <ul> <li>The active payload is located at: <code class="prettyprint">~/payload/payload.sh</code></li> <li>Captured loot is stored with the <code class="prettyprint">~/loot/...</code> directory </li> <li>To save all loot locally, run: <code class="prettyprint">scp -r root@172.16.24.1:/root/loot/* .</code></li> <li>To upload a new payload, run <code class="prettyprint">scp payload.sh root@172.16.24.1:/root/payload/</code></li> </ul> <h2>Conducting an Attack</h2> <ol> <li>Flip into Attack Mode (fully forward), and wait for LED to go magenta</li> <li>Plug device into victim Ethernet port, watch LED's blink</li> <li>Once LED turns off, unplug device and switch to off</li> </ol> <p>Out-of-the box, the ShakJack comes with an nmap payload, useful for initial network reconnaissance </p> <hr> <h2>Additional Tools</h2> <h4>CLI Helper Tool</h4> <p>The SharkJack Helper a CLI tool for carrying out common tasks: <br> Get a shell, push a payload, grab saved loot and upgrade the firmware etc</p> <ol> <li>Download from: <a href="https://downloads.hak5.org/shark" rel="noopener nofollow" target="_blank">https://downloads.hak5.org/shark</a></li> <li>Make executable: <code class="prettyprint">chmod +x sharkjack.sh</code></li> <li>Run <code class="prettyprint">./sharkjack.sh</code>, and follow on-screen prompts</li> </ol> <h4>Web Interface</h4> <p>Once the firmware has been updated (V1.01 and newer), you can access the SharkJack's web interface by visiting 172.16.24.1 in your browser. From here you can view and modify the current payload, download your loot and view device status</p> <h4>Cloud C2</h4> <ol> <li>Download and run Cloud C2 for your system, from <a href="https://shop.hak5.org/products/c2" rel="noopener nofollow" target="_blank">https://shop.hak5.org/products/c2</a></li> <li>Go to Add Device --&gt; SharkJack. Then select the listing --&gt; Setup, and config file will download</li> <li>The <code class="prettyprint">device.config</code> needs to be uploaded to <code class="prettyprint">/etc</code>. Run <code class="prettyprint">scp device.config root@172.16.24.1:/ete/</code></li> <li>To connect, run <code class="prettyprint">CTCONNECT</code>. Back on the web interface, your now able to open a shell, for remote access!</li> <li>To get the loot, run <code class="prettyprint">C2EFIL STRING /root/loot/nmap/nmap-scan_1.txt nmap</code>, data now will show up in Loot tab!</li> </ol> <p>Note that it the SharkJack does not connect to CloudC2 automatically, but by using the <code class="prettyprint">CTCONNECT</code> and <code class="prettyprint">C2EFIL ..</code> commands to your payload, you'll be able to exfiltrate the loot immediately, and access it remotely.</p> <hr> <h2>Reference Info</h2> <h4>Switch Positions</h4> <ul> <li>Back: Off/ Charging</li> <li>Middle: Arming Mode</li> <li>Front: Attack Mode</li> </ul> <h4>LET Lights</h4> <ul> <li>Green (blinking): Booting up</li> <li>Blue (blinking): Charging</li> <li>Blue (solid): Fully Charged</li> <li>Yellow (blinking): Arming Mode</li> <li>Red (blinking): Error / No Payload</li> </ul> <p>Individual Payloads have their own LED routines, but usually:<br> Red: Setup, Amber: Scanning, Green: Finished</p> <h4>Specifications</h4> <ul> <li>OS: OpenWRT 19.07-based GNU/Linux</li> <li>SoC: 580MHz MediaTek MT7628DAN mips CPU</li> <li>MEMORY: 64 MB DDR2 RAM, 64 MB SPI Flash</li> <li>IO: RJ45 IEEE 802.3 Ethernet + USB-C charge port</li> <li>DIMENSIONS: 62 x 21 x 12 mm</li> <li>POWER: 2.5W (USB 5V 0.5A)</li> <li>BATTERY: 1S 401020 3.7V 50mAh 0.2W LiPo</li> <li>BATTERY TIMES: ~15 mins run, ~7 mins charge</li> <li>TEMP: Operating- 35ยบC ~ 45ยบC, Storage -20ยบC ~ 50ยบC</li> <li>RELATIVE HUMIDITY: 0% to 90% (noncondensing)</li> </ul> </p> My worry about the future of Keybase ๐Ÿ˜Ÿ Alicia's Notes ๐Ÿš€ Sun, 17 May 2020 15:44:20 +0000 https://notes.aliciasykes.com/14871/my-worry-about-the-future-of-keybase https://notes.aliciasykes.com/14871/my-worry-about-the-future-of-keybase <p><p>When I heard that Zoom had acquired Keybase last week, my <a href="https://twitter.com/Lissy_Sykes/status/1258393347770789896" rel="noopener nofollow" target="_blank">initial reaction</a> was that it was a prank.</p> <h3>A bit of background</h3> <p>Keybase is a cryptography-based platform, where you control your private keys and use them to encrypt files, messages and more. It's mostly used by techy people and the privacy-conscious. Personally, I've been a big fan, and user of keybase for the past 4 years.<br> And Zoom, it seemed to come from nowhere when lockdown started, suddenly it was super popular: it has allowed us to stay in touch with our friends and family, for free and with excellent video quality. But it seems that nearly everyday recently, there's been another <a href="https://www.tomsguide.com/news/zoom-security-privacy-woes" rel="noopener nofollow" target="_blank">critical security issue</a> with Zoom, they don't come across as a company that values the privacy of their users.</p> <h3>My Worries about the future of Keybase</h3> <p>This is an extract from the acquisition <a href="https://keybase.io/blog/keybase-joins-zoom" rel="noopener nofollow" target="_blank">article</a> posted on Keybase:</p> <blockquote> <p><em>"Initially, our single top priority is helping to make Zoom even more secure. There are no specific plans for the Keybase app yet. Ultimately Keybase's future is in Zoom's hands, and we'll see where that takes us. Of course, if anything changes about Keybaseโ€™s availability, our users will get plenty of notice."</em></p> </blockquote> <p>This is what worries me about the above quote:</p> <ul> <li>"๐˜–๐˜ถ๐˜ณ ๐˜ด๐˜ช๐˜ฏ๐˜จ๐˜ญ๐˜ฆ ๐˜ต๐˜ฐ๐˜ฑ ๐˜ฑ๐˜ณ๐˜ช๐˜ฐ๐˜ณ๐˜ช๐˜ต๐˜บ ๐˜ช๐˜ด ๐˜ฉ๐˜ฆ๐˜ญ๐˜ฑ๐˜ช๐˜ฏ๐˜จ ๐˜ต๐˜ฐ ๐˜ฎ๐˜ข๐˜ฌ๐˜ฆ ๐˜ก๐˜ฐ๐˜ฐ๐˜ฎ ๐˜ฆ๐˜ท๐˜ฆ๐˜ฏ ๐˜ฎ๐˜ฐ๐˜ณ๐˜ฆ ๐˜ด๐˜ฆ๐˜ค๐˜ถ๐˜ณ๐˜ฆ" - Implies, that the KeyBase team will now be working on the Zoom platform, and not Keybase.</li> <li>"๐˜Œ๐˜ท๐˜ฆ๐˜ฏ ๐˜ฎ๐˜ฐ๐˜ณ๐˜ฆ ๐˜ด๐˜ฆ๐˜ค๐˜ถ๐˜ณ๐˜ฆ" - HA! They are pretending Zoom is secure</li> <li>"๐˜›๐˜ฉ๐˜ฆ๐˜ณ๐˜ฆ ๐˜ข๐˜ณ๐˜ฆ ๐˜ฏ๐˜ฐ ๐˜ด๐˜ฑ๐˜ฆ๐˜ค๐˜ช๐˜ง๐˜ช๐˜ค ๐˜ฑ๐˜ญ๐˜ข๐˜ฏ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ต๐˜ฉ๐˜ฆ ๐˜’๐˜ฆ๐˜บ๐˜ฃ๐˜ข๐˜ด๐˜ฆ ๐˜ข๐˜ฑ๐˜ฑ ๐˜บ๐˜ฆ๐˜ต" - this doesn't sound good</li> <li>"๐˜œ๐˜ญ๐˜ต๐˜ช๐˜ฎ๐˜ข๐˜ต๐˜ฆ๐˜ญ๐˜บ ๐˜’๐˜ฆ๐˜บ๐˜ฃ๐˜ข๐˜ด๐˜ฆ'๐˜ด ๐˜ง๐˜ถ๐˜ต๐˜ถ๐˜ณ๐˜ฆ ๐˜ช๐˜ด ๐˜ช๐˜ฏ ๐˜ก๐˜ฐ๐˜ฐ๐˜ฎ'๐˜ด ๐˜ฉ๐˜ข๐˜ฏ๐˜ฅ๐˜ด" - FUCK</li> <li>"๐˜ช๐˜ง ๐˜ข๐˜ฏ๐˜บ๐˜ต๐˜ฉ๐˜ช๐˜ฏ๐˜จ ๐˜ค๐˜ฉ๐˜ข๐˜ฏ๐˜จ๐˜ฆ๐˜ด ๐˜ข๐˜ฃ๐˜ฐ๐˜ถ๐˜ต ๐˜’๐˜ฆ๐˜บ๐˜ฃ๐˜ข๐˜ด๐˜ฆโ€™๐˜ด ๐˜ข๐˜ท๐˜ข๐˜ช๐˜ญ๐˜ข๐˜ฃ๐˜ช๐˜ญ๐˜ช๐˜ต๐˜บ" - Makes it sound like Keybase could one day be discontinued </li> </ul> <p>And from the Zoom <a href="https://blog.zoom.us/wordpress/2020/05/07/zoom-acquires-keybase-and-announces-goal-of-developing-the-most-broadly-used-enterprise-end-to-end-encryption-offering/" rel="noopener nofollow" target="_blank">blog post</a>:</p> <ul> <li>"๐˜ž๐˜ฆ ๐˜ข๐˜ณ๐˜ฆ ๐˜ฆ๐˜น๐˜ค๐˜ช๐˜ต๐˜ฆ๐˜ฅ ๐˜ต๐˜ฐ ๐˜ช๐˜ฏ๐˜ต๐˜ฆ๐˜จ๐˜ณ๐˜ข๐˜ต๐˜ฆ ๐˜’๐˜ฆ๐˜บ๐˜ฃ๐˜ข๐˜ด๐˜ฆโ€™๐˜ด ๐˜ต๐˜ฆ๐˜ข๐˜ฎ ๐˜ช๐˜ฏ๐˜ต๐˜ฐ ๐˜ต๐˜ฉ๐˜ฆ ๐˜ก๐˜ฐ๐˜ฐ๐˜ฎ ๐˜ง๐˜ข๐˜ฎ๐˜ช๐˜ญ๐˜บ" - Yup, they bought Keybase just to use their engineers</li> <li>"๐˜›๐˜ฉ๐˜ช๐˜ด ๐˜ข๐˜ค๐˜ฒ๐˜ถ๐˜ช๐˜ด๐˜ช๐˜ต๐˜ช๐˜ฐ๐˜ฏ ๐˜ฎ๐˜ข๐˜ณ๐˜ฌ๐˜ด ๐˜ข ๐˜ฌ๐˜ฆ๐˜บ ๐˜ด๐˜ต๐˜ฆ๐˜ฑ ๐˜ง๐˜ฐ๐˜ณ ๐˜ก๐˜ฐ๐˜ฐ๐˜ฎ ๐˜ข๐˜ด ๐˜ธ๐˜ฆ ๐˜ข๐˜ต๐˜ต๐˜ฆ๐˜ฎ๐˜ฑ๐˜ต ๐˜ต๐˜ฐ ๐˜ข๐˜ค๐˜ค๐˜ฐ๐˜ฎ๐˜ฑ๐˜ญ๐˜ช๐˜ด๐˜ฉ ๐˜ต๐˜ฉ๐˜ฆ ๐˜ค๐˜ณ๐˜ฆ๐˜ข๐˜ต๐˜ช๐˜ฐ๐˜ฏ ๐˜ฐ๐˜ง ๐˜ข ๐˜ต๐˜ณ๐˜ถ๐˜ญ๐˜บ ๐˜ฑ๐˜ณ๐˜ช๐˜ท๐˜ข๐˜ต๐˜ฆ ๐˜ท๐˜ช๐˜ฅ๐˜ฆ๐˜ฐ ๐˜ค๐˜ฐ๐˜ฎ๐˜ฎ๐˜ถ๐˜ฏ๐˜ช๐˜ค๐˜ข๐˜ต๐˜ช๐˜ฐ๐˜ฏ๐˜ด ๐˜ฑ๐˜ญ๐˜ข๐˜ต๐˜ง๐˜ฐ๐˜ณ๐˜ฎ" - I don't think they have any intention of creating a <em>"truly private"</em> platform. And the word <em>"attempt"</em> doesn't exactly instill confidence in me</li> <li>"๐˜–๐˜ถ๐˜ณ ๐˜จ๐˜ฐ๐˜ข๐˜ญ ๐˜ช๐˜ด ๐˜ต๐˜ฐ ๐˜ฑ๐˜ณ๐˜ฐ๐˜ท๐˜ช๐˜ฅ๐˜ฆ ๐˜ต๐˜ฉ๐˜ฆ ๐˜ฎ๐˜ฐ๐˜ด๐˜ต ๐˜ฑ๐˜ณ๐˜ช๐˜ท๐˜ข๐˜ค๐˜บ ๐˜ฑ๐˜ฐ๐˜ด๐˜ด๐˜ช๐˜ฃ๐˜ญ๐˜ฆ ๐˜ง๐˜ฐ๐˜ณ ๐˜ฆ๐˜ท๐˜ฆ๐˜ณ๐˜บ ๐˜ถ๐˜ด๐˜ฆ ๐˜ค๐˜ข๐˜ด๐˜ฆ, ๐˜ธ๐˜ฉ๐˜ช๐˜ญ๐˜ฆ ๐˜ข๐˜ญ๐˜ด๐˜ฐ ๐˜ฃ๐˜ข๐˜ญ๐˜ข๐˜ฏ๐˜ค๐˜ช๐˜ฏ๐˜จ ๐˜ต๐˜ฉ๐˜ฆ ๐˜ฏ๐˜ฆ๐˜ฆ๐˜ฅ๐˜ด ๐˜ฐ๐˜ง ๐˜ฐ๐˜ถ๐˜ณ ๐˜ถ๐˜ด๐˜ฆ๐˜ณ๐˜ด ๐˜ข๐˜ฏ๐˜ฅ ๐˜ฐ๐˜ถ๐˜ณ ๐˜ค๐˜ฐ๐˜ฎ๐˜ฎ๐˜ช๐˜ต๐˜ฎ๐˜ฆ๐˜ฏ๐˜ต ๐˜ต๐˜ฐ ๐˜ฑ๐˜ณ๐˜ฆ๐˜ท๐˜ฆ๐˜ฏ๐˜ต๐˜ช๐˜ฏ๐˜จ ๐˜ฉ๐˜ข๐˜ณ๐˜ฎ๐˜ง๐˜ถ๐˜ญ ๐˜ฃ๐˜ฆ๐˜ฉ๐˜ข๐˜ท๐˜ช๐˜ฐ๐˜ณ ๐˜ฐ๐˜ฏ ๐˜ฐ๐˜ถ๐˜ณ ๐˜ฑ๐˜ญ๐˜ข๐˜ต๐˜ง๐˜ฐ๐˜ณ๐˜ฎ" - When they talk about <em>"balancing"</em> the needs of customers, this implies that they will not be aiming for true end-to-end encryption and anonymity, it could be possible but I doubt Zoom will peruse that path</li> </ul> <p>I know all this is just legal speak, and they have to word it in this way to cover themselves, but too me this is worrying. I'd come to love Keybase over the years, the team behind it are very talented, and have done an amazing job. It's going to be sad to say goodbye, but for now I'm going to enjoy it while I can :)</p> </p> Expressing my Gratitude to the Universe ๐ŸŒŒ Alicia's Notes ๐Ÿš€ Wed, 15 Apr 2020 22:05:05 +0000 https://notes.aliciasykes.com/18762/expressing-my-gratitude-to-the-universe https://notes.aliciasykes.com/18762/expressing-my-gratitude-to-the-universe <p><p>Dear Universe,<br> Thanks!</p> <hr> <p><br><br> <img title="NGC 4907 a barred-spiral galaxy, 270 million light-years away" src="https://www.nasa.gov/sites/default/files/thumbnails/image/potw2031a.jpg" style="margin: 0.5rem auto;width:100%;max-width:400px;border-radius:12px;"></p> </p> AHT GPG Public Key ๐Ÿ”‘ Alicia's Notes ๐Ÿš€ Tue, 31 Mar 2020 20:35:37 +0000 https://notes.aliciasykes.com/13403/aht-gpg-public-key https://notes.aliciasykes.com/13403/aht-gpg-public-key <p><div class="highlight"><pre class="highlight plaintext"><code>-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBF48O4ABCAC9IEjW7+Q2uF7efrxguXeRVr0NgHPIbTdAioVp2TkPlAi+h+yW gbyeluutVlg2Mo5uWccPBaPHLm9Pr0CKTKiF8Y1RrYiDZ8RmyJSNux40FBGFPsNs mfj3v7pjdTinI4v+EW8Lqd704fGCkgEpUpamefI2O8Hc7pHAtH1PUz99dcO1ThDY Bn5grO8CPmM6XfRIHvBf7oJ0DwBH/yoS5Gjs2P4ijk/GMplApaVroCo8dAjyS7QJ xreko5yVr2hhzrIznJYc63UBe6lAoM7wpArLCHxJ2fw1zHMuWg431EnpZa5nwrml iSXizo1MuVUXm1Mt52wb3s26koLUoCXhNcqfABEBAAG0KEFsaWNpYSBIYWlnLVRo b21hcyA8YWxpY2lhLmh0QGFsaWNpYS5odD6JAU4EEwEIADgWIQSEJgDk7beVIXMv TmyOI+xzzok6aQUCXjw7gAIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCO I+xzzok6aTL7B/4knCMhDX5MOTiAd0NKKE89EqApayJuxWovnvYmYEN2fje+rMH2 gf1J6+XET7jJ8jNujYIpvQmJcnumfzk9/dXNfT+MWn93ZOn+8Y2FmFD4jCdG20dS Bx9mPAH00QoG7qZXk8EUvqo0EHtVPHW0PREyB3B/qd+tx1RcBva4vp8eYQezl16w gjxGM4rjtcwgDGmlHM1PoeplJ6dr9kmB1fJ/HnuQnPKFMcU2bBj6Mbv2uensd4Js zDgKWAaT5X+LA7xLs65bSgPFnos6gUFg+dS2tYf/zoIGiCGaeiv93RnWdvTYPcba fHPmwsLX97HFk4KXnNvdAEaJlykbTvujHP14uQENBF48O4ABCAC5YOL+GBpmoTKB nniRlRdt2Y+oWN0eyongTwLb3oPyc6+BfcMJS+8mV9hp96qYvXLDoNwkZZWUuHAP SFhS4YjNW7mufOqKejUlkOgNvFpQ6eiU6QxmLu7RB4dWsPXMWxKAayaDsIJ75amf EPyEcy+8/jkpAs62copxdJcJNkD3GGda2W6EC1GjhZGZjK4UnDAMg/iVpbygJFiH EYHEL4JvS0HrW+30eikvXi9R8MxW/pNQIuJyjp8rJTwbV3fPeCwfuasPECuLK9qN FmpL7NEAyreYET+uZxW16r7tDo3pIAZcz6+y4sBvf3+hR6T5IGL8nvezu71l0YhO r4b38CIBABEBAAGJATYEGAEIACAWIQSEJgDk7beVIXMvTmyOI+xzzok6aQUCXjw7 gAIbDAAKCRCOI+xzzok6aWmdB/9yyai3QfSNhXnljLN7bLDyukFWnioqNZZWRKsp 1Coi2b7/yIYm1i4nd7W9YMXSZ2Lojl5471A4/u74M8c3Ua7RLxS5SJGDTYm1TX8L xM4MY+iaYcbSMt+8ll0Y2av4cQAx/S69DIONSAqsIuKtNptKxedyKmB9IX3QLtpK J2SFOTHVXWg4EVovhCvr7DlI9nkQtFJ+fgVk4GW8UeY5b+uR3Emcpcfo7h/FVwav Pc0jCYP8i2YZQ3IdN6+Py2PXnhS6+OZukVy3GSib6dmdk1XhaUCcE8xbht92GiK0 2TVqWk8NQtfrMH6TvJmsgfNUAuOz3dOGgUwK1DqvhYQRWMh1 =4Lz6 -----END PGP PUBLIC KEY BLOCK----- </code></pre></div> <p>Fingerprint: <code class="prettyprint">8426 00E4 EDB7 9521 732F 4E6C 8E23 EC73 CE89 3A69</code></p> <style> .post-content .post-body pre { width: fit-content; } .highlight { background: none; } </style> </p> [HOW-TO] Enable/ Disable Pi-Hole from CLI ๐Ÿฅง Alicia's Notes ๐Ÿš€ Tue, 31 Mar 2020 19:58:32 +0000 https://notes.aliciasykes.com/13402/how-to-enable-disable-pi-hole-from-cli https://notes.aliciasykes.com/13402/how-to-enable-disable-pi-hole-from-cli <p><p>Pi Hole has an API that can be hit from browser, PostMan or CLI<br> This is useful for creating a physical button, voice command or automation script</p> <p>To enable or diable Pi Hole, just hit the following end points<br> Disable URL : <a href="http://pi.hole/admin/api.php?disable&amp;auth=%5BWEB_PASSWORD%5D" rel="noopener nofollow" target="_blank">http://pi.hole/admin/api.php?disable&amp;auth=[WEB_PASSWORD]</a><br> Enable URL : <a href="http://pi.hole/admin/api.php?enable&amp;auth=%5BWEB_PASSWORD%5D" rel="noopener nofollow" target="_blank">http://pi.hole/admin/api.php?enable&amp;auth=[WEB_PASSWORD]</a><br> Disable for [X] Seconds: <a href="http://pi.hole/admin/api.php?disable=%5BX%5D&amp;auth=%5BWEB_PASSWORD%5D" rel="noopener nofollow" target="_blank">http://pi.hole/admin/api.php?disable=[X]&amp;auth=[WEB_PASSWORD]</a></p> <p>[WEB_PASSWORD] can be found in <code class="prettyprint">/etc/pihole/setupVars.conf</code><br> It is a 64-character string with the identifier<code class="prettyprint">WEBPASSWORD</code><br> It is NOT your pi-hole interface or server password</p> <p>API Docs: <a href="https://discourse.pi-hole.net/t/pi-hole-api/1863" rel="noopener nofollow" target="_blank">https://discourse.pi-hole.net/t/pi-hole-api/1863</a></p> <p>Or, if logged into pi server, run: <code class="prettyprint">pihole enable</code><br> Docs: <a href="https://docs.pi-hole.net/core/pihole-command" rel="noopener nofollow" target="_blank">https://docs.pi-hole.net/core/pihole-command</a></p> </p> Hello World ๐Ÿ‘‹ Alicia's Notes ๐Ÿš€ Wed, 18 Mar 2020 18:41:16 +0000 https://notes.aliciasykes.com/13001/hello-world https://notes.aliciasykes.com/13001/hello-world <p><p>This is my blog. It has a bunch of random notes. The stuff here is mostly pointless, some of it's cool- but most of it pointless. Kind of like the rest of what I do with my life.</p> <p>I keep the posts and information up-to-date.</p> </p>