
A personal Django site built around a few small apps: accounts, per-user file storage, a to-do list with scheduled email reminders, a page of random-generator tools, and a staff-only diagnostics page. Hosted on a Raspberry Pi at home.

main handles accounts (register, login/logout, profile) through Django’s built-in auth, and redirects you straight to somewhere useful after logging in instead of dropping you back on the login page. Django’s own password validators do the heavy lifting on the register form: minimum length, no fully-numeric passwords, no passwords too close to the username or email.


todo is a per-user to-do list with title, due date, an optional remind date, and a priority level. A management command (send_reminders), meant to run on a schedule, emails users about any item whose remind date has passed and hasn’t already been sent. Editing the remind date un-marks it, so pushing it back doesn’t get silently skipped. Without SMTP configured it just prints the email to the console, which made local testing much easier.

fileManagement is per-user file storage, each file scoped to the account that uploaded it. Beyond upload and download, files can be edited and deleted, and uploads are validated before they’re accepted. The file list shows upload date and size next to each entry, with a search box to filter by title once you’ve got more than a couple of files on there.

randomTools is a grab-bag of client-side generators on one page: coin flip, dice roller, random number, spin-the-wheel picker, magic 8-ball, password generator, colour swatch, and list shuffler. All local JavaScript, no database involved.
serverInfo is a staff-only diagnostics page (Python/Django versions, installed apps, database engine, OS/CPU/memory/disk stats) gated by Django’s is_staff flag rather than a hardcoded check.

Configuration (SECRET_KEY, DEBUG, ALLOWED_HOSTS) comes from environment variables, not hardcoded values, with a .env.example documenting what’s needed; db.sqlite3 and uploaded media/ are gitignored.
Stack: Python, Django
Status: in progress