diff --git a/README.md b/README.md
index 6abb0ec4d2f0b927ef14f8077cbe58dbfe4652bc..cd768f4f34df10f91d42042d9b5d64d8add67e73 100644
--- a/README.md
+++ b/README.md
@@ -46,21 +46,21 @@ NoshX is a simple, customizable command-line shell designed for UNIX-like system
 
 1. **Clone the repositiory**
 ```bash
-git clone https://git.gvk.idi.ntnu.no/ZsomborSzaboAntalovszky/nosh.git
-cd nosh
+git clone https://git.gvk.idi.ntnu.no/ZsomborSzaboAntalovszky/noemi-shell-x.git
+cd noemi-shell-x
 ```
 2. **Build the Shell**
 
 ```bash
-g++ -o nosh.exe nosh.cpp
+g++ noshx -o noshx.cpp
 ```
 Assuming you have `g++` installed.
 
-This will create an executable called `nosh`.
+This will create an executable called `noshx`.
 
 **Run the Shell**
 
-Once the build completes successfully, run `nosh`.
+Once the build completes successfully, run `./noshx`.
 
 ## Contributing
 
@@ -83,7 +83,7 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
 
 1. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 
-2. Any modified version of this Software, or any software derived from this Software, **must include a name distinct from the original project name ("Nosh")** to avoid confusion with the original project.
+2. Any modified version of this Software, or any software derived from this Software, **must include a name distinct from the original project name ("NoshX")** to avoid confusion with the original project.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 ````
diff --git a/noshx.cpp b/noshx.cpp
index ac87a5ce52ac89dec59ac2cbd417fa4e9feb3964..900869c32950ec9748ad8c512ba754b839a97b7e 100644
--- a/noshx.cpp
+++ b/noshx.cpp
@@ -30,14 +30,11 @@
  * 
  *  CHANGELOG
  * 
- *  Noémi Shell X ver. 0.2.1
+ *  Noémi Shell X ver. 0.3
  *
