A lightweight, secure, and mobile-responsive web application for managing tasks across users.
Built with Java 25 and SQLite.


Screenshots from a mobile phone browser above:
- Role-based access control: A separate interface for Admins and Users with their respective controls
- Live progress tracking: Admins can see Users task progression
- Mobile-friendly design: Looks good and easy to use on mobile phones as well as computers
- Persistent storage: SQLite database remains safe and intact after updates or changes
- Session Management: Implemented secure UUID-based session tokens with HttpOnly cookies to prevent Session Hijacking and IDOR attacks.
- SQL Injection Prevention: 100% coverage using PreparedStatements for all database interactions.
- XSS Protection: Automatic HTML entity escaping for all user-generated content (usernames and task descriptions).
- Access Control: Server-side verification of administrative privileges for all sensitive actions (adding users, clearing feeds).
- Language: Java (using the built-in com.sun.net.httpserver)
- Database: SQLite 3
- Frontend: Vanilla HTML5 and CSS3
- Local Machine: Java Development Kit (JDK 25) and Git installed.
- Server: Java Runtime Environment (JRE) or JDK installed.
Clone the project files to your local development machine and navigate into the project root:
git clone [https://github.com/js-2507/Multi-User-Task-List.git](https://github.com/js-2507/Multi-User-Task-List.git) cd Multi-User-Task-List
Ensure that your project's local dependency directory contains the necessary .jar archive files for the database driver and security features:
sqlite-jdbc-*.jar
Run the following commands inside your local project directory or IntelliJ IDEA built-in terminal to compile the source code and pack it into a portable package:
Step 1: Compile all Java source files into a 'bin' distribution directory
javac -cp "lib/*" src/*.java -d bin/
Step 2: Create an executable JAR archive targeting the Main entrypoint
jar cfe chore-app.jar Main -C bin .
On your server, make a directory for the service, make note of it for later
Deploy the generated application artifact along with its required dependency directory to your target production server environment using an SFTP client (such as FileZilla or WinSCP):
Option A: Running in the Foreground (For Testing)
This locks your terminal window to the process. Closing your terminal or disconnecting from SSH will stop the application:
java -cp "chore-app.jar:lib/*" Main
To run the service silently in the background so it keeps executing even after you close your terminal or log out of your SSH session, use the nohup command:
nohup java -cp "chore-app.jar:lib/*" Main > server.log 2>&1 &
To ensure the chore management service remains highly available, runs silently in the background, and automatically recovers from server reboots or system power outages, configure it as an official Ubuntu system service.
1. Create a new service tracking definition file:
sudo nano /etc/systemd/system/chore.service
2. Populate the configuration layout below (make sure to replace user and the companion working paths with your actual server account environment configurations):
[Unit] Description=Household Chore Tracker Service After=network.target [Service] User=user WorkingDirectory=/home/user/chore-app ExecStart=/usr/bin/java -cp "chore-app.jar:lib/*" Main Restart=always StandardOutput=syslog StandardError=syslog SyslogIdentifier=chore-app [Install] WantedBy=multi-user.target
3. Reload the tracking manager engine, flag the chore tracking script to start during the initial boot sequence, and engage the service right away:
sudo systemctl daemon-reload sudo systemctl enable chore.service sudo systemctl start chore.service
4. Confirm that your deployment profile launched successfully without active system blockages:
sudo systemctl status chore.service
for web admin and use,
The admin can add users (and their usernames/passwords), add tasks for users, undo task progress, clear tasks for users, and see progress of all users tasks.
Default admin username is 'admin' and password is 'admin123$' (can be changed in Database.java file, line 28). Users can see only their tasks through login, and can mark tasks as complete. Any contributions and improvements are appreciated!