<?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: Mohamed Ait lahsen</title>
    <description>The latest articles on DEV Community by Mohamed Ait lahsen (@mohamed_aitlahsen_b8689e).</description>
    <link>https://dev.to/mohamed_aitlahsen_b8689e</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%2F2897760%2F7ce13eb7-7767-4fe2-af9c-4f0eade753e8.png</url>
      <title>DEV Community: Mohamed Ait lahsen</title>
      <link>https://dev.to/mohamed_aitlahsen_b8689e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohamed_aitlahsen_b8689e"/>
    <language>en</language>
    <item>
      <title>How We Built NovaTik: A Modern TikTok Downloader for the Web</title>
      <dc:creator>Mohamed Ait lahsen</dc:creator>
      <pubDate>Wed, 02 Sep 2026 17:53:24 +0000</pubDate>
      <link>https://dev.to/mohamed_aitlahsen_b8689e/how-we-built-novatik-a-modern-tiktok-downloader-for-the-web-5hla</link>
      <guid>https://dev.to/mohamed_aitlahsen_b8689e/how-we-built-novatik-a-modern-tiktok-downloader-for-the-web-5hla</guid>
      <description>&lt;p&gt;"How We Built NovaTik: A Modern TikTok Downloader for the Web"&lt;br&gt;
published: true&lt;br&gt;
description: "A look at the technologies, architecture, and engineering decisions behind building NovaTik, a modern browser-based TikTok downloader."&lt;/p&gt;

&lt;h2&gt;
  
  
  tags: webdev, nextjs, typescript, javascript
&lt;/h2&gt;

&lt;h1&gt;
  
  
  How We Built NovaTik: A Modern TikTok Downloader for the Web
&lt;/h1&gt;

&lt;p&gt;Building a small web tool can look simple from the outside.&lt;/p&gt;

&lt;p&gt;Paste a URL. Click a button. Download a file.&lt;/p&gt;

&lt;p&gt;But once you start building a real-world application around third-party platforms, things become much more interesting.&lt;/p&gt;

&lt;p&gt;That's what happened while building &lt;strong&gt;NovaTik&lt;/strong&gt;, a browser-based TikTok downloader designed to make saving TikTok content simple without requiring users to install additional software.&lt;/p&gt;

&lt;p&gt;You can try the finished product at &lt;a href="https://novatik.app" rel="noopener noreferrer"&gt;novatik.app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article, I'll share some of the engineering decisions behind the project and what we learned while building it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea behind NovaTik
&lt;/h2&gt;

&lt;p&gt;The basic concept is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A user copies a TikTok URL.&lt;/li&gt;
&lt;li&gt;They paste it into NovaTik.&lt;/li&gt;
&lt;li&gt;The backend processes the URL.&lt;/li&gt;
&lt;li&gt;Available media information is returned.&lt;/li&gt;
&lt;li&gt;The user chooses an option and downloads the result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The challenge is making those steps reliable across different browsers, devices, URLs, formats, and languages.&lt;/p&gt;

&lt;p&gt;The goal was to keep the user experience as simple as possible while keeping the architecture flexible enough to evolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The technology stack
&lt;/h2&gt;

&lt;p&gt;NovaTik uses a modern JavaScript/TypeScript stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;The frontend is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next.js gives us the routing, rendering, metadata, and frontend infrastructure needed for a multilingual application.&lt;/p&gt;

&lt;p&gt;TypeScript is particularly useful for a project like this because there are several different data structures involved in processing media and communicating with the backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;The backend uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;yt-dlp&lt;/li&gt;
&lt;li&gt;FFmpeg&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The backend is responsible for processing download requests rather than putting the heavy work directly in the browser.&lt;/p&gt;

&lt;p&gt;This separation also makes it easier to improve the frontend independently from the media-processing layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why yt-dlp?
&lt;/h2&gt;

&lt;p&gt;One of the interesting engineering challenges is extracting media information from external platforms.&lt;/p&gt;

&lt;p&gt;Instead of trying to implement every extraction mechanism ourselves, NovaTik uses &lt;strong&gt;yt-dlp&lt;/strong&gt; as part of the backend processing pipeline.&lt;/p&gt;

&lt;p&gt;This gives the project a mature extraction layer while allowing us to build our own API and user experience around it.&lt;/p&gt;

&lt;p&gt;However, using an external extraction tool also means that the application needs to be prepared for changes.&lt;/p&gt;

&lt;p&gt;Third-party platforms can change their page structure, APIs, delivery mechanisms, or media URLs.&lt;/p&gt;

&lt;p&gt;That means a downloader is never really a "build it once and forget it" project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling media formats
&lt;/h2&gt;

&lt;p&gt;Another challenge is deciding which media format to return to the user.&lt;/p&gt;

&lt;p&gt;A video can have multiple available representations, including different resolutions and streams.&lt;/p&gt;

&lt;p&gt;Instead of blindly selecting the first available format, the backend evaluates the available information and chooses an appropriate option.&lt;/p&gt;

