<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rex Anthony</title>
    <description>The latest articles on DEV Community by Rex Anthony (@rexthony).</description>
    <link>https://dev.to/rexthony</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F429822%2Fb0e43bd9-a3d6-47ef-93b2-86d6ef36bad1.jpg</url>
      <title>DEV Community: Rex Anthony</title>
      <link>https://dev.to/rexthony</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rexthony"/>
    <language>en</language>
    <item>
      <title>How Panning and Zooming Work in a 2D top-down game</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Fri, 16 Aug 2024 14:23:00 +0000</pubDate>
      <link>https://dev.to/rexthony/how-panning-and-zooming-work-in-a-2d-top-down-game-1afj</link>
      <guid>https://dev.to/rexthony/how-panning-and-zooming-work-in-a-2d-top-down-game-1afj</guid>
      <description>&lt;p&gt;In this article, I will explain my approach to building a camera class that manages panning and zooming in a 2d game canvas. &lt;/p&gt;

&lt;p&gt;We look at the underlying mathematical theory, create formulas and then apply it to code. I will then show you the practical execution of the code in a real game. &lt;/p&gt;

&lt;p&gt;On the surface of just looking at it, it seems like a no-brainer. In 3D it is fairly straightforward. But how do you replicate that effect in a 2d plane? This is interesting because, in theory, we are looking at the 3d world through a 2d frame. &lt;/p&gt;

&lt;p&gt;Let's dig into it then. &lt;/p&gt;

&lt;h2&gt;
  
  
  Panning
&lt;/h2&gt;

&lt;p&gt;We start with a 2d plane that starts at point (0,0) for the x and y coordinates. This is usually at the top left of the canvas/screen. For this discussion, we will use an infinite canvas with the origin at (0,0). The positive x-axis moves from left to right. At the same time, the positive y-axis moves from top to bottom. This is different from normal maths where the positive y-axis is from bottom to top. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-coordinates" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-coordinates" alt="2D plane canvas coordinate system"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we pan the screen, we change the position where objects are rendered, like when you scroll through social media. Therefore, if we scroll vertically moving a point from the bottom to the top of the canvas, we need to subtract from the initial y-axis position. Likewise, to move it down, we need to add to the initial y-axis position. The same thing applies if we want to move the point across the x-axis. To move a point to the right, we add to the x-axis and to move a point to the left, we subtract from the x-axis &lt;/p&gt;

&lt;p&gt;By using this idea, we can set up a camera class that has a position (x,y) property relative to which we will render our points. &lt;/p&gt;

&lt;p&gt;This means that if the camera is at (0,0) and a point is at (1,1). When we render the point on the screen, it will be at (1,1). &lt;/p&gt;

&lt;p&gt;If we move the camera to (1,1), and the position of the point remains the same at (1,1), we render it at a new position on the canvas relative to the value that we have set for the camera which should be (0,0). This means that the point is now at the origin of the canvas. If we move the camera to (2,2), and the point has a fixed position at (1,1), the point will no longer be visible on the screen, because it will be at (-1,-1). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-panning-in-sharetxt-virtual" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-panning-in-sharetxt-virtual" alt="Panning example in ShareTXT Virtual"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using the above, we can deduce a formula for panning a point on the canvas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;render(x,y) = point(x,y) - camera(x,y) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore, by specifying the x and y positions of the camera, we can determine the coordinate on the canvas where the point would be rendered. &lt;/p&gt;

&lt;h2&gt;
  
  
  Zooming
&lt;/h2&gt;

&lt;p&gt;In 3d when we zoom into something, we bring it closer to our eye which makes it bigger and we can see more detail. This effect can also be achieved on a 2d plane, but to develop a mathematical model of zooming, we need to go down to one dimension. &lt;/p&gt;

&lt;p&gt;In a one-dimensional line, let's take the x-axis, the starting point is zero (0) and we can move positively to the right as well as negatively to the left. Let's move positively to a random point, say positive 50. &lt;/p&gt;

&lt;p&gt;We want to look at the range from 40 to 60. This means that 50 is in the middle. Because (40+60)/2 = 50. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-coordinate-x-axis" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-coordinate-x-axis" alt="x-axis in one-dimension"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's take a look at what happens when we zoom in. If you remember what I said earlier,  when we zoom in, we see more detail. Therefore we note the distance from 40 to 50 is 10. And the distance from 50 to 60 is 10. If we render this on the canvas, it would be exactly as we have described without zoom. &lt;/p&gt;

&lt;p&gt;Zooming in is like stretching a rubber band out from both ends by the same amount. &lt;/p&gt;

&lt;p&gt;When we zoom in, render those points on the screen, and measure their distances we will notice that they are further apart from the implied anchor which is 50. Therefore after zooming in, if we take our ruler and measure the distance from 40 to 50 and 50 to 60 on the canvas, it will be greater than 10. The amount with which it has increased is called the zoom factor. &lt;/p&gt;

&lt;p&gt;For example, let's say, we have a zoom factor of 1.5 and render it on the screen. This means that we stretch the line out. What will be the final coordinates and distance from 50? If 40 and 60 were the initial coordinates each with a distance of 10 to the point 50. &lt;/p&gt;

&lt;p&gt;This is really easy to calculate and requires 3 steps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the distance from the origin(50)&lt;/li&gt;
&lt;li&gt;Multiply the distance to the zoom factor to get the new distance&lt;/li&gt;
&lt;li&gt;Add the new distance to the origin(50) to get the new coordinates &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's do this for the end at point 40 applying a zoom factor of 1.5 which is the final rendered point on the canvas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step 1. 40 - 50 = -10
Step 2. -10 × 1.5 = -15
Step 3. -15 + 50 = 35 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For point 40, this means that the new final coordinate after zoom is applied is 35. &lt;/p&gt;

&lt;p&gt;For point 60 also applying a zoom factor of 1.5 what is the final rendered point on the canvas?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step 1. 60 - 50 = 10
Step 2. 10 × 1.5 = 15
Step 3. 15 + 50 = 65 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For point 60, this means that the new final coordinate after zoom is applied is 65. &lt;/p&gt;

&lt;p&gt;Therefore before Zoom, the 3 important points that we are looking at are 40,50,60. After a zoom factor of 1.5 is applied, does points are scaled to 35,50,65. This is all done in 1 dimension. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-coordinate-x-axis-zoom" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-coordinate-x-axis-zoom" alt="Zooming across the x-axis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Point 50 is called the focus because as you see it remains constant as it is the point from which others are scaled. &lt;/p&gt;

&lt;p&gt;Let's develop a formula using the above that we will use just like we did for panning. &lt;/p&gt;

&lt;p&gt;Let's say that&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xb is the coordinate of the point before Zoom,
xa is the coordinate of the point after Zoom,
xf is the focus point, and
z is the Zoom factor 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compressing the 3 steps above into one expression, we have the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xa = (xb - xf)z + xf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Solving the above, you get&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xa = zxb - zxf + xf
xa = zxb - xf(z-1)
zxb = xa + xf(z-1)
xb = (xa + xf(z-1)) / z 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There you have it.&lt;br&gt;
The final coordinate of a point after zoom is applied is given by the following formula&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xa = zxb - xf(z-1) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Applying this to 2-dimensional coordinates requires you to perform this calculation on each coordinate for (x,y). &lt;/p&gt;

&lt;p&gt;Applying this to the camera class, we store a zoom variable for the zoom factor and, use the x and y coordinates of the camera as the focus and apply a zoom (i.e calculate the final x and y positions) on all points relative to the focus.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;render(x,y) = applyZoom(point(x,y), camera(x,y)) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where applyZoom has the following function definition&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;applyZoom(point, focus) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that to pan and zoom, pass in the new pan position to the applyZoom function to get the new pan+zoom position for rendering. Pan first, zoom second. &lt;/p&gt;

&lt;h2&gt;
  
  
  The camera class
&lt;/h2&gt;

&lt;p&gt;Here is the complete camera class in JavaScript, I have stripped it down to show only what is needed to implement panning and zooming, use it as a basis for your implementation, and don't forget to credit me for helping you out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class GameCamera {
    constructor(gameState) {
        this.gameState = gameState;
        this.isFocusOnGameObject = false;
        this.focusedGameObject = undefined;
        this.cameraWidth = game.canvas.width;
        this.cameraHeight = game.canvas.height;
        this.position = new Vector2D(0, 0);
        this.direction = new Vector2D(0, 0);
        this.target = new Vector2D(0, 0);
        this.point = new Vector2D(0, 0);
        this.offsetX = 0;
        this.offsetY = 0;
        this.duration = 0;
        this.elapsedTime = 0;
        this.callback = undefined;
        this.minDistance = 1;
        this.zoomLevel = 1;
    }

    // Method to specify a location in world space where camera should focus
    setFocus(x, y, offsetX = 0, offsetY = 0, translateAnimationDuration = 0, animationCompleteCallback = undefined) {
        this.isFocusOnGameObject = false;
        this.point.set(x, y);
        this.target.set(this.point.x - (this.cameraWidth / 2) - offsetX, this.point.y - (this.cameraHeight / 2) - offsetY);
        this.offsetX = offsetX;
        this.offsetY = offsetY;
        this.duration = translateAnimationDuration;
        this.callback = animationCompleteCallback;
    }

    // Method to attach a target that the camera will follow
    setTarget(gameObject, offsetX = 0, offsetY = 0, translateAnimationDuration = 0, animationCompleteCallback = undefined) {
        this.isFocusOnGameObject = true;
        this.point.set(gameObject.property.position.x + (gameObject.property.size.width / 2), gameObject.property.position.y + (gameObject.property.size.height / 2));
        this.target.set(this.point.x - (this.cameraWidth / 2) - offsetX, this.point.y - (this.cameraHeight / 2) - offsetY);
        this.focusedGameObject = gameObject;
        this.offsetX = offsetX;
        this.offsetY = offsetY;
        this.duration = translateAnimationDuration;
        this.callback = animationCompleteCallback;
    }

    update(deltaLoopTimeInMilliseconds) {

        // because the object might move (change its x,y position), we update the point and target each frame
        if (this.isFocusOnGameObject) {
            // set the point to the middle of the object
            this.point.set(this.focusedGameObject.property.position.x + (this.focusedGameObject.property.size.width / 2), this.focusedGameObject.property.position.y + (this.focusedGameObject.property.size.height / 2));
            // move the camera target to position the point at the center of the camera boundary +- offset
            this.target.set(this.point.x - (this.cameraWidth / 2) - this.offsetX, this.point.y - (this.cameraHeight / 2) - this.offsetY);
        }

        // check if the camera has focused on the target else transition smoothly to the target
        if (this.position.distance(this.target) &amp;lt; this.minDistance) {
            this.elapsedTime = 0;
            this.setPosition(this.target.x, this.target.y);
            if (this.callback != undefined) {
                this.callback();
                this.callback = undefined;
            }
        } else {
            if (this.duration == 0) {
                this.setPosition(this.target.x, this.target.y);
            } else {
                this.elapsedTime += deltaLoopTimeInMilliseconds;
                if (this.elapsedTime &amp;gt; this.duration) this.elapsedTime = this.duration;
                let ratio = this.elapsedTime / this.duration;
                this.direction.set(this.target.x, this.target.y);
                this.direction.subtract(this.position);
                this.direction.multiply(ratio);
                this.position.add(this.direction);
                this.setPosition(this.position.x, this.position.y);
            }
        }
    }

    // Method to set the camera's position
    setPosition(x, y) {
        this.position.x = Math.max(0, Math.min(x, (this.gameState.worldWidth - this.cameraWidth)));
        this.position.y = Math.max(0, Math.min(y, (this.gameState.worldHeight - this.cameraHeight)));
    }

    render(textureId, x, y, width, height, sourceWidth, sourceHeight, row, frame) {

        let objectX = ((x - this.point.x) * this.zoomLevel) + this.point.x - this.position.x;
        let objectY = ((y - this.point.y) * this.zoomLevel) + this.point.y - this.position.y;

        // if object is in the frame of the camera, render it.
        if (
            objectX &amp;lt; this.cameraWidth &amp;amp;&amp;amp;
            objectX + width &amp;gt; 0 &amp;amp;&amp;amp;
            objectY &amp;lt; this.cameraHeight &amp;amp;&amp;amp;
            objectY + height &amp;gt; 0
        ) {
            textureManager.drawCameraFrame(
                textureId,
                objectX,
                objectY,
                width,
                height,
                sourceWidth,
                sourceHeight,
                row,
                frame,
                this.zoomLevel,
                game.ctx
            );
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Practical example
&lt;/h2&gt;

&lt;p&gt;If you have done everything as described in this article, you will have created your camera class using pure JavaScript without any frameworks. Here is an example of it in action &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-zooming-in-sharetxt-virtual" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2F2d-screen-plane-zooming-in-sharetxt-virtual" alt="Zooming example in ShareTXT Virtual"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This gif is from &lt;a href="https://sharetxt.live/virtual" rel="noopener noreferrer"&gt;ShareTXT virtual&lt;/a&gt; which is a free real open-world, massive online multiplayer experience, where you can interact with other players and engage in fun activities together. &lt;/p&gt;

&lt;p&gt;The graphic assets for the illustrations used in this article are listed below&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://juliocaesartm.itch.io/3d-created-character-walk-and-idle-cycle-sprite" rel="noopener noreferrer"&gt;3D-Created Character Walk and Idle Cycle Sprite by Julian A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cainos.itch.io/pixel-art-top-down-basic" rel="noopener noreferrer"&gt;Pixel Art Top-Down - Basic by Cainos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this article has helped you to understand the theory of how panning and zooming work in a 2d plane or game. I have given you the formulas, as well as how to represent them in code for execution in your programming language of choice. I have also shown you the practical result that should be expected if you do everything as expected. Have a nice day.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Meet the Future of Virtual Worlds: An Inside Look at ShareTXT Virtual</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Wed, 07 Aug 2024 06:21:00 +0000</pubDate>
      <link>https://dev.to/rexthony/meet-the-future-of-virtual-worlds-an-inside-look-at-sharetxt-virtual-1274</link>
      <guid>https://dev.to/rexthony/meet-the-future-of-virtual-worlds-an-inside-look-at-sharetxt-virtual-1274</guid>
      <description>&lt;p&gt;&lt;a href="https://sharetxt.live/virtual" rel="noopener noreferrer"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jxPuQyY1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sharetxt.live/uploads/images/virtual-banner-image" alt="ShareTXT Virtual banner image" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine a world where every player you meet is a real person, and every conversation could lead to a new friendship, alliance, or rivalry. Whether you're a social butterfly or a lone explorer, ShareTXT Virtual offers something for everyone. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://sharetxt.live/virtual" rel="noopener noreferrer"&gt;ShareTXT virtual&lt;/a&gt; is a free-to-play online massive multiplayer open-world experience&lt;/strong&gt; where you can interact with other players and engage in fun activities together. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It was developed with a mobile-first approach&lt;/strong&gt;, which is an innovative design methodology. This means that it works well on both mobile and desktop with a high-performance metric. &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;This is more than just a game; it's a dynamic, interactive universe where players from all corners of the globe come together to explore, compete, and connect. *&lt;/em&gt;&lt;br&gt;
This is a dream come true and is shaping up to become a massive shake-up in online interaction. This is great news for players. &lt;/p&gt;

&lt;p&gt;The reviews have been glowing, with users hailing everything from the interaction to the gameplay experience. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live/virtual" rel="noopener noreferrer"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UrBydpCk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sharetxt.live/uploads/images/sharetxt-virtual-screenshot" alt="ShareTXT Virtual Screenshot" width="679" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect and Communicate
&lt;/h2&gt;

&lt;p&gt;Communication is at the heart of ShareTXT Virtual. The platform offers a range of ways to interact with fellow players: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public Shout Outs:&lt;/strong&gt; Got something to say to the entire world? Public shoutouts let you broadcast your messages for everyone to see. Whether you’re organizing an event, issuing a challenge, or just want to make your presence known, public shoutouts are your megaphone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Messages:&lt;/strong&gt; Prefer a more personal touch? Private messaging allows you to have one-on-one conversations, perfect for strategizing with friends or getting to know new acquaintances. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Customize Your Experience
&lt;/h2&gt;

&lt;p&gt;Express yourself in ShareTXT Virtual with multiple skins that allow you to personalize your character. Whether you want to stand out in a crowd or blend in with your surroundings, these customization options ensure your avatar truly represents you. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There are multiple skins that players can choose from to customize their playing experience.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore Vast Terrains
&lt;/h2&gt;

&lt;p&gt;The world of ShareTXT Virtual is vast and varied, featuring over 30 unique terrains waiting to be explored. Each terrain is filled with hidden secrets and stories just waiting to be discovered. From lush forests to eerie wastelands, every corner of this world holds new adventures and challenges. &lt;/p&gt;

&lt;h2&gt;
  
  
  Engage in Exciting Activities
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The fun never stops in ShareTXT Virtual.&lt;/strong&gt; The city is a bustling hub of activities where there's always something happening:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mini Games:&lt;/strong&gt; Compete against other players in a variety of mini-games. Whether you’re battling for the top spot on the leaderboard or just looking to have some fun, these games offer endless entertainment and rewards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Night Clubs:&lt;/strong&gt; Ready to show off your dance moves? Head to the nightclub where you can dance the night away and maybe even win a dance-off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theaters and Poetry:&lt;/strong&gt; For those who appreciate the arts, our theaters host songs, poetry readings and storytelling sessions. Sit back, relax, and enjoy the creative expressions of your fellow players.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comedy Clubs:&lt;/strong&gt; Laughter is the best medicine, and our comedy clubs are just the place to get your dose. Enjoy performances by some of the funniest players in the game, or step on stage yourself and try out your best jokes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Book clubs:&lt;/strong&gt; If you love diving into a good book and discussing it with others, our book clubs are perfect for you. Share your favorite reads, explore new genres, and connect with other book enthusiasts.
The world is at your feet. You can create your group and interactions in the virtual world. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Uncover Hidden Secrets
&lt;/h2&gt;

&lt;p&gt;Eventually, the inhabitants of ShareTXT Virtual wouldn't just be other players. In time, our world will be populated by AI-driven NPCs (Non-Player Characters) who have their own stories, secrets, and personalities. Interact with them just like you would with any other player. Earn their trust, and they might just reveal secrets that can lead to new quests and hidden treasures. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live/virtual" rel="noopener noreferrer"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--75-dUrIx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://img.itch.zone/aW1hZ2UvMjg3NzM5Mi8xNzIyMTM2OS5naWY%3D/original/zldtpM.gif" alt="ShareTXT Virtual ingame gameplay" width="600" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the Adventure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;So what are you waiting for? ShareTXT Virtual is more than a game; it's a living, breathing world full of possibilities.&lt;/strong&gt; Whether you're looking to make new friends, challenge your skills, or just explore a rich and immersive environment, ShareTXT Virtual has something for you. &lt;/p&gt;

&lt;p&gt;Ready to dive in? &lt;a href="https://sharetxt.live/virtual" rel="noopener noreferrer"&gt;Visit ShareTXT Virtual now and start your adventure today.&lt;/a&gt; The world is waiting for you.&lt;/p&gt;

</description>
      <category>mmorpg</category>
      <category>virtualreality</category>
      <category>gamedev</category>
      <category>networking</category>
    </item>
    <item>
      <title>File Sharing Alternatives to Email Attachments</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Mon, 17 Apr 2023 19:36:23 +0000</pubDate>
      <link>https://dev.to/rexthony/file-sharing-alternatives-to-email-attachments-9kj</link>
      <guid>https://dev.to/rexthony/file-sharing-alternatives-to-email-attachments-9kj</guid>
      <description>&lt;p&gt;Email attachments can be a convenient way to share files with others, but they also come with a number of challenges. Unlike sharing &lt;a href="https://sharetxt.live/blog/how-to-safely-share-passwords-and-secret-codes-online"&gt;passwords&lt;/a&gt; and &lt;a href="https://sharetxt.live/blog/how-to-share-text-online-via-your-browser"&gt;text&lt;/a&gt;, attachments can be large, which can make emails slow to send and receive, and they can also be prone to errors and security risks. If you're looking for a better way to share files, there are a number of alternatives to email attachments that can provide more reliable and secure file-sharing options.&lt;/p&gt;

&lt;p&gt;In this post, I'll explore some of the best file-sharing alternatives to email attachments. From cloud storage and file-sharing services to file transfer protocols and collaboration and project management tools, we'll cover a range of options that can help you share files more efficiently and securely. Whether you're working on a team, sharing files with clients, or simply looking for a better way to share files with friends and family, these file-sharing alternatives can provide the solutions you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud storage and file-sharing services
&lt;/h2&gt;

&lt;p&gt;Cloud storage and file-sharing services provide a convenient and easy way to store and share files online. These services offer users a certain amount of storage space on remote servers, which can be accessed from any device with an internet connection. Some popular examples of cloud storage and file-sharing services include &lt;a href="https://google.com/drive"&gt;Google Drive&lt;/a&gt;, &lt;a href="https://dropbox.com"&gt;Dropbox&lt;/a&gt;, and &lt;a href="https://www.microsoft.com/en-ww/microsoft-365/onedrive/online-cloud-storage"&gt;OneDrive&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zkmcQuT7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sharetxt.live/uploads/images/google-drive-one-drive-pics" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zkmcQuT7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sharetxt.live/uploads/images/google-drive-one-drive-pics" alt="Google drive, one drive, drop box pics" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the main benefits of using cloud storage and file-sharing services is that they allow users to access their files from any device, at any time. This can be especially useful for teams or individuals who need to share files and collaborate on projects remotely. Cloud storage and file-sharing services also make it easy to share files with others, as users can simply send a link to the file or folder, rather than sending large attachments via email.&lt;/p&gt;

&lt;p&gt;However, there are also some potential drawbacks to using cloud storage and file-sharing services. One concern is security, as users are trusting their files to a third-party service. It's important to choose a reputable and secure cloud storage and file-sharing service and to take additional steps to protect your files (e.g. using strong passwords, and enabling two-factor authentication). Additionally, users may need to pay for additional storage space if they exceed the allotted amount, and some services may have limitations on file types or sizes that can be uploaded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live/app/share-files"&gt;File Sharing services such as ShareTXT&lt;/a&gt; eliminate the worry about security by offering an innovative solution that enables you to share your files end-to-end between your devices without them being stored somewhere in some database. This eliminates the need for an intermediate server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gEMdqvbz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sharetxt.live/uploads/images/share-files-app-ui" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gEMdqvbz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sharetxt.live/uploads/images/share-files-app-ui" alt="ShareTXT share files app" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overall, cloud storage and file-sharing services can be a convenient and efficient way to store and share files, but it's important to carefully consider the security and cost implications before committing to a particular service.&lt;/p&gt;

&lt;h2&gt;
  
  
  File transfer protocols
&lt;/h2&gt;

&lt;p&gt;:{"type":"videoEmbed", "src":"&lt;a href="https://www.youtube.com/embed/tOj8MSEIbfA"&gt;https://www.youtube.com/embed/tOj8MSEIbfA&lt;/a&gt;", "title":"Youtube Video Player", "allow":"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"}&lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/File_Transfer_Protocol"&gt;File transfer protocols (FTPs)&lt;/a&gt; are a set of rules that govern the exchange of files over a network. There are a variety of file transfer protocols, including FTP (File Transfer Protocol), &lt;a href="https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol"&gt;SFTP (SSH File Transfer Protocol)&lt;/a&gt;, and &lt;a href="https://en.wikipedia.org/wiki/HTTPS"&gt;HTTPS (Hypertext Transfer Protocol Secure)&lt;/a&gt;. These protocols enable users to transfer files between computers, servers, and other devices over the internet.&lt;/p&gt;

&lt;p&gt;One of the main benefits of using file transfer protocols is that they allow you to &lt;a href="https://sharetxt.live/app/share-files"&gt;transfer large files quickly and efficiently&lt;/a&gt;. FTPs also offer a high level of security, as they use encryption to protect the data being transferred. This can be especially important for transferring sensitive or confidential files.&lt;/p&gt;

&lt;p&gt;However, there are also some potential drawbacks to using file transfer protocols. One concern is that they can be complex to set up and configure, especially for users who are not familiar with network protocols. FTPs also require specialized software or tools to use, such as &lt;a href="https://filezilla-project.org/"&gt;FileZilla&lt;/a&gt; or &lt;a href="https://winscp.net/eng/index.php"&gt;WinSCP&lt;/a&gt;. Additionally, FTPs may not be as user-friendly as other file-sharing methods, such as cloud storage and file-sharing services.&lt;/p&gt;

&lt;p&gt;Overall, file transfer protocols can be a powerful and secure way to transfer large files, but they may not be the best option for all users. It's important to consider your specific needs and the resources available to you when deciding whether to use a file transfer protocol for file sharing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collaboration and project management tools
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mXz1GdBk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sharetxt.live/uploads/images/collaboration-and-project-management-tools" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mXz1GdBk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://sharetxt.live/uploads/images/collaboration-and-project-management-tools" alt="Collaboration tools graphics" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Collaboration and project management tools are software applications that enable teams to work together and manage projects more efficiently. These tools can include features such as task assignments, file sharing, real-time communication, and progress tracking. Some popular examples of collaboration and project management tools include &lt;a href="https://sharetxt.live/recommends/trello"&gt;Trello&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/asana"&gt;Asana&lt;/a&gt;, and &lt;a href="https://sharetxt.live/recommends/slack"&gt;Slack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the main benefits of using collaboration and project management tools is that they provide a central platform for teams to organize and manage their work. These tools can help teams stay organized and on track, and can also improve communication and collaboration between team members.&lt;/p&gt;

&lt;p&gt;However, there are also some potential drawbacks to using collaboration and project management tools. One concern is that these tools may require a learning curve for users who are not familiar with them, and may require some time and effort to set up and configure. Additionally, some collaboration and project management tools may require a subscription or payment to use, and may not be suitable for all types of projects or teams.&lt;/p&gt;

&lt;p&gt;Overall, collaboration and project management tools can be a powerful way to improve productivity and efficiency for teams, but it's important to carefully consider the costs and resources required before committing to a particular tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, email attachments are not the only option for file sharing. There are a number of alternatives that can provide more efficient, secure, and reliable file sharing solutions. From cloud storage and file sharing services to file transfer protocols and collaboration and project management tools, there are a range of options available to suit different needs and budgets.&lt;/p&gt;

&lt;p&gt;When choosing a file sharing method, it's important to consider the specific needs of your team or project, as well as the resources and budget available. Consider factors such as the size and type of files being shared, the level of security and reliability required, and the level of collaboration and organization needed. By carefully evaluating the options and choosing the best solution for your needs, you can improve the efficiency and effectiveness of your file sharing process.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>filesharing</category>
    </item>
    <item>
      <title>How to Properly Attribute and Cite Sources when Sharing Content Online</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Wed, 04 Jan 2023 13:27:05 +0000</pubDate>
      <link>https://dev.to/rexthony/how-to-properly-attribute-and-cite-sources-when-sharing-content-online-54nm</link>
      <guid>https://dev.to/rexthony/how-to-properly-attribute-and-cite-sources-when-sharing-content-online-54nm</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ugcs-LEN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/attribution-reference" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ugcs-LEN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/attribution-reference" alt="Citation and attribution" width="640" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When sharing content online whether as a post, &lt;a href="https://sharetxt.live/blog/how-to-create-content-on-social-media-that-converts"&gt;social media&lt;/a&gt;, or any other media, it's important to properly attribute and cite sources to give credit to the creators and owners of the content, and to ensure that your own work is accurate and credible. Proper attribution and citation not only helps to respect the rights of others, but it can also enhance the quality and value of your own content.&lt;/p&gt;

&lt;p&gt;But what exactly is attribution and citation, and why are they important? &lt;strong&gt;Attribution is the act of giving credit to the source of the content you are using or sharing&lt;/strong&gt;. This can be as simple as including the name of the creator or owner and a link to the original source. Attribution helps to acknowledge the contributions of others and can help to establish your own credibility as a content creator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Citation, on the other hand, involves providing more detailed information about the source of the content, including the title, author, publication date, and other relevant details&lt;/strong&gt;. Citations are typically used in academic or professional contexts to provide a clear and detailed record of the sources used in a piece of work. In addition to helping to &lt;a href="https://sharetxt.live/blog/step-by-step-guide-to-writing-plagiarism-free-essays"&gt;establish credibility and prevent plagiarism&lt;/a&gt;, citations also provide readers with the information they need to locate and verify the sources themselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live/blog/how-to-properly-attribute-and-cite-sources-when-sharing-content-online"&gt;In this blog post&lt;/a&gt;, I'll delve into the basics of attribution and citation, and discuss best practices for properly attributing and citing sources when sharing content online. I'll also explore some tools and resources that can help you to attribute and cite sources effectively. Whether you're a content creator, business owner, or social media enthusiast, these tips will help you to properly attribute and cite sources and share content with confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is attribution?
&lt;/h2&gt;

&lt;p&gt;Attribution is the act of giving credit to the source of the content you are using or sharing. It involves acknowledging the contributions of others and helping to establish your own credibility as a content creator. Proper attribution is important for a number of reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It helps to respect the rights of others&lt;/strong&gt;: By properly attributing content, you are acknowledging the contributions of the creators and owners of the content and showing respect for their rights. This is especially important when you are using content that is protected by copyright or other intellectual property laws.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It can enhance the quality and value of your own content&lt;/strong&gt;: By including attribution, you can provide your readers with additional context and resources, and enhance the overall value of your content. Attribution can also help to establish your own credibility as a content creator by demonstrating that you are using reliable and reputable sources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It can help to prevent plagiarism&lt;/strong&gt;: Proper attribution can help to prevent plagiarism, which is the act of using someone else's work without giving credit. Plagiarism is not only unethical, but it can also have serious legal and professional consequences. By properly attributing content, you can avoid potential issues related to plagiarism and demonstrate that you are using content responsibly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To properly attribute content, you should include the name of the creator or owner and a link to the original source. This can be as simple as adding a byline or including a link to the source in the text of your post. Depending on the context and the type of content you are sharing, you may also need to include additional information, such as the title of the work or the date it was published.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is citation?
&lt;/h2&gt;

&lt;p&gt;Citation is the act of providing detailed information about the source of the content you are using or sharing. It involves including specific details about the work, such as the title, author, publication date, and other relevant information. Citations are typically used in academic or professional contexts to provide a clear and detailed record of the sources used in a piece of work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pitt.libguides.com/citationhelp"&gt;There are many different citation styles&lt;/a&gt;, each with its own set of rules and guidelines for formatting citations and referencing sources. Some common citation styles include APA, MLA, and Chicago. Depending on the context and the type of content you are sharing, you may need to use a specific citation style or follow the guidelines of a particular organization or publication.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D0wXigOP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/citation-styles" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D0wXigOP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/citation-styles" alt="Citation styles" width="602" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Citation is important for a number of reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It helps to establish credibility and prevent plagiarism&lt;/strong&gt;: By properly citing sources, you can demonstrate that you are using reliable and reputable sources and help to prevent plagiarism. Plagiarism is the act of using someone else's work without giving credit, and it can have serious legal and professional consequences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It provides readers with the information they need to locate and verify sources&lt;/strong&gt;: By including detailed citation information, you can provide your readers with the information they need to locate and verify the sources you are using. This can be especially important in academic or professional contexts, where readers may need to consult the original sources for further information or analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It helps to support your own work&lt;/strong&gt;: By citing sources, you can provide evidence and support for your own work and help to establish your own credibility as a content creator. Citations can also help to demonstrate that you are familiar with the research and literature in your field and that you are using this knowledge to inform your own work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To properly cite sources, you should include all of the relevant information about the source, including the title, author, publication date, and other details as required by the citation style you are using. You should also include a reference list or bibliography at the end of your work, which lists all of the sources you have cited in alphabetical order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools and resources for attribution and citation
&lt;/h2&gt;

&lt;p&gt;There are many different tools and resources available to help you attribute and cite sources effectively when sharing content online. Here are some options to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual methods&lt;/strong&gt;: If you prefer to attribute and cite sources manually, there are a number of resources that can help you to do so. These include style guides, such as the APA, MLA, or Chicago style guides, which provide detailed instructions on how to format citations and references. You can also find online resources, such as &lt;a href="https://sharetxt.live/recommends/quillbot-citation-generator"&gt;citation generators&lt;/a&gt;, which can help you to create citations in a specific style.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Online tools and resources&lt;/strong&gt;: There are a number of online tools and resources that can help you to attribute and cite sources more efficiently. Some options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Citation management tools&lt;/strong&gt;: These tools allow you to create, organize, and manage your citations and references in one place. Popular citation management tools include &lt;a href="https://sharetxt.live/recommends/endnote"&gt;EndNote&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/zotero"&gt;Zotero&lt;/a&gt;, and &lt;a href="https://sharetxt.live/recommends/mendeley"&gt;Mendeley&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins and extensions&lt;/strong&gt;: There are a number of browser extensions and plugins that can help you to attribute and cite sources more easily. For example, the &lt;a href="https://www.easybib.com/guides/feature-highlight-easybib-chrome-extension/"&gt;EasyBib extension for Google Chrome&lt;/a&gt; allows you to generate citations for websites and articles with a single click.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Online citation generators&lt;/strong&gt;: There are many online citation generators available that can help you to create citations in a variety of styles. Some popular options include &lt;a href="https://www.citationmachine.net/"&gt;Citation Machine&lt;/a&gt; and &lt;a href="https://www.bibme.org/"&gt;BibMe&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By using these tools and resources, you can streamline the process of attributing and citing sources and ensure that you are using content responsibly and legally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, proper attribution and citation are crucial for anyone who creates or shares content online. By giving credit to the sources of the content you use and sharing detailed information about those sources, you can respect the rights of others, establish your own credibility, and prevent plagiarism. Whether you're a content creator, business owner, or social media enthusiast, understanding and properly using attribution and citation can help you to share content responsibly and legally.&lt;/p&gt;

&lt;p&gt;There are many different tools and resources available to help you attribute and cite sources effectively. From manual methods like style guides to online tools like citation management software and online citation generators, there are a variety of options to suit your needs and preferences. By using these resources, you can streamline the process of attributing and citing sources and ensure that you are using content responsibly and legally.&lt;/p&gt;

&lt;p&gt;I hope this blog post has helped you to better understand the importance of attribution and citation when sharing content online and has given you some ideas for how to attribute and cite sources effectively. Let me know if you have any other questions or need further assistance.&lt;/p&gt;

</description>
      <category>career</category>
      <category>writing</category>
      <category>citation</category>
      <category>community</category>
    </item>
    <item>
      <title>Time Management Techniques for Remote Workers</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Sun, 01 Jan 2023 12:17:56 +0000</pubDate>
      <link>https://dev.to/rexthony/time-management-techniques-for-remote-workers-271a</link>
      <guid>https://dev.to/rexthony/time-management-techniques-for-remote-workers-271a</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ppFNqMx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/time-management" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ppFNqMx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/time-management" alt="Time management graphic" width="880" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remote work has become increasingly popular in recent years, and with the COVID-19 pandemic, more people than ever are working from home. While remote work has many benefits, such as flexibility and the ability to work from anywhere, it can also be challenging to stay focused and manage your time effectively.&lt;/p&gt;

&lt;p&gt;Effective time management is especially important for remote workers, as it can help you stay on track and achieve your goals more efficiently. By using time management techniques, you can avoid distractions, stay organized, and get more done.&lt;/p&gt;

&lt;p&gt;In this blog post, we'll discuss time management techniques specifically for remote workers. From setting clear goals and priorities to taking breaks and exercising regularly, these techniques can help you stay focused and avoid burnout. By following these tips, you can improve your productivity and achieve your goals more efficiently as a remote worker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identify your goals and priorities
&lt;/h2&gt;

&lt;p&gt;Identifying your goals and priorities is an important step in managing your time effectively when you work remotely. By setting clear goals and priorities, you can stay focused on what is most important and avoid wasting time on tasks that are less important or not aligned with your goals.&lt;/p&gt;

&lt;p&gt;To identify your goals and priorities, start by considering what you want to achieve in your work. This could be career advancement, &lt;a href="https://sharetxt.live/blog/ways-to-make-money-online-as-a-content-creator"&gt;increasing your income&lt;/a&gt;, or making a positive impact in your field. Once you have identified your overall goals, break them down into smaller, more specific objectives. For example, if your goal is to advance your career, you might set specific objectives such as completing a certification program or networking with industry leaders.&lt;/p&gt;

&lt;p&gt;Once you have identified your goals and objectives, prioritize them based on their importance and deadline. This can help you stay focused on what is most important and avoid getting overwhelmed by too many tasks. You can also use tools like the &lt;a href="https://www.eisenhower.me/eisenhower-matrix/"&gt;Eisenhower Matrix&lt;/a&gt; to help you prioritize tasks based on their urgency and importance.&lt;/p&gt;

&lt;p&gt;By setting clear goals and priorities, you can stay focused on what is most important and avoid wasting time on tasks that are less important or not aligned with your goals. This can help you manage your time effectively and achieve your goals more efficiently as a remote worker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a task list
&lt;/h2&gt;

&lt;p&gt;Creating a task list is an important part of managing your time effectively when you work remotely. By organizing your tasks in a list, you can stay on top of what needs to be done, avoid wasting time, and stay focused on your goals.&lt;/p&gt;

&lt;p&gt;To create a task list, start by writing down all the tasks you need to complete. This can include everything from small tasks like answering emails to larger projects like creating a presentation. Once you have a comprehensive list of tasks, prioritize them based on their importance and deadline. This can help you focus on the most important tasks first and avoid getting overwhelmed.&lt;/p&gt;

&lt;p&gt;There are several tools and techniques you can use to create and manage your task list. One simple method is to use a paper or digital to-do list, where you can write down each task and check it off as you complete it. You can also use task management software or apps, such as &lt;a href="https://sharetxt.live/recommends/todoist"&gt;Todoist&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/trello"&gt;Trello&lt;/a&gt; or &lt;a href="https://sharetxt.live/recommends/asana"&gt;Asana&lt;/a&gt;, which allow you to create and organize tasks, set deadlines, and track progress.&lt;/p&gt;

&lt;p&gt;By creating a task list and using tools to manage your tasks, you can stay on top of what needs to be done and avoid wasting time. This can help you manage your time effectively and achieve your goals more efficiently as a remote worker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the Pomodoro Technique
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Pomodoro_Technique"&gt;The Pomodoro Technique&lt;/a&gt; is a time management technique that can help you stay focused and avoid burnout when you work remotely. The technique involves working in focused bursts, followed by short breaks to recharge. This can help you stay focused and avoid distractions, and it can also help you avoid burnout by taking breaks to rest and recharge.&lt;/p&gt;

&lt;p&gt;To use the Pomodoro Technique, set a timer for 25 minutes and work on a task without any distractions. When the timer goes off, take a 5 minute break to rest and recharge. After four Pomodoros (or 100 minutes of work), take a longer break of 15-30 minutes. You can use a timer or a Pomodoro app to help you stay on track.&lt;/p&gt;

&lt;p&gt;The Pomodoro Technique can be customized to fit your needs and schedule. You can adjust the length of the work and break intervals to find what works best for you. Some people find that shorter work intervals help them stay focused, while others prefer longer intervals. Experiment with different intervals to find what works best for you.&lt;/p&gt;

&lt;p&gt;By using the Pomodoro Technique, you can stay focused and avoid burnout when you work remotely. This can help you manage your time effectively and achieve your goals more efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manage your environment
&lt;/h2&gt;

&lt;p&gt;Managing your environment is an important part of managing your time effectively when you work remotely. By creating a dedicated workspace and minimizing distractions, you can stay focused and avoid wasting time.&lt;/p&gt;

&lt;p&gt;To manage your environment when you work remotely, create a dedicated workspace. This could be a separate room or a designated area in your home where you can work without distractions. Make sure your workspace is comfortable and well-lit, and set it up with everything you need to get your work done, such as a computer, printer, and office supplies.&lt;/p&gt;

&lt;p&gt;Another way to manage your environment when you work remotely is to minimize distractions. This could include turning off notifications on your phone or computer, closing unnecessary tabs or programs, and letting people know you are working and not to be disturbed. You may also want to consider using &lt;a href="https://sharetxt.live/recommends/noise-cancelling-headphones"&gt;noise-cancelling headphones&lt;/a&gt; or a &lt;a href="https://sharetxt.live/recommends/white-noise-machine"&gt;white noise machine&lt;/a&gt; to block out external distractions.&lt;/p&gt;

&lt;p&gt;By managing your environment and minimizing distractions, you can stay focused and avoid wasting time when you work remotely. This can help you manage your time effectively and achieve your goals more efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schedule breaks and time for physical activity
&lt;/h2&gt;

&lt;p&gt;Scheduling breaks and time for physical activity is an important part of managing your time effectively when you work remotely. By taking breaks and exercising regularly, you can recharge and avoid burnout, which can help you stay focused and productive.&lt;/p&gt;

&lt;p&gt;To schedule breaks and time for physical activity when you work remotely, consider setting aside specific times for these activities in your schedule. For example, you might take a short break every hour to stretch or go for a walk, and schedule a longer break or exercise session in the middle of the day.&lt;/p&gt;

&lt;p&gt;There are many different types of breaks and physical activities you can choose from. Some options might include going for a walk or run, practicing yoga or meditation, or participating in a group fitness class. Whatever you choose, make sure to choose activities that you enjoy and that help you relax and recharge.&lt;/p&gt;

&lt;p&gt;By scheduling breaks and time for physical activity, you can recharge and avoid burnout when you work remotely. This can help you manage your time effectively and achieve your goals more efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Communicate effectively with team members and stakeholders
&lt;/h2&gt;

&lt;p&gt;Effective communication is an important part of managing your time effectively when you work remotely. By communicating clearly and efficiently with your team members and stakeholders, you can avoid misunderstandings and stay on track with your work.&lt;/p&gt;

&lt;p&gt;To communicate effectively with your team members and stakeholders when you work remotely, there are several things you can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use clear, concise language&lt;/strong&gt;: Avoid jargon or technical terms that might not be familiar to everyone, and use simple, straightforward language to convey your message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use visual aids&lt;/strong&gt;: When possible, use visual aids like charts, graphs, or slides to help illustrate your points and make your message more clear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use video conferencing&lt;/strong&gt;: Use video conferencing tools like &lt;a href="https://sharetxt.live/recommends/zoom"&gt;Zoom&lt;/a&gt; or &lt;a href="https://sharetxt.live/recommends/skype"&gt;Skype&lt;/a&gt; to communicate face-to-face with your team members and stakeholders. This can help you build rapport and improve communication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow up&lt;/strong&gt;: After a meeting or conversation, follow up with a summary or next steps to make sure everyone is on the same page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By communicating effectively with your team members and stakeholders, you can avoid misunderstandings and stay on track with your work. This can help you manage your time effectively and achieve your goals more efficiently as a remote worker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stay organized
&lt;/h2&gt;

&lt;p&gt;Staying organized is an important part of managing your time effectively when you work remotely. By keeping your work and personal life organized, you can avoid wasting time looking for things and stay focused on your tasks.&lt;/p&gt;

&lt;p&gt;To stay organized when you work remotely, there are several things you can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a system for organizing your files&lt;/strong&gt;: Use a file naming convention and create folders to keep your files organized and easy to find. You can also use cloud storage tools like &lt;a href="https://sharetxt.live/recommends/google-drive"&gt;Google Drive&lt;/a&gt; or &lt;a href="https://sharetxt.live/recommends/dropbox"&gt;Dropbox&lt;/a&gt; to store and access your files from anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use task management software or apps&lt;/strong&gt;: Use tools like &lt;a href="https://sharetxt.live/recommends/trello"&gt;Trello&lt;/a&gt;{:target="_blank"} or &lt;a href="https://sharetxt.live/recommends/asana"&gt;Asana&lt;/a&gt; to create and manage your tasks, set deadlines, and track progress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Declutter your workspace&lt;/strong&gt;: Keep your workspace clean and organized by decluttering regularly. This can help you stay focused and avoid distractions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set boundaries&lt;/strong&gt;: Set clear boundaries between your work and personal life by creating designated work and non-work areas in your home.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By staying organized, you can avoid wasting time looking for things and stay focused on your tasks. This can help you manage your time effectively and achieve your goals more efficiently as a remote worker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Working remotely can present challenges when it comes to managing your time effectively. By using time management techniques like setting clear goals and priorities, creating a task list, using the Pomodoro Technique, managing your environment, scheduling breaks and physical activity, communicating effectively with team members and stakeholders, and staying organized, you can stay focused and avoid burnout.&lt;/p&gt;

&lt;p&gt;Remember that every person is different, so it's important to find time management techniques that work for you. Experiment with different techniques and tools to find what works best for you, and don't be afraid to adjust your approach as needed.&lt;/p&gt;

&lt;p&gt;By managing your time effectively, you can achieve your goals more efficiently and enjoy the benefits of working remotely.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>5 Ways Startups Can Use AI Today to Grow Rapidly</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Tue, 01 Nov 2022 10:55:00 +0000</pubDate>
      <link>https://dev.to/rexthony/5-ways-startups-can-use-ai-today-to-grow-rapidly-50ca</link>
      <guid>https://dev.to/rexthony/5-ways-startups-can-use-ai-today-to-grow-rapidly-50ca</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Everyone has a plan till they get punched in the mouth. — Mike Tyson&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ever since the very &lt;a href="https://www.britannica.com/technology/artificial-intelligence/Alan-Turing-and-the-beginning-of-AI"&gt;extensive work on artificial intelligence,&lt;/a&gt; done in the middle of the 20th century by Alan Turing, the popularity of AI has spread far and wide. Today, these advancements are helping businesses all over to world differentiate themselves and &lt;a href="https://www.sciencedirect.com/science/article/pii/S0166497222001705"&gt;innovate at a rapid pace that has never been seen in history&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Indeed, the popularity and success of strong brands like Coca-Cola, Amazon, Netflix, Google, and many others depend largely on how they have harnessed AI in their business processes. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BHujdkXp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/statista-ai-growth-graph" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BHujdkXp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/statista-ai-growth-graph" alt="Statista growth in artificial intelligence graph" width="880" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI technology has been a game changer for businesses all over the world. This was exclusive to big companies but this is no longer the case. Small companies, most especially startups, now can use AI in their products and services to grow their businesses rapidly and compete favorably.&lt;/p&gt;

&lt;p&gt;As the owner of a startup business, you want to manage your capital to invest it in areas that will be profitable to your business. This means cutting costs by making use of AI in those areas that are necessary. AI can help you in various aspects of your startup from &lt;a href="https://www.copy.ai/tools/content-idea-generator"&gt;ideation&lt;/a&gt;, product development, &lt;a href="https://www.copy.ai/blog/7-sales-page-copywriting-tips"&gt;sales&lt;/a&gt;, and &lt;a href="https://sharetxt.live/blog/how-to-generate-ad-copy-with-ai"&gt;marketing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this post, I will outline 5 tools provided by copy.ai that you can use when you are just beginning to form your startup. These tools will save you useful resources such as time and money and they will give you the boost to rapidly kickstart your startup growth.&lt;/p&gt;

&lt;p&gt;To get started, &lt;a href="https://sharetxt.live/recommends/copy-ai"&gt;sign up to copy.ai here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copy.AI Startup Tools
&lt;/h2&gt;

&lt;p&gt;These consist of tools that you can use to create content for your startup business, they consist of the following&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Audience refiner&lt;/li&gt;
&lt;li&gt;Brand mission&lt;/li&gt;
&lt;li&gt;Brand voice&lt;/li&gt;
&lt;li&gt;Motto generator&lt;/li&gt;
&lt;li&gt;Value proposition&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to use Copy.ai to discover your Target Audience
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7YZz-O_i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-audience-refiner-tool-screenshot" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7YZz-O_i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-audience-refiner-tool-screenshot" alt="Copy.ai Audience refiner tool screenshot" width="880" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy.ai has a tool that enables you to identify your target audience as a startup business. It is estimated that businesses spend about &lt;a href="https://www.marketingevolution.com/marketing-essentials/target-audience"&gt;37 billion dollars&lt;/a&gt; to show ads to people who are not interested in their product or service.&lt;/p&gt;

&lt;p&gt;As a startup business, you need to make sure that you spend your money as efficiently as possible. It is easy to get caught up in how great your offering is that you fail to understand the people that will be using your product at the end of the day.&lt;/p&gt;

&lt;p&gt;There are several advantages to knowing who your target audiences are such as&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It helps you to create a more effective marketing plan&lt;/li&gt;
&lt;li&gt;It helps you to build rapport with your target audience and communicate more effectively&lt;/li&gt;
&lt;li&gt;It enables you to create a buyers persona&lt;/li&gt;
&lt;li&gt;It makes it easier to find and connect with the right people&lt;/li&gt;
&lt;li&gt;It eliminates false expectations about your audience&lt;/li&gt;
&lt;li&gt;It provides you with pertinent information to tailor your product to your audience's requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.copy.ai/blog/how-to-find-your-target-audience"&gt;Finding your target audience&lt;/a&gt; is crucial to building your business as a startup.&lt;/p&gt;

&lt;p&gt;To use the Audience refiner tool by copy.ai, perform the following steps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the left toolbar, search and click on Startup Tools &amp;gt; Audience Refiner&lt;/li&gt;
&lt;li&gt;Describe your audience with at least 15 words or more. &lt;/li&gt;
&lt;li&gt;Finally, click on create content&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to use Copy.ai to create a Brand Mission
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F9wbdZ2f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-brand-mission-tool-screenshot" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F9wbdZ2f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-brand-mission-tool-screenshot" alt="Copy.ai Brand mission tool screenshot" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most businesses have a mission and vision statement. This describes in clear terms what the business wants to achieve, who they want to support, and why they want to support them. &lt;/p&gt;

&lt;p&gt;This statement keeps you focused on where it is that you want to carry your business. Coming up with these statements can be a daunting task requiring a lot of time, deep, and sober reflection.&lt;/p&gt;

&lt;p&gt;:{"type":"videoEmbed", "src":"&lt;a href="https://www.youtube.com/embed/5e61lCFpH2E"&gt;https://www.youtube.com/embed/5e61lCFpH2E&lt;/a&gt;", "title":"YouTube video player", "allow": "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"} &lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live/recommends/copy-ai"&gt;Copy.ai&lt;/a&gt; enables you to create multiple brand mission statements that can help you in the process of coming up with one for your business, saving you some time in the process. &lt;/p&gt;

&lt;p&gt;To use the brand mission tool by copy.ai, perform the following steps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the left toolbar, search and click on Startup Tools &amp;gt; Brand Mission&lt;/li&gt;
&lt;li&gt;Enter the name of your business or brand&lt;/li&gt;
&lt;li&gt;Enter a description of your brand, audience, and product/service. The more content you provide, the better the output that is generated&lt;/li&gt;
&lt;li&gt;Pick the tone that describes how you want the brand mission to be perceived&lt;/li&gt;
&lt;li&gt;Finally, click on create content&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to use Copy.ai to create a Brand Voice
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U31Dhta---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-brand-voice-tool-screenshot" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U31Dhta---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-brand-voice-tool-screenshot" alt="Copy.ai Brand mission tool screenshot" width="880" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your brand voice is the personality that your brand assumes. It consists of a couple of words that sum up the principles that the brand is defined upon. A strong and memorable brand voice can &lt;a href="https://www.qualtrics.com/blog/brand-building-tips/"&gt;help you to connect with your target audience&lt;/a&gt; and stand out from other competitors in your space.&lt;/p&gt;

&lt;p&gt;Your brand voice does not change and is reflected in every aspect of your business both online and offline. Align your brand voice with your business mission and vision statement to maintain consistency.&lt;/p&gt;

&lt;p&gt;To use the brand voice tool by copy.ai, perform the following steps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the left toolbar, search and click on Startup Tools &amp;gt; Brand Voice&lt;/li&gt;
&lt;li&gt;Enter the name of your brand&lt;/li&gt;
&lt;li&gt;Describe your brand, audience, and product/service. The more content you provide, the better the output that is generated&lt;/li&gt;
&lt;li&gt;Finally, click on create content&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to use Copy.ai to create a Motto
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O8XFN7U6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-motto-generator-tool-screenshot" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O8XFN7U6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-motto-generator-tool-screenshot" alt="Copy.ai Motto generator tool screenshot" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your business motto or slogan is a phrase that describes your brand. It should be short and memorable. A good slogan &lt;a href="https://www.statista.com/statistics/1193557/leading-beer-brands-retail-sales-revenue-uk/"&gt;can increase brand patronage in most instances as can be seen by companies like Stella Artois&lt;/a&gt;. It signifies the image that the business wants to portray to its audience. For example&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disneyland&lt;/strong&gt;: The happiest place on earth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nike&lt;/strong&gt;: Just do it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BMW&lt;/strong&gt;: The ultimate driving machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uber&lt;/strong&gt;: Move the way you want&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kentucky Fried Chicken&lt;/strong&gt;: Finger-lickin' good&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To use the motto generator tool by copy.ai, perform the following steps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the left toolbar, search and click on Startup Tools &amp;gt; Motto generator&lt;/li&gt;
&lt;li&gt;Enter the name of your business/brand&lt;/li&gt;
&lt;li&gt;Describe your brand, audience, and product/service.&lt;/li&gt;
&lt;li&gt;Select the tone with which the AI will generate the output&lt;/li&gt;
&lt;li&gt;Finally, click on create content&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to use Copy.ai to create a Value proposition
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1C6-6LQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-value-proposition-tool-screenshot" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1C6-6LQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copyai-value-proposition-tool-screenshot" alt="Copy.ai Value proposition tool screenshot" width="880" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your value proposition is your promise to your customers or a particular market segment. It should be simple, easy to understand, and consistent with your brand voice. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.investopedia.com/terms/v/valueproposition.asp"&gt;A successful value proposition&lt;/a&gt; can help you convert a potential client into a paying customer.&lt;/p&gt;

&lt;p&gt;To use the value proposition tool by copy.ai, perform the following steps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the left toolbar, search and click on Startup Tools &amp;gt; Value proposition&lt;/li&gt;
&lt;li&gt;Enter the name of your business/brand&lt;/li&gt;
&lt;li&gt;Describe your brand, audience, and product/service.&lt;/li&gt;
&lt;li&gt;Select the tone with which the AI will generate the output&lt;/li&gt;
&lt;li&gt;Finally, click on create content&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;It takes a lot of time in starting a business. There are so many different factors to consider and implement without even looking at the initial idea itself. But with the help of machine learning and artificial intelligence, you can significantly speed up the initiation of your startup.&lt;/p&gt;

&lt;p&gt;Today, AI is more accessible than ever, and as a startup owner, I have outlined 5 tools that you can use to kickstart your business on the right track.&lt;/p&gt;

&lt;p&gt;AI tools for startups are all about enhancing efficiency and reducing time spent. If you haven't already, &lt;a href="https://sharetxt.live/recommends/copy-ai"&gt;sign up here to take advantage of this opportunity with Copy.AI&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>ai</category>
      <category>writing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Upload a file to GraphQL with VanillaJS</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Mon, 01 Aug 2022 17:54:00 +0000</pubDate>
      <link>https://dev.to/rexthony/how-to-upload-a-file-to-graphql-with-vanillajs-3dg7</link>
      <guid>https://dev.to/rexthony/how-to-upload-a-file-to-graphql-with-vanillajs-3dg7</guid>
      <description>&lt;p&gt;File upload is a feature that is very easy to implement in rest API but when it comes to sending a file to a GraphQL server, there is no standard way to go about it.&lt;/p&gt;

&lt;p&gt;In this article you will learn the widely accepted method of implementing file upload which is becoming increasingly popular in new apps. The technique follows the specification by &lt;a href="https://github.com/jaydenseric/graphql-multipart-request-spec"&gt;@jaydenseric&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It works similar to REST and is intuitive to use. Most examples that you will find online will use react, making use of the &lt;a href="https://www.npmjs.com/apollo-upload-client"&gt;graphql-upload-client&lt;/a&gt; to implement file upload to a GraphQL server. In this post, I will not be using any dependency client. I will upload a file to a GraphQL server by making use of Vanilla javascript. Hopefully this article helps you to determine what the graphql-upload-client library is doing under the hood.&lt;/p&gt;

&lt;p&gt;I will describe how to upload a file to a GraphQL server by making use of the following server dependencies&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;express&lt;/li&gt;
&lt;li&gt;apollo-server-express&lt;/li&gt;
&lt;li&gt;graphql-upload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the only dependencies that we will be using. We will run our application in node js with the dependencies above.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;express&lt;/strong&gt; is a server that we use to serve our application to the web.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;apollo-server-express&lt;/strong&gt; will add the graphql capability to our application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;graphql-upload&lt;/strong&gt; is a schema type for the uploaded file in graphql&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Let's Get Started
&lt;/h2&gt;

&lt;p&gt;We will begin by setting up our server to receive graphql upload requests.&lt;/p&gt;

&lt;p&gt;Firstly, make sure you have node installed on your system, then create a new empty directory and initialize the nodejs application by typing the following into the command prompt/terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a &lt;em&gt;package.json&lt;/em&gt; file which serves as your nodejs application config file.&lt;/p&gt;

&lt;p&gt;Next, install the following server dependencies&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install express, apollo-server-express, graphql-upload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will install express,apollo-server-express and graphql-upload dependencies into a new folder called node_modules, the package.json file will also be updated with a new entry for the installed dependencies.&lt;/p&gt;

&lt;p&gt;Next, create a new file called &lt;em&gt;app.js&lt;/em&gt;. In this file, you will enter the following to import the dependencies that you installed above&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApolloServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;apollo-server-express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;graphqlUploadExpress&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;graphql-upload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./schema&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;startServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ApolloServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="c1"&gt;// This middleware should be added before calling `applyMiddleware`.&lt;/span&gt;
    &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graphqlUploadExpress&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;applyMiddleware&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SERVER LISTENING ON PORT &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;startServer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;em&gt;require("dotenv").config()&lt;/em&gt; is used to load the environment variables from the .env file.&lt;/p&gt;

&lt;p&gt;We import the &lt;em&gt;apollo-server-express&lt;/em&gt; and the &lt;em&gt;graphql-upload&lt;/em&gt; into app.js. We also require a file called &lt;em&gt;/schema&lt;/em&gt;. This will load the schema/index.js, which will be used to define the schema for our graphQL application.&lt;/p&gt;

&lt;p&gt;The folder 📂 structure will look like this&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UK5Chi44--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/graphql-file-upload-folder-structure" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UK5Chi44--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/graphql-file-upload-folder-structure" alt="Image" width="400" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the schema/index.js file, you fetch the data from schema.graphql using the built in node js &lt;em&gt;fs&lt;/em&gt; dependency as shown below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;typeDefs&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./typeDefs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resolvers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./resolvers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;typeDefs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;resolvers&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we load the type definitions and resolvers from their respective folders.&lt;/p&gt;

&lt;p&gt;Here the schema for our graphQL application defined in schema/typeDefs/schema.graphql&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;scalar&lt;/span&gt; &lt;span class="nx"&gt;Upload&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;File&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Query&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Mutation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;singleUpload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Upload&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;File&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The query is not really important for file upload, but is required by graphql so we leave it there.&lt;/p&gt;

&lt;p&gt;The upload scalar is the type of our uploaded file.&lt;/p&gt;

&lt;p&gt;From the above, you can see that we have one query called hello and a single mutation called singleUpload which we will use to upload our file to the graphql server. The response from this mutation is a URL path to the uploaded image.&lt;/p&gt;

&lt;p&gt;Here is &lt;em&gt;schema/typeDefs/index.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;gql&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;apollo-server-express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;join&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./schema.graphql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;typeDefs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gql&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;typeDefs&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="s2"&gt;`; 

module.exports = typeDefs;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we simply load the schema and return it.&lt;/p&gt;

&lt;p&gt;In resolvers/index.js, we have the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GraphQLUpload&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;graphql-upload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Upload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GraphQLUpload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;Mutation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;singleUpload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createReadStream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mimetype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;encoding&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createReadStream&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`../../public/images/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createWriteStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`http://localhost:4000/images/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
javascript&lt;br&gt;
Here, is where we handle the file upload. We restructure the file and store the image in our local machine in the public directory of our application.&lt;/p&gt;

&lt;p&gt;That's basically it for our backend.&lt;/p&gt;
&lt;h2&gt;
  
  
  The front end
&lt;/h2&gt;

&lt;p&gt;The front end will be a very simple HTML and javascript app with a file upload functionality. We have a simple upload input which will enable you to select an image file from your local file system and upload it to the graphql server that we have just created.&lt;/p&gt;
&lt;h3&gt;
  
  
  Let's get started.
&lt;/h3&gt;

&lt;p&gt;Here is the HTML and Javascript for the front end. We have placed them together in the same file&lt;br&gt;
&lt;em&gt;index.html&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;post&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;upload&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sr"&gt;/ form &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sr"&gt;/ body &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sr"&gt;/ html &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onchange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;operations&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`{ "query": "mutation ($file: Upload!) { singleUpload(file: $file) { url } }", "variables": { "file": null } }`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;map&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`{ "0": ["variables.file"] }`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:4000/graphql&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;
                &lt;span class="p"&gt;});&lt;/span&gt;

                &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

                &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="sr"&gt;/ script &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a very simple front end.&lt;/p&gt;

&lt;p&gt;The mutation that sends the uploaded file is as shown below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;mutation&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Upload&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nx"&gt;singleUpload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="nx"&gt;URL&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the following variables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;variables.file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We submit the data to the graphql server with a formData which we create by appending the mutation in the &lt;em&gt;operations&lt;/em&gt; and the variables in the &lt;em&gt;map&lt;/em&gt;. You can upload multiple images in the same way, by incrementing the index of the variables from 0,1,2 and so on.&lt;/p&gt;

&lt;p&gt;We first listen for an unchanged event on the file input which is triggered after selecting the file to be uploaded. We get the binary file and append it to the form that we created dynamically, we then send the form to your graphql server just like we would with a normal rest upload. &lt;/p&gt;

&lt;p&gt;Our server will process the request and determine what mutation should handle the request based on the value that we passed to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;File upload to a graphql server can be very easily implemented with the &lt;strong&gt;apollo-server-express&lt;/strong&gt; dependency provided by the apollo. You can also implement it with the apollo server.&lt;/p&gt;

&lt;p&gt;In this tutorial, we have used the apollo-server-express, because it enables us to access the uploaded image from the public directory.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>javascript</category>
      <category>html</category>
    </item>
    <item>
      <title>How to Auto Generate a Youtube Video Script with AI</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Sun, 20 Mar 2022 23:32:02 +0000</pubDate>
      <link>https://dev.to/rexthony/how-to-auto-generate-a-youtube-video-script-with-ai-29g1</link>
      <guid>https://dev.to/rexthony/how-to-auto-generate-a-youtube-video-script-with-ai-29g1</guid>
      <description>&lt;p&gt;As a youtuber, you understand the need to create high-quality video content at scale in a short period of time.&lt;/p&gt;

&lt;p&gt;You know that video content production takes time. From planning, scripting, shooting to post-production, there are a lot of things that can slow down your pace.&lt;/p&gt;

&lt;p&gt;This can reduce your output which can hurt your rankings on youtube. This is because youtube's algorithm reward creators that consistently publish content by giving them greater exposure and rankings.&lt;/p&gt;

&lt;p&gt;In this article, I am going to show you how to use an AI to auto-generate a youtube video script for your channel. I'll break this down for you in a way that even if you have no experience writing scripts, you'll learn everything you need to know to get set up. This will save you time and help you create video scripts that captivate your audience and earn you more subscribers. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why do you need a youtube script?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---itMT8zT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/writing-a-script-by-girl" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---itMT8zT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/writing-a-script-by-girl" alt="A female scriptwriter with her hands on her head" width="800" height="534"&gt;&lt;/a&gt;&lt;br&gt;
Have you ever noticed that some videos ranking on YouTube have higher click-through rates compared to others? The reason for this is that the video has an interesting thumbnail, title, description, and scripting. &lt;/p&gt;

&lt;p&gt;If you can write a script that hooks your audience throughout the first 15 seconds of your video, they have a greater chance of sticking around and watching the video through to the end and subscribing to your channel. &lt;/p&gt;

&lt;p&gt;The importance of scripting your videos goes far beyond having words to say when it comes time to shoot the video. Instead, a script is used to create the concept of your video in written form. It gives you a better idea of the direction you’d like to go with your content creation strategy. &lt;/p&gt;

&lt;p&gt;Whether you'll simply sit back and chat with your audience or if there will be some acting involved. All this is geared towards presenting your content in a form that is appealing to your audience. &lt;/p&gt;

&lt;p&gt;A youtube script has the following elements &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scene descriptions&lt;/strong&gt;: If your video is broken down into scenes, in this section you will describe the scenes to provide context for filming. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dialogue&lt;/strong&gt;: In this section, you will describe what the characters in your video are going to say. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Directions&lt;/strong&gt;: In addition to speaking, your characters need to act and assume various personas. They might move around a space and perform various actions. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera cues&lt;/strong&gt;: Instructions for how the video should be filmed.  &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-production notes&lt;/strong&gt;: Descriptions of how the video will be edited in post-production.  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What if I told you that there is a way to generate a script for your next YouTube video with just a few clicks? &lt;/p&gt;
&lt;h2&gt;
  
  
  How to use AI to auto-generate a video script for youtube
&lt;/h2&gt;

&lt;p&gt;Several AI writing tools can help you to generate a script for your youtube video. In this section, we are going to go through a couple of them to see their features, pros, and cons. &lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://sharetxt.live/recommends/copy-ai"&gt;1. Copy.ai&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This is an AI copywriting tool that is designed for a bunch of use cases. The AI uses GPT-3 technology to produce high-quality auto-generated content. &lt;/p&gt;

&lt;p&gt;Copy.ai enables you to use the AI for free with 10 free credits every month for registered users. This is renewed monthly. &lt;/p&gt;

&lt;p&gt;It has a large collection of tools, which are grouped into the following categories&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Digital Ad copy&lt;/li&gt;
&lt;li&gt;Startup tools&lt;/li&gt;
&lt;li&gt;Website copy&lt;/li&gt;
&lt;li&gt;Blog tools&lt;/li&gt;
&lt;li&gt;Email/Letter&lt;/li&gt;
&lt;li&gt;Social media tools&lt;/li&gt;
&lt;li&gt;Sales copy&lt;/li&gt;
&lt;li&gt;Writing tools&lt;/li&gt;
&lt;li&gt;Brainstorming Tools&lt;/li&gt;
&lt;li&gt;Personal tools &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  How to use Copy.AI to create a video script for YouTube
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oI1nxjb4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copy-ai-video-description-tool" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oI1nxjb4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/copy-ai-video-description-tool" alt="Vide description tool by copy.ai" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first thing that you need to do is to sign up for an account. If you already have an account, then you can log in.&lt;/li&gt;
&lt;li&gt;Create a project or skip.&lt;/li&gt;
&lt;li&gt;In the sidebar, search for "youtube" in the tools search box. You will be presented with a couple of tools for youtube. Select the youtube description intro&lt;/li&gt;
&lt;li&gt;Type in the title of your video and a short description of what your video is about.&lt;/li&gt;
&lt;li&gt;Click on create copy and wait a few seconds while the ai generates a handful of descriptions for you. &lt;/li&gt;
&lt;li&gt;Finally, go through the auto-generated list by the ai and select the ones that you will love to use for your script. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://simplified.co"&gt;2. Simplified.co&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Simplified is a web app for social media management. The app enables you to create, collaborate, design, write marketing copy, create videos, and publish to social media.&lt;/p&gt;

&lt;p&gt;Simplified.co has a free plan that gives you access to an AI writer. You also get access to 30+ AI copywriting templates, collaboration tools, 1GB of workspace storage, and a lot more.&lt;/p&gt;

&lt;p&gt;It has 3 AI writing tools categories&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-form writer&lt;/li&gt;
&lt;li&gt;Short-form assistant&lt;/li&gt;
&lt;li&gt;AI designer&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  How to use Simplified.co to create a video script for YouTube
&lt;/h4&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/AWazuzryLec"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first thing that you need to do is to sign up for an account. If you already have an account, then you can log in.&lt;/li&gt;
&lt;li&gt;Click on the AI writer and select the Long-form writer&lt;/li&gt;
&lt;li&gt;Start typing in the title of your youtube video&lt;/li&gt;
&lt;li&gt;Finally, from the AI assistant tab, select a template such as &lt;strong&gt;Blog introduction&lt;/strong&gt; and click on &lt;strong&gt;Generate&lt;/strong&gt;. This will create multiple suggestions which you can select to add to your content.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://chibi.ai"&gt;3. Chibi.ai&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Chibi.ai is an ai powered auto-complete writing web application that helps you to overcome writer's block by completing your text and as a result giving you ideas on your content flow.&lt;/p&gt;

&lt;p&gt;Chibi.ai is free to use with a 2000 word limit per month which renews on the 1st of every month.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to use Chibi.ai to create a video script for YouTube
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mEn6ts6R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/chibi-ai-dashboard" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mEn6ts6R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/chibi-ai-dashboard" alt="Chibi.ai dashboard" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first thing that you need to do is to sign up for an account. If you already have an account, then you can log in.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;New document&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Write your youtube video title and your video description&lt;/li&gt;
&lt;li&gt;To let the AI complete your text, click on a template such as &lt;strong&gt;Intro&lt;/strong&gt;. The AI will scan through your text and generate content based on what you are currently writing about.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://rytr.me"&gt;4. Rytr.me&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Rytr is an AI writing assistant that helps you create high-quality content, in just a few seconds&lt;/p&gt;

&lt;p&gt;Rytr is free to use with a 5000 character limit per month.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to use Rytr.me to create a video script for YouTube
&lt;/h4&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/a6znj2_N3-4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first thing that you need to do is to sign up for an account. If you already have an account, then you can log in.&lt;/li&gt;
&lt;li&gt;Click on the use case drop down and choose &lt;strong&gt;Video description&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Write your youtube video title into the input field&lt;/li&gt;
&lt;li&gt;To let the AI complete your text, click on &lt;strong&gt;Ryte more&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://shortlyai.com"&gt;5. ShortlyAI.com&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;ShortlyAI is a writing application that has been designed to help you write better and generate better blog posts. It has a very simple UI (user interface) but is surprisingly powerful.&lt;/p&gt;

&lt;p&gt;Unlike the others, ShortlyAI is not free and requires you to pay either a monthly or yearly subscription. &lt;a href="https://www.shortlyai.com/pricing"&gt;Click here&lt;/a&gt; to check the current pricing. &lt;/p&gt;

&lt;h4&gt;
  
  
  How to use ShortlyAI to create a video script for YouTube
&lt;/h4&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/v6iBQpm-3Lo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first thing that you need to do is to sign up for an account. If you already have an account, then you can log in.&lt;/li&gt;
&lt;li&gt;Click on writing an article/blog&lt;/li&gt;
&lt;li&gt;Write your youtube video title and your video description&lt;/li&gt;
&lt;li&gt;To let the AI complete your text, click on &lt;strong&gt;Write for me&lt;/strong&gt;. The AI will scan through your text and generate content based on what you are currently writing about. &lt;/li&gt;
&lt;li&gt;Finally, you can choose to undo or edit the content&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article, we have discussed how to use AI to generate the scripts for your next YouTube video content. We have also looked at 3 different tools that would help you to get the script for your video. &lt;/p&gt;

&lt;p&gt;It might not be easy to do it yourself, but if you've got a great idea for a video, have no fear. AI is here. And with a little bit of work on your part, you can have your very own script to use as a template for your amazing projects. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live/contact"&gt;Let me know&lt;/a&gt; if you think I missed out on any of your favourite tools.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>youtube</category>
      <category>script</category>
    </item>
    <item>
      <title>How to Sync Your Notes Across Multiple Devices</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Wed, 23 Feb 2022 17:21:26 +0000</pubDate>
      <link>https://dev.to/rexthony/how-to-sync-your-notes-across-multiple-devices-h3m</link>
      <guid>https://dev.to/rexthony/how-to-sync-your-notes-across-multiple-devices-h3m</guid>
      <description>&lt;p&gt;Are you one of those people who have half a dozen devices but only get to use one at a time? And every time you switch from one device to another, you are lost as your notes could be on any one of them? &lt;/p&gt;

&lt;p&gt;Keeping your notes in sync online is a very easy task if you use the right tools. &lt;/p&gt;

&lt;p&gt;I’ve spent years trying various syncing solutions – solutions that would make my life easier by syncing across all my devices regardless of differences in device manufacturer. &lt;/p&gt;

&lt;p&gt;In this article, I will go over how to use an online web app called &lt;a href="https://sharetxt.live"&gt;ShareTXT&lt;/a&gt; to enable you to synchronize your notes across multiple devices. &lt;/p&gt;

&lt;p&gt;I used to have my notes on my laptop and after that, I used cloud services to synchronize and share them across all my devices. &lt;/p&gt;

&lt;p&gt;The problem was that for the simple task of sharing one or two lines of a note, it was a very slow process. I wanted something way faster. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With ShareTXT, your notes get synchronized across all your devices in real-time as you type it into the application&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;With it being an online application, you do not need to install any app on your devices. It works automatically out of the box without any setup. &lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of keeping your notes in sync
&lt;/h2&gt;

&lt;p&gt;Syncing notes is important. It helps you have one source of truth across browsers, desktops, and mobile phones. &lt;/p&gt;

&lt;p&gt;It is a great feature, especially when you're on the go. If you edit a note on your computer, all other devices will automatically update to reflect those changes. &lt;/p&gt;

&lt;p&gt;Your notes can easily get disorganized especially if you have them in multiple places. &lt;/p&gt;

&lt;p&gt;You can access your notes anywhere you want with a modern browser. You don't need to install any software on your computer or smartphone. &lt;/p&gt;

&lt;p&gt;If you are on your computer, laptop, tablet, or phone and you have an internet connection, you also have access to your notes. &lt;strong&gt;Any changes you make will be updated instantly across all devices&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;You can easily share your notes with others by &lt;a href="https://sharetxt.live/blog/how-to-share-text-online-via-your-browser"&gt;copying them and pasting them into the other device's clipboard&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Synchronizing your notes is important &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you have a team of people contributing to the same set of notes.&lt;/li&gt;
&lt;li&gt;If you have several devices and want to have a consistent experience across all of them.&lt;/li&gt;
&lt;li&gt;If you're using multiple note-taking apps and want to switch seamlessly between them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to quickly sync your notes online
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live"&gt;ShareTXT&lt;/a&gt; is an online web application that makes it incredibly easy and quick to sync your notes across multiple devices. You can get started in less than a minute. &lt;/p&gt;

&lt;h3&gt;
  
  
  How to sync your notes across multiple devices with ShareTXT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Using your web browser, go to &lt;a href="https://sharetxt.live"&gt;sharetxt.live&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit the same link on the other device that you want to synchronize your notes &lt;/li&gt;
&lt;li&gt;Type or paste your notes into the input field. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you begin to type your note, it automatically appears on the other device because the notes are synchronized. &lt;/p&gt;

&lt;p&gt;You can have multiple devices synchronized by visiting the same link. The moment you begin to type or paste a text into the input field, it will automatically appear on all the devices. &lt;/p&gt;

&lt;p&gt;You can also save your notes and access them from any device. &lt;/p&gt;

&lt;p&gt;Simply login or "&lt;strong&gt;Claim a link&lt;/strong&gt;" to create an account with your Google account or email address. &lt;/p&gt;

&lt;p&gt;Since you are creating and managing your notes online, you can be sure that they will remain synchronized when you access them from any device. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this day and age, we’re connected and our various devices 24/7. It makes sense that you’d want to save your notes on one device so you can access them on another. &lt;/p&gt;

&lt;p&gt;Doing more with your notes is easy when you have them readily available across multiple devices. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://sharetxt.live"&gt;ShareTXT&lt;/a&gt; is a platform for synchronizing your notes&lt;/strong&gt; so you can take your notes with you wherever you go. &lt;/p&gt;

&lt;p&gt;You can sync your notes and &lt;a href="https://sharetxt.live/blog/how-to-safely-share-passwords-and-secret-codes-online"&gt;share your passwords or security codes&lt;/a&gt; safely and quickly across multiple devices in real-time and the best part is that it is free to use and works automatically without installing any apps. &lt;/p&gt;

&lt;p&gt;Hopefully, this post has given you some ideas on how to easily keep your notes synchronized. &lt;/p&gt;

&lt;p&gt;Do well to contact me with your thoughts. I'd love to hear from you. &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>notetaking</category>
      <category>synchronize</category>
    </item>
    <item>
      <title>How to Install GlitchTip on Ubuntu 18.04</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Thu, 17 Feb 2022 03:07:02 +0000</pubDate>
      <link>https://dev.to/rexthony/how-to-install-glitchtip-on-ubuntu-1804-2k52</link>
      <guid>https://dev.to/rexthony/how-to-install-glitchtip-on-ubuntu-1804-2k52</guid>
      <description>&lt;p&gt;&lt;a href="https://glitchtip.com" rel="noopener noreferrer"&gt;GlitchTip&lt;/a&gt; is an application that helps you to track your applications up-time (up-time monitoring) and crashes.&lt;/p&gt;

&lt;p&gt;After developing your application and release it to the world, GlitchTip enables you to keep track of events that happen as people use your application.&lt;/p&gt;

&lt;p&gt;If an error occurs when a user is using your application, information about the error is sent to your GlitchTip deployment. This enables you to spot errors very quickly and take action to fix the error before more people experience that issue.&lt;/p&gt;

&lt;p&gt;Rather than depending on your users submitting bug reports, you can quickly know the instant that an error is triggered by someone using your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is GlitchTip?
&lt;/h2&gt;

&lt;p&gt;GlitchTip is an open source re-implementation of the Sentry error tracking platform. &lt;/p&gt;

&lt;p&gt;But unlike sentry, it is free to use.&lt;/p&gt;

&lt;p&gt;You can setup and deploy it on your own VPS server. As we are going to do later on in this article.&lt;/p&gt;

&lt;p&gt;After setting up the error tracking application, you need to insert some code into your application to send errors to your GlitchTip deployment. These are called SDKs. &lt;/p&gt;

&lt;p&gt;GlitchTip currently has SDKs for applications created with the following technologies&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;Cordova&lt;/li&gt;
&lt;li&gt;Electron&lt;/li&gt;
&lt;li&gt;Elixir&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Javascript&lt;/li&gt;
&lt;li&gt;Minidump&lt;/li&gt;
&lt;li&gt;Native (C/C++)&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Objective-C&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;React-Native&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can checkout the full SDK documentation &lt;a href="https://glitchtip.com/sdkdocs" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You can have one GlitchTip deployment and have multiple applications sending error reports to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install GlitchTip on Ubuntu 18.04
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we are going to be deploying GlitchTip on docker on an AWS VPS running a Ubuntu 18.04 server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;p&gt;Before you get started, please install&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker-compose&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Get the docker compose file
&lt;/h3&gt;

&lt;p&gt;Create a directory in your root directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;mkdir&lt;/span&gt; &lt;span class="nx"&gt;glitchtip&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;glitchtip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create a file called &lt;strong&gt;"docker-compose.yml"&lt;/strong&gt; in the current directory. I will be using nano which comes as a default in my server, you can also use vim&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;nano&lt;/span&gt; &lt;span class="nx"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this file, copy and paste the docker-compose commands from &lt;a href="https://glitchtip.com/assets/docker-compose.sample.yml" rel="noopener noreferrer"&gt;here&lt;/a&gt;. It looks like this at the time of writing this article&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: "3.4"
x-environment:
  &amp;amp;default-environment
  DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres
  SECRET_KEY: change_me
  PORT: 8000
x-depends_on:
  &amp;amp;default-depends_on
  - postgres
  - redis

services:
  postgres:
    image: postgres:13
    environment:
      POSTGRES_HOST_AUTH_METHOD: "trust"
    restart: unless-stopped
  redis:
    image: redis
    restart: unless-stopped
  web:
    image: glitchtip/glitchtip
    depends_on: *default-depends_on
    ports:
      - "8000:8000"
    environment: *default-environment
    restart: unless-stopped
  worker:
    image: glitchtip/glitchtip
    command: ./bin/run-celery-with-beat.sh
    depends_on: *default-depends_on
    environment: *default-environment
    restart: unless-stopped
  migrate:
    image: glitchtip/glitchtip
    depends_on: *default-depends_on
    command: "./manage.py migrate"
    environment: *default-environment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On line 5, endeavor to change your SECRET_KEY to something more secure.&lt;br&gt;
Also under the &lt;strong&gt;x-environment&lt;/strong&gt; section at the top of the file, you can add more environment variables to GlitchTip such as &lt;code&gt;GLITCHTIP_MAX_EVENT_LIFE_DAYS&lt;/code&gt;, &lt;code&gt;REDIS_URL&lt;/code&gt;, &lt;code&gt;DATABASE_URL&lt;/code&gt; and others. &lt;/p&gt;

&lt;p&gt;Check out the list of environment variables &lt;a href="https://glitchtip.com/documentation/install" rel="noopener noreferrer"&gt;here&lt;/a&gt;, under the &lt;em&gt;Configurations&lt;/em&gt; subheading. &lt;/p&gt;

&lt;p&gt;For our case, we will leave it as it is.&lt;/p&gt;

&lt;p&gt;Next, save the file and type&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt; &lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to create the application at port 8000.&lt;/p&gt;

&lt;p&gt;Open your browser and go to &lt;code&gt;your_ip_address:8000&lt;/code&gt;. You should see the GlitchTip login screen&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzafk4d3i8katgti8981.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzafk4d3i8katgti8981.PNG" alt="GlitchTip login"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on signup to register&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ic2ly025hqgsspwvbcj.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ic2ly025hqgsspwvbcj.PNG" alt="GlitchTip signup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After logging in, you will be taken to the dashboard where you can create an organization&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hiskmcq4cxc52ydgi6i.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hiskmcq4cxc52ydgi6i.PNG" alt="GlitchTip dashboard"&gt;&lt;/a&gt;&lt;br&gt;
Click on &lt;strong&gt;Create New Organization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jrb5l5rjz6symf0a0cq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jrb5l5rjz6symf0a0cq.PNG" alt="Glitchtip create an organization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the name of your organization. I used "Rex Org" for mine.&lt;/p&gt;

&lt;p&gt;After that is done, proceed and you will be taken to the organisation screen where you can manage your projects for this organisation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1yljruzb3076njufgbu.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1yljruzb3076njufgbu.PNG" alt="GlitchTip Organization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, there are no projects, so let us create a new project for our simple node.js application. Note that you can create a project for any type of application as I have listed in the SDKs above.&lt;/p&gt;

&lt;p&gt;Next, click on &lt;strong&gt;"Create New Project"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc8onv8buwvasarjgrye.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc8onv8buwvasarjgrye.PNG" alt="GlitchTip Create a new project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the type of application that you want to monitor. In our case, we select Node.js&lt;/p&gt;

&lt;p&gt;Next, enter the name of your application in Project Name and click on create a team where you can specify a slug for your team. In my case, I used &lt;code&gt;rex-team&lt;/code&gt; as my team slug.&lt;/p&gt;

&lt;p&gt;Finally, click on the &lt;strong&gt;Create Project&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;After the project is created, you will be taken to a screen which explains to you how to setup your application to start using GlitchTip as a monitoring system. In our case, we are using Node.js so it looks like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1x3nlbqtvtys32n9dw2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1x3nlbqtvtys32n9dw2.PNG" alt="Issues"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice that we are now in the issues tab. Note the right hand side of the screen that shows a DSN link. We will need to use it in your application to send bug reports automatically whenever they happen to our GlitchTip deployment.&lt;/p&gt;

&lt;p&gt;For now, we have our GlitchTip project setup and ready to listen for errors from our application. &lt;/p&gt;
&lt;h2&gt;
  
  
  Create a simple Node.js app and connect it with GlitchTip
&lt;/h2&gt;

&lt;p&gt;Let us proceed with setting up a simple node.js app and adding an intentional error to see if it gets tracked by GlitchTip.&lt;/p&gt;

&lt;p&gt;Go back to the terminal and head back to your home directory, make sure that you have node and npm already installed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;mkdir&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have created a directory called app, we entered into the directory and initialized this directory as a node.js directory for our application. We will now have a package.json file automatically created for us.&lt;/p&gt;

&lt;p&gt;Next, we are going to install 2 dependencies&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;express&lt;/li&gt;
&lt;li&gt;@sentry/node
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@sentry/node&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will install an express server and a GlitchTip SDK for our node app which we will use to send error reports to our GlitchTip deployment.&lt;/p&gt;

&lt;p&gt;After everything is installed successfully, our package.json file will be automatically updated with our dependencies&lt;/p&gt;

&lt;p&gt;Next, create a file in the &lt;code&gt;~/app/&lt;/code&gt; directory called &lt;strong&gt;index.js&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="nx"&gt;nano&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this file we create 2 simple express routes. One with an error and another without an error. We also copy and paste our DSN url from our GlitchTip deployment to track for errors from our application.&lt;/p&gt;

&lt;p&gt;Paste the following code into your index.js file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a GlitchTip test app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file and in your terminal type &lt;code&gt;node index.js&lt;/code&gt;. You will get the following response &lt;code&gt;Listening on port 3000&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Open your browser and go to &lt;strong&gt;&lt;a href="http://your_ip_address:3000" rel="noopener noreferrer"&gt;http://your_ip_address:3000&lt;/a&gt;&lt;/strong&gt;. You should see the following output&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
"status": "success",
"message": "This is a GlitchTip test app"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means that your app is working fine.&lt;/p&gt;

&lt;p&gt;Next, we are going to setup this simple app to fail on purpose and send that error to GlitchTip.&lt;/p&gt;

&lt;p&gt;Edit your index.js file and update it with the following code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Sentry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@sentry/node&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;Sentry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;dsn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://1273aea6f3274bbaa26bec9e6d7ad511@localhost:8000/1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Sentry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Handlers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestHandler&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a GlitchTip test app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My first GlitchTip error!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Sentry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Handlers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;errorHandler&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We now have a route that throws an error when we visit the &lt;strong&gt;&lt;a href="http://your_ip_address:3000/error" rel="noopener noreferrer"&gt;http://your_ip_address:3000/error&lt;/a&gt;&lt;/strong&gt; endpoint.&lt;/p&gt;

&lt;p&gt;Run the app again with &lt;code&gt;node index.js&lt;/code&gt; and open your browser and visit the link &lt;code&gt;http://your_ip_address:3000/error&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You should see that an error is thrown&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw38e27u52fco9hvuvjdp.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw38e27u52fco9hvuvjdp.PNG" alt="Our error"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, go back to our GlitchTip deployment and refresh the page. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F21famo8h4jejrz3unw3a.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F21famo8h4jejrz3unw3a.PNG" alt="GlitchTip first issue"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will now be able to see the error displayed in the issues tab.&lt;/p&gt;

&lt;p&gt;That's it. You have now successfully integrated GlitchTip as a monitoring system for your application.&lt;/p&gt;

&lt;p&gt;You can click on an error to inspect it and get information about how the error originated with a stack trace just as I have below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mnkx1hkyuc6qrf211dl.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mnkx1hkyuc6qrf211dl.PNG" alt="GlitchTip stack trace"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can track when the error occured, how many times it has been reported, the last time it was reported and more information about the error such as the header data sent, node version and so on.&lt;/p&gt;

&lt;p&gt;In addition to error tracking, you can also perform up-time monitoring with GlitchTip. It will occasionally send a ping to your application to keep track of its availability so that when your application stops working you can receive a notification and take action quickly.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>node</category>
      <category>docker</category>
    </item>
    <item>
      <title>How to Safely Share Passwords and Secrets Codes Online</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Wed, 16 Feb 2022 10:50:57 +0000</pubDate>
      <link>https://dev.to/rexthony/how-to-safely-share-passwords-and-secrets-codes-online-hkb</link>
      <guid>https://dev.to/rexthony/how-to-safely-share-passwords-and-secrets-codes-online-hkb</guid>
      <description>&lt;p&gt;I've been wondering how to securely share passwords and secret codes online between your devices using your browser, without having to install the same password manager app on multiple devices. &lt;/p&gt;

&lt;p&gt;There are numerous reasons that this could be required, and there are various ways around it - some of these may also be more appropriate than others depending on what you're trying to achieve. &lt;/p&gt;

&lt;p&gt;In this article, I will go over how to use an encrypted service called &lt;a href="https://sharetxt.live" rel="noopener noreferrer"&gt;ShareTXT&lt;/a&gt; to enable you to safely share your IP address, password, hash codes, your mnemonic phrase, or any other secret code between your devices for free. &lt;/p&gt;

&lt;p&gt;Password managers are expensive and are not the correct solution when you want to quickly share specific personal information that might be of value to other parties as not everyone will have the application installed on their device. &lt;/p&gt;

&lt;p&gt;The solution that I am proposing will enable you to paste your passwords into the recipient's device without needing to install any app. &lt;/p&gt;

&lt;p&gt;You don't even need to create an account or pay a fee to get started. The application is free to use. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why you might need to share your password
&lt;/h2&gt;

&lt;p&gt;In general, it is not a good idea to share your password with anyone else. Your password should be kept secret at all times. &lt;/p&gt;

&lt;p&gt;Most companies have shared passwords for their documents or WiFi that they share with their employees as plain text documents. &lt;/p&gt;

&lt;p&gt;This information tends to get into the hands of bad actors who can use it to infiltrate and sabotage your business. &lt;/p&gt;

&lt;p&gt;Other reasons why you might need to share passwords would be to allow access to a shared resource such as a shared WiFi password, ssh keys, to share login information between your multiple smart devices. &lt;/p&gt;

&lt;h2&gt;
  
  
  How to secure your password before sharing
&lt;/h2&gt;

&lt;p&gt;While preparing to share your password, take a few precautions to ensure that it is secure. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create unique passwords&lt;/strong&gt;: never use the same password for more than one account. This minimizes the risks to your other accounts in the situation that one account is compromised.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create strong passwords&lt;/strong&gt;: a good password will contain uppercase, lowercase characters, numbers, special characters/symbols. Try to make your passwords at least 8 characters or more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never share your passwords in plain text formats&lt;/strong&gt;: this leaves you vulnerable and exposes you to several attack vectors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not share your passwords to your email inbox&lt;/strong&gt;: it is unencrypted and if you forget to log out, an attacker can simply copy your passwords and use them maliciously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup two factor authentication&lt;/strong&gt;: before sharing your passwords, ensure that you add another layer of security to protect your data. Most apps offer this option. It requires you to authenticate yourself multiple times before accessing a given resource. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to safely share your password online
&lt;/h2&gt;

&lt;p&gt;The best way to share your passwords is with an encrypted service. These services hash your passwords so that even if it is intercepted during transmission, your password can not be decrypted and will be useless to the attacker. &lt;/p&gt;

&lt;h3&gt;
  
  
  Sharing your passwords with ShareTXT
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Using your web browser, go to &lt;a href="https://sharetxt.live" rel="noopener noreferrer"&gt;sharetxt.live&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Visit the same link on the other device that you want to share your passwords&lt;/li&gt;
&lt;li&gt;Type or paste your password into the input field to share it between the connected devices

&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsharetxt.live%2Fuploads%2Fimages%2Fsharetxt-homepage-default" alt="The ShareTXT home page"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Data encryption occurs before your password is sent, it gets decrypted and displayed on the device after it is received.&lt;/p&gt;

&lt;p&gt;ShareTXT enables you to "Claim a private link". This provides additional security and requires you to log in before sharing your private information. &lt;/p&gt;

&lt;p&gt;You can log in with either your email or Google account to save and manage your passwords and secret codes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Most people often look for apps such as password managers to help them share their password, and get them installed on all of their devices. &lt;/p&gt;

&lt;p&gt;These apps are not free and require a subscription. For the simple task of sharing passwords, they are overkill, they break your flow, and are complicated to use.&lt;/p&gt;

&lt;p&gt;What ShareTXT provides is a simple, quick, and secure way to share your passwords and secret codes between your devices for free. &lt;/p&gt;

&lt;p&gt;We covered a lot of ground in this post, but I hope that you found it informative and helpful. &lt;/p&gt;

&lt;p&gt;Good security practices can be difficult to keep up with, but they’re so important that we should all make at least the effort to keep ourselves safe. With the right tools, it’s not hard to do, either!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>security</category>
      <category>beginners</category>
    </item>
    <item>
      <title>7 Ways to Get Paid as a Content Creator Working Remotely in 2022</title>
      <dc:creator>Rex Anthony</dc:creator>
      <pubDate>Sun, 06 Feb 2022 15:36:39 +0000</pubDate>
      <link>https://dev.to/rexthony/7-ways-to-get-paid-as-a-content-creator-working-remotely-in-2022-11ji</link>
      <guid>https://dev.to/rexthony/7-ways-to-get-paid-as-a-content-creator-working-remotely-in-2022-11ji</guid>
      <description>&lt;p&gt;The ability to &lt;a href="https://sharetxt.live/blog/ways-to-make-money-online-as-a-content-creator"&gt;make money online&lt;/a&gt; while working remotely is now the new normal. With the internet being ubiquitous, location doesn’t matter anymore. A good number of companies and startups offer a wide range of services that allow you to work from home.&lt;/p&gt;

&lt;p&gt;As a content creator, there are several options to get paid. Most clients look for writers who accept payment via PayPal or bank transfer. While this is great, others prefer being paid via other methods. &lt;/p&gt;

&lt;p&gt;Whatever your preference is, it’s good to know about the different ways you can get paid for your work as an online content creator. &lt;/p&gt;

&lt;p&gt;As a content creator working remotely, you can get paid via &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PayPal &lt;/li&gt;
&lt;li&gt;Payoneer&lt;/li&gt;
&lt;li&gt;Bank Transfer&lt;/li&gt;
&lt;li&gt;Credit Card&lt;/li&gt;
&lt;li&gt;Gift Cards &lt;/li&gt;
&lt;li&gt;Check &lt;/li&gt;
&lt;li&gt;Cryptocurrency&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  PayPal
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I don't have a bank account, because I don't know my mother's maiden name. – Paula Poundstone&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pi-Jsmvd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/paypal-logo" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pi-Jsmvd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/paypal-logo" alt="Paypal logo" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live/recommends/paypal"&gt;PayPal&lt;/a&gt; is an online payment system. It allows people to send money to each other over the Internet.&lt;/p&gt;

&lt;p&gt;PayPal has an app that you can use to transfer funds and manage your funds from any location.&lt;/p&gt;

&lt;p&gt;PayPal is easy to use. To receive money on your PayPal account, you will enter the email address your PayPal account is registered under into a field in the sender's PayPal account. &lt;/p&gt;

&lt;p&gt;The sender will then enter the amount they want to send you and click a button to send the money. You will get an email alert when you've received the money.&lt;/p&gt;

&lt;p&gt;Once you have received the funds, you can withdraw them into your bank account.&lt;/p&gt;

&lt;p&gt;If you use PayPal to receive payments – particularly on eBay – then they will charge you anything between 5 and 10 percent of the total price.&lt;/p&gt;

&lt;p&gt;Complaints from PayPal users report that their accounts have been frozen without warning. The company’s algorithms are constantly checking every transaction to look for unusual behavior which might be something as innocuous as a larger-than-usual sum being moved through its systems.&lt;/p&gt;

&lt;p&gt;Also, PayPal may hold on to your money if you have a history of chargebacks. When this happens, they can hold on to your funds for up to 21 days to guard against the possibility of a problem with a transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Payoneer
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;It may not always be profitable at first for businesses to be online, but it is certainly going to be unprofitable not to be online.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wfQx0co1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/payoneer-logo" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wfQx0co1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/payoneer-logo" alt="Payoneer logo" width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another great option is &lt;a href="https://sharetxt.live/recommends/payoneer"&gt;Payoneer&lt;/a&gt;, which enables you to receive payment from anywhere in the world by simply using your corporate card. &lt;/p&gt;

&lt;p&gt;In addition to the website, you can also use the Payoneer app on your phone. &lt;/p&gt;

&lt;p&gt;It provides you with a credit card that is very easy to use, it works with almost all ATMs worldwide, you can send &amp;amp; receive the money very simple&lt;/p&gt;

&lt;p&gt;After receiving the funds, you can withdraw them from any ATM close to you. If you do not have an ATM near you, then you can transfer the funds into your local bank account.&lt;/p&gt;

&lt;p&gt;Payoneer offers receiving accounts via the Global Payment Service. This enables you to receive local bank transfers from companies and marketplaces in the US, UK, EU, Japan, Canada, Australia, and Mexico directly to your Payoneer account.&lt;/p&gt;

&lt;p&gt;It also supports withdrawals to local bank accounts in over 150 countries and currencies.&lt;/p&gt;

&lt;p&gt;With a Payoneer account, you can receive payments from the following online sites&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Google&lt;/li&gt;
&lt;li&gt;Youtube&lt;/li&gt;
&lt;li&gt;ClickBank&lt;/li&gt;
&lt;li&gt;UpWork&lt;/li&gt;
&lt;li&gt;Fiverr&lt;/li&gt;
&lt;li&gt;PeoplePerHour&lt;/li&gt;
&lt;li&gt;IStockPhoto&lt;/li&gt;
&lt;li&gt;99Designs&lt;/li&gt;
&lt;li&gt;Amazon&lt;/li&gt;
&lt;li&gt;Expert360&lt;/li&gt;
&lt;li&gt;TeeSpring&lt;/li&gt;
&lt;li&gt;Guru&lt;/li&gt;
&lt;li&gt;ProBlogger&lt;/li&gt;
&lt;li&gt;DailyMotion&lt;/li&gt;
&lt;li&gt;GraphicRiver&lt;/li&gt;
&lt;li&gt;DepositPhotos&lt;/li&gt;
&lt;li&gt;SEOClerks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Payoneer is not supported by some online companies to receive payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bank transfer
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;If money doesn't grow on trees, then why do banks have branches?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--otu07X5n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/bank-transfer-graphic" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--otu07X5n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/bank-transfer-graphic" alt="Bank transfer" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Payment by bank transfer is by far the most conventional way to get paid as a remote content creator.&lt;/p&gt;

&lt;p&gt;A bank or wire transfer enables you to receive money to your local bank account from anywhere in the world.&lt;/p&gt;

&lt;p&gt;To receive international payments, you need to provide the sender with your full name, address, postal code, account number, BIC/Swift code, IBAN, bank details such as your branch code, bank name, city, location code, country, country code, your account type and the location of the bank's branch that is closest to you.&lt;/p&gt;

&lt;p&gt;Bank transfers would be convenient for remote content creators who do not have a credit card because after the transfer is sent and the funds settle in your account, you can go to a physical bank to request withdrawal of your funds.&lt;/p&gt;

&lt;p&gt;From my personal experience of using bank transfers, it usually takes a couple of days after the transfer is initiated, for the funds to settle in your account. Usually about 3 to 4 working days not counting Saturdays and Sundays.&lt;/p&gt;

&lt;p&gt;This means that you need to wait patiently and trust that the funds have been sent by the sender. The sender will usually send you proof of payment such as the bank receipt indicating that he has initiated the payment.&lt;/p&gt;

&lt;p&gt;Bank transfers tend to come with huge charges for processing your payments and currency conversion, check with your local bank to find out how much they charge for processing your payments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credit card
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I haven't reported my missing credit card to the police because whoever stole it is spending less than my wife. - Ilie Nastase&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hmRokcbn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/credit-card-graphic" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hmRokcbn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/credit-card-graphic" alt="Credit card graphic" width="580" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As an online content creator, you can create a website and set up yourself as a credible personality.&lt;/p&gt;

&lt;p&gt;A website enables you to showcase your previous work to potential clients and track important metrics such as the number of your website visitors and so on.&lt;/p&gt;

&lt;p&gt;As a site owner, you can also accept credit card payments from your clients.&lt;/p&gt;

&lt;p&gt;To get started, you need to determine what type of credit cards you'll accept such as &lt;a href="https://sharetxt.live/recommends/visa"&gt;VISA&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/mastercard"&gt;MasterCard&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/discover"&gt;Discover&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/american-express"&gt;American Express&lt;/a&gt;, and so on.&lt;/p&gt;

&lt;p&gt;Note that processing fees vary based on the credit card processor and transaction type.&lt;/p&gt;

&lt;p&gt;There are 3 ways to accept credit card payments.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In person payments: In this scenario, your client is physically present with you. By giving you his credit card, you can process the payment with a card reader or POS device.&lt;/li&gt;
&lt;li&gt;Over the phone payments: This is less secure, is more prone to fraud and as such, it incurs higher charges. In this scenario, your client shares their credit card with you over the phone. You then enter that information into a card reader to process the transaction.&lt;/li&gt;
&lt;li&gt;Online payments: Credit card processing providers charge huge fees for performing fraud checks and verifying the card holder's account number. By far, the best way to accept credit card payments is with an online credit card processor like &lt;a href="https://sharetxt.live/recommends/stripe"&gt;Stripe&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/venmo"&gt;Venmo&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/wise"&gt;Wise&lt;/a&gt;, &lt;a href="https://sharetxt.live/recommends/skrill"&gt;Skrill&lt;/a&gt;, and so on.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Gift cards
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I Hope This Makes You Smile. You Deserve It!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4QoLA5ya--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/gift-card-with-red-ribbon" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4QoLA5ya--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/gift-card-with-red-ribbon" alt="A gift card with a red ribbon" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A gift card is a sort of payment that can be used to make purchases at retail stores, gas stations, restaurants, and other designated locations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sharetxt.live/recommends/gift-cards"&gt;Gift cards&lt;/a&gt; can be physical or digital. Many retailers both online and offline offer/accept gift cards. These cards make it convenient for customers to pay for their products with an in-store card reader or via an app to speed up the checkout process.&lt;/p&gt;

&lt;p&gt;With gift cards, you can avoid credit card fees when sending/receiving payments from your clients.&lt;/p&gt;

&lt;p&gt;The downside of a gift card is that it limits your purchasing power. This is because there can only be a limited number of retailers that accept certain gift cards.&lt;/p&gt;

&lt;p&gt;As an owner of a gift card, you may need to pay a fee to reload money into the card. You may be charged a fee for inactivity if you fail to use the card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;There's a way of transferring funds that is even faster than electronic banking. It's called marriage - James Holt McGavran&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MnIEiuez--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/signing-check-graphic" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MnIEiuez--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/signing-check-graphic" alt="Signing a check graphic" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although the usage of checks is slowly diminishing, checks still amount to a significant slice of transactions that take place daily.&lt;/p&gt;

&lt;p&gt;As a content creator, the goal is to make it seamless for your clients to pay you without any hurdles. One way to accomplish this is by accepting all forms of payment, including checks, and allowing your clients to make a decision about what payment method they will prefer to use.&lt;/p&gt;

&lt;p&gt;Although, inevitably, there is always a risk of a bounced check, here are some ways to go about reducing the likelihood of this happening&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do not accept an altered check&lt;/li&gt;
&lt;li&gt;Do not accept a check with a P.O Box number&lt;/li&gt;
&lt;li&gt;Verify the information on the check&lt;/li&gt;
&lt;li&gt;Setup a policy to accept a check only with identifiable forms of ID&lt;/li&gt;
&lt;li&gt;Accept checks with check numbers above 300. Any number below this indicates that the check belongs to a new account number and is likely to bounce.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cryptocurrency
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Gold has gone from 0 to $1850 in 5000 years. Bitcoin has gone from 0 to $57,000 in 10 years. Why would I own gold? - Bill Miller&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zbtaUhhC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/holding-bitcoin" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zbtaUhhC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://sharetxt.live/uploads/images/holding-bitcoin" alt="Holding bitcoin" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cryptocurrencies are becoming more popular as more businesses are accepting them as a form of payment.&lt;/p&gt;

&lt;p&gt;It is less expensive to receive payments from your clients because cryptocurrencies do not need third-party verification.&lt;/p&gt;

&lt;p&gt;Before a client sends you payment via a cryptocurrency, you need to provide him with your crypto wallet address. After the payment is sent, the transaction is verified and recorded on the blockchain. It takes a while depending on the speed of the blockchain network for you to receive your payment.&lt;/p&gt;

&lt;p&gt;You don't need to worry about dealing with banks.&lt;/p&gt;

&lt;p&gt;Some things to keep in mind when accepting payments with cryptocurrencies&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The transaction is irreversible. This means that if a client requests a refund after making payment, you need to manually send back the payment. This requires bookkeeping effort on your part.&lt;/li&gt;
&lt;li&gt;Cryptocurrencies are taxable in most countries around the world. Check your government's website for regulations regarding your ownership of cryptocurrencies.&lt;/li&gt;
&lt;li&gt;Cryptocurrencies are still very volatile. This means that the value of your currency can change at any moment for better or for worse. Therefore, you should be cautious before investing all of your savings into cryptocurrencies and keep an eye out for trending news that may impact your earnings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There are several ways for you to receive payments for your work as a content creator working remotely.&lt;/p&gt;

&lt;p&gt;Online platforms like &lt;a href="https://sharetxt.live/recommends/paypal"&gt;PayPal&lt;/a&gt; and &lt;a href="https://sharetxt.live/recommends/payoneer"&gt;Payoneer&lt;/a&gt; are more convenient for you and your clients and they simplify the process of receiving payments. The transaction fees are also lower compared to conventional banks.&lt;/p&gt;

&lt;p&gt;As a content creator, the goal is to make payment seamless for your clients therefore accepting payment methods such as bank transfers, credit cards, gift cards, checks, and cryptocurrencies give them a choice of choosing the payment method that is convenient for them.&lt;/p&gt;

&lt;p&gt;Now that you know how to accept payments from your clients, I have written an article that guides you on how to make money as an online content creator, &lt;a href="https://sharetxt.live/blog/ways-to-make-money-online-as-a-content-creator"&gt;check it out here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>contentcreation</category>
      <category>moneytransfer</category>
    </item>
  </channel>
</rss>
