<?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: Deeraf</title>
    <description>The latest articles on DEV Community by Deeraf (@deeraf).</description>
    <link>https://dev.to/deeraf</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4232358%2F30516458-099b-4d70-a4d1-4f4cc57a1753.png</url>
      <title>DEV Community: Deeraf</title>
      <link>https://dev.to/deeraf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deeraf"/>
    <language>en</language>
    <item>
      <title>Explain Your Tech Like a Stickman: Short Explainer Videos for Devs and DevRel</title>
      <dc:creator>Deeraf</dc:creator>
      <pubDate>Sat, 07 Nov 2026 16:04:13 +0000</pubDate>
      <link>https://dev.to/deeraf/explain-your-tech-like-a-stickman-short-explainer-videos-for-devs-and-devrel-4696</link>
      <guid>https://dev.to/deeraf/explain-your-tech-like-a-stickman-short-explainer-videos-for-devs-and-devrel-4696</guid>
      <description>&lt;p&gt;Some of the best explanations of technical ideas aren't in docs. They're in a two-minute video where a stick figure mails a letter to explain how packets travel, or two characters fight over the last slice of pizza to explain a race condition.&lt;/p&gt;

&lt;p&gt;If you write docs, do developer relations, teach, or just want to share what you know, short explainer videos are worth adding to your toolkit. And the stickman style is one of the easiest ways to make them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9yjk1si10zu0iqh6c8a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb9yjk1si10zu0iqh6c8a.jpg" alt="Six frames from stickman explainer Shorts: Roman characters, a cave, a campfire, a treasury" width="800" height="230"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Real frames from AI-generated stickman Shorts. Notice how little detail each scene needs. Source: sticktale.com&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why stick figures work for technical topics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Analogies need characters.&lt;/strong&gt; Most good technical explanations are analogies: a waiter for an API, a librarian for an index, a bouncer for a firewall. A stick figure can play any of those roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less visual noise.&lt;/strong&gt; Detailed animation competes with the concept. Simple drawings leave the viewer's brain free for the idea.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast to update.&lt;/strong&gt; Tech changes. A simple style is cheap to remake when your API or best practice changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works without a face.&lt;/strong&gt; Not every developer wants to be on camera.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Topics that work well
&lt;/h2&gt;

&lt;p&gt;Concepts that involve &lt;em&gt;actors doing things&lt;/em&gt; translate best:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How DNS resolution works (someone asking for directions)&lt;/li&gt;
&lt;li&gt;Race conditions and locks (two people, one bathroom key)&lt;/li&gt;
&lt;li&gt;Caching (keeping snacks on your desk instead of walking to the kitchen)&lt;/li&gt;
&lt;li&gt;OAuth (a valet key for your car)&lt;/li&gt;
&lt;li&gt;Load balancing (a host seating guests across waiters)&lt;/li&gt;
&lt;li&gt;Public-key cryptography (a padlock anyone can close but only you can open)&lt;/li&gt;
&lt;li&gt;Git branches (parallel timelines)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Concepts that are mostly &lt;em&gt;syntax&lt;/em&gt; (how to write a for loop) are better served by screen recordings.&lt;/p&gt;

&lt;h2&gt;
  
  
  A script template for technical explainers
&lt;/h2&gt;

&lt;p&gt;This structure works for 45-second Shorts and five-minute videos alike:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hook with the pain.&lt;/strong&gt; Start with the problem, not the definition. &lt;em&gt;"Your site loads in 50 ms for you and 8 seconds for users in Sydney. Here's why."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introduce the analogy.&lt;/strong&gt; &lt;em&gt;"Imagine the internet is a postal system."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walk through the steps with the character.&lt;/strong&gt; One step per scene. Each scene should change the picture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The twist or gotcha.&lt;/strong&gt; The thing beginners get wrong. &lt;em&gt;"But the letter doesn't go straight there. It hops through a dozen post offices."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map the analogy back to the real thing.&lt;/strong&gt; Briefly name the actual technical terms (resolver, TTL, CDN) now that the viewer has a mental model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payoff.&lt;/strong&gt; Return to the opening pain and resolve it. &lt;em&gt;"That's why a CDN puts a copy of your site in Sydney."&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Accuracy still matters
&lt;/h2&gt;

&lt;p&gt;Developers love correcting videos in the comments. Before you publish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have someone who knows the topic review the script.&lt;/li&gt;
&lt;li&gt;Watch out for analogies that break in important ways, and say where they break if it matters.&lt;/li&gt;
&lt;li&gt;Link to real docs in the description for people who want depth.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where to use them
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;README and docs:&lt;/strong&gt; embed a short explainer at the top of a concept page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release notes:&lt;/strong&gt; explain a new feature's &lt;em&gt;why&lt;/em&gt; in 60 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding:&lt;/strong&gt; give new team members a series of short videos on your architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube Shorts and LinkedIn:&lt;/strong&gt; short concept videos are great for developer audiences scrolling between meetings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Making them quickly
&lt;/h2&gt;

