Archive

Archive for July, 2020

Best Chrome Extensions for Marketing in 2020

July 22nd, 2020 No comments

Internet users access numerous websites and resources to better search for and use various online information. In regards to Google Chrome, online users, marketers, and enterprises benefit from using the best chrome extensions for marketing in 2020.

With extensions, Google Chrome assists digital professionals and businesses with many marketing services to improve articles and social media content, search engine optimization (SEO), and E-commerce sites. Also, extensions provide users with tools to increase productivity and organization for project development.

When using the Google Chrome search engine, users have access to the internet across multiple platforms. Unlike other popular search engines, Google Chrome’s user-friendly interface and powerful software are versatile and consist of Google Chrome Extensions. Within the Google Chrome Store library, users access an extensive collection of easy-to-download and helpful Chrome extensions to enhance their daily online interactions and business.

What are Google Chrome extensions?

As a search engine, Google Chrome offers search engine services for all users. However, this software enables users to easily modify their search engine browsers to better assist users with various internet services. More specifically, the user manually downloads and installs .crx package files, which increase the functionality of individual Chrome browsers.

Commonly, users access the Google Chrome Store to download and install open-source or payment application operating software. Once users install extensions, users toggle, organize, and customize the extensions to meet online needs. Also, the best chrome extensions for marketing in 2020 appear in the Google Chrome store. Moreover, individuals, marketers, and enterprises improve productivity, access valuable information, and improve marketing content with various Google Chrome extensions.

Website and SEO Chrome Extensions

For most businesses, quality content, professional design, and effective search engine optimization (SEO) raise brand awareness and promote more traffic to web and mobile sites. With assistance, a web designer offers web design services to develop websites that rank well with google search engines to compete with more upscale corporations. After launching a website to meet business objectives, attracting visitors to the web and mobile sites is equally important.

Essentially, sending out a press release is a great solution to attract more visitors to the web and mobile sites. Furthermore, the press release promotes the brand from a creative perspective while showcasing the brand’s products and services more attractively. For the most part, professional website design and promotional campaigns ensure positive website performance and require the use of Chrome extensions for more effective marketing.

MozBar

First, MozBar is a Google Chrome extension that features a search engine optimization tool. More specifically, the features within MozBar display useful data metrics for web pages and websites. Once downloaded, MozBar displays a banner below the Google Chrome search browser with multiple analysis metrics to ensure that sites rank high on Google search engines and compete with more high ranking websites.

Through an “authority ranking,” users easily identify how individual pages, websites, links, and domains that rank with Google. The program also includes a spam report for sites to offer businesses the opportunity to avoid websites with lower content quality. Also, the MozBar user accesses the program’s metrics to identify specific links that are Do-follow or No-Follow and their rankings with relevant keywords.

NoFollow

Secondly, NoFollow is a vital marketing Chrome extension for search engine optimization. From Igorware.com, the software is available in the Google Chrome store. In detail, the NoFollow extension quickly identifies links on websites that do not increase link value. In other words, the lack of link promotion also refers to a “NoFollow” link. To explain, “NoFollow” sites do not allow websites to connect to other websites to increase domain rankings on Google search engines. In most cases, websites with higher search engine optimization rankings rely on DoFollow links that increase link value. In return, DoFollow links properly redirect site traffic to more dominant domains and increase overall website rankings.

Moreover, NoFollow comprises other Search engine optimization features to support business marketing objectives. Primarily, the NoFollow uses user-friendly color coding displays to outline various links. Also, the software quickly locates meta tags on web pages and sites. Lastly, the extension is easy to operate with a straightforward toggling control.

Google PageSpeed

Thirdly, understanding website performance metrics is essential for retaining high SEO rankings and online traffic. From the Google Chrome store, users download and install the Google PageSpeed Chrome extension to better track website performance and increase search engine optimization rankings. Often, websites consist of high-quality content but fail to gain attention due to complicated files that corrupt websites. As a result, less online traffic visits high-quality websites, which leads to a decrease in page and domain ranking on Google search engines.

However, Google PageSpeed’s software quickly indicates web pages with poor performance and reports valuable insights for users. From the speed tests, web and mobile developers better understand how website content interacts with various platforms. For better website performance, the developer opts into compiling images, videos, and animations into smaller files that enhance website performance and SEO rankings.

Content Marketing Chrome Extensions

For every marketer, developing high-quality content increases consumer traffic and scores high in search engine optimization on Google search engines. Additionally, content marketing improves branding, increases traffic to social media, mobile and online websites, and reaches more target audiences. Regardless of enterprise size, all agencies benefit from using Chrome extensions as one of the 10 best marketing tools for all agencies.

Thus, the best chrome extensions for marketing in 2020 enable marketers and digital professionals to develop quality content while tracking famous data metrics on competitor websites. As a plus, chrome extensions analyze popular keywords, images, and web and mobile designs to enhance content marketing.

Grammarly for Chrome

To continue, Grammarly is a software that assists all users with grammar and writing. Although Grammarly is available across multiple platforms, the Grammarly for Chrome extension classifies as one of the best chrome extensions for marketing in 2020 due to its user-friendly interface and professional writing services.

To list a few, Grammarly uses real-time writing editing software to address issues as they occur. Additionally, the software implements an assistant to modify writing format to fit the style and tone for specific target audiences. Most importantly, the Grammarly extension operates well while running in the background of the Google Chrome search browser. To add, Grammarly also gives users a plagiarism checker to analyze content for unique, high-quality content.

BuzzSumo Extension

Moving forward, BuzzSumo is one of the best Google Chrome extensions for marketing in 2020. To explain, BuzzSumo gives users the ability to compare keywords, content, and topics across Google web browsers. In more detail, marketers ensure that their articles, posts, and images rank higher than competitors’ content by viewing different web pages and analyzing performance metrics.

Additionally, the extension provides an in-depth analysis that displays information such as web and mobile site engagements, shares, pins, and backlinks. In return, users with BuzzSumo correctly add high-ranking keywords to websites that increase content value and attract more visitors to websites. Overall, BuzzSumo enables marketers to popularize content from smaller enterprises with websites and social media sites at more substantial corporations.

Networking Chrome Extensions

As a general rule, networking is an important marketing strategy for all businesses and entrepreneurs. In marketing, companies rely on collaboration with other clients to ensure that content expands to other significant domains and that communication remains reliable. Thus, marketers rely on networking extensions to increase productivity and promote higher ranking websites and content across Google.

Hunter.io

As a popular extension, Hunter.io is a simple and effective networking Chrome extension. As an open-source application, Hunter.io extracts emails quickly and locates contact information on the web and mobile sites. Also, the extension offers verification scores to inform users of more conventional contact forms. Rather than opening numerous web pages to search for the right personnel, the software increases networking capabilities for marketers.

Programming Chrome Extensions

In regards to data science, developers, marketers, and businesses rely on extensive research to search for code snippets. For better website design and functionality, the developer or marketer attaches pieces of codes to social media platforms and websites to improve brand presence. For example, programmers and marketers include social media buttons to websites, posts, articles, and profiles to attract online traffic to more brand websites.

Grepper

Free to download, Grepper is a unique and useful Chrome extension for programmers, developers, and marketers. To explain, Grepper runs in the background of the Google Chrome browser and quickly enables users to program information. Usually, searching for the correct codes and inquiries that apply to specific platforms and applications is sometimes tricky. However, Grepper software enables all users to locate the programming codes from their search results quickly.

Also, Grepper encourages more users to submit answers to rank well within the community as a helpful and reliable leader in the marketing and programming community. As an alternative to searching numerous forums and online video and article tutorials, Grepper is a straightforward solution identification software that better assists users. As a benefit, the users will decrease time searching for snippets of code and dedicate more time to improving web and mobile design and improving the functionality of sites.

Conclusion

In conclusion, the best Google Chrome extensions for marketing in 2020 assist users with developing websites with higher search engine optimization rankings, increasing productivity, and improving content quality. Although users have access to an extensive collection of Chrome extensions, using useful marketing software enables marketers and businesses to compete with others regardless of enterprise scale. With these extensions, users increase project development productivity, utilize more analytical metrics to target larger audiences, and promote brand value through quality content management.


Photo by Caio from Pexels

Categories: Others Tags:

Modern CSS Techniques To Improve Legibility

July 22nd, 2020 No comments
The comparison between the “d” and “x” glyphs of three different fonts at the same size reveal that their heights of the “x” (and therefore their optically size) are totally different

Modern CSS Techniques To Improve Legibility

Modern CSS Techniques To Improve Legibility

Edoardo Cavazza

2020-07-22T10:30:00+00:00
2020-07-23T08:09:31+00:00

We can read in many ways, and there are many different types of readers, each with their own needs, skills, language, and, above all, habits. Reading a novel at home is different from reading it on the train, just as reading a newspaper is different from browsing its online version. Reading, like any other activity, requires practice for someone to become fast and efficient. Basically, we read better those things that we are used to reading the most.

Which aspects should we take into consideration when designing and developing for reading? How can we create accessible, comfortable, inclusive experiences for all readers, including the most challenged and those affected by dyslexia?

Articles Dedicated To Accessibility

At Smashing, we believe a good website is an accessible website, one which is available to everyone, no matter how they browse the web. We’ve highlighted just some of the many articles that we’re sure will help you create more accessible sites and web apps. Explore more articles ?

Spaces, Words, Sentences, And Paragraphs

Units

