rayhana

Projects I Made: Tiny apps from my phone (Termux + Kali)

Exactly what I built, how built it, how to run it, what to change, and the feelings behind it.

Intro
Projects keep you honest. I wanted things that are small but feel real: not toy apps, but little pocket utilities you can show off. Two that I actually use and love: a Random Books CLI and a Seedhe Maut lyrics quiz engine (the quiz engine reads your snippets, safe for copyright). One lives in Termux, the other I prefer launching inside Kali Rootless for the extra “os energy.”


Project A: Random Books CLI (Termux native)

What it is

A tiny C++ CLI that recommends books by genre, can search, and save favorites. Works offline, perfect when you are stuck in the woods.

Why I made it

I wanted a project that:

Files & layout

book-cli/
  data/books.csv
  src/main.cpp
  Makefile
  scripts/install.sh

Key commands to run

# clone or create files in ~/book-cli
cd ~/book-cli
make
./books    # run locally
# or install globally
~/book-cli/scripts/install.sh
books      # run from anywhere

What I felt building it

Making the CSV and seeing it load felt tidy. The first time the save to favorites prompt worked on my phone I weirdly grinned at the screen. It’s small but complete, everything a beginner should feel proud to ship.

What I liked & disliked

Liked: Pure offline, no API, no keys, zero fuss. Good learning surface for file parsing and CLI UX.
Disliked: CSV parsing is fragile (no commas in fields). If I did it again I’d use a tiny JSON loader or a proper CSV library.


Project B: Seedhe Maut Quiz (Kali Rootless)

What it is

A fill-in-the-blank CLI quiz engine. You provide questions.txt lines like hola ____|amigo. The game picks 10 random questions and scores you. Clean, simple, and you can run it inside Kali Rootless or Termux.

Important: I don’t redistribute song lyrics. You paste your own short snippets or hints.

Why I made it

For fun, for music, and because games teach string handling and UX quickly.

The actual code (C++17, ~100 lines)

#include <bits/stdc++.h>  
using namespace std;  

struct QA { string prompt; string answer; };  

static string trim(string s){  
    auto issp = [](int c){ return isspace(c); };  
    s.erase(s.begin(), find_if(s.begin(), s.end(), [&](int c){ return !issp(c); }));  
    s.erase(find_if(s.rbegin(), s.rend(), [&](int c){ return !issp(c); }).base(), s.end());  
    return s;  
}  

static string lower(string s){  
    transform(s.begin(), s.end(), s.begin(), ::tolower);  
    return s;  
}  

static vector<QA> loadQA(const string& path){  
    vector<QA> v;  
    ifstream in(path);  
    string line;  
    while (getline(in, line)){  
        if (line.empty()) continue;  
        auto bar = line.find('|');  
        if (bar == string::npos) continue;  
        string p = trim(line.substr(0, bar));  
        string a = trim(line.substr(bar+1));  
        if (!p.empty() && !a.empty()) v.push_back({p, a});  
    }  
    return v;  
}  

static string home(){  
    const char* h = getenv("HOME");  
    return h ? string(h) : string(".");  
}  

static void logScore(int got, int total){  
    string dir = home() + "/.sm_quiz";  
    system((string("mkdir -p ") + dir).c_str());  
    string path = dir + "/scores.txt";  
    ofstream out(path, ios::app);  
    time_t t = time(nullptr);  
    out << put_time(localtime(&t), "%Y-%m-%d %H:%M:%S") << " - " << got << "/" << total << "\n";  
}  

int main(){  
    ios::sync_with_stdio(false);  
    cin.tie(nullptr);  

    string path = home() + "/seedhe-maut/questions.txt";  
    auto qa = loadQA(path);  
    if (qa.size() < 10){  
        cerr << "Need at least 10 lines in " << path << "\n";  
        cerr << "Format: prompt|answer  (example: hola ____|amigo)\n";  
        return 1;  
    }  

    cout << "Seedhe Maut Quiz - 10 fill-in-the-blank questions\n";  
    cout << "Type your answer and press Enter. Case does not matter.\n\n";  

    srand((unsigned) time(nullptr));  
    vector<int> idx(qa.size());  
    iota(idx.begin(), idx.end(), 0);  
    random_shuffle(idx.begin(), idx.end());  
    idx.resize(10);  

    int score = 0;  
    for (int i = 0; i < 10; i++){  
        auto& q = qa[idx[i]];  
        cout << "Q" << (i+1) << ": " << q.prompt << "\n> ";  
        string ans; getline(cin, ans);  
        ans = lower(trim(ans));  
        string key = lower(q.answer);  
        if (ans == key){  
            cout << "Correct\n\n";  
            score++;  
        } else {  
            cout << "Wrong. Answer: " << q.answer << "\n\n";  
        }  
    }  
    cout << "Final score: " << score << "/10\n";  
    logScore(score, 10);  
    return 0;  
}

How to run

# prepare
mkdir -p ~/seedhe-maut
# copy quiz.cpp there
clang++ -std=c++17 quiz.cpp -o quiz
./quiz
# install as system command (optional)
~/seedhe-maut/install.sh
smquiz

What felt real

Watching my friend get 2/10 and then rage was a peak social moment. I love small games because they make people talk — and that’s always the goal.

What I liked & disliked

Liked: The engine is simple to extend (timed mode, hints, streaks).
Disliked: Input method on small screens can feel clumsy; an external keyboard or KeX desktop helps.


Extra mini-project ideas (grow these)


Real mistakes & fixes while building projects


My favorite tools while building


Resources I used (and my tiny reviews)

  1. Termux Wiki: official, accurate.

    • Liked: Clear storage and package notes.
    • Disliked: A bit dry for beginners.
  2. Dev.to C++ on Termux: practical how-to.

    • Liked: Fast start; sample compile & run.
    • Disliked: Too short for larger projects.
  3. Kali NetHunter Rootless docs: for the Kali userspace setup.

    • Liked: Capability matrix, official instructions.
    • Disliked: Some community installers are sketch; trust kali.org docs.
  4. Fira Code / Fira Mono — for nicer code font vibes on KeX.

    • Liked: ligatures, tastefully hacker-y.
    • Disliked: none, just install it.

Final thoughts: a tiny pep talk (from me to you)

Build things that make you feel stupid and proud at the same time. Phone dev is ugly, cramped, and sometimes annoying, but it teaches you to think small and ship fast. Keep your projects tiny, keep them useful, keep pushing them to GitHub. You’ll be surprised how quickly little wins add up.