Case study
Πώς έχτισα το Theron
Πλατφόρμα διαχείρισης για γυμναστήρια και personal trainers, σχεδιασμένη και χτισμένη μόνος μου: το back office πάνω στο οποίο τρέχει το γυμναστήριο, και η εφαρμογή που χρησιμοποιούν τα μέλη του.
Άνοιγμα theronapp.comΤο πρόβλημα
Τα μικρά γυμναστήρια και οι ανεξάρτητοι προπονητές δουλεύουν με ένα Excel και ένα τετράδιο. Τα δεδομένα υπάρχουν — ποιος είναι μέλος, τι πληρώνει, πότε λήγει η συνδρομή του, τι σήκωσε την περασμένη εβδομάδα — αλλά είναι σε μορφή που δεν σηκώνει ερώτηση. Κανείς δεν ξέρει πόσες συνδρομές λήγουν αυτόν τον μήνα χωρίς να ανοίξει το αρχείο και να μετρήσει.
Οι εμπορικές πλατφόρμες που το λύνουν είναι τιμολογημένες για αλυσίδες, και το μεγαλύτερο μέρος αυτού που χρεώνουν είναι ακριβώς ό,τι δεν έχει ένα στούντιο είκοσι μελών: έλεγχος πρόσβασης με hardware, ταμείο, sales pipeline, marketing automation.
Τι έχτισα
Το Theron είναι δύο προϊόντα πάνω σε μία βάση. Το back office είναι σύστημα διαχείρισης γυμναστηρίου — μέλη, πλάνα, ανανεώσεις και τα προγράμματα που αναθέτει ο προπονητής — και η εφαρμογή μέλους είναι εκεί που ο πελάτης καταγράφει προπονήσεις και macros, ακόμη και φωτογραφίζοντας το πιάτο του.
Το κομμάτι των αναφορών ήταν ο λόγος που χτίστηκε. Η οθόνη διατήρησης απαντά ποιος πρέπει να ανανεώσει, ποιος έφυγε και πόσο κόστισε, ενώ ο πίνακας εσόδων σπάει τα έσοδα ανά μήνα και ανά πλάνο. Το μητρώο πελατών κρατάει ιστορικό, όχι στιγμιότυπο, ώστε η πρόοδος να είναι κάτι που βλέπεις και όχι κάτι που θυμάσαι.
Εξίσου σημαντικό είναι τι δεν κάνει. Δεν είναι ημερολόγιο κρατήσεων, δεν πουλάει συνδρομές σε ταμείο, και δεν τρέχει καμπάνιες marketing. Η σελίδα τιμών και οι σελίδες λειτουργιών το γράφουν ρητά, μαζί με τις γραμμές όπου η απάντηση είναι όχι.
Πώς είναι χτισμένο
Η εφαρμογή μέλους είναι React Native σε iOS και Android. Το marketing site και το dashboard του διαχειριστή είναι ένα codebase σε Next.js App Router, ώστε οι δημόσιες σελίδες και το προϊόν πίσω από login να μοιράζονται deploy και τύπους.
Το Supabase δίνει Postgres, auth και row-level security. Κάθε πίνακας που αγγίζει ένα γυμναστήριο περιορίζεται ανά οργανισμό στο επίπεδο της βάσης και όχι στον κώδικα της εφαρμογής, γιατί ένα λάθος σε ένα query δεν πρέπει να μπορεί να δείξει τη λίστα μελών του ενός γυμναστηρίου σε άλλο. Οι χρεώσεις τρέχουν σε Stripe, και τα όρια των πακέτων διαβάζονται από ένα κοινό module, ώστε η σελίδα τιμών και οι έλεγχοι στον server να μην αποκλίνουν ποτέ.
Η αναγνώριση τροφίμων προήλθε από τη διπλωματική μου — multi-task ResNet50 σε PyTorch που κάνει ταξινόμηση και παλινδρόμηση βάρους πάνω σε custom dataset 47 κατηγοριών — και είναι αυτό που έκανε ρεαλιστική την καταγραφή macros από φωτογραφία αντί για επίδειξη.
Τι κράτησα
Όταν χτίζεις μόνος, οι βαρετές αποφάσεις είναι οι ακριβές. Δύο αποδείχθηκαν ότι πληρώνουν τον εαυτό τους: μία και μόνο πηγή αλήθειας για οτιδήποτε χρεώνεται, και η ειλικρινής λίστα με το «αυτό δεν το κάνουμε» γραμμένη νωρίς, γιατί τελειώνει τις κόντρες που κάνεις με τον εαυτό σου στις δύο τα ξημερώματα.
Το προϊόν είναι live και δημόσιο, και οι τιμές είναι πάνω στο site αντί για πίσω από τηλεφώνημα πωλητή: theronapp.com/el/times-kostos.