On a web page, many units are available for us to adjust the font size of text. Understanding which unit to use is essential to setting the structure of a whole reading section. The reflowable nature of the web requires us to consider several aspects, such as the size of the viewport and the user’s reading preferences.

For this reason, the most suitable choices are generally em and rem, which are font-specific units. For example, setting the margins between paragraphs using ems helps to preserve the vertical rhythm as the text size changes. However, this can be a problem when a serif font is alternated with a sans-serif within a section. In fact, at the same font size, fonts can appear optically very different. Traditionally, the height of the lowercase “x” character (the x-height) is the reference for determining the apparent size of a character.

The comparison between the “d” and “x” glyphs of three different fonts at the same size reveal that their heights of the “x” (and therefore their optically size) are totally different

At the same font size, characters will optically appear very different. (Large preview)

Using the font-size-adjust rule, we can, therefore, optically render fonts of the same size, because the property will match the heights of the lowercase letters. Unfortunately, this property is currently available only in Firefox and in Chrome and Edge behind a flag, but it can be used as progressive enhancement using the @support check:

@supports (font-size-adjust: 1;) {
    article {
        font-size-adjust: 0.5;
    }
}

It also helps with the swap from the fallback font to the one loaded remotely (for example, using Google Fonts).

The first example shows how switching the font works normally. In the second one, we are using font-size-adjust to make the swap more comfortable. (Large preview)

Optimal Line Height

We think typography is black and white. Typography is really white […] It is the space between the blacks that really makes it.

— Massimo Vignelli, Helvetica, 2007

Because typography is more a matter of “whites” than ”blacks”, when we apply this notion to the design of a website or web application, we must take into account special features such as line height, margins between paragraphs, and line breaks.

Setting the font size by relying on the x-height helps with optimizing the line height. The default line height in browsers is 1.2 (a unitless value is relative to the font size), which is the optimal value for Times New Roman but not for other fonts. We must also consider that line spacing does not grow linearly with the font size and that it depends on various factors like the type of the text. By testing some common fonts for long-form reading, combined with sizes from 8 to 14 points, we were able to deduce that, on paper, the ratio between the x-height and the optimal line spacing is 37.6.

A graph shows the relation between the ratio of x height and line height (y axis) and the ratio of x height and ascenders (x axis), with a downward trend from 38.1 to 35.8 fo the first ratio while increasing values of the x axis

Acceptable line-spacing ranges. (Large preview)

Compared to reading on paper, screen reading generally requires more spacing between lines. Therefore, we should adjust the ratio to 32 for digital environments. In CSS, this empirical value can be translated into the following rule:

p {
    line-height: calc(1ex / 0.32);
}

In the right reading contexts, this rule sets an optimal line height for both serif and sans-serif fonts, even when typographical tools are not available or when a user has set a font that overwrites the one chosen by the designer.

Define The Scale

Now that we have adjusted the font size and used the ex unit to calculate the line height, we need to define the typographical scale in order to correctly set the spacing between paragraphs and to provide a good rhythm to the reading. As said before, line spacing does not grow linearly but varies according to the type of text. For titles with a large font size, for example, we should consider a higher ratio for the line height.

article h1 {
    font-size: 2.5em;
    line-height: calc(1ex / 0.42);
    margin: calc(1ex / 0.42) 0;
}

article h2 {
    font-size: 2em;
    line-height: calc(1ex / 0.42);
    margin: calc(1ex / 0.42) 0;
}

article h3 {
    font-size: 1.75em;
    line-height: calc(1ex / 0.38);
    margin: calc(1ex / 0.38) 0;
}

article h4 {
    font-size: 1.5em;
    line-height: calc(1ex / 0.37);
    margin: calc(1ex / 0.37) 0;
}

article p {
    font-size: 1em;
    line-height: calc(1ex / 0.32);
    margin: calc(1ex / 0.32) 0;
}

Letter And Word Spacing

When working on legibility, we must also consider readers who are challenged, such as those with dyslexia and learning disabilities. Developmental dyslexia affects reading, and discussion and research regarding the causes are still ongoing. It is important to make use of scientific studies to understand the effects that visual and typographic variables have on reading.

For example, in a study that my company followed (“Testing Text Readability of Dyslexia-Friendly Fonts”), there was clear evidence that the glyph shapes of high-legibility fonts do not really assist reading, but wider spacing between characters (kerning) does. This finding was confirmed by another study on the effectiveness of increased spacing (“How the Visual Aspects Can Be Crucial in Reading Acquisition: The Intriguing Case of Crowding and Developmental Dyslexia”).

These studies suggest that we should exploit the dynamism and responsiveness of web pages by offering more effective tools, such as controls for handling spacing. A common technique when enlarging the size of characters is to adjust the spacing between letters and words through CSS properties such as letter-spacing and word-spacing.

