A Kanban board for small teams: create tasks, move them across the board with drag and drop, and manage contacts. Built as a team project during my web development training at the Developer Akademie.
Live demo: join.tobias-klanert.de. Use the guest login to try it without an account.
- Team project with three people, part of my web development training at Developer Akademie GmbH.
- Design provided by Developer Akademie GmbH.
- My role: team coordination, Firebase integration, login and sign-up, the board with drag and drop, and support with bug fixes.
- Sign-up and login with email and password (Firebase Authentication)
- Guest login with demo data, no account needed
- Summary page with an overview of your tasks
- Board with drag and drop between status columns
- Tasks with title, description, due date, priority, category, subtasks and assigned contacts
- Contact management
- Responsive layout for desktop, tablet and phone
| Area | Choice |
|---|---|
| Frontend | Vanilla JavaScript, HTML, CSS (no framework, no build step) |
| Auth | Firebase Authentication (email and password) |
| Data | Firebase Realtime Database (region europe-west1) |
| Hosting | nginx container behind Caddy on my own Hetzner VPS |
The Firebase web config in js/firebase.js is public on purpose. It only identifies the Firebase project and does not grant access to any data. Access is enforced on the server side by Realtime Database Security Rules:
- Signed-in users can only read and write their own data under
users/<uid>. - The guest demo data under
users/guestUseris read-only. - Everything else is denied by default.
Join is a static site, so there is nothing to build. On my VPS the repository is checked out and mounted read-only into a hardened nginx container: non-root user, read-only file system, no Linux capabilities. Hidden files such as .git/ are blocked. Caddy sits in front of it as a reverse proxy and handles HTTPS. An update is a git pull on the server.
The Firebase SDK is loaded as an ES module, which browsers refuse to load from file://. Serve the folder with any local web server instead:
git clone https://github.com/TobiasKlanert/Join.git
cd Join
python3 -m http.server 8000Then open http://localhost:8000. The app connects to the same Firebase project as the live demo, so the guest login is the easiest way to look around.
Join/
├── assets/ # Images, fonts and templates
├── html/ # Subpages: summary, board, add task, contacts, legal pages
├── js/ # Application logic, Firebase setup in js/firebase.js
├── styles/ # Stylesheets
├── index.html # Login page and entry point
└── script.js # Shared scripts
- Portfolio: tobias-klanert.de
- LinkedIn: Tobias Klanert
- GitHub: @TobiasKlanert
No license is granted. The code is public so you can see how Join is built. The design belongs to Developer Akademie GmbH, the code to the project team.