- *  This version is using a much cleaner way to draw the heart shape at the Noemi function,
- *  by using for loops instad of manual measurments. This version also made the prompt even 
- *  more unix like, by displaying '~' when at home instead of 'home' as well as using the 
- *  '$' instad of the '>' character. I also added a sweet function. If you use the 'now'
- *  command on may 21st (Noémi's birthday), a yellow, bold, highlighted 
- *  text will say: 'Happy birthday, Noemi!'
+ *  This version introduces the 'snatch' command which can be used quite like 'apt install'. It can download commands via download links.
+ *  From this version, the commands 'noemi' and 'noemi -l' are no longer included in this code, but can be installed by running 'snatch noemi'.
+ *  This MIGHT change in the future, but for now, it is what it is.
  */
 
 
@@ -52,7 +49,8 @@
 #include <cstdlib> 
 #include <limits.h>
 #include <cmath>
-
+#include <curl/curl.h>
+#include "snatch.h"
 
 const char VERSION[] = "0.2.1"; ///< Change version number here for the entire code
 
@@ -68,10 +66,10 @@ namespace fs = std::filesystem;
 // Declaring functions
 void handle_pwd(const vector<string>& args);
 bool is_builtin_command(const vector<string>& args);
-void handle_noemi(const vector<string>& args);
 void handle_storage(const vector<string>& args);
 void handle_now(const vector<string>& args);
 void handle_cd(const vector<string>& args);
+void handle_snatch(const vector<string>& args);
 
 // To be implemented commands:
 
@@ -168,6 +166,30 @@ int main() {
     return 0; // Terminate program with success
 }
 
+/**
+ *  Downloads available commands that do not come preinstalled with NoshX
+ * 
+ *  @param args for arguments
+ */
+
+void handle_snatch(const vector<string>& args){
+    if (args[1] == "noemi"){
+        string url = "https://dl.dropboxusercontent.com/scl/fi/57vw2d5jozsabnqy9jorh/noemi?rlkey=k21ir92qhilt6qup8t88juc7k&st=nry1l85t&dl=1";
+        string output_filename = "noemi";
+
+        if (download_file(url, output_filename)) {
+            system("chmod +x noemi");
+            cout << "snatch: download completed successfully.\n";
+        } else {
+            cout << "snatch: download failed.\n";
+        }
+    }
+    else{
+        cout << "snatch: unrecognized argument\n";
+    }
+}
+
+
 void handle_help(const vector<string>& args){
     
     if (args.size() < 1){
@@ -271,6 +293,21 @@ bool is_builtin_command(const vector<string>& args){
         return true;
     }
 
+    if (args[0] == "snatch"){
+        if (args.size() > 2){
+            cout << "snatch: too many arguments\n";
+            return true;
+        }
+        
+        if (args.size() == 1){
+            cout << "usage: snatch <package_name>\n";
+            return true;
+        }
+
+        handle_snatch(args);
+        return true;
+    }
+
     if (args[0] == "about") {
         
         if (args.size() > 2){
@@ -329,8 +366,20 @@ bool is_builtin_command(const vector<string>& args){
 
     if (args[0] == "noemi"){
       
-        handle_noemi(args);
+        if (!fs::exists("noemi")) {
+            cout << "noshx: command 'noemi' is not available, but can be installed with snatch" << endl;
+            cout << "Try 'snatch noemi'" << endl;
+            return true; // Exit early
+        }
+        
+        string command = "./noemi";
+        if (args.size() == 2) {
+            command += " " + args[1];
+        }
+        
+        system(command.c_str());
         return true;
+               
     }
 
     if (args[0] == "cd"){
@@ -391,47 +440,6 @@ bool is_builtin_command(const vector<string>& args){
     return false; // Return false if given command does not exist
 }
 
-/**
- *  Though the name sounds dirty, this is a very lovely function that draws a heart out of '#' characters.
- *  every time the user enters the command 'noemi'
- * 
- *  @param args for arguments
- *  @param time for adjusting smoothness of draw
- */
-
-void handle_noemi(const vector<string>& args){
-
-    if (args.size() > 2){
-        cout << "Usage: noemi <optional_delay_argument>\n";
-        return; // Exit early
-    }
-
-    float time = 0.1; // Default: 0.5 seconds (short)
-
-    if (args.size() == 2) {
-        const string option = args[1];
-
-        if (option == "-l") {
-            time = 1.0; // Long delay
-        } else {
-            cout << "noemi: unrecognized argument '" << args[1] << "'\n";
-            return;
-        }
-    }
-
-    for (float y = 1.3; y >= -1.1; y -= 0.06) {
-        for (float x = -1.2; x <= 1.2; x += 0.025) {
-            if (pow((x * x + y * y - 1.0), 3) - x * x * y * y * y <= 0.0)
-                cout << '#';
-            else
-                cout << ' ';
-        }
-        cout << endl;
-        usleep(static_cast<useconds_t>(time * 1'000'000)); // sleep after each line
-    }
-
-}
-
 /**
  *  Handling the 'list' command for listing files and directories.
  * 
diff --git a/snatch.cpp b/snatch.cpp
index 7e3a9b65ab12821ca5801358c9a1e9293d215225..de9461b9ae6b71480252af9ae6519b9da4e9cbb1 100644
--- a/snatch.cpp
+++ b/snatch.cpp
@@ -1,14 +1,22 @@
 #include <iostream>
 #include <fstream>
 #include <curl/curl.h>
-#include "snatch.h"
+#include <sys/stat.h>
 
 using namespace std;
 
-// Write callback to write data into a file
+// Transfer info callback function
+static int xferinfo_callback(void* p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t uptotal, curl_off_t upnow) {
+    if (dltotal > 0) {
+        int percent = static_cast<int>((dlnow / static_cast<double>(dltotal)) * 100);
+        cout << "\rDownloading: " << percent << "% (" << dlnow / 1024 << " KB of " << dltotal / 1024 << " KB)";
+        cout.flush();
+    }
+    return 0; // returning 0 tells curl to continue the download
+}
+
 size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream) {
-    size_t written = fwrite(ptr, size, nmemb, stream);
-    return written;
+    return fwrite(ptr, size, nmemb, stream);
 }
 
 bool download_file(const string& url, const string& output_filename) {
@@ -18,28 +26,39 @@ bool download_file(const string& url, const string& output_filename) {
 
     curl = curl_easy_init();
     if (curl) {
-        fp = fopen(output_filename.c_str(), "wb"); // "wb" = write binary
+        fp = fopen(output_filename.c_str(), "wb");
         if (!fp) {
             cerr << "Failed to open file: " << output_filename << endl;
             curl_easy_cleanup(curl);
             return false;
         }
 
-        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());          // Set the URL
-        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); // How to write received data
-        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);             // Where to write
-        res = curl_easy_perform(curl);                             // Perform download
+        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
+        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
+        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
+
+        // Set the XFERINFO callback to display download status
+        curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferinfo_callback);
+        curl_easy_setopt(curl, CURLOPT_XFERINFODATA, nullptr);
+        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); // Enable progress meter
+
+        res = curl_easy_perform(curl);
 
-        curl_easy_cleanup(curl); // Clean up
-        fclose(fp);              // Close file
+        curl_easy_cleanup(curl);
+        fclose(fp);
 
         if (res != CURLE_OK) {
-            cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << endl;
+            cerr << "\ncurl_easy_perform() failed: " << curl_easy_strerror(res) << endl;
             return false;
         }
 
+        // Make the file executable
+        if (chmod(output_filename.c_str(), 0755) != 0) {
+            cerr << "Warning: Failed to make " << output_filename << " executable." << endl;
+        }
+
+        cout << "\nDownload complete!" << endl;
         return true;
     }
     return false;
-}
-
+}
\ No newline at end of file
diff --git a/snatch.h b/snatch.h
index d686f3bb6f4492d5ebbbb42b2af6e018c21969a6..7f7259a30f8b34a6d43c543d2f6ba81e4fcc9f25 100644
--- a/snatch.h
+++ b/snatch.h
@@ -3,7 +3,11 @@
 
 #include <iostream>
 
+// Forward declaration for the xferinfo callback function
+static int xferinfo_callback(void* p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t uptotal, curl_off_t upnow);
+
+// Function declarations
 size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream);
 bool download_file(const std::string& url, const std::string& output_filename);
 
-#endif
\ No newline at end of file
+#endif