See the Pen [Letter and word spacing](https://codepen.io/smashingmag/pen/KKVbOoE) by Edoardo Cavazza.

See the Pen Letter and word spacing by Edoardo Cavazza.

The problem with this is that letter-spacing acts unconditionally and breaks the kerning of the font, leading the page to render nonoptimal spaces.

Alternatively, we can use variable fonts to gain more control over font rendering. Font designers can parameterize spacing in a variable and non-linear way, and can determine how the weight and shape of a glyph can better adapt to the habits of the reader. In the following example, using the Amstelvar font, we are able to increase the optical size as well as spacing and contrast, as intended by the designer.

See the Pen [The optical size in variable fonts](https://codepen.io/smashingmag/pen/VweqoRM) by Edoardo Cavazza.

See the Pen The optical size in variable fonts by Edoardo Cavazza.

The Web.dev article “Introduction to Variable Fonts on the Web” has more detail on what variable fonts are and how to use them. And check out the Variable Fonts tool to see how they work.

Width And Alignment

To optimize reading flow, we also have to work on the width of the paragraph, which is the number of characters and spaces on a line. While reading, our eye focuses on about eight letters in a foveatio (i.e. the operation that is activated when we look at an object), and it is able to handle only a few consecutive repetitions. Therefore, line breaks are crucial: The moment of moving one’s focus from the end of a line to the beginning of the next is one of the most complex operations in reading and must be facilitated by keeping the right number of characters per type of text. For a basic paragraph, a common length is about 60 to 70 characters per line. This value can be easily set with the ch unit by assigning a width to the paragraph:

p {
    width: 60ch;
    max-width: 100%;
}

Justification also plays an important role in reading across lines. Hyphenation support for languages is not always optimal in the various browsers; therefore, it must be checked. In any case, avoid justified text in the absence of hyphenation because the horizontal spacing that would be created would be an obstacle to reading.

/* The browser correctly supports hyphenation */
p[lang=”en”] {
    text-align: justify;
    hyphens: auto;
}

/* The browser does NOT correctly support hyphenation */
p[lang=”it”] {
    text-align: left;
    hyphens: none;
}

Manual hyphenation can be used for languages that do not have native support. There are several algorithms (both server- and client-side) that can inject the ‐ entity within words, to instruct browsers where the token can be broken. This character would be invisible, unless it is located at the end of the line, whereupon it would render as a hyphen. To activate this behavior, we need to set the hyphens: manual CSS rule.

Foreground Contrast

The contrast of characters and words with the background is fundamental to legibility. The WCAG has defined guidelines and constraints for different standards (A, AA, AAA) governing the contrast between text and background. Contrast can be calculated with different tools, both for design and development environments. Keep in mind that automated validators are support tools and do not guarantee the same quality as a real test.

By using CSS variables and a calc statement, we can dynamically calculate the color that offers the best contrast with the background. In this way, we can offer the user different types of contrast (sepia, light gray, night mode, etc.), by converting the whole theme according to the background color.

article {
    --red: 230;
    --green: 230;
    --blue: 230;
    --aa-brightness: (
        (var(--red) * 299) +
        (var(--green) * 587) +
        (var(--blue) * 114)
    ) / 1000;
    --aa-color: calc((var(--aa-brightness) - 128) * -1000);
    background: rgb(var(--red), var(--green), var(--blue));
    color: rgb(var(--aa-color), var(--aa-color), var(--aa-color));
}

See the Pen [Automatic text contrast](https://codepen.io/smashingmag/pen/zYrygyr) by Edoardo Cavazza.

See the Pen Automatic text contrast by Edoardo Cavazza.

In addition, with the introduction and cross-browser support of the prefer-color-scheme media query, it becomes even easier to manage the switch from light to dark theme, according to user preference.

@media (prefers-color-scheme: dark) {
    article {
        --red: 30;
        --green: 30;
        --blue: 30;
    }
}

Going Forward

Designing and developing for optimal reading require a lot of knowledge and the work of many professionals. The more this knowledge is spread across the team, the better off users will be. Below are some points to lead us to good results.

For Designers

  • Consider semantic structure as being part of the project, rather than a technical detail;
  • Document layout and font metrics, especially the why’s and how’s of your choices. They will help developers to correctly implement the design;
  • Reduce typographic variables as much as possible (fewer families, styles, and variants).

For Developers

  • Learn the principles of typography in order to understand the design decisions made and how to implement them;
  • Use units relative to font size to implement responsive layouts (paddings, margins, gaps) that scale to user preferences;
  • Avoid unrestrained manipulation of font metrics. Legibility might suffer when font constraints are not respected.

For Teams

  • Read and understand the principles of the WCAG;
  • Consider inclusion and accessibility as part of the project (rather than separate issues).

Reading is a complex activity. Despite the many resources on web typography and the academic papers that identify areas for improvements, there is no magical recipe for achieving good legibility. The number of variables to consider might seem overwhelming, but many of them are manageable.

We can set the optimal line height of a paragraph using the ex unit, as well as set a paragraph’s width using the ch unit, in order to respect the user’s preferred browser settings for font size and family. We can use variable fonts to adjust the spacing between letters and words, and we can manipulate the stroke of glyphs to increase contrast, helping readers with visual impairments and dyslexia. We can even automatically adjust text contrast using CSS variables, giving the user their preferred theme.

All of these help us to build a dynamic web page whose legibility is optimized according to the user’s needs and preferences. Finally, given that every little implementation or technological detail can make a huge difference, it is still essential to test users’ reading performance using the final artifact.

Related Resources

(ra, yk, al, il)

Categories: Others Tags:

Top 4 Examples of Great User Onboarding Design

July 22nd, 2020 No comments

Outstanding user experience is key to set yourself apart from your rivals in 2020, and it all starts the moment users sign up for your app or software. That is, user onboarding is a vital piece of the UX puzzle. If you get it right, user onboarding is a surefire way to boost user activation, engagement, and retention.

Despite that, numerous app startups tend to overlook user onboarding, which results in a nasty cycle of:

  • Shelling out an arm and a leg on user acquisition
  • Rendering a rough start (in terms of UX) to the users acquired
  • Eventually losing a good chunk of those users to a competitor
  • Repeat

So if you want to dodge this cycle and keep your users engaged with your app for the long-run, you better focus on designing a great user onboarding experience.

Wait, what’s user onboarding design, exactly?

Before we take inspiration from four solid examples of great user onboarding design, let’s promptly recap what user onboarding actually is. In the words of OptinMonster, “User onboarding is the process of actively guiding users to find new value in your product or service. It begins even before a user signs up and continues after that.”

You can imagine it as a small conversion funnel between acquiring new users and turning them into highly engaged ones. Alternatively, think of user onboarding as a bridge between new signups and happily paying loyal users. A great user onboarding design shortens the time it takes for users to learn about your product and its value.

With that clear, let’s learn from four of the best user onboarding design examples from brands that have done an excellent job at it:

Slack

By far one of the most popular team-messaging apps, Slack absolutely shines at explaining itself to the new users it still continues to acquire. It does so by leveraging well-designed empty states and clever use of its own core functionality — instant messaging.

That is, instead of towing new users through a tedious tour of every feature, Slack introduces users to only the key features like Threads using their empty states, along with crisp microcopy that explains how these features will be helpful once the user is active on the platform.

Furthermore, Slack uses its very own Slackbot to host a quick tour of the tool. This interactive approach compels users to take meaningful action while teaching them how to use the tool. Consider employing user onboarding tools to design such an exciting and interactive onboarding experience for your own product.

Duolingo

Duolingo enables people of any age to learn a language with personalized goals and fun questions. With as many as 36 languages on offer, with various difficulty levels, it can be tricky to get started. In comes Duolingo’s simple and super-effective user onboarding process to the rescue.

Unlike most apps, Duolingo has a user onboarding design that begins with the product and ends with a signup form — an exemplar of gradual engagement.

Gradual engagement is all about delaying registration for as long as possible — typically up to the point where users are sure about their interest in the app and must register in order to progress further. Duolingo’s onboarding process guides users through a swift translation exercise, illustrating just how quick and easy it can be to learn a new language — before asking users to commit to the app and signup.

So while certain features remain off-limits to unregistered users, users can still appreciate the app’s core value proposition of easy language learning without creating an account. Plus, a progress bar sets up the user’s expectations of the efforts needed to complete a lesson. As users watch their progress bar fill up, they may feel more motivated to drive it to completion.

Of course, gradual engagement isn’t a technique suitable for every product (a banking app, for instance, requires the user to enter personal information in order to prove its value). But the important takeaway is that you should consider letting users interact with your product and understand its core benefits before making them commit.

Hulu

Switching video streaming services is something most of us like to avoid. It can be annoying to learn a new content organization system on the new platform.

Hulu, however, does a brilliant job of making the switch seamless with its user onboarding process. As soon as you create an account, you land on the following page.

As is the usual case, Hulu offers a 30-day free trial and you can pick the plan you’d like to continue once the trial period ends. But not many streaming services remind you three days before your trial ends so you can decide whether to continue with the paid plan or cancel, something that Hulu does.

Now, once you create your account and choose your plan, you see a simple onboarding screen.

Hulu wants to personalize your viewing experience and minimize any stress that may be caused by its enormous library. Thus, it splits the content up into and suggests shows and movies based on your interests selected initially. Doing so, Hulu keeps you engaged with content recommendations that you’re likely to enjoy.

While this user onboarding process isn’t unique to Hulu, it’s simple and intuitive. The takeaway here is that you must learn about user preferences during the onboarding process so as to personalize their experience later on and keep them from churning.

IBM Cognos Analytics

IBM, the long-established tech giant is renowned for its powerful B2B SaaS products. Cognos Analytics is an AI-powered business intelligence solution that provides a comprehensive toolkit for tracking, reporting, and leveraging analytics.

As with most complex enterprise products, IBM’s Cognos Analytics may seem overwhelming to new users and effective onboarding depends on users’ ability to prioritize between a plethora of useful features. Instead of making users go through every single feature one by one, IBM focuses its onboarding design on providing context to a few core features that allow the user to get started right away.

It has a product tour with a “choose your own adventure” modal that lets users take their own path according to their needs. This gives users a feeling of being in control while allowing IBM to provide more tailored experiences.

What’s more, all the copy is succinct and adds value to users without overwhelming them with a clutter of features all at once.

Finally, a 3-item “Getting Started” checklist enables users to prioritize their first actions on the new platform and encourages them to complete the onboarding process without viewing it as a hurdle.

Over to You

All these four brands have designed an amazing onboarding experience that guides users to value and sets them up for continued success.
Simply put, user onboarding is an opportunity to create an awesome first impression on newly signed-up users and instantly make them realize why they need your product. Thus, strive to design an intuitive user onboarding experience and witness better user engagement and retention rates yourself.

Creator: Pratik Dholakiya is the Founder of Growfusely.
Photo: Business photo created by pressfoto – www.freepik.com

Categories: Others Tags:

What is a self-hosted WordPress blog?

July 22nd, 2020 No comments

Blogging is one of the most popular sources of passive income among youngsters nowadays, and why not? It requires less investment and gains a high ROI.

Now to start Blogging, you need a website to start with, and there are various free blogging websites available to make it easy for you. But do you really like to be controlled by these Free blogging websites? What if your blog is growing day by day and all of sudden your blogging site provider suddenly shuts off!

All your months of hard work will go in vain suddenly. Which you will don’t like!. Why depend on others and become liable to them if you have an option to choose your own hosted blog site in minimal amounts, where you will be the boss of your own blog website and you are free to do whatever you like to do with your site whether customization or adding new features to it. Due to this, a Self-hosted WordPress blog is very common nowadays, and below you will get all the information regarding “what is a self-hosted blog? How can you set up a self-hosted blog and some tips? etc.

Self-hosted WordPress blog

Self-hosted WordPress blog is nothing but a website for which you can buy your own domain name and Manage hosting service provider to set up your own blogging site. In which you can install your own CMS(Content Management System) and you have your own Control panel (Provided by both Domain name and hosting service provider). Where you have all the controls and can pay as per their monthly/yearly plans.

Pros of Self-hosted WordPress Blog

  • It’s free and super easy to use
  • You own the data. You have complete control. Your site will not be hacked because someone has decided that they have broken the rules (as long as they are not doing anything illegal). You are in control
  • You will be able to install your plugins freely
  • You can customize it with the Theme of your choice. Change theme files (not just styles), if you prefer
  • You can make money by making and inserting the ads you want Custom Tracking and Analytics.
  • Cybercrime will be limited and on your controls, You can customize and tighten website security as per your need. Most of the self-hosted service providers also come with their free hosting and security packages.

Cons of Self-hosted WordPress Blog

  • Like any other website, you will need to host it and this will come at a cost. As your site grows, your costs keep track (But you can make some money to cover them :))
  • You are responsible for updating your WordPress that can be done with a single click.
  • The backup is up to you, but you can count on some amazing plugins like BackupBuddy and VaultPress (which we use).
  • You are responsible for avoiding SPAM, but you can enable Akismet (which already comes with WordPress), and you won’t have to worry so much about it.

What are the pros and cons of Free blog providers?

Pros:

  • It’s free for up to predefined( threshold storage provided by different providers). After that, you will have to pay according to the space you need.
  • Free blogging websites make regular backups.

Cons:

  • Place ads on all free sites. If you prefer to live without the ads, you have to pay to remove them!
  • You are not allowed to place ads on your site unless you receive some minimum page views per month. They have a process that you can place ads as long as you share 50-50 with them.
  • You are restricted to your Analytics. Since you cannot enter custom codes, you will not be able to use metrics and analytics software.
  • They can delete your site at any time if they think it violates your Terms of Service.
  • They can change their theme without notice. Believe me, it already happened!
  • Even if you pay for upgrades, you still have to say that you are linked to WordPress.com

How to Start with Self- hosted WordPress blog?

So when you decide to blog and have all the important resources needed to create the blog (which we will discuss later in the blog), it shouldn’t take you longer than necessary to create a record. This means that it could be up and running in no time. So fasten your seat belts, as we will take you for a ride.

Resources you will need to start the blog:

  • A credit/debit card (for payments)
  • A domain name (try to choose something that is related to your niche)
  • Few minutes of your time (half an hour maximum)
  • Once you have all these things in hand, you’re almost ready to go. Now, you may want to decide on the platform. WordPress is suggested to you simply because it offers a multiplicity of benefits over any other free or paid platform. It is flexible, it allows plugins and templates, it is an open-source platform and, best of all, it gives you the independence to fully use the platform according to your requirements.
  • You will need a hosting account: To start the blog of your dreams, you must rent a space to install the blog platform and manage your blog. Web hosting primarily refers to a server on the remote computer, or cloud, where your blog basically lives. There are actually hundreds of Managed web hosting services available, however, Wpoven, Hostgator or Bluehost are recommended by almost everyone for many different reasons including the fact that it costs much less.
  • Install the WordPress plugin: Once you have finished your domain name and web hosting platform, the next thing that remains to be solved is the platform on which you will create your blogs, WordPress. Once you have chosen web hosting, you will need to install WordPress. The process is very simple and once you visit the WordPress site, you will be guided to make the installation easy and smooth.
  • Choose a theme for your blog: Immediately after you’ve completed your WordPress installation, you’re almost ready to blog; however, it still has a little detail to address. Select a topic that you like according to your requirements. There are many available, both free and at minimal cost, select the one you like best or sit closest to you and you’re ready to go.

This last step in this process is simply for fun. Once you have WordPress installed all you have to do is fill the spaces on the blog with ‘new posts’. You have completed the difficult part; all that’s left to do now is have fun with your new blog while making sure people learn something new, from your perspective.

Which one is best for you?

You cannot simply say that one platform is “better” than another.

The good question is: “What is the best option for my specific needs with the blog that I want to create now and in the future?”

I would consider the decision according to a series of different scenarios that can occur in this:

  • Intended to give it a try: f you just want to start blogging on a topic you like, but without any ambition and no specific horizon, I recommend you rule out WordPress.org and hire your own hosting (renting an Internet server for your site).

The reason is not so much the cost since the cost of hosting is very low, but to keep things simple.

Blogger demands more technically. I mean, would you rather not have to touch anything that sounds like technical stuff like HTML, or wouldn’t you mind messing around with these things a bit? If you don’t like technical stuff the answer is clear you better chose Blogger for an easy and hassle-free start. If you are a little more “techie” and you like to mess around with things like HTML or CSS, WordPress.com in its variant will be frustrating because basically you can not do anything at this level. Now, to get into its paid versions that already allow you to do things, but they cost what a hosting or more, I would go directly to WordPress.org with hosting.

Therefore, here it is more logical to go to Blogger if you want a free option. And also, if at any given time you want to monetize your activity, you will have fewer restrictions than on WordPress.com

  • If you are working on a serious project but don’t want to spend money: Here the first thing I want to advise you is, to be frank with yourself, can you really not afford what it costs to have a few coffees to pay the monthly fee for hosting? To get an idea of ??what we are talking about, In my opinion, You can start with these very popular Managed web hosting services provider such as Hostgator, Bluehost, Wpoven, etc. If you go into the links, you will see that we are talking about very little money per month in the basic plans. Basic plans are usually more than enough.

Now, if you really are in an extreme economic situation that prevents you from spending money on hosting, to choose between WordPress.com and Blogger, I would approach the subject as in the previous point depending on your skills with web technologies.

And finally, do not hire a free hosting, stay better with WordPress.com or Blogger. It will not compensate you, they are little less than a trap, a crappy trick to attract crappy customers.

  • Want to earn some money and you have a serious project: If you are not economic or financially weak like the one I described above and that really justifies not spending the least cost of hosting, there is simply no doubt: I would always recommend self-hosted WordPress blog. Otherwise, you will discover that the limitations of Blogger (which has much less) are a drag on your project. In addition, you forget from the beginning of future complications derived from the need to migrate to a self-hosted WordPress blog.

And I am not thinking about the limitations for the use of online advertising, in fact, it is one of the least effective options when you are not an experienced and media professional.

I’m thinking of things like, for example, affiliate marketing where you need to do things like following conversion statistics to know what content works and what doesn’t for the purpose of generating commissions, being able to design your site free to adapt it to what you need or the integration of a shopping cart to be able to make sales.

If you are starting out and do not have technical knowledge of any kind, also seriously consider spending a little more on hosting that goes beyond normal support on hosting and also offers specialized WordPress support.

If nothing works for you, you can learn web designing and earn from it from freelancing. There are various freelancing websites such as Upwork, Fiverr, etc. that provide a unique platform, to begin with. Just you have to make a free account and attract web designing clients with your lucrative offers/bids.

Now, as it could have been pretty clear now, nothing is easier and more fun than having your own blog to keep your point of view or your business facing the world and nothing is easier and faster than doing the same with WordPress. Now, you can get your blog up and running in even less time than you need to do laundry every day. If I were you, I’d rather skip my clothes today and build my blog.


Photo by Stephen Phillips – Hostreviews.co.uk on Unsplash

Categories: Others Tags:

What is a self-hosted WordPress blog?

July 22nd, 2020 No comments

Blogging is one of the most popular sources of passive income among youngsters nowadays, and why not? It requires less investment and gains a high ROI.

Now to start Blogging, you need a website to start with, and there are various free blogging websites available to make it easy for you. But do you really like to be controlled by these Free blogging websites? What if your blog is growing day by day and all of sudden your blogging site provider suddenly shuts off!

All your months of hard work will go in vain suddenly. Which you will don’t like!. Why depend on others and become liable to them if you have an option to choose your own hosted blog site in minimal amounts, where you will be the boss of your own blog website and you are free to do whatever you like to do with your site whether customization or adding new features to it. Due to this, a Self-hosted WordPress blog is very common nowadays, and below you will get all the information regarding “what is a self-hosted blog? How can you set up a self-hosted blog and some tips? etc.

Self-hosted WordPress blog

Self-hosted WordPress blog is nothing but a website for which you can buy your own domain name and Manage hosting service provider to set up your own blogging site. In which you can install your own CMS(Content Management System) and you have your own Control panel (Provided by both Domain name and hosting service provider). Where you have all the controls and can pay as per their monthly/yearly plans.

Pros of Self-hosted WordPress Blog

  • It’s free and super easy to use
  • You own the data. You have complete control. Your site will not be hacked because someone has decided that they have broken the rules (as long as they are not doing anything illegal). You are in control
  • You will be able to install your plugins freely
  • You can customize it with the Theme of your choice. Change theme files (not just styles), if you prefer
  • You can make money by making and inserting the ads you want Custom Tracking and Analytics.
  • Cybercrime will be limited and on your controls, You can customize and tighten website security as per your need. Most of the self-hosted service providers also come with their free hosting and security packages.

Cons of Self-hosted WordPress Blog

  • Like any other website, you will need to host it and this will come at a cost. As your site grows, your costs keep track (But you can make some money to cover them :))
  • You are responsible for updating your WordPress that can be done with a single click.
  • The backup is up to you, but you can count on some amazing plugins like BackupBuddy and VaultPress (which we use).
  • You are responsible for avoiding SPAM, but you can enable Akismet (which already comes with WordPress), and you won’t have to worry so much about it.

What are the pros and cons of Free blog providers?

Pros:

  • It’s free for up to predefined( threshold storage provided by different providers). After that, you will have to pay according to the space you need.
  • Free blogging websites make regular backups.

Cons:

  • Place ads on all free sites. If you prefer to live without the ads, you have to pay to remove them!
  • You are not allowed to place ads on your site unless you receive some minimum page views per month. They have a process that you can place ads as long as you share 50-50 with them.
  • You are restricted to your Analytics. Since you cannot enter custom codes, you will not be able to use metrics and analytics software.
  • They can delete your site at any time if they think it violates your Terms of Service.
  • They can change their theme without notice. Believe me, it already happened!
  • Even if you pay for upgrades, you still have to say that you are linked to WordPress.com

How to Start with Self- hosted WordPress blog?

So when you decide to blog and have all the important resources needed to create the blog (which we will discuss later in the blog), it shouldn’t take you longer than necessary to create a record. This means that it could be up and running in no time. So fasten your seat belts, as we will take you for a ride.

Resources you will need to start the blog:

  • A credit/debit card (for payments)
  • A domain name (try to choose something that is related to your niche)
  • Few minutes of your time (half an hour maximum)
  • Once you have all these things in hand, you’re almost ready to go. Now, you may want to decide on the platform. WordPress is suggested to you simply because it offers a multiplicity of benefits over any other free or paid platform. It is flexible, it allows plugins and templates, it is an open-source platform and, best of all, it gives you the independence to fully use the platform according to your requirements.
  • You will need a hosting account: To start the blog of your dreams, you must rent a space to install the blog platform and manage your blog. Web hosting primarily refers to a server on the remote computer, or cloud, where your blog basically lives. There are actually hundreds of Managed web hosting services available, however, Wpoven, Hostgator or Bluehost are recommended by almost everyone for many different reasons including the fact that it costs much less.
  • Install the WordPress plugin: Once you have finished your domain name and web hosting platform, the next thing that remains to be solved is the platform on which you will create your blogs, WordPress. Once you have chosen web hosting, you will need to install WordPress. The process is very simple and once you visit the WordPress site, you will be guided to make the installation easy and smooth.
  • Choose a theme for your blog: Immediately after you’ve completed your WordPress installation, you’re almost ready to blog; however, it still has a little detail to address. Select a topic that you like according to your requirements. There are many available, both free and at minimal cost, select the one you like best or sit closest to you and you’re ready to go.

This last step in this process is simply for fun. Once you have WordPress installed all you have to do is fill the spaces on the blog with ‘new posts’. You have completed the difficult part; all that’s left to do now is have fun with your new blog while making sure people learn something new, from your perspective.

Which one is best for you?

You cannot simply say that one platform is “better” than another.

The good question is: “What is the best option for my specific needs with the blog that I want to create now and in the future?”

I would consider the decision according to a series of different scenarios that can occur in this:

  • Intended to give it a try: f you just want to start blogging on a topic you like, but without any ambition and no specific horizon, I recommend you rule out WordPress.org and hire your own hosting (renting an Internet server for your site).

The reason is not so much the cost since the cost of hosting is very low, but to keep things simple.

Blogger demands more technically. I mean, would you rather not have to touch anything that sounds like technical stuff like HTML, or wouldn’t you mind messing around with these things a bit? If you don’t like technical stuff the answer is clear you better chose Blogger for an easy and hassle-free start. If you are a little more “techie” and you like to mess around with things like HTML or CSS, WordPress.com in its variant will be frustrating because basically you can not do anything at this level. Now, to get into its paid versions that already allow you to do things, but they cost what a hosting or more, I would go directly to WordPress.org with hosting.

Therefore, here it is more logical to go to Blogger if you want a free option. And also, if at any given time you want to monetize your activity, you will have fewer restrictions than on WordPress.com

  • If you are working on a serious project but don’t want to spend money: Here the first thing I want to advise you is, to be frank with yourself, can you really not afford what it costs to have a few coffees to pay the monthly fee for hosting? To get an idea of ??what we are talking about, In my opinion, You can start with these very popular Managed web hosting services provider such as Hostgator, Bluehost, Wpoven, etc. If you go into the links, you will see that we are talking about very little money per month in the basic plans. Basic plans are usually more than enough.

Now, if you really are in an extreme economic situation that prevents you from spending money on hosting, to choose between WordPress.com and Blogger, I would approach the subject as in the previous point depending on your skills with web technologies.

And finally, do not hire a free hosting, stay better with WordPress.com or Blogger. It will not compensate you, they are little less than a trap, a crappy trick to attract crappy customers.

  • Want to earn some money and you have a serious project: If you are not economic or financially weak like the one I described above and that really justifies not spending the least cost of hosting, there is simply no doubt: I would always recommend self-hosted WordPress blog. Otherwise, you will discover that the limitations of Blogger (which has much less) are a drag on your project. In addition, you forget from the beginning of future complications derived from the need to migrate to a self-hosted WordPress blog.

And I am not thinking about the limitations for the use of online advertising, in fact, it is one of the least effective options when you are not an experienced and media professional.

I’m thinking of things like, for example, affiliate marketing where you need to do things like following conversion statistics to know what content works and what doesn’t for the purpose of generating commissions, being able to design your site free to adapt it to what you need or the integration of a shopping cart to be able to make sales.

If you are starting out and do not have technical knowledge of any kind, also seriously consider spending a little more on hosting that goes beyond normal support on hosting and also offers specialized WordPress support.

If nothing works for you, you can learn web designing and earn from it from freelancing. There are various freelancing websites such as Upwork, Fiverr, etc. that provide a unique platform, to begin with. Just you have to make a free account and attract web designing clients with your lucrative offers/bids.

Now, as it could have been pretty clear now, nothing is easier and more fun than having your own blog to keep your point of view or your business facing the world and nothing is easier and faster than doing the same with WordPress. Now, you can get your blog up and running in even less time than you need to do laundry every day. If I were you, I’d rather skip my clothes today and build my blog.


Photo by Stephen Phillips – Hostreviews.co.uk on Unsplash

Categories: Others Tags:

Why You Should Avoid Free WordPress Themes

July 22nd, 2020 No comments

As a newbie to the world of websites, you’ve probably heard of WordPress, plenty of website owners and developers swear by it as the best content management system for building your website.

The problem with WordPress for many is also its greatest strength, the power of customisation.

Creating your own site on WordPress is as simple as finding a theme you like and installing it on your site. There are thousands of themes to choose from, with many of them being affordable and provide you with a host of features any website owner would love, yet people still opt for free themes.

Free themes are a great way to get used to WordPress and messing around, but as for building your actual site on a free theme, I would recommend against it.

In case you think you’re cutting costs or being smart you need to realise that there is no free lunch, even with the internet having so much frees tuff available. There are reasons developers are giving away stuff for free and its all part of a grand plan.

If you want to know why you should avoid free themes, then check out our list below.

1. No support or documentation

Most free WordPress themes aren’t worth a developers time to maintain, update or provide support and is an entry point for users to try out WordPress or see what the developer is capable of so they can upsell you into their premium themes.

Many free themes are often abandoned, the developers don’t update them or the developers no longer in operation. Free themes also don’t always come with great documentation on how to use them so you won’t know if something is a feature or a bug, you simply have to figure it out on your own which can take hours.

Developers are also going to focus on what makes them money so while some do update their fee themes, they take more time to release than the Premium versions which are worth updating, so you need to wait for your updates, leaving you behind others.

2. Not SEO-optimised

Free WordPress themes are usually bare-bones and hardly offer any in-built SEO options and the coding will be unclear. A clean code, faster loading time, SEO compatible makes a theme SEO-optimised. If the point of your site is to get traffic from Google search, its better to have a platform that tailors to all Google’s needs from the beginning.

3. Lesser number of features

Free themes are normally not rich when it comes to features and is only there to give you an idea of how what a developer can do for you. Some will rely on plugins when these features could be built natively into themes and bloat your code when it wasn’t needed.

Certain free themes also try to upsell you by recommending premium plugins instead, and once you get all the features you want, you probably paid more for all those plugins than a premium theme would have cost you.

A basic blog could possibly get away with using a free theme, but any business or eCommerce site should always opt to ship out for a paid theme if they are serious about building a website.

4. No theme options panel

Many bloggers who are starting a WordPress site may not have technical knowledge. Premium themes often gather various feature sets and place it into an easy to use GUI which is known as a theme panel, a benefit of using a premium theme.

Most of the free WordPress themes do not come with a theme options panel, so you need to play with the codes to create any custom design or even edit the PHP file to add certain features, an option that many non-coders should try to avoid.

If you’re a non-technical person and just want to be able to make changes while changing a range of presets.

5. Mobile responsiveness

Having a site that is mobile-friendly is not enough in this competitive internet arena, and your site needs to provide an optimal mobile experience as it would on desktop. Google has actively split its mobile and desktop index to give better results for mobile users, and if you’re in a country with a high mobile use rate, it’s best you get a theme that can automatically respond to your changes and turn it into a mobile-friendly page.

Free themes may have some mobile-friendly aspects like 1 or 2 columns settings, but it may not allow you to do more customisation than a premium or paid theme would, limiting your ability to customise your site for mobile users.

6. Spam links

The one thing that sets me off about free WordPress themes is they often stuff links into the footer, sometimes it’s customisable other times its encrypted and cannot be removed. This may be seen as link spam by Google or if your site gathers a lot of traffic you’re sending the theme owner tonnes of free traffic via your efforts.

7. Hidden and malicious code

Unfortunately, the WordPress community aren’t all the noblest of developers, and open source code isn’t the most trustworthy. As a developer, you may be able to snatch code from online repositories and review it for insecurities before using it.

However, for non-technical grabbing random code off the internet, this provides a distinct risk as you could be installing backdoors into your website or devices, as well as hidden, malicious code within a theme. This hidden code can produce spam links, security exploits, and abuses on your WordPress site. Hackers install code in various places that run this type of malware.

If you don’t want to risk bad or malicious code, then stay away from free themes.

8. Plugins compatibility problems

Plugins are one of the main reasons any site owner opts for WordPress since they make it easier for non-coders to add features to their site. Free themes are often not the most well-checked code bases and plugins can sometimes break or corrupt your site as they are added. The incompatibility of your theme with plugins will mean one has to go and since the theme is the main code base, you will have to start deleting WordPress plugins to keep your site in working order.

In addition, a shoddy code base can also mean 3rd party code reduces the performance and actually needs to be refactored to work properly.

If you feel that plugins for 3rd party tools and features are a must, then its best you stay away from free themes.

9. Endlessly searching for free themes

Free themes are a dime a dozen and reviewing themes, there features and which one has more of what you need can take a lot of time and to be completely honest, you won’t find a free theme with all the features you like and want. As you dive deeper down the rabbit hole of themes, you could end up downloading files that aren’t exactly the safest.

To find trustworthy themes, you should use approved WordPress theme resellers and try to find something in your price range. Remember this is only to get you started, once your site is up and running and making money you could purchase a more expensive theme and revamp your site with new features and a better look.

10. Lack of continued development

WordPress software continues to improve with each new update. Two or three times a year, WordPress releases new software versions, adding new features, security patches, and numerous other updates. This is the code base of the actual WordPress CMS, not the theme or 3rd party software like plugins.

As you can tell, there are a lot of moving parts, and with free themes not having support, as coding changes, you may see more and more erratic behaviour from your site.

You will either be forced to remain on older versions of WordPress to remain compatible and miss out on new features, and security updates or you need to get a new theme or a developer to update your free theme, costing you more than it should have should you have bought a premium theme.

Free can come at a cost

I get it, it’s easy to get wrapped up in free offers but in some cases, free can cost you more than spending a few bucks for peace of mind. If you’re going to pick a theme, make sure you use trusted theme resellers and that you have direct content with the creator so you can always reach out to them should you have issues.

Free WordPress themes have their place in the ecosystem, but should not be used if you’re going to be serious about building a website and want customers to interact with it.


Photo by Fikret tozak on Unsplash

Categories: Others Tags:

How to Keep Work Safe When Telecommuting Replaces Office

July 22nd, 2020 No comments

Working from home is a logical response to the circumstances that emerged because of the COVID-19 pandemic. But, are we all really ready to work from home and from other places where we have the opportunity to connect to our company systems via the Internet, that is, public networks, and work the same as sitting in our office, at our desk?

What could be wrong with that? Well, for many, just about everything…

Risks of Telecommuting

The company’s internal systems have been built and adjusted over the years, taking care to be stable and secure. Suddenly, overnight, employees are no longer in their offices but at their homes or in some other places where there’s an Internet connection. Of course, they’re expected to be productive and perform their tasks as well as if they were in their usual working places.

Such work outside the company’s offices can seriously jeopardize the security of the organization’s data and information systems. These risks are incomparably greater in times of crisis, such as natural disasters, earthquakes, riots or states of war, and even in times of epidemics such as now.

Some of these risks include:

  • Unauthorized physical access to devices that access systems and data.
  • Disclosure of information for access to the system (so-called social engineering or electronic “eavesdropping” of communication).
  • The use of devices outside the company’s premises significantly increases the possibility that these devices will be “infected” with malware.
  • Difficulties in establishing a secure communication channel.
  • Poor or insufficient protection of access to key parts of the system and sensitive data.

How to Protect Yourself?

You need to take care of 3 basic things:

  1. Security of device you access
  2. Communication security
  3. Data security itself

Working from home often involves more than just using devices from the company we work for, which should have antivirus detection software installed and data security systems stored on those devices (such as encrypting the data contained on devices and/or partitions and directories accessed with special credentials).

The use of other devices, such as mobile phones, tablets, or home computers used by other household members, especially children, can be very dangerous and their use should be completely excluded or minimized.

VPN as a Solution for All Problems

VPN these days is a magic word that solves all problems when it comes to working outside the company’s premises. Yes, a VPN allows secure data exchange between remote systems and the computers that access them, but it also has its weaknesses. Even well-known manufacturers of equipment and software solutions for establishing VPN connections have faced security vulnerabilities in recent years.

Many small businesses use low-cost networking equipment that also has VPN functionality. Most of these devices are made for home use to provide basic protection for access to networked devices in the house (cameras, heating systems, air conditioning systems, lighting …).

To make things worse, many of the weaknesses of these devices and the ways to abuse them have long been known and are available to everyone, not just experts. If you’ve already enabled VPN access to your organization’s system, install the latest software that resolves known security issues.

If your device allows you to select VPN communication encryption algorithms, choose the one that gives you the highest level of security. This will inevitably slow down the speed of communication, but with modern devices and fast Internet links, the slowdown won’t be an obstacle to get the job done without any problems and your organization’s systems and data will be much more secure. Limited access device resources can be a problem, but only if a large number of users connect to the system at the same time.

Access Control

And last but not least important component of maintaining system and data security is access control. When working from the office, users have different access rights to data and applications and this is mostly addressed by rules at the level of the operating system, DC (domain controller), or some other access control system.

In most cases, this is sufficient protection because all, or the vast majority of users, work within the environment for which access rules are set. Remote work requires the establishment of the same rules but in the new situation, access points are exposed to possible hacker attacks and they will, once inside, know how to bypass those rules and access your confidential data.

If the equipment you use for the VPN connection allows this, turn on multi-factor authentication and filtering of IP addresses from which access is allowed. You can find out your IP address and hide it at https://nordvpn.com/what-is-my-ip/. Segment your internal network and disable access, except with special credentials, to those segments that are most important to the functioning of your organization and that contain the most sensitive data whose endangerment or destruction jeopardizes the survival of the company.

Quality and up-to-date antivirus programs, network segmentation, regular and secure backup, and monitoring of traffic, especially the one coming out of your system, are necessary elements to raise system security to a sufficient level for most companies. System and data integrity and security should always come first.


Photo by Jacky Chiu on Unsplash

Categories: Others Tags:

What ya need there is a bit of templating

July 22nd, 2020 No comments

I had a fella write in to me the other day. He had some HTML, CSS, and JavaScript, and it just wasn’t behaving like he thought it ought to. The HTML had some placeholders in it and the JavaScript had some data in it, and the assumption was that the data would fill the placeholders.

To those of us with some degree of web knowledge, we can look at this and see why it’s not working like he thought it would. But I think it’s also valuable to try to see things from that perspective and then look at solutions that are hopefully as simple as the original problem seems to be.

The HTML was something like this…

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Test</title>
  <link rel="stylesheet" href="test.css">
  <script src="data.js"></script>
</head>
<body>
  <section>
    <div>{company_name}</div>
  </section>
</body>
</html>

The JavaScript was like this…

var company_data = {
  "{company_name}" : "SOME COMPANY",
};

There is nothing invalid going on here.

That’s all perfectly valid code. It is linked up right. It will run. It just doesn’t do anything besides render {company_name} to the screen. The expectation is that it would render SOME COMPANY to the screen instead, replacing the {company_name} placeholder with the data from the JavaScript file.

Let’s fix it with a one-liner.

In this exact scenario, to display the correct company name, we need to select that element in the DOM and replace its content with our data. We could do that by adding this one extra line to the JavaScript:

var company_data = {
  "{company_name}": "SOME COMPANY"
};

document.querySelector("div").innerHTML = company_data["{company_name}"];

That’s not particularly re-usable or resiliant, but hey, it’s also not over-thinking or over-tooling it.

The expectation was templating

I think we can see at this point that what he hoped would happen is that this sort of templating would automatically happen. Provide an object with keys that match what is in the HTML, the content in that HTML is automatically swapped out. It just doesn’t work that way with raw web technologies.

No joke, there are hundreds of ways to go about handling this. Here’s a few off the top of my head:

  • Use a templating language like Handlebars or Mustache
  • Use a static site generator like Eleventy, which uses Liquid by default
  • Make an HTML and write your own script to use it
  • Make a Web Component
  • Use a back-end language instead, or a language like Nunjucks to process ahead of time
  • Use a preprocessor like Pug

As a general preference, I’d say doing the templating server-side or during a build is ideal — why mess with the DOM if you don’t need to?

But just to ignore that advice for a second, here’s an example of doing it client-side with Handlebars, just so the fella from the original email has a working example of how that can work:

CodePen Embed Fallback

The post What ya need there is a bit of templating appeared first on CSS-Tricks.

You can support CSS-Tricks by being an MVP Supporter.

Categories: Designing, Others Tags:

Using Flexbox and text ellipsis together

July 21st, 2020 No comments

You can truncate a single line of text with an ellipsis (…) fairly easily with text-overflow and a few friends. But, as you might expect, that truncation happens at the end of the line of text. What if you want to truncate content in the middle?

Leonardo Faria details good use cases for this, like in an operating system window listing files. The line of text is a file name and a file extension. When that line truncates, it truncates just the name, always leaving the extension at the end. The trick is a flexbox parent so you can use overflow on just the file name part, but have to make sure to reset the min-width, as the natural value there is min-content, which prevents the truncation which is confusing.

CodePen Embed Fallback

Direct Link to ArticlePermalink


The post Using Flexbox and text ellipsis together appeared first on CSS-Tricks.

You can support CSS-Tricks by being an MVP Supporter.

Categories: Designing, Others Tags:

Building Desktop Apps With Electron And Vue

July 21st, 2020 No comments
default open state of your electron app

Building Desktop Apps With Electron And Vue

Building Desktop Apps With Electron And Vue

Timi Omoyeni

2020-07-21T15:30:00+00:00
2020-07-21T18:33:53+00:00

JavaScript used to be known as the language for building websites and web applications especially with some of its frameworks such as React, Vue, and Angular but over time (as early as 2009), it became possible for JavaScript to run outside the browser with the emergence of Node.js, an open-source, cross-platform, JavaScript runtime environment that executes JavaScript code outside a web browser. This has led to the ability to use JavaScript for a whole lot more than just web applications, and one of which is building desktop applications using Electron.js.

Electron enables you to create desktop applications with pure JavaScript by providing a runtime with rich native (operating system) APIs. You can see it as a variant of the Node.js runtime that is focused on desktop applications instead of web servers.

In this tutorial, we’re going to learn how to build desktop applications using Electron, we’re also going to learn how to use Vuejs to build Electron applications.

Note: Basic knowledge of Vue.js and the Vue CLI is required to follow this tutorial. All of the code used in this tutorial can be found on my GitHub. Feel free to clone and play around with it!

What Are Desktop Applications?

Desktop applications are applications that run stand-alone in desktop or laptop computers. They are applications that perform specific tasks and are installed solely for this purpose.

An example of a desktop application is your Microsoft Word, which is used for creating and typing documents. Other examples of common desktop applications are web browsers, Visual Studio Code, and Adobe Photoshop. Desktop applications are different from web applications because you have to install the desktop application in order for you to access and make use of it, and they sometimes do not need internet access for them to work. Web apps, on the other hand, can be accessed by simply visiting the URL that such an app is hosted on and always need internet access before you can access them.

Examples of frameworks used in building desktop apps include:

  1. Java
    Java is a general-purpose programming language that is class-based, object-oriented, and designed to have as few implementation dependencies as possible. It is intended to let application developers write once, run anywhere (WORA), meaning that compiled Java code can run on all platforms that support Java without the need for recompilation.
  2. Java FX
    According to their official documentation, it is an open-source, next-generation client application platform for desktop, mobile, and embedded systems built on Java.
  3. C#
    C# is a general-purpose, multi-paradigm programming language encompassing strong typing, lexically scoped, imperative, declarative, functional, generic, object-oriented, and component-oriented programming disciplines.
  4. .NET
    .NET is a free, cross-platform, open-source developer platform for building many different types of applications. With .NET, you can use multiple languages, editors, and libraries to build for web, mobile, desktop, gaming, and IoT.

What Is Electron?

Electron is an open-source framework for building desktop applications. It was formerly known as ‘Atom shell’ and is developed and maintained by GitHub. It lets you write cross-platform desktop applications using HTML, CSS, and JavaScript. This means that you can build desktop applications for Windows, MacOS and other platforms using one code base. It is based on Node.js and Chromium. Examples of applications built with Electron include the popular Atom editior, Visual Studio Code, WordPress for desktop, and Slack.

Installation

You can install Electron in your project using NPM:

npm install electron --save-dev

You can also install it globally if you’re going to be working with electron apps a lot using this command:

npm install electron -g

Building Vuejs Apps For Desktop With Electron

If you’re familiar with building web applications using Vuejs, it is possible to build desktop applications using Vuejs. All you need for this is the Vue CLI Plugin Electron Builder.

The Vue CLI Plugin Electron Builder

This tool allows you to build Vue apps for desktop with Electron, this means that it makes your Vue application work as an electron app. This means that your Vue application which possibly is a web application can be extended to work in desktop environments without the need to build a separate desktop application in another framework. This gives Vue developers the option and power to go beyond the web. Going forward, you can work on that idea you have and give users a desktop application option — one that can run on Windows, macOS, and Linux.

To see this in action, we’re going to be building a News app using the News API. The application will provide breaking news headlines and allow you to search for articles from news sources and blogs all over the web with their API. All you need to get started with them is your personal API key which can be gotten from here.

We’ll be building a simple app that offers the following:

  1. A page that displays top and breaking headlines from a selected country with the option to choose a country using their /top-headlines endpoint. News API provides news from a list of countries that they support, find the list here.
  2. News from a selected category using a combination of their /everything endpoint and a query parameter q with which we’ll specify our category.

After getting your API Key, we can create our application using the Vue CLI. Ensure you have the Vue CLI installed on your system, if you do not, install it using this command:

npm install -g @vue/cli
# OR
yarn global add @vue/cli

Once this is done, create your News app using the CLI:

vue create news-app

We’ll fetch the data from the News API by using Axios for this tutorial, but you can use any alternative you’re more comfortable with. You can install Axios by using any of the following commands:

//NPM
npm install axios
// YARN
yarn add axios

The next step would be to set up an Axios instance for global config in our application. We’re going to be creating a plugins folder in the src folder where we’ll create this axios.js file. After creating the file, add the following lines of code:

import axios from "axios";
let baseURL = `https://newsapi.org/v2`;
let apiKey = process.env.VUE_APP_APIKEY;
const instance = axios.create({
    baseURL: baseURL,
    timeout: 30000,
    headers: {
        "X-Api-Key": apiKey,
    },
});
export default instance;

Here, we define our baseURL and apiKey which we got from News API and pass it to a new instance of Axios. This instance accepts the baseURL and apiKey together with a timeout property. News API requires you to add your API Key when making a request to their API and offers 3 ways to attach it to your request but here, we’re adding it to the header X-Api-Key property after which we export instance. Once this is done, we can now use this config for all our Axios requests in our app.

When this is done, you can add the Plugin Electron builder with the CLI using this command:

vue add electron-builder

You’ll be prompted to select your preferred Electron version, I selected version 9.0.0 because it is the latest version of Electron (at the time of writing).

When this is done, you can now serve your application using this command:

Using Yarn(strongly recommended)
yarn electron:serve
OR NPM
npm run electron:serve

This will take some time to compile and serve your app. When that is done, your application will pop open on your system, this should look like this:

default open state of your electron app

Auto-open state of your electron app. (Large preview)

If you close the devtools of your app, it should look like this:

anding page your app

Landing page your app. (Large preview)

This electron plugin is super helpful and easy to use because every part of the development of this app works the same way as a Vue app. This means you can have one codebase for both your web application and desktop app. Our app will have three parts:

  1. A landing page that renders top news from a country chosen at random.
  2. A page for rendering top news from the user’s country of choice.
  3. A page that renders top news from a category of the user’s selection.

For this, we’re going to be needing a header component for all our nav links. So let us create a file in the components folder and name it header.vue, and afterward add the following lines of code to it:

<template>
    <header class="header">
        <div class="logo">
            <div class="logo__container">
                <img src="../assets/logo.png" alt="News app logo" class="logo__image" />
            </div>
            <h1>News App</h1>
        </div>
        <nav class="nav">
            <h4 class="nav__link">
                <router-link to="/home">Home</router-link>
            </h4>
            <h4 class="nav__link">
                <router-link to="/top-news">Top News</router-link>
            </h4>
            <h4 class="nav__link">
                <router-link to="/categories">News By Category</router-link>
            </h4>
        </nav>
    </header>
</template>
<script>
    export default {
        name: "app-header",
    };
</script>
<style>
    .header {
        display: flex;
        flex-wrap: wrap;
        justify-content: space-between;
    }
    .logo {
        display: flex;
        flex-wrap: nowrap;
        justify-content: space-between;
        align-items: center;
        height: 50px;
    }
    .logo__container {
        width: 50px;
        height: 50px;
    }
    .logo__image {
        max-width: 100%;
        max-height: 100%;
    }
    .nav {
        display: flex;
        flex-wrap: wrap;
        width: 350px;
        justify-content: space-between;
    }
</style>

Here, we create a header component that has our app name and logo (image can be found on my GitHub) together with a nav section that contains links to the other parts of our application. The next thing would be to import this page on our layout page — App.vue so we can see our header on every page.

<template>
    <div id="app">
        <app-header />
        <router-view />
    </div>
</template>
<script>
    import appHeader from "@/components/Header.vue";
    export default {
        name: "layout",
        components: {
            appHeader,
        },
    };
</script>
<style>
    @import url("https://fonts.googleapis.com/css2?family=Abel&family=Staatliches&display=swap");
    html,
    #app {
        min-height: 100vh;
    }
    #app {
        font-family: "Abel", sans-serif;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        text-align: center;
        color: #2c3e50;
        background-color: #fff;
    }
    #app h1 {
        font-family: "Staatliches", cursive;
    }
    a {
        font-weight: bold;
        color: #2c3e50;
        text-decoration: none;
    }
    a:hover {
        text-decoration: underline;
    }
    a.router-link-exact-active {
        color: #42b983;
    }
