Naptrack 1.0.4

dotnet tool install --global Naptrack --version 1.0.4
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local Naptrack --version 1.0.4
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=Naptrack&version=1.0.4
                    
nuke :add-package Naptrack --version 1.0.4
                    

<p align="center">

███╗   ██╗ █████╗ ██████╗ ████████╗██████╗  █████╗  ██████╗██╗  ██╗
████╗  ██║██╔══██╗██╔══██╗╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██║ ██╔╝
██╔██╗ ██║███████║██████╔╝   ██║   ██████╔╝███████║██║     █████╔╝
██║╚██╗██║██╔══██║██╔═══╝    ██║   ██╔══██╗██╔══██║██║     ██╔═██╗
██║ ╚████║██║  ██║██║        ██║   ██║  ██║██║  ██║╚██████╗██║  ██╗
╚═╝  ╚═══╝╚═╝  ╚═╝╚═╝        ╚═╝   ╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝╚═╝  ╚═╝

NuGet License: MIT .NET 10 Platform Made with

</p>

Grab audio and video from the web. Built originally to get lofi tracks offline for coding sessions.

Paste a link, pick MP3 or MP4, hit Download. That's it.

<p align="center"> <img src="assets/Naptrack.gif" alt="Naptrack Demo" width="700" /> </p>

Built with .NET 10 and RazorConsole.

Features

  • Download audio (MP3) or video (MP4) from YouTube, TikTok, Instagram, Facebook, and 1000+ sites
  • MP3/MP4 format toggle
  • Auto-downloads yt-dlp and ffmpeg on first run (no manual setup)
  • Keeps yt-dlp up to date automatically, so sites do not start refusing downloads as it ages
  • Native folder picker to change download location
  • Cross-platform: Windows, Linux, macOS
  • Keyboard-driven TUI with animated spinners

Installation

Option 1: .NET Tool (requires .NET 10 SDK)

dotnet tool install -g Naptrack

Then run from anywhere:

naptrack

Option 2: Standalone Binary (no dependencies)

Download the latest release for your platform from Releases. No .NET installation needed.

Or build it yourself:

# Windows
dotnet publish -r win-x64

# Linux
dotnet publish -r linux-x64

# macOS Intel
dotnet publish -r osx-x64

# macOS Apple Silicon
dotnet publish -r osx-arm64

The output is a single executable in bin/Release/net10.0/<runtime>/publish/.

Usage

  1. Launch naptrack
  2. Paste a URL (YouTube, TikTok, Instagram, Facebook, etc.)
  3. Select MP3 or MP4
  4. Press Enter or Tab to [ Download ] and press Enter
  5. File downloads to your configured folder

Keyboard Shortcuts

Key Action
Tab Navigate between elements
Enter Select / confirm
Esc Clear input and errors
Ctrl+V Paste (Windows)
Cmd+V Paste (macOS)
Ctrl+Shift+V Paste (Linux)
Ctrl+C Quit

Configuration

  • Download folder: Click the folder path or use [ Change ] to open a folder picker
  • The URL box empties as soon as a download is accepted, so it is ready for the next link. The link is not lost — press to bring it back from history if a download needs another go.
  • Settings are saved to:
    • Windows: %APPDATA%\Naptrack\config.json
    • Linux: ~/.config/Naptrack/config.json
    • macOS: ~/Library/Application Support/Naptrack/config.json

Dependencies

Naptrack automatically downloads these on first run if not found:

  • yt-dlp — media extraction from 1000+ sites
  • ffmpeg — audio/video format conversion

They live alongside your settings, in bin/ next to config.json.

Keeping yt-dlp current

yt-dlp is the part of Naptrack that goes out of date. Sites change what they accept on no schedule, and an old build fails in a way that looks like being blocked: the video is found and its formats are listed, then the download itself comes back HTTP Error 403.

So Naptrack tracks yt-dlp's nightly channel — the same code that becomes the next stable release, published as it lands — and checks for a newer build at most once a day, updating in the background while it starts. If you are offline, rate limited, or already current, nothing happens and nothing is said.

The version in use is shown in the app. It turns yellow once the build is more than two weeks old, and [ Update yt-dlp ] next to it fetches the newest build immediately. That button is what the "Access denied" message is pointing you at.

If you already have yt-dlp installed through pip, Homebrew or a package manager, Naptrack uses it and leaves it alone — updating someone else's install is not its business. The exception is a system copy that has gone stale: rather than leave you with downloads that cannot succeed, Naptrack installs its own up-to-date copy and uses that instead. Yours is left untouched.

JavaScript runtime (optional)

YouTube's player challenges are JavaScript, and yt-dlp now warns that extracting without an engine to run them is deprecated and may drop some formats. yt-dlp finds Deno by itself; Naptrack additionally detects Node or Bun and points yt-dlp at whichever it finds. None of them are required, and installing one is not a fix for being blocked — it affects which formats are available, not whether the download is allowed.

License

MIT

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
1.0.4 90 8/19/2026
1.0.3 109 8/14/2026
1.0.2 94 8/12/2026
1.0.1 152 4/10/2026
1.0.0 119 4/10/2026

v1.0.4 - Fixes downloads failing with "Access denied" or what looked like being blocked. yt-dlp was fetched once on first run and never updated, so every install eventually fell far enough behind the sites it talks to that the media request came back 403 with no way to fix it from inside the app. yt-dlp now tracks the nightly channel, is checked once a day and updated automatically, and its version is shown in the app with a button to update it on demand. A stale system-installed yt-dlp is replaced with a managed copy. Node or Bun is used as a JavaScript runtime for YouTube when available. Interrupted updates can no longer leave a truncated binary behind.