&lt;p&gt;For example, the application can distinguish between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard-definition video&lt;/li&gt;
&lt;li&gt;Higher-quality video&lt;/li&gt;
&lt;li&gt;Audio&lt;/li&gt;
&lt;li&gt;Other available media representations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This becomes especially important when the goal is to provide a predictable user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the frontend simple
&lt;/h2&gt;

&lt;p&gt;One of the biggest lessons from the project is that a technically complex backend does not mean the UI should be complex.&lt;/p&gt;

&lt;p&gt;The main interaction should remain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paste → Process → Choose → Download&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;A user shouldn't need to understand codecs, streams, containers, or server-side processing.&lt;/p&gt;

&lt;p&gt;The frontend hides that complexity and presents the result in a simple interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building for multiple languages
&lt;/h2&gt;

&lt;p&gt;NovaTik was also designed as a multilingual application.&lt;/p&gt;

&lt;p&gt;The project currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;English&lt;/li&gt;
&lt;li&gt;French&lt;/li&gt;
&lt;li&gt;Spanish&lt;/li&gt;
&lt;li&gt;Portuguese&lt;/li&gt;
&lt;li&gt;Arabic&lt;/li&gt;
&lt;li&gt;Indonesian&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This introduced another interesting engineering problem.&lt;/p&gt;

&lt;p&gt;Internationalization isn't just translating buttons.&lt;/p&gt;

&lt;p&gt;URLs, metadata, navigation, structured data, language alternatives, and page content all need to work together.&lt;/p&gt;

&lt;p&gt;For example, a tool page should remain understandable and discoverable regardless of which language version a visitor uses.&lt;/p&gt;

&lt;p&gt;Arabic also introduced RTL layout considerations that don't exist in the same way for left-to-right languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO is part of the architecture
&lt;/h2&gt;

&lt;p&gt;For a public web application, SEO cannot be treated as something added after development.&lt;/p&gt;

&lt;p&gt;The frontend needs to generate useful metadata, canonical URLs, language alternatives, structured data, sitemap entries, and crawlable pages.&lt;/p&gt;

&lt;p&gt;For NovaTik, this means the technical architecture and SEO architecture are closely connected.&lt;/p&gt;

&lt;p&gt;A page that looks great but cannot be properly discovered, crawled, understood, or indexed is still a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned
&lt;/h2&gt;

&lt;p&gt;Building NovaTik has reinforced a few lessons that apply to many web projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Simple products can have complicated infrastructure
&lt;/h3&gt;

&lt;p&gt;A simple interface can hide a surprising amount of backend work.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Third-party dependencies require maintenance
&lt;/h3&gt;

&lt;p&gt;When your product depends on an external platform, you need to expect changes and build your system so those changes can be handled quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. TypeScript pays off
&lt;/h3&gt;

&lt;p&gt;Strong typing becomes increasingly valuable as the number of API responses, media formats, locales, and components grows.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. UX should hide technical complexity
&lt;/h3&gt;

&lt;p&gt;Users care about accomplishing their task, not about how the backend processes a media URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. SEO should be considered early
&lt;/h3&gt;

&lt;p&gt;Routing, metadata, internationalization, internal linking, and crawlability are much easier to handle correctly when they're considered during development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next for NovaTik?
&lt;/h2&gt;

&lt;p&gt;NovaTik is still evolving.&lt;/p&gt;

&lt;p&gt;We're continuing to improve the downloader, the user experience, multilingual support, performance, and the overall creator workflow.&lt;/p&gt;

&lt;p&gt;The long-term goal is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build useful tools for people who work with short-form content, while keeping the experience fast and straightforward.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you'd like to try the project, you can visit &lt;strong&gt;&lt;a href="https://novatik.app" rel="noopener noreferrer"&gt;NovaTik&lt;/a&gt;&lt;/strong&gt;.&lt;br&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%2Fyr7v0m6pfnd7ql5utu9e.png" 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%2Fyr7v0m6pfnd7ql5utu9e.png" alt=" " width="799" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading — and if you're building a web tool of your own, I'd love to hear what you're working on.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title># Building NovaTik: The Problems I Didn't Expect

I started building **NovaTik**, a simple TikTok video downloader, thinking it would be a relatively easy project.

It wasn't. 😂

The basic idea is simple:

```text
TikTok URL Backend Process Video Do</title>
      <dc:creator>Mohamed Ait lahsen</dc:creator>
      <pubDate>Sun, 30 Aug 2026 17:30:48 +0000</pubDate>
      <link>https://dev.to/mohamed_aitlahsen_b8689e/-building-novatik-the-problems-i-didnt-expect-i-started-building-novatik-a-simple-tiktok-59na</link>
      <guid>https://dev.to/mohamed_aitlahsen_b8689e/-building-novatik-the-problems-i-didnt-expect-i-started-building-novatik-a-simple-tiktok-59na</guid>
      <description></description>
      <category>backend</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