</style>

Here, we replace the default content in the template section with our newly created header component after we have imported and declared it in the script section. Finally, we add some styling for the whole app in the style section.

Now if we try to view our app, it should look like this:

empty landing page

Empty landing page. (Large preview)

The next step would be to add content to our Home.vue file. This page would host the first section of our app; Top news from a country selected at random. Update your Home.vue file with the following lines of code:

<template>
  <section class="home">
    <h1>Welcome to News App</h1>
    <h4>Displaying Top News from {{ countryInfo.name }}</h4>
    <div class="articles__div" v-if="articles">
      <news-card
        v-for="(article, index) in articles"
        :key="index"
        :article="article"
      ></news-card>
    </div>
  </section>
</template>
<script>
  import { mapActions, mapState } from "vuex";
  import NewsCard from "../components/NewsCard";
  export default {
    data() {
      return {
        articles: "",
        countryInfo: "",
      };
    },
    components: {
      NewsCard,
    },
    mounted() {
      this.fetchTopNews();
    },
    computed: {
      ...mapState(["countries"]),
    },
    methods: {
      ...mapActions(["getTopNews"]),
      async fetchTopNews() {
        let countriesLength = this.countries.length;
        let countryIndex = Math.floor(
          Math.random() * (countriesLength - 1) + 1
        );
        this.countryInfo = this.countries[countryIndex];
        let { data } = await this.getTopNews(
          this.countries[countryIndex].value
        );
        this.articles = data.articles;
      },
    },
  };
