A household record-keeping app built as a Design Thinking coursework project. It tracks the recurring "life admin" that's easy to lose track of — loans, insurance, warranties, miscellaneous bills, and medical records — behind a per-user login, and includes a simple tax estimator.
Built with Streamlit + pandas, following the full Design Thinking process: empathize → define → ideate → prototype. The empathy research, problem statement, and ideation artifacts are in docs/design-process/; a static HTML mockup of the intended site is in website/.
From the empathize/define phase (full writeup):
In a household there are multiple payments that must be done regularly like electricity bill, loan payments, etc. Sometimes people might miss out a few payments and there might be severe consequences according to the bill they missed to pay. A similar thing could be said about the medical information of family members — it can be very easy to lose medical information of family members, especially the older ones, and in a few cases bad medical history could have serious consequences.
Two personas drove the design: the head of a household juggling bills and family medical history with "rudimentary methods to only store information," and a student/bachelor living alone for the first time, hitting the same problems with less support.
Proposed solution: keep a running record of what's owed to whom and when, provide medical record storage, and (eventually) trigger reminders as due dates approach. The ideation list breaks this down further — payment types (prepaid/postpaid, critical/non-critical, fixed/variable), what data to capture per record, and adjacent ideas like storing key documents (ID proofs, insurance policies).
| Page | What it does |
|---|---|
| Home | Sign up / log in (hashed passwords via streamlit-authenticator) |
| Bills | CRUD for Loans, Insurance, Warranty, and Miscellaneous bills — per-user CSV storage |
| Tax | Quick tax-owed calculator (amount × rate) |
| Medical | CRUD for Medical History, Bills, and Prescriptions |
Each signup gets its own set of CSV files under app/pages/csv/*/<username>.csv, so records are isolated per user.
A demo account is seeded so you can log in immediately:
- Username:
demo - Password:
Demo@1234
Requires Python 3.11+.
pip install pipenv
pipenv install
pipenv run streamlit run app/Home.pyOr with a plain virtualenv:
python3 -m venv .venv && source .venv/bin/activate
pip install streamlit pandas streamlit-authenticator watchdog
streamlit run app/Home.pyOpen the URL Streamlit prints (defaults to http://localhost:8501).
app/email_reminder.py is a standalone utility page for sending a one-off reminder email. It needs SMTP credentials supplied via environment variables (never hardcode credentials):
export LIFEADMIN_SMTP_USER="you@example.com"
export LIFEADMIN_SMTP_PASSWORD="an-app-password" # not your account passwordapp/ Streamlit app
Home.py Login / signup
pages/
1_Bills.py Loans, Insurance, Warranty, Misc
2_Tax.py Tax calculator
3_Medical.py Medical History, Bills, Prescriptions
csv/ Per-user data, one folder per record type
generate_keys.py Hashes user.csv passwords into hashed_pw.pkl
email_reminder.py Standalone reminder-email utility
website/ Static HTML mockup of the intended marketing site
docs/design-process/ Design Thinking artifacts (personas, problem statement, ideation)
This was a coursework prototype, not a production app — worth being upfront about:
- Passwords are stored in a plaintext CSV before hashing on signup; fine for a local demo, not for real deployment (a real build would hash at the point of entry and never persist the plaintext).
- Per-user data lives in flat CSV files rather than a database — simple to read, but no concurrency safety.
- The reminder/notification system from the original problem statement (nudging users before a bill is due) was scoped out of the prototype.
- Actual due-date reminders (the core idea from the problem statement) via the email utility or a scheduled job.
- Move persistence from CSV to a real database.
- Flesh out the marketing site in
website/and wire it to the app.