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:
- uses file I/O,
- compiles on phone,
- is easily extensible to JSON/remote APIs later.
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)
- Export favorites to JSON and sync to GitHub gists.
- Convert the books CLI to Python and add fuzzy search.
- Make the quiz web-based using Flask and expose a local webhook to the phone.
- Add Termux:API notifications for a daily book suggestion.
Real mistakes & fixes while building projects
- Forgot to
termux-setup-storage
→ data files lived in a weird sandbox. Fix: run it ASAP. - Compiled with strict flags on older phones → sometimes
clang
flags need adjusting. If compile fails, drop-O2
or test with-std=c++17
only. - Hard-coded paths → changed to
HOME()
helper to be portable.
My favorite tools while building
- clang — surprisingly fast on phones.
- neovim — for longer edits.
- git — I push everything to GitHub even if it’s small. Good version therapy.
- Kali Rootless (KeX) — use it when you want a desktop feeling without rooting.
Resources I used (and my tiny reviews)
Termux Wiki: official, accurate.
- Liked: Clear storage and package notes.
- Disliked: A bit dry for beginners.
Dev.to C++ on Termux: practical how-to.
- Liked: Fast start; sample compile & run.
- Disliked: Too short for larger projects.
Kali NetHunter Rootless docs: for the Kali userspace setup.
- Liked: Capability matrix, official instructions.
- Disliked: Some community installers are sketch; trust kali.org docs.
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.