</script>
<style>
  .articles__div {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
  }
</style>

In the script section of this file, we import mapState and mapActions from Vuex, which we’ll be using later on in this file. We also import a NewsCard component (we’ll create this next) that would render all news headlines on this page. We then make use of the fetchTopNews method to fetch the latest news from a country selected at random from the array of countries in our store. This country is passed to our getTopNews action, this would be appended to the baseURL as a query for a country like so baseURL/top-news?country=${randomCountry}. Once this is done, we loop through this data and pass it to the article prop of our Newscard component in the template section. We also have a paragraph that indicates which country the top news is from.

The next thing would be to set up our NewsCard component that will display this news. Create a new file inside your components folder, name it NewsCard.vue, and add the following lines of code to it:

<template>
  <section class="news">
    <div class="news__section">
      <h1 class="news__title">
        <a class="article__link" :href="article.url" target="_blank">
          {{ article.title }}
        </a>
      </h1>
      <h3 class="news__author" v-if="article.author">{{ article.author }}</h3>
      <!-- <p class="article__paragraph">{{ article.description }}</p> -->
      <h5 class="article__published">{{ new Date(article.publishedAt) }}</h5>
    </div>
    <div class="image__container">
      <img
        class="news__img"
        src="../assets/logo.png"
        :data-src="article.urlToImage"
        :alt="article.title"
      />
    </div>
  </section>
