Extras - https://stackoverflow.com/questions/36022926/what-do-the-save-flags-do-with-npm-install `npm i --save` and `npm i ` are same now and they also update dependencies of package too. to not update dependencies of package use `npm i --no-save` - nvm(Node version manager) `curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash`   `nvm ls-remote` : for getting list of available versions which can be downloaded `nvm list` : for getting list of downloaded versions of node `nvm install 14.0.0` : for downloading and installing version 14.0.0 `nvm use 14.0.0` : switching to version 14.0.0 `nvm use system`: switching to version when nodejs first installed `nvm alias default 18.0`: this will make 18 as default - https://github.com/ishtms/learn-nodejs-hard-way (without installing other frameworks) - https://youtu.be/Nh-252u80F4 : get wifi password - Running nodejs in background https://sentrytwo.com/92df06609b - To avoid running sudo Why You Should Never Run "sudo npm"... https://www.youtube.com/watch?v=aFrR56sqC_A - **pm2** PM2 is a production process manager for Node.js applications with a built-in load balancer. It allows you to keep applications alive forever, to reload them without downtime and to facilitate common system admin tasks. install this npm package globally or locally. `npm i -g pm2` Using this we can start multiple node instances with single command. But first starting node application instances in background `pm2 start app.js --name app1` same as `node app.js` but in background to stop node instance use `pm2 stop app1` multiple node instance in file `ecosystem.config.js` ```js module.exports = { apps: [ { name: 'main', script: 'index.js', watch: true, env: { NODE_ENV: 'production', PORT: 8081 } }, { name: 'ytdownloadspace', script: '../ytDownloadSpace/app.js', watch: true, env: { NODE_ENV: 'production', PORT: 8080 } }, { name: 'ytdlApi', script: '../ytdlApi/app.js', watch: true, env: { NODE_ENV: 'production', PORT: 8083 } } ] }; ``` and fiannly when use `pm2 start ecosystem-config.js`. To stop all these started with this file use `pm2 stop ecosystem-config.js` To list processes use `pm2 list` - installing packages through repo link `npm i https://github.com/expressjs/express` https://www.pluralsight.com/resources/blog/guides/install-npm-packages-from-gitgithub   - download a file with https and fs module ```js const https = require("https"); // Use 'http' for non-HTTPS links const fs = require("fs"); const fileUrl = "https://cdn.discordapp.com/attachments/1473231612341915668/1473231989501853819/packages_sorted2.txt?ex=699575b5&is=69942435&hm=66884969a27901525409ff1e5400619ea5305667a130476b7982e041c55297e8&"; // Replace with your file URL const destinationPath = "./downloaded-file.txt"; // Replace with desired local path and filename const file = fs.createWriteStream(destinationPath); https .get(fileUrl, (response) => { // Check if the request was successful (status code 200) if (response.statusCode !== 200) { console.error(`Download failed, status code: ${response.statusCode}`); file.close(); // Close the write stream fs.unlink(destinationPath, () => {}); // Delete the partial file return; } // Pipe the response stream to the file stream response.pipe(file); // Event listener for when the download is complete file.on("finish", () => { file.close(); console.log("Download Completed!"); }); }) .on("error", (err) => { // Handle network errors fs.unlink(destinationPath, () => {}); // Delete the partial file on error console.error("Error during download:", err.message); }); ```   tips 1. to prevent adding of installed packages in package.json use `--no-save` flag when installing packages. eg: `npm i --no-save sqlite3`     better-sqlite guide https://www.w3resource.com/sqlite/snippets/better-sqlite3.php [Comprehensive Guide to Better-SQLite3 (16_5_2026 5:48:16 am).html](../../../_resources/Comprehensive%20Guide%20to%20Better-SQLite3%20%2816_5_2026%205.html) for parameterized query, string concatenation using `||` ```js selectQuery = `select * from ${songDataTableEnums.tablename} where ${songDataTableEnums.columns.songname} like ? || '%' or ${songDataTableEnums.columns.songname} like '% '|| ? || '%' or ${songDataTableEnums.columns.artist_name} like ? || '%' or ${songDataTableEnums.columns.artist_name} like '% '|| ? || '%'`; ```   generate thumbnails of video ```js const ffmpeg = require('fluent-ffmpeg'); ffmpeg('path/to/video.mp4') .screenshots({ count: 1, timemarks: ['00:00:02'], // Capture at 2 seconds filename: 'thumbnail.png', folder: 'output/path/' }); ``` or ```js ffmpeg('input.mp4') .screenshots({ count: 3, // Number of screenshots to take timestamps: ['10%', '30sec', 60], // Locations: percentages, strings, or numbers (seconds) filename: 'thumbnail-at-%s-seconds.png', // %s inserts the timestamp folder: './output', // Destination directory size: '320x240' // Rescales output width x height }) .on('end', () => { console.log('Screenshots taken successfully!'); }) .on('error', (err) => { console.error('An error occurred: ' + err.message); }); ``` * count: Total number of images to generate. If timestamps is not provided, it automatically distributes screenshots evenly across the video duration. * timestamps: An array specifying exact positions to snapshot. * Numbers represent absolute seconds (e.g., 15). * Strings format time as HH:MM:SS.milli or specific counts (e.g., '00:01:20'). * Percentages evaluate relative to video length (e.g., '50%'). * folder: Path to the directory where files will save. * filename: Format for file naming. Use %s to interpolate the specific frame's timestamp or %i for the index sequence.