← Back to work
Building

TaskFlow

A project and task management app for freelancers and small teams: workspaces, roles, a Kanban board and built-in chat. Work in progress - the project behind my RNCP5 certification file.

  • Flask
  • PostgreSQL
  • Docker
  • Caddy
  • Gunicorn
  • Redis
  • Socket.IO
Timeline2026 → certification file due 31 December 2026
RoleDesign & engineering, solo
TeamSolo
ContextRNCP5 certification project
Context

Work is organised as Workspace → Projects → Tasks. Tasks have a status, a priority, an assignee and a due date, and are shown on a Kanban board. Each workspace has members with a role: owner, admin, member or guest. There is a chat per workspace and direct messages between users.

The backend is Flask, split into blueprints (auth, workspaces, projects, tasks, direct messages). It talks to PostgreSQL 17 with plain SQL through psycopg, and uses Socket.IO for the chat. The frontend is HTML, CSS and vanilla JavaScript with no build step. Passwords are hashed with Argon2, sessions are cookie-based, and Redis backs the rate limiter. In production it runs on Docker Compose behind Caddy, with Gunicorn serving Flask.

Status: not finished. It is the project for my RNCP5 certification file, due 31 December 2026, and a demo is online. The tests use test doubles for the database: they cover selected authentication, permission, validation, messaging and health-check paths, but not the PostgreSQL queries or the browser rendering, which still need a running database and manual checks.

Architecture
  • Backend

    Flask · blueprints · psycopg

    One blueprint per area (auth, workspaces, projects, tasks, direct messages); plain SQL, no ORM.

  • Permissions

    app/permissions.py

    A single file holds the checks. A project or task resolves to its workspace, then to the user’s role in workspace_members.

  • Database

    PostgreSQL 17

    users, workspaces, workspace_members, projects, tasks, sessions, workspace_messages, direct_messages.

  • Deployment

    Docker Compose · Caddy · Gunicorn · Redis

    Caddy serves the static frontend and proxies /api and /socket.io to Flask; Redis stores rate-limit counters.

TaskFlow