</template>
<script>
  export default {
    name: "news-card",
    props: {
      article: Object,
    },
    mounted() {
      this.lazyLoadImages();
    },
    methods: {
      lazyLoadImages() {
        const images = document.querySelectorAll(".news__img");
        const options = {
          // If the image gets within 50px in the Y axis, start the download.
          root: null, // Page as root
          rootMargin: "0px",
          threshold: 0.1,
        };
        const fetchImage = (url) => {
          return new Promise((resolve, reject) => {
            const image = new Image();
            image.src = url;
            image.onload = resolve;
            image.onerror = reject;
          });
        };
        const loadImage = (image) => {
          const src = image.dataset.src;
          fetchImage(src).then(() => {
            image.src = src;
          });
        };
        const handleIntersection = (entries) => {
          entries.forEach((entry) => {
            if (entry.intersectionRatio > 0) {
              loadImage(entry.target);
            }
          });
        };
        // The observer for the images on the page
        const observer = new IntersectionObserver(handleIntersection, options);
        images.forEach((img) => {
          observer.observe(img);
        });
      },
    },
  };
</script>
<style>
  .news {
    width: 100%;
    display: flex;
    flex-direction: row;
    align-items: flex-start;
    max-width: 550px;
    box-shadow: 2px 1px 7px 1px #eee;
    padding: 20px 5px;
    box-sizing: border-box;
    margin: 15px 5px;
    border-radius: 4px;
  }
  .news__section {
    width: 100%;
    max-width: 350px;
    margin-right: 5px;
  }
  .news__title {
    font-size: 15px;
    text-align: left;
    margin-top: 0;
  }
  .news__author {
    font-size: 14px;
    text-align: left;
    font-weight: normal;
  }
  .article__published {
    text-align: left;
  }
  .image__container {
    width: 100%;
    max-width: 180px;
    max-height: 180px;
  }
  .news__img {
    transition: max-width 300ms cubic-bezier(0.4, 0, 1, 1),
      max-height 300ms cubic-bezier(0.4, 0, 1, 1);
    max-width: 150px;
    max-height: 150px;
  }
  .news__img:hover {
    max-width: 180px;
    max-height: 180px;
  }
  .article__link {
    text-decoration: none;
    color: inherit;
  }
