
Συναντήσεις που Μπορείς Πραγματικά να Ξαναβρείς: Η Έκδοση με το Timeline
Το GeekBye v1.7.3 αντικατέστησε το dropdown των συναντήσεων με ένα πραγματικό timeline — ανθρώπινες ημερομηνίες, αναζήτηση, ένα breadcrumb που λέει σε ποια συνάντηση βρίσκεσαι. Από κάτω: μια κούρσα αυτόματης επιλογής, ένα screenshot που προηγείται της ίδιας του της συνάντησης, και πέντε διορθώσεις για Windows σε είκοσι οκτώ λεπτά.
Μέχρι τον Ιανουάριο του 2026, οι χρήστες του GeekBye είχαν πρόβλημα ιστορικού. Η εφαρμογή ηχογραφούσε και ανέλυε τις συναντήσεις τους μια χαρά — και μετά τις αρχειοθετούσε σε ένα dropdown. Ένα dropdown είναι εντάξει για τρία στοιχεία. Γύρω στη δέκατη πέμπτη συνάντηση, «εκείνη η συνέντευξη της περασμένης Τρίτης» είχε γίνει αρχαιολογική αποστολή μέσα από πανομοιότυπες γραμμές. Το v1.7.3 — 64 commits ανάμεσα στα μέσα Δεκεμβρίου και τις 16 Ιανουαρίου — είναι η έκδοση όπου οι συναντήσεις έγιναν κάτι που μπορείς πραγματικά να ξαναβρείς.
(Μια λογιστική σημείωση, επειδή το git history είναι ειλικρινές ακόμη κι όταν οι αριθμοί εκδόσεων δεν είναι: δεν υπάρχει release tag v1.7.2. Η έκδοση ανέβηκε, αλλά το επόμενο tag που κυκλοφόρησε ήταν το v1.7.3, οπότε οι διορθώσεις για Windows της εποχής του v1.7.2 ταξίδεψαν μαζί με αυτή την έκδοση.)
Από dropdown σε timeline
Η κεντρική αλλαγή είναι ένα pull request: 12 αρχεία, +640 γραμμές, οι περισσότερες ένα νέο component MeetingsTimeline 381 γραμμών. Το dropdown έγινε ένα κυλιόμενο timeline από κάρτες συναντήσεων, ομαδοποιημένες σε τέσσερις κάδους — Today, Yesterday, This Week, Older (σήμερα, χθες, αυτή την εβδομάδα, παλαιότερα) — με ημερομηνίες γραμμένες όπως θα τις έλεγε ένας άνθρωπος: Today, 2:30 PM, Yesterday, 2:30 PM, Mon, 2:30 PM για την τρέχουσα εβδομάδα, και Jan 5, 2:30 PM πιο πέρα. Το Cmd/Ctrl+K εστιάζει σε ένα πλαίσιο αναζήτησης που φιλτράρει κατά τίτλο. Η προβολή λεπτομερειών της συνάντησης έγινε πραγματική σελίδα πλοήγησης, οπότε τα κουμπιά πίσω και μπροστά του navbar σημαίνουν επιτέλους κάτι, και το breadcrumb σταμάτησε να γράφει «Meetings / Meeting» και άρχισε να γράφει «Meetings / Interview with John» (κομμένο με αποσιωπητικά, γιατί πάντα θα υπάρχει κάποιος που ονομάζει τη συνάντησή του σαν μυθιστόρημα).
Μαζί της ήρθαν δύο μικρές βελτιώσεις ποιότητας ζωής: ένα κουμπί διαγραφής μέσα στην προβολή της συνάντησης (που μετά τη διαγραφή σε γυρίζει πίσω στο timeline, αντί να σε παρατήσει σε μια νεκρή σελίδα), και η αυτόματη πλοήγηση — όταν μια συνεδρία ακρόασης τελειώνει με πραγματικό περιεχόμενο απομαγνητοφώνησης, το dashboard ανοίγει κατευθείαν στη σελίδα λεπτομερειών εκείνης της συνάντησης. Κλείνεις την κλήση, βλέπεις τη συνάντηση. Οι συνεδρίες που τελειώνουν άδειες διαγράφονται αθόρυβα αντί να γεμίζουν το timeline.
Η κούρσα που δημιουργείς βελτιώνοντας την πλοήγηση
Ιδού το κομμάτι που δεν σου λέει το changelog. Η παλιά λίστα συναντήσεων είχε μια συνήθεια: σε κάθε φόρτωση, επέλεγε αυτόματα την πιο πρόσφατη συνεδρία. Ακίνδυνο όσο η λίστα ήταν ένα dropdown που σπάνια άγγιζες. Μοιραίο τη στιγμή που οι συναντήσεις έγιναν σελίδα στην οποία πλοηγείσαι: κλικάρεις τη συνάντηση #5, ένα refetch στο παρασκήνιο ολοκληρώνεται, και η λίστα εξυπηρετικά επιλέγει την πιο πρόσφατη συνάντηση — αντικαθιστώντας την επιλογή που έκανες πριν από δύο δευτερόλεπτα. Η διόρθωση δεν ήταν ένας εξυπνότερος έλεγχος· ήταν η ολοκληρωτική διαγραφή του auto-select. Κάθε λίστα που επιλέγει πράγματα εκ μέρους του χρήστη θα καταλήξει κάποια στιγμή να πολεμά τον χρήστη.
Η αφαίρεσή του αποκάλυψε τη δεύτερη κούρσα. Η αυτόματη πλοήγηση πηδά σε μια συνάντηση τη στιγμή που τελειώνει η συνεδρία της — που μπορεί να είναι πριν εκείνη η συνεδρία ολοκληρώσει την εγγραφή της στην τοπική βάση δεδομένων SQLite. Πλοηγήσου πολύ γρήγορα και φτάνεις σε μια συνάντηση που δεν υπάρχει ακόμη. Η διόρθωση που κυκλοφόρησε είναι μια καθυστέρηση 500 χιλιοστών του δευτερολέπτου πριν από τη φόρτωση των συνεδριών κατά την άφιξη στην προβολή λεπτομερειών, και ο χειριστής πλοήγησης κουβαλά τις δικές του δικλείδες — περίμενε το did-finish-load του παραθύρου συν 100ms αν το dashboard μόλις δημιουργήθηκε, 50ms αν ήταν ήδη ανοιχτό. Η δική μας ανάγνωση: η πλοήγηση στο τέλος της συνεδρίας διασχίζει τρεις χρονικές επικράτειες — την εγγραφή στη βάση δεδομένων, τη φόρτωση του παραθύρου και το React mount — και καθεμιά πήρε τη δική της μικρή καθυστέρηση. Δουλεύει, και θα το πούμε καθαρά: μια στοίβα από μαγικούς αριθμούς είναι τίμια ομολογημένο χρέος, όχι νίκη.
Το screenshot που προηγείται της ίδιας του της συνάντησης
Άλλη μία υπόθεση πέθανε σε αυτή την έκδοση: «τα screenshots ανήκουν σε μια συνεδρία αν και μόνο αν τραβήχτηκαν κατά τη διάρκειά της.» Απόλυτα λογικό. Λάθος. Οι πραγματικοί χρήστες πατούν Cmd+H πάνω στην αγγελία εργασίας, στην ατζέντα, στον κώδικα που πρόκειται να συζητήσουν — πριν πατήσουν Start. Η καρτέλα Report ταίριαζε τα screenshots με το χρονικό εύρος της συνεδρίας αυστηρά, οπότε εκείνα τα προπαρασκευαστικά screenshots εξαφανίζονταν από την αναφορά για την οποία είχαν τραβηχτεί. Η διόρθωση διεύρυνε το παράθυρο ταιριάσματος κατά 60 δευτερόλεπτα πριν από την έναρξη της συνεδρίας. (Ο ίδιος ο μηχανισμός χρονικών ευρών είναι παλαιότερος — κυκλοφόρησε αθόρυβα στο v1.6.15· η συνεισφορά του v1.7.3 είναι ότι του έμαθε πως οι συναντήσεις αρχίζουν λίγο πριν αρχίσουν.)
Πέντε διορθώσεις σε είκοσι οκτώ λεπτά
Η ιστορία από το πεδίο αυτής της έκδοσης δεν βρίσκεται καθόλου στο timeline — βρίσκεται στο overlay του onboarding στα Windows, και είναι μια σχολικού βιβλίου αλυσίδα «διόρθωσε τη διόρθωση»: πέντε commits ανάμεσα στις 10:50 και τις 11:18 το ίδιο πρωί.
Το κύριο παράθυρο του GeekBye χρησιμοποιεί mouse passthrough — ένα hook που εναλλάσσει το setIgnoreMouseEvents του Electron σε κάθε κίνηση του ποντικιού, ώστε τα κλικ να περνούν μέσα από τις διάφανες περιοχές. Κατά το onboarding στα Windows, αυτό το hook πολεμούσε το overlay του tutorial, και στο βήμα όπου εμφανίζεται το παράθυρο του dashboard, η εφαρμογή πάγωνε. Διόρθωση πρώτη: κάνε το hook να μην κάνει τίποτα όσο το onboarding είναι ενεργό. Ειρήνη μέσω αφοπλισμού.
Μόνο που τώρα τα κουμπιά του onboarding δεν ανταποκρίνονταν, επειδή η προώθηση συμβάντων έστελνε τα κλικ στο παράθυρο του dashboard κάτω από το overlay. Οι διορθώσεις δύο και τρία πείραζαν το forward: false ανά wizard. Μετά ήρθε το commit που βρήκε την πραγματική βαθύτερη αιτία: όταν ανοίγει το παράθυρο του dashboard, ο δικός του χειριστής drag επαναφέρει το κύριο παράθυρο σε λειτουργία click-through — και η πρώτη διόρθωση είχε κάνει το passthrough hook παθητικό, που σήμαινε ότι δεν είχε μείνει τίποτα να διορθώσει την παρεμβολή. Η πραγματική διόρθωση αντέστρεψε τη στρατηγική: το hook τώρα επαναβεβαιώνει ενεργά το setIgnoreMouseEvents(false) σε κάθε κίνηση του ποντικιού κατά το onboarding, ακριβώς επειδή εξωτερικός κώδικας μπορεί να το επαναφέρει ανά πάσα στιγμή. Διέγραψε επίσης 75 γραμμές από τις προηγούμενες ανά-wizard παρακάμψεις.
Και ακόμη και τότε υπήρξε πέμπτο commit, επειδή το να κερδίσεις τον πόλεμο του input δεν σημαίνει ότι κέρδισες τον πόλεμο του z-order: το overlay και το dashboard κάθονταν και τα δύο στο ίδιο always-on-top επίπεδο, και τα Windows ανεβάζουν όποιο παράθυρο πάρει το focus. Το overlay μετακόμισε σε υψηλότερο επίπεδο παραθύρου και ανασηκώνεται μόνο του με καθυστέρηση αφού εμφανιστεί το dashboard. Η πορεία αξίζει να τη θυμάσαι: μια παθητική διόρθωση που αφοπλίζει τον μόνο σου υπερασπιστή είναι χειρότερη από την αρχική μάχη.
Τρία πράγματα που μας δίδαξε αυτή η έκδοση
- Οι αναβαθμίσεις πλοήγησης βγάζουν στην επιφάνεια σφάλματα κατάστασης. Η κούρσα του auto-select υπήρχε πριν από το v1.7.3· ένα dropdown απλώς δεν σε άφηνε ποτέ να τη νιώσεις. Τη στιγμή που οι συναντήσεις έγιναν σελίδα στην οποία πλοηγείσαι συνειδητά, κάθε κομμάτι κώδικα που επέλεγε πράγματα για σένα έγινε σφάλμα.
- Τα χρονικά όρια γύρω από την πρόθεση του χρήστη χρειάζονται περιθώριο. Συνεδρίες, ηχογραφήσεις, αναφορές — οι χρήστες ενεργούν λίγο πριν και λίγο μετά το επίσημο παράθυρο της μηχανής. Το buffer των 60 δευτερολέπτων για τα screenshots είναι μία γραμμή που αντανακλά πώς συμπεριφέρονται πραγματικά οι άνθρωποι.
- Ποτέ μην κάνεις τον διορθωτικό σου κώδικα παθητικό. Το πάγωμα στα Windows χρειάστηκε πέντε διορθώσεις επειδή η πρώτη διόρθωση απενεργοποίησε τον μόνο μηχανισμό που μπορούσε να αντισταθμίσει την εξωτερική παρεμβολή. Αν κάποιος άλλος κώδικας μπορεί να σπάσει την αναλλοίωτή σου ανά πάσα στιγμή, η δουλειά σου είναι να την επαναβεβαιώνεις συνεχώς, όχι να αποσύρεσαι.
Για το προηγούμενο κεφάλαιο της ιστορίας του v1 — το χτίσιμο δύο branded εφαρμογών από αυτό το ένα codebase — δες ένα codebase, δύο εφαρμογές: πώς να κάνεις white-label χωρίς fork (v1.7.1)· και για ολόκληρη την πορεία, η ανατομία της παράδοσης λογισμικού στην τελειότητα.