---
title: TaskFlow
description: >-
  Offline-first task-dispatch PWA για ομάδες φιλοξενίας. Realtime updates μέσω Socket.IO, BullMQ scheduler για
  επαναλαμβανόμενες εργασίες, IndexedDB mutation queue ώστε η εφαρμογή να δουλεύει όταν πέφτει το Wi-Fi. Multi-tenant
  SaaS, live και δωρεάν στο tasks.jimrarras.com.
lang: el
source: https://jimrarras.com/projects/taskflow/
fetched: '2026-09-19T05:53:18.689Z'
---

Lead Developer

Offline-first task-dispatch PWA για ομάδες φιλοξενίας. Realtime updates μέσω Socket.IO, BullMQ scheduler για επαναλαμβανόμενες εργασίες, IndexedDB mutation queue ώστε η εφαρμογή να δουλεύει όταν πέφτει το Wi-Fi. Multi-tenant SaaS, live και δωρεάν στο tasks.jimrarras.com.

- **178** αρχεία αυτόματων ελέγχων

- **12** ξεχωριστές περιοχές, από εργασίες ως δωμάτια και ειδοποιήσεις

- **8** καταστάσεις που περνά μια εργασία, από τη δημιουργία ως την έγκριση

## Stack
1. [Αρχική](https://jimrarras.com/)
2. [Έργα](https://jimrarras.com/projects/)
3. TaskFlow

αρχεία αυτόματων ελέγχων

178

ξεχωριστές περιοχές, από εργασίες ως δωμάτια και ειδοποιήσεις

12

καταστάσεις που περνά μια εργασία, από τη δημιουργία ως την έγκριση

8

![TaskFlow](https://jimrarras.com/images/projects-cards/taskflow.webp)

## Η κατάσταση

Σε ένα ξενοδοχείο, μια κουζίνα ή έναν χώρο εκδηλώσεων, η δουλειά μοιράζεται σε χαρτάκια και σε φωνές στον διάδρομο. Το προσωπικό κινείται συνέχεια, και το Wi-Fi είναι καλό στη ρεσεψιόν και ανύπαρκτο στο υπόγειο. Έχτισα το TaskFlow μόνος μου για να αντέχει ακριβώς αυτό: να μοιράζει εργασίες σε βάρδιες που δεν κάθονται μπροστά σε υπολογιστή, και να μη χαλάει όταν χάνεται το σήμα. Είναι ζωντανό και δωρεάν για όποια ομάδα το θέλει.

## Δουλεύει και χωρίς σήμα

Η εφαρμογή δεν σταματά όταν πέσει το δίκτυο. Ό,τι κάνει κάποιος εκτός σήματος μπαίνει σε ουρά πάνω στη συσκευή του και ξαναπαίζει μόλις επιστρέψει η σύνδεση, με τη σειρά που έγινε.

Το δύσκολο δεν είναι η ουρά, είναι τι κάνεις όταν ο server πει οριστικά όχι.

Πώς λειτουργεί

- **Η ουρά:** κάθε POST, PATCH και DELETE που γίνεται εκτός δικτύου γράφεται σε ένα store του IndexedDB με χρονοσήμανση και ξαναπαίζει ταξινομημένο κατά χρόνο.
- **Τι μπλοκάρει τι:** οι ενέργειες πάνω στην ίδια οντότητα εξαρτώνται μεταξύ τους, η έναρξη πριν την υποβολή, οπότε μια κολλημένη ενέργεια κρατά πίσω μόνο τη δική της εργασία και όχι ολόκληρη την ουρά.
- **Τι ξαναδοκιμάζεται:** τα 408 και 429 καθαρίζουν μόνα τους και επαναλαμβάνονται. Κάθε άλλο 4xx είναι οριστικό όχι: σβήνεται από την ουρά και εμφανίζεται ως ειδοποίηση με την ενέργεια που απορρίφθηκε.
- **Τι υπάρχει offline:** ο service worker κρατά το κέλυφος της εφαρμογής και τις απαντήσεις του API με NetworkFirst και όριο πέντε δευτερολέπτων, ώστε μια μισάνοιχτη σύνδεση να μην κρεμάει την οθόνη.
- **Ενημερώσεις με ερώτηση:** η νέα έκδοση δεν ενεργοποιείται μόνη της. Ρωτάει, γιατί ένα deploy στη μέση της βάρδιας αλλιώς αλλάζει την εφαρμογή κάτω από τα χέρια του χρήστη.

## Κάθε εργασία ξέρει σε ποιον ανήκει

Μια εργασία ή δίνεται σε συγκεκριμένο άτομο ή μπαίνει σε δεξαμενή και τη διεκδικεί όποιος είναι διαθέσιμος. Από εκεί και πέρα προχωράει σε συγκεκριμένα βήματα, και κανείς δεν μπορεί να την πάει εκεί που δεν επιτρέπεται.

Πώς λειτουργεί

- **Οκτώ καταστάσεις:** pending, in\_pool, assigned, claimed, in\_progress, submitted, approved, redo.
- **Ένας πίνακας μεταβάσεων:** όλες οι επιτρεπτές κινήσεις ζουν σε ένα κοινό πακέτο και ελέγχονται με την ίδια συνάρτηση σε server και client, οπότε δεν υπάρχει δεύτερη εκδοχή του κανόνα.
- **Η εξαίρεση του διαχειριστή:** ο εργαζόμενος δεν γυρίζει ποτέ μια εργασία πίσω. Ο διαχειριστής μπορεί να την παρκάρει στην αρχή του πίνακα, με το `submitted` εξαιρεμένο και το `approved` τελικό.
- **Realtime:** τα γεγονότα βγαίνουν από τα routes του API και ακυρώνουν το αντίστοιχο cache στον client, οπότε η οθόνη ενημερώνεται χωρίς να την ανανεώσει κανείς.

## Τις επαναλήψεις δεν τις θυμάται άνθρωπος

Το turnover των δωματίων και το checklist της παράδοσης βάρδιας μπαίνουν μία φορά ως πρότυπο και εμφανίζονται μόνα τους όταν πρέπει.

Πώς λειτουργεί

- **Κάθε λεπτό:** ένας worker του BullMQ ελέγχει τα προγράμματα κάθε 60 δευτερόλεπτα και δημιουργεί όσες εργασίες έχουν ωριμάσει.
- **Τρεις ρυθμοί:** ημερήσια, εβδομαδιαία και μηνιαία επανάληψη, όλες από πρότυπα εργασιών.
- **Σε ποιον ανήκει:** η δημιουργία τρέχει από την ουρά στον server και όχι από τον browser κάποιου, οπότε δεν εξαρτάται από το ποιος έχει ανοιχτή την εφαρμογή.

## Πολλές ομάδες, ένα σύστημα

Δύο ξενοδοχεία στο ίδιο deployment δεν βλέπουν το ένα τη δουλειά του άλλου, και μέσα σε κάθε ομάδα ο υπεύθυνος και ο εργαζόμενος δεν βλέπουν την ίδια εφαρμογή.

Πώς λειτουργεί

- **Διαχωρισμός δεδομένων:** κάθε οντότητα κουβαλάει `tenantId` και κάθε ερώτημα είναι περιορισμένο σε αυτό.
- **Τρεις ρόλοι:** superadmin, admin και worker, με τη διεπαφή χωρισμένη σε ξεχωριστές περιοχές ανά ρόλο και έλεγχο πρόσβασης στη δρομολόγηση.
- **Δύο τρόποι εισόδου:** κωδικός για τους διαχειριστές, PIN τεσσάρων ως έξι ψηφίων για τους εργαζόμενους. Τα access tokens ζουν 15 λεπτά, τα refresh tokens 7 ημέρες, αποθηκευμένα ως hash και εναλλασσόμενα σε κάθε χρήση.
- **Δωμάτια realtime:** το Socket.IO βάζει κάθε σύνδεση σε δωμάτια ανά ομάδα, ανά χρήστη, ανά δεξαμενή και ανά εργασία, οπότε μια ενημέρωση φτάνει μόνο σε όσους αφορά.
- **Πώς στήνεται:** Fastify 5 με PostgreSQL και Drizzle, Redis για την ουρά και το realtime, όλα σε ένα monorepo με δύο εφαρμογές και τρία κοινά πακέτα.

## Σύνδεσμοι

Μια ενέργεια που ο server απορρίπτει οριστικά δεν επαναλαμβάνεται σιωπηλά: φεύγει από την ουρά και ο εργαζόμενος βλέπει με το όνομά της ποια ακριβώς χάθηκε.

- **Οκτώ καταστάσεις:** pending, in_pool, assigned, claimed, in_progress, submitted, approved, redo.

- Live: [tasks.jimrarras.com](https://tasks.jimrarras.com/)

## Παρόμοια έργα

- Komvos Connect: άλλο multi-tenant SaaS, αλλά για κρατήσεις ραντεβού αντί για task dispatch
- Γηροκομείο collection-app: άλλο offline-first mobile workflow, αλλά native Android scanner αντί για PWA