</style>

Here, we display data passed into this component using the article object prop. We also have a method that lazy loads the images attached to each article. This method loops through the number of article images we have and lazy loads them when they become visible. Finally, we have styles targeted at this component in the style section.

The next thing will be to set up our store so we can start getting the latest news. Add the following lines of code to your index.js file:

import Vue from "vue";
import Vuex from "vuex";
import axios from "../plugins/axios";
Vue.use(Vuex);
const store = new Vuex.Store({
    state: {
        countries: [{
                name: "United States of America",
                value: "us",
            },
            {
                name: "Nigeria",
                value: "ng",
            },
            {
                name: "Argentina",
                value: "ar",
            },
            {
                name: "Canada",
                value: "ca",
            },
            {
                name: "South Africa",
                value: "za",
            },
        ],
        categories: [
            "entertainment",
            "general",
            "health",
            "science",
            "business",
            "sports",
            "technology",
        ],
    },
    mutations: {},
    actions: {
        async getTopNews(context, country) {
            let res = await axios({
                url: `/top-headlines?country=${country}`,
                method: "GET",
            });
            return res;
        },
    },
});
export default store;

We are adding two properties to our store, one of these properties is countries. This property contains an array of countries’ object. We also have the categories property; this contains an array of available categories on the News API. The reader will like the freedom to view the top news from specific countries and categories; this will also be needed in more than one part of the app and that is why we’re making use of the store. In the actions section of our store, we have a getTopNews method that fetches top news from a country(this country was passed from the component that called this action).