&lt;p&gt;You can draw scenes yourself in Excalidraw and record a voiceover, which works well but takes time per video. For faster production, AI tools now handle most of the pipeline. I use &lt;a href="https://sticktale.com" rel="noopener noreferrer"&gt;StickTale&lt;/a&gt;, an AI stickman video generator: give it a question like "How does DNS work?" and it researches the topic, writes a script with this hook-to-payoff shape, draws each scene with a consistent character, and adds narration and captions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fera3a14q6cl537pj97am.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fera3a14q6cl537pj97am.jpg" alt="Four steps: ask a question, get a researched script, every scene drawn and narrated, edit export upload" width="799" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can then rewrite any line or redraw any scene before exporting, which is where your technical review comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try one
&lt;/h2&gt;

&lt;p&gt;Pick the concept you've explained most often in code reviews or Slack threads. Write the hook as the pain it causes, pick an analogy, and make a 60-second version. It'll probably get more views than the doc page it summarizes.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>learning</category>
      <category>beginners</category>
      <category>video</category>
    </item>
    <item>
      <title>From GPX File to Animated Route Video: A Practical Guide</title>
      <dc:creator>Deeraf</dc:creator>
      <pubDate>Sat, 07 Nov 2026 15:59:31 +0000</pubDate>
      <link>https://dev.to/deeraf/from-gpx-file-to-animated-route-video-a-practical-guide-p79</link>
      <guid>https://dev.to/deeraf/from-gpx-file-to-animated-route-video-a-practical-guide-p79</guid>
      <description>&lt;p&gt;If you've ever recorded a run, a bike ride, or a road trip, you have a GPX file somewhere. And if you've tried to turn it into a nice animated map for a video, a talk, or a blog post, you've probably found that raw GPS data is messier than it looks.&lt;/p&gt;

&lt;p&gt;This guide covers the data side: getting a clean, light, privacy-safe track that animates smoothly. It's useful whether you animate with code (MapLibre, deck.gl) or a dedicated tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pfq9lhza3lupj6xiakm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4pfq9lhza3lupj6xiakm.jpg" alt="Three example animated maps: a highlighted country on a globe, a road trip route through a city, and a flight path over Europe" width="798" height="145"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The goal: clean routes and regions that animate smoothly. Examples from the Mapimator showcase.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Get the GPX
&lt;/h2&gt;

&lt;p&gt;Most apps let you export a GPX file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strava:&lt;/strong&gt; open an activity, use the "..." menu, then "Export GPX".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Garmin Connect:&lt;/strong&gt; activity, gear icon, "Export to GPX".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Komoot:&lt;/strong&gt; open a tour and download it as GPX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google My Maps:&lt;/strong&gt; export a layer as KML/KMZ (you can convert it to GeoJSON, see below).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GPX is just XML: tracks (&lt;code&gt;trk&lt;/code&gt;) made of segments (&lt;code&gt;trkseg&lt;/code&gt;) made of points (&lt;code&gt;trkpt&lt;/code&gt;) with latitude, longitude, elevation, and time.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Convert to GeoJSON
&lt;/h2&gt;

&lt;p&gt;Most web mapping libraries prefer GeoJSON. Two easy options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command line with GDAL:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ogr2ogr &lt;span class="nt"&gt;-f&lt;/span&gt; GeoJSON route.geojson ride.gpx tracks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last argument is the layer name. GPX files expose &lt;code&gt;tracks&lt;/code&gt;, &lt;code&gt;track_points&lt;/code&gt;, &lt;code&gt;routes&lt;/code&gt;, and &lt;code&gt;waypoints&lt;/code&gt; layers. You usually want &lt;code&gt;tracks&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In JavaScript with &lt;code&gt;@tmcw/togeojson&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;gpx&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tmcw/togeojson&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;xml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DOMParser&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;parseFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gpxText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/xml&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;geojson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;gpx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Simplify the line
&lt;/h2&gt;

&lt;p&gt;A one-hour ride recorded every second is 3,600 points. Animating every one of them is wasteful, and GPS jitter makes the line look shaky when you zoom in.&lt;/p&gt;

