2026 · ενημέρωση 12 Σεπ 2026
tabsesh
Εξήντα καρτέλες, μία εντολή που αναιρείται.
Το πρόβλημα
Κατέληγα συνεχώς με 60+ καρτέλες σε τρία παράθυρα. Οι περισσότεροι tab managers είναι είτε αντίγραφο της γραμμής σελιδοδεικτών είτε συνδρομή με οθόνη σύνδεσης.
Ήθελα κάτι που κρατά τα πάντα στους σελιδοδείκτες του ίδιου του browser, δουλεύει από το πληκτρολόγιο και δεν κάνει ποτέ σιωπηλά κάτι καταστροφικό: το κλείσιμο 40 καρτελών πρέπει να αναιρείται, όχι να είναι στοίχημα.
Πώς δουλεύει
- PopupΕφαρμογή πλήρους σελίδαςΓρήγορο overlay
- src/lib/core
- chrome.bookmarkstabs · tabGroups · alarmschrome.storage.local
Κάθε σημείο εισόδου καλεί τις ίδιες συναρτήσεις στο src/lib/core, που δεν έχει καθόλου Svelte. Ένα bug που διορθώνεται εκεί διορθώνεται ταυτόχρονα στο GUI και στο τερματικό, και κανένα από τα δύο δεν μπορεί να αποσυγχρονιστεί από το άλλο.
Τα δύσκολα σημεία
- 01
Χρονόμετρα που επιβιώνουν τον service worker
Ένας service worker του Manifest V3 μπορεί να τερματιστεί ανά πάσα στιγμή, και ένα setTimeout πεθαίνει μαζί του. Οι συνεδρίες συγκέντρωσης χρησιμοποιούν το chrome.alarms, το μόνο χρονόμετρο που επιβιώνει την επανεκκίνηση, οπότε μια συνεδρία 25 λεπτών ολοκληρώνεται κανονικά.
- 02
Tests για APIs που δεν τα προσομοιώνει κανείς
Τα ψεύτικα APIs επεκτάσεων που προτείνει το WXT δεν υλοποιούν καθόλου bookmarks ή tabGroups, αφού οι περισσότερες επεκτάσεις δεν τα αγγίζουν. Έγραψα ένα μικρό fake στη μνήμη μόνο για αυτά τα δύο, φτιαγμένο γύρω από όσα πραγματικά καλεί ο κώδικας.
- 03
Δύο bugs πριν την κυκλοφορία
Τα 73 tests έπιασαν το undoLastDelete να επαναφέρει λάθος φάκελο όταν δύο διαγραφές έπεφταν στο ίδιο χιλιοστό του δευτερολέπτου, που διορθώθηκε με σταθερό κριτήριο ισοβαθμίας, και ένα bug στο ίδιο το fake-browser, όπου το tabs.remove() έψαχνε παράθυρο με το id της καρτέλας.
Αποφάσεις και συμβιβασμοί
Οι σελιδοδείκτες ως βάση δεδομένων
Ο συγχρονισμός μεταξύ συσκευών έρχεται δωρεάν και δεν υπάρχει τίποτα για μεταφορά ή backup. Το κόστος: τα ονόματα φακέλων πρέπει να είναι μοναδικά σε όλο το δέντρο, αφού οι εντολές βρίσκουν τους φακέλους με το όνομα.
Ήπια διαγραφή παντού
Το rm μεταφέρει τους φακέλους σε κρυφό κάδο για 48 ώρες. Ένα εργαλείο πληκτρολογίου κάνει ένα λάθος πάτημα πολύ εύκολο· η αναστρεψιμότητα από προεπιλογή είναι καλύτερη από ένα παράθυρο επιβεβαίωσης που δεν διαβάζει κανείς.
Token χρήστη αντί για OAuth
Ο διαμοιρασμός ενός φακέλου ως Gist χρησιμοποιεί προσωπικό token με δικαίωμα μόνο για gist, κι έτσι όλη η επέκταση μένει χωρίς server.
Δικαιώματα μόνο για τον σκοπό τους
Το <all_urls> υπάρχει μόνο για τη συντόμευση του overlay· τα alarms και notifications μόνο για τις συνεδρίες συγκέντρωσης. Το καθένα εξηγείται στο README.
Τι δεν κάνει ακόμα
- Δεν υπάρχει ακόμα έκδοση για Firefox, αν και το WXT την υποστηρίζει· έχω δοκιμάσει μόνο Chrome.
- Η εκτίμηση της μνήμης που ελευθερώθηκε εξαρτάται από το chrome.processes, που δεν το έχει κάθε έκδοση Chromium· όταν λείπει, ο αριθμός απλώς δεν εμφανίζεται.