At this point, if we open our app, we should see our landing page that looks like this:

Updated landing page

Updated landing page. (Large preview)

The background.js file

This file is the entry point for Electron into your app. It controls all the Desktop app-like settings for this app. The default state of this file can be found on my GitHub.

In this file, we have some predefined configurations set for the app such as the default height and width for your app. Let’s take a look at some of the things you can do in this file.

Enabling the Vuejs devtools

By default, you have access to dev tools in Electron but it is not enabled after installation. This is as a result of an existing bug on windows 10, so if you open you background.js file, you will find some commented out code with comments that state why they’re commented out:

// Install Vue Devtools
// Devtools extensions are broken in Electron 6.0.0 and greater
// See https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/378 for more info
// Electron will not launch with Devtools extensions installed on Windows 10 with dark mode
// If you are not using Windows 10 dark mode, you may uncomment these lines
// In addition, if the linked issue is closed, you can upgrade electron and uncomment these lines
// try {
//   await installVueDevtools()
// } catch (e) {
//   console.error('Vue Devtools failed to install:', e.toString())
// }

So if you’re not affected by this bug, you can uncomment the try/catch block and also search for installVueDevtools in this same file(line 5) and also uncomment it. Once this is done, your app will automatically restart, and when you check your dev tools, you should see the Vuejs Devtools.

Vuejs in devtools

Vuejs in devtools. (Large preview)
Selecting A Custom Icon For Your App

By default, the Electron icon is set as the default icon for your app, and most of the time, you probably would like to set your own custom icon. To do this, move your icon into your public folder, and rename it to be icon.png. The next thing to do would be to add the required dependency, electron-icon-builder.

You can install it using any of the following commands:

// With Yarn:
yarn add --dev electron-icon-builder
// or with NPM:
npm install --save-dev electron-icon-builder

Once this is done, you can run this next command. It will convert your icon into Electron format and print the following in your console when this done.

generated info in terminal

Generated info in terminal. (Large preview)

The next thing would be to set the icon option in background.js file. This option goes inside the BrowserWindow option that is imported from Electron. To do this, update BrowserWindow to look like this:

// Add this to the top of your file
/* global __static */
// import path
import path from 'path'

// Replace
win = new BrowserWindow({ width: 800, height: 600 })
// With
win = new BrowserWindow({
  width: 800,
  height: 600,
  icon: path.join(__static, 'icon.png')
})

Now if we run yarn run electron:build and view our app, we should see the updated icon being used as the app icon but it doesn’t change in development. This issue helps address a manual fix for it on macOS.

Setting Title For Your App

You will notice the title of your app is set to the app name (news-app in this case) and we’ll need to change it. To do that, we have to add a title property to the BrowserWindow method in our background.js file like this:

win = new BrowserWindow({
        width: 600,
        height: 500,
        title: "News App",
        icon: path.join(__static, "icon.png"),
        webPreferences: {
            // Use pluginOptions.nodeIntegration, leave this alone
            // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
            nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
        },
    });

Here, we’re setting the title of our app to ‘News App’. But if your index.html file has a title selected or your title doesn’t change to this, try adding this code to your file:

win.on("page-title-updated", (event) => event.preventDefault());

We’re listening for an event that gets fired when our title is updated from BrowserWindow. When this event is fired, we’re telling Electron not to update the title with the one found in index.html file.

Another thing that might be worth changing is the productName, this controls what name appears when you hover on your app’s icon or what your computer recognizes the app as. Right now, the name of our app is Electron. To change this name in production, create a vue.config.js file and add the following lines of code to it:

module.exports = {
    pluginOptions: {
        electronBuilder: {
            builderOptions: {
                productName: "News App",
            },
        },
    },
};

Here, we define productName to be ‘News App’ so that when we run the build command for our app, the name changes from ‘Electron’ to ‘News App’.

Multi Platform Build

By default, when you run the build command, the app that gets created is dependent on the platform that it is being run on. This means if you run the build command on Linux, the app that gets created would be a Linux desktop app. The same also applies to other platforms(macOS and windows). But Electron comes with the option to specify a platform (or two platforms) you want to generate. The available options are:

  1. mac
  2. win
  3. linux

So in order to build the Windows version of your app, run the following command:

// NPM
npm electron:build -- --win nsis
// YARN
yarn electron:build --win nsis

Conclusion

The completed application can be found on my GitHub. The official Electron documentation provides information and a guide that helps you customize your desktop app whichever way you want. Some of the things I tried out but aren’t included in this tutorial are:

  1. Customizing your dock on macOS — https://www.electronjs.org/docs/tutorial/macos-dock.
  2. Setting resizeable, maximizable, and many more — https://github.com/electron/electron/blob/master/docs/api/browser-window.md#new-browserwindowoptions.

So if you’re looking to do much more with your Electron application, their official docs is a good place to start.

Related Resources

  1. Node.jshttps://en.wikipedia.org/wiki/Node.js
  2. Java (programming language)https://en.wikipedia.org/wiki/Java_(programming_language)
  3. Electron (software framework)
  4. JavaFX 14
  5. electronjs
  6. Electron Documentation
  7. Vue CLI Plugin Electron Builder
  8. Lazy Loading Images for Performance Using Intersection Observer by Chris Nwamba
  9. axios
  10. Getting Started With Axios In Nuxthttps://www.smashingmagazine.com/2020/05/getting-started-axios-nuxt/) by Timi Omoyeni

(ks, ra, yk, il)

Categories: Others Tags: