npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ft-to-inv

v2.1.0

Published

Converts FreeTube data to Invidious format and syncs with the Invidious API.

Downloads

623

Readme

ft-to-inv

Takes FreeTube data and exports it to invidious-import.json, where it can be optionally imported to Invidious via the API. You can also schedule runs via the --cron flag, see below.

Demo

Why?

"FreeTube is great for local use, but it doesn’t sync across devices. Invidious does. This tool bridges the gap so your history, subscriptions, and playlists stay consistent." - albert einstein i think

Warnings:

  • wsl isnt supported right now, if you want to run on windows, use cmd, powershell, or windows terminal. Wsl has issues with keytar and system keychains.
  • also its ur fault if my tool eats your files or something like that. you should back them up next time instead of blaming my hungry tool or me.
  • and i dont have a mac so pls report any macos issues if you have one (tested on windows 11 and ubuntu noble)

Installation

# npm
npm i -g ft-to-inv 

# yarn
yarn global add ft-to-inv 

# pnpm
pnpm add -g ft-to-inv

Or Import (still in testing)

ESM:

import main from "ft-to-inv";
// overrides here
await main({
  token: "abc123",
 // etc...
  })

CommonJS:

const main = require("ft-to-inv");
// overrides here
await main({
  token: "abc123",
 // etc...
  })

Quick Start

After installing, run the package to begin syncing

ft-to-inv # its really that simple!

Highlights

  • Automatically detects your FreeTube data directory
  • Supported anywhere you can run Node.js (Windows, Linux, MacOS)
  • Optionally contacts the Invidious API to sync your data
  • Can be scheduled to run on a cron schedule
  • Supports environment variables, CLI args, and a config file
  • Dry run mode to check for errors without making changes
  • Retries with exponential backoff
  • Encrypted token storage
  • some other stuff install it to find out

Why should I give you my Invidious token?

Your Invidious token is only used to authenticate with the Invidious API. It is optional to use the API, you can run in no-sync mode to generate the invidious-import.json file without contacting the API. If you do give me the token, it's encrypted at rest using your system keychain via the keytar package. The encryption is done using a passphrase that you provide, which is stored securely in your system keychain. The passphrase is only used to encrypt and decrypt the token. The default passphrase is "ilikewaffles" + 8 random hex characters. If you want to change the passphrase, you can delete it from your keychain and the tool will prompt you again.

Config

There's a config file that you can use to further change the program. The config is read after environment variables and CLI arguments, here's the order: cli args > environment variables > config. The config is a simple jsonc file, here's an excerpt:

{
  "token":"abc123",
  // make sure to include the protocol (http or https) and no trailing slash
  "instance":"http://localhost:3000",
  "verbose": true,
  "dont_shorten_paths": false
}

If you need help with any of the config options, there's comments in the config file, and there's a help menu. If there's anything else, please open an issue on the repo.

Usage with args

npx ft-to-inv -t abc123 -i localhost:3000 

Environment Variables

This tool also supports using environment variables to control the config! Every variable has only a few possible aliases. Here's an example for token.

FT_TO_INV_TOKEN
FT_TO_INV_CONFIG_TOKEN
TOKEN

Most other flags have those 3 prefixes. Here's the full list of config options:

CLI Arguments

| Argument | Aliases | Explanation | Usage | | ------- | -------- | ------- | ----- | | --token| -t | Your Invidious SID token. This is required unless using no-sync or dry-run. You can get it by going to your instance > Settings/Preferences > Manage Tokens. | -t abc123 | |--instance| -i | Your Invidious instance. Required unless you have no-sync or dry-run enabled. | -i https://invidious.example.com | |--freetube-dir| -dir, -cd, -f| Path to the FreeTube data directory. Defaults to a certain path based on which OS you have. On Windows, it's yourUser\AppData\Roaming\FreeTube. On Linux, it's yourUsersHome/.config/FreeTube/. On MacOS, it defaults to you/Library/Application Support/FreeTube/. If it's not there you need to specify where it is with this flag.| -dir ./ | | --export-dir | -e | Where export files should be saved. The default is wherever the command is being run from (./). Exports 2 files, 3 if there are playlists, invidious-import.json, import.old.json, and playlist-import.json. invidious-import.json is for you to import into invidious (if there's no API), import.old.json is a copy of invidious-import.json used for tracking diffs, and playlist-import.json is used for importing playlists specifically into Invidious as there's no API endpoint. | -e .\ | | --verbose | -v | Enables more verbose logging (WIP!). Useful for debugging or seeing how it works| -v | | --dry-run | none | Dry Run mode is useful for checking if you have correct files. It only reads the FreeTube files, checks what it would sync, then exits | --dry-run | | --quiet | -q | Enables less verbose logging, suppresses all non-error messages. | -q | | --no-sync | none | No-sync mode generates an invidious-import.json file but does not contact the Invidious API. Useful for cases where the API is disabled or where you don't feel comfortable pasting your Invidious token. | --no-sync | | --dont-shorten-paths | none | Disables path shortening, by default your export and FreeTube data directories are replaced with <ExportDir> and <FreeTubeDir>| --dont-shorten-paths | | --dont-run-first-time-setup | -drs, --dont-run-setup| Skip the first time setup prompts and get straight to syncing. Useful for automated runs. | -drs | | --run-first-time-setup | -fts, --first-time-setup | Runs the first time setup even if all the files are detected. Useful if there are malformed or corrupt entries, or something changed. | -fts | | --insecure | --http | Tells the script to run in HTTP mode, rather than HTTPS. This is automatically set based on the protocol entered in --instance | --insecure | | --cron-schedule | --cron, -cron | Allows you to schedule a run on a cron schedule. If not used with an = or quotes, it checks the next 4-5 args | --cron 0 * * * * | | --config | -c | Path to the config file. | -c config.example.jsonc | --help | -h, -?, /? | Displays a help message that is only slightly better than this README | -h | | --logs | -l | Specifies whether to log console output to a file. The only name for this is ft-to-inv-(time).log | -l |

Contributing

This repo follows the standard approach to contributing, just make a fork of the repo and submit a PR.

License

MIT