&lt;p&gt;Simplification removes points that don't change the shape much:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mapshaper route.geojson &lt;span class="nt"&gt;-simplify&lt;/span&gt; 10% &lt;span class="nt"&gt;-o&lt;/span&gt; route-simple.geojson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with Turf.js:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;simplify&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@turf/simplify&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;simple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;simplify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;geojson&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;tolerance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;highQuality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tolerance is in degrees, so &lt;code&gt;0.0001&lt;/code&gt; is roughly 10 m. Start there and adjust visually. For a continent-scale flight path you can go much higher; for a hiking trail at street level, keep it low.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Remove GPS noise
&lt;/h2&gt;

&lt;p&gt;Common problems in raw tracks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spikes:&lt;/strong&gt; a single point that jumps hundreds of meters away. Filter points whose implied speed between neighbors is unrealistic for the activity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stationary clusters:&lt;/strong&gt; a cloud of points where you stopped for coffee. Simplification usually cleans these up, or you can drop consecutive points closer than a few meters apart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple segments:&lt;/strong&gt; pausing the recording creates separate &lt;code&gt;trkseg&lt;/code&gt; elements, which become a MultiLineString. Merge them if you want one continuous animated line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Trim the start and end for privacy
&lt;/h2&gt;

&lt;p&gt;This step is easy to forget. Most tracks begin and end at home. Before publishing a route anywhere, cut the first and last few hundred meters:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@turf/length&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;lineSliceAlong&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@turf/line-slice-along&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;km&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kilometers&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;trimmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lineSliceAlong&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;km&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kilometers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That removes 500 m from each end. Viewers still see the journey, without your front door.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Animate it
&lt;/h2&gt;

&lt;p&gt;Now the line is ready. Your options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code it yourself.&lt;/strong&gt; In MapLibre GL JS, the common approach is to add the line as a GeoJSON source and grow it over time by slicing it with &lt;code&gt;lineSliceAlong&lt;/code&gt; on each animation frame, while moving the camera with &lt;code&gt;map.easeTo&lt;/code&gt; or &lt;code&gt;map.flyTo&lt;/code&gt;. Recording the output as a video file is the hard part: you'll need to capture frames at a fixed time step rather than in real time, or the result will stutter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a tool.&lt;/strong&gt; If you just need the video, a dedicated map animation tool saves a lot of work. I use &lt;a href="https://mapimator.com" rel="noopener noreferrer"&gt;Mapimator&lt;/a&gt;, which runs in the browser, imports GPX, KML, and GeoJSON directly, handles camera moves and route drawing, and exports MP4 for YouTube or vertical formats for Shorts and TikTok.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsd9qjurcp2p5ij137uwa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsd9qjurcp2p5ij137uwa.jpg" alt="Feature overview: fast map animation, export to any format, 4K quality, customizable maps, fully online, AI Director" width="798" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Either way, the cleaning steps above matter: a simplified, trimmed track animates more smoothly and looks more deliberate on screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Exported GPX from your app&lt;/li&gt;
&lt;li&gt;[ ] Converted to GeoJSON (&lt;code&gt;tracks&lt;/code&gt; layer)&lt;/li&gt;
&lt;li&gt;[ ] Simplified to a sensible tolerance&lt;/li&gt;
&lt;li&gt;[ ] Removed spikes and merged segments&lt;/li&gt;
&lt;li&gt;[ ] Trimmed start and end for privacy&lt;/li&gt;
&lt;li&gt;[ ] Previewed at the zoom level you'll actually use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clean data in, nice map out.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>maps</category>
      <category>gis</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Make a Text Message Story Video That People Watch to the End</title>
      <dc:creator>Deeraf</dc:creator>
      <pubDate>Sat, 07 Nov 2026 15:58:31 +0000</pubDate>
      <link>https://dev.to/deeraf/how-to-make-a-text-message-story-video-that-people-watch-to-the-end-1fd9</link>
      <guid>https://dev.to/deeraf/how-to-make-a-text-message-story-video-that-people-watch-to-the-end-1fd9</guid>
      <description>&lt;p&gt;Scroll TikTok, Reels, or YouTube Shorts for five minutes and you'll hit one: a phone screen, a chat thread, and messages popping in one by one while you wait to see how it ends. Text message story videos are one of the most reliable faceless formats on short-form video. They need no camera, no actors, and no editing skills, and the best ones keep viewers watching to the last second.&lt;/p&gt;

&lt;p&gt;Making one that &lt;em&gt;works&lt;/em&gt;, though, is mostly about writing and pacing. Here's the full process, from premise to export.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with a premise that fits in one sentence
&lt;/h2&gt;

&lt;p&gt;The best chat stories can be pitched in a single line, and that line usually holds tension or a reveal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"A guy texts his ex by accident, and her new boyfriend replies."&lt;/li&gt;
&lt;li&gt;"A mom joins the family group chat and immediately exposes everyone."&lt;/li&gt;
&lt;li&gt;"Someone gets a text from their own number."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can't say what's at stake in one sentence, the viewer won't feel it in the first three seconds either.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Write the hook as the very first message
&lt;/h2&gt;

&lt;p&gt;There's no intro in a chat video. The opening bubble &lt;em&gt;is&lt;/em&gt; the hook, so make it something no one could scroll past:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Unknown:&lt;/strong&gt; don't open the door&lt;br&gt;
&lt;strong&gt;Unknown:&lt;/strong&gt; I'm serious. whoever's knocking isn't me&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Skip greetings, "hey"s, and small talk. Start in the middle of the situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Keep messages short and the rhythm uneven
&lt;/h2&gt;

&lt;p&gt;Real texting is bursty, and that rhythm is what makes these videos feel alive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One thought per bubble.&lt;/strong&gt; Split long messages into two or three quick ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vary the pacing.&lt;/strong&gt; Rapid-fire exchanges during arguments, a long pause before a big reveal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the typing indicator.&lt;/strong&gt; Three dots that appear, vanish, and come back create suspense better than any line of text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leave things unsaid.&lt;/strong&gt; "…" or a read receipt with no reply often hits harder than a paragraph.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Build to a twist, then end fast
&lt;/h2&gt;

&lt;p&gt;Most successful chat stories follow a simple arc: hook, escalation, twist, punchline. Once the twist lands, end the video within a message or two. Lingering after the payoff is where viewers swipe away, and an abrupt ending also encourages rewatches, which the algorithms reward.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Make it look like a real phone
&lt;/h2&gt;

&lt;p&gt;Viewers stay immersed when the chat looks like the app they use every day. Pay attention to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The right platform style:&lt;/strong&gt; iMessage blue and grey bubbles, WhatsApp green with ticks, or Instagram DMs, in light or dark mode to match the mood.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact names and profile pictures&lt;/strong&gt; that fit the characters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realistic details:&lt;/strong&gt; read receipts, timestamps, emoji reactions, quoted replies, voice notes, and photo messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group chats&lt;/strong&gt; with named members for chaotic, multi-character stories.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2jragbwx22jk93gigc7a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2jragbwx22jk93gigc7a.jpg" alt="The same chat style options shown as iMessage, WhatsApp and Instagram DM exports" width="800" height="528"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Platform-faithful iMessage, WhatsApp and Instagram DM styles. Source: chatimator.com&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Add sound and a typing keyboard
&lt;/h2&gt;

&lt;p&gt;Sound does a lot of quiet work. Message send and receive pings give each bubble a beat, and a keyboard typing out outgoing messages, typos and all, makes the viewer feel like they're holding the phone. Add a low background track for mood, and keep it quiet enough that the pings stay crisp.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Export for each platform
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TikTok, Reels, Shorts:&lt;/strong&gt; 9:16 vertical at 1080p. Keep the chat in the center so platform buttons and captions don't cover it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube long-form compilations:&lt;/strong&gt; 16:9 with a background behind the phone frame.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Length:&lt;/strong&gt; 30 to 60 seconds is the sweet spot for most text stories. Longer only works if the tension keeps rising.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Tools to speed it up
&lt;/h2&gt;

&lt;p&gt;You can build chat videos by screen-recording a real phone, but that's slow to edit and risky if a real notification pops up. Video editors like CapCut can fake it with templates, but timing every bubble by hand gets tedious. A dedicated tool is much faster. I use &lt;a href="https://chatimator.com" rel="noopener noreferrer"&gt;Chatimator, a fake text message video maker&lt;/a&gt; that runs in the browser. You write the conversation (or have AI draft a script from a one-line premise and edit it), choose iMessage, WhatsApp, or Instagram styling, add typing and sounds, and export an MP4 ready for upload.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F66n7qmjr3iln7gcii2s9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F66n7qmjr3iln7gcii2s9.jpg" alt="A chat video editor with the conversation script on the right and a live phone preview in the middle" width="800" height="484"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Writing a chat script with a live preview in Chatimator&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Label it as fiction
&lt;/h2&gt;

&lt;p&gt;Text stories work best as clearly fictional entertainment. Say "story" or "fiction" in the caption or description, use invented names, and never use fake chats to impersonate real people, spread rumors, or mislead anyone. Platforms crack down on deceptive content, and audiences are happy to enjoy a good story without believing it happened.&lt;/p&gt;

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

&lt;p&gt;A great text story video comes down to a one-line premise, a hook in the first bubble, uneven pacing with plenty of suspense, a twist, and a fast ending. Get those right, make the phone look real, and you have a format you can publish daily without ever showing your face.&lt;/p&gt;

</description>
      <category>video</category>
      <category>tiktok</category>
      <category>youtube</category>
      <category>contentcreation</category>
    </item>
  </channel>
</rss>
