A work management app for a 10-person team: a Home dashboard, a personal "My Tasks" inbox, per-project List/Board/Calendar views, a task detail panel with comments/likes/activity, and a Team directory.
Plain LAMP stack — PHP (PDO/MySQL, session-based login) on the backend, a
dependency-free vanilla-JS single-page frontend on top. No Node/build step
required; deployment is just copying files to a webroot and pointing Apache
at public/.
- PHP 8.x + PDO (
pdo_mysql) - MySQL or MariaDB
- Apache with
mod_php(or php-fpm) - No frontend framework / no build step —
public/assets/js/app.jsis loaded directly by the browser.
sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-mysql mysql-server
sudo a2enmod rewritesudo mysql -u root <<'SQL'CREATE DATABASE project_manager CHARACTER SET utf8mb4;CREATE USER 'project_manager'@'localhost' IDENTIFIED BY 'CHANGE_ME';GRANT ALL PRIVILEGES ON project_manager.* TO 'project_manager'@'localhost';FLUSH PRIVILEGES;SQL
mysql -u project_manager -p project_manager < db/schema.sql
mysql -u project_manager -p project_manager < db/seed.sql # optional demo datadb/seed.sql seeds a placeholder 10-person team, 5 projects, and ~24 tasks
so the app isn't empty on first load. Every seeded user's password is
password123 — change these before going live, or skip the seed file
entirely and create your own users (see step 5).
cp config/config.sample.php config/config.phpEdit config/config.php with your DB credentials (host/name/user/pass) and
workspace name. config/config.php is gitignored — never commit real
credentials.
Copy the repo to somewhere Apache can serve, e.g. /var/www/project-manager,
then point Apache's DocumentRoot at the public/ subdirectory (not the
repo root — config/, includes/, and db/ must stay outside the webroot).
Example vhost (/etc/apache2/sites-available/project.senylrc.org.conf):
<VirtualHost*:80>
ServerName project.senylrc.org
DocumentRoot /var/www/project-manager/public
<Directory/var/www/project-manager/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/project-manager-error.log
CustomLog ${APACHE_LOG_DIR}/project-manager-access.log combined
</VirtualHost>sudo a2ensite project.senylrc.org
sudo systemctl reload apache2Point the project.senylrc.org DNS record at this server, then set up TLS
(e.g. sudo apt install certbot python3-certbot-apache && sudo certbot --apache -d project.senylrc.org).
If you skipped db/seed.sql, create at least one user directly:
php -r 'echo password_hash("your-password", PASSWORD_DEFAULT), PHP_EOL;'INSERT INTO users (name, email, password_hash, role, hue)
VALUES ('Your Name', 'you@example.com', '<hash from above>', 'Your Role', 280);Then create at least one project (tasks always belong to a project):
INSERT INTO projects (name, hue) VALUES ('First Project', 250);config/ gitignored config.php (DB credentials) + a sample to copy
db/ schema.sql, seed.sql
includes/ PHP shared code (db connection, auth/session, JSON helpers)
public/ Apache DocumentRoot
index.php auth-gated app shell, embeds bootstrap JSON for the SPA
login.php login form + handler
api/ JSON endpoints (tasks.php, comments.php)
assets/ style.css + app.js (vanilla JS SPA, no build step)
- Single workspace, single MySQL database — sized for one ~10-person team, not multi-tenant.
- All comments/activity for all tasks are embedded in the initial page load rather than paginated per task; fine at this team size, but would need pagination if task/comment volume grows significantly.
- Task tags are read/display-only from the UI in this pass (seeded via SQL); there's no tag editor yet.