2026 · ενημέρωση 29 Σεπ 2026
ixnos-data
Πού πάνε τα λεφτά; Οι ελληνικές δημόσιες δαπάνες, με αναζήτηση στα ελληνικά ή σε greeklish.
Το πρόβλημα
Οι διαγωνισμοί (ΚΗΜΔΗΣ) και οι αποφάσεις δαπανών (Διαύγεια) είναι ήδη δημόσιοι, αλλά δύσκολα αναζητούνται, είναι γραμμένοι σε πυκνά διοικητικά ελληνικά και δεν φτάνουν σε κανέναν. Μια μικρή επιχείρηση δεν έχει εύκολο τρόπο να μάθει ότι μια κοντινή αρχή μόλις δημοσίευσε διαγωνισμό για αυτό που πουλάει.
Υπάρχουν επί πληρωμή συλλέκτες. Ήθελα έναν δωρεάν, ανοιχτού κώδικα, με δημόσιο API, που διαβάζει και τις δύο πηγές και συνδέει έναν διαγωνισμό με την κατακύρωση, τη σύμβαση και την πληρωμή του.
Πώς δουλεύει
- ΚΗΜΔΗΣ APIΔιαύγεια API
- Εισαγωγή σε Python
- PostgreSQL 16
- .NET 10 APIΕιδοποιήσεις .NET
- Web app σε Next.jsΣυνόψεις emailΔημόσιο API
Τέσσερις υπηρεσίες μοιράζονται μία βάση PostgreSQL και τίποτε άλλο, οπότε η καθεμία μπορεί να πέσει και να γίνει deploy μόνη της. Το pipeline φέρνει, ελέγχει και κάνει upsert· το API διαβάζει με χειρόγραφο SQL για την αναζήτηση και EF Core για τις εγγραφές· οι ειδοποιήσεις είναι μια διεργασία μίας εκτέλεσης από το cron, οπότε μια βλάβη στο email δεν μπορεί ποτέ να ρίξει το site.
Τα δύσκολα σημεία
- 01
Ελληνική αναζήτηση που συγχωρεί
Ο κόσμος γράφει «καθαρισμος», «katharismos» ή «κλιματηστικών». Ένας κοινός normaliser για Python και .NET, δοκιμασμένος στα ίδια παραδείγματα, ενοποιεί τόνους, τελικό σίγμα και λατινικά γράμματα που μοιάζουν με ελληνικά. Η αναζήτηση πλήρους κειμένου της PostgreSQL με ελληνικό stemmer καλύπτει τις κλίσεις, η ομοιότητα trigram τα ορθογραφικά λάθη και τα φωνητικά κλειδιά τα greeklish. Ένα σύνολο 56 πραγματικών ερωτημάτων πετυχαίνει precision@10 από 0,84 έως 1,00, και το deploy αποτυγχάνει αν πέσει.
- 02
Δύο πηγές, ίδια χρήματα, διαφορετική περιγραφή
Το ΚΗΜΔΗΣ δίνει ποσά χωρίς ΦΠΑ, η Διαύγεια με ΦΠΑ, και οι κατακυρώσεις της Διαύγειας επαναλαμβάνουν αυτές του ΚΗΜΔΗΣ. Τα δύο κρατιούνται χωριστά, με ετικέτα, και συνδέονται μέσω ΑΦΜ αντί να αθροίζονται. Οι διορθώσεις στη Διαύγεια δείχνουν την απόφαση που αντικαθιστούν με ένα εσωτερικό ID έκδοσης και όχι με τον δημόσιο αριθμό της, και το pipeline το επιλύει με όποια σειρά κι αν φτάσουν.
- 03
Μέτρηση πριν από τη μοντελοποίηση
Πριν από οποιοδήποτε σχήμα, δοκιμαστικές λήψεις έφεραν έξι μήνες ΚΗΜΔΗΣ και τρεις εβδομάδες Διαύγειας: 614.000 εγγραφές. Έτσι έμαθα ότι οι τίτλοι κόβονται στους 100 χαρακτήρες, ότι ο τόπος εκτέλεσης διαφέρει από τη διεύθυνση της αρχής στο 15% των προκηρύξεων, ότι το ΚΗΜΔΗΣ απαντά 404 για μέρες χωρίς ακόμα εγγραφές, και ότι κάποιες πληρωμές είναι τυπογραφικά λάθη άνω των 100 εκατ. €.
- 04
Ειδοποιήσεις που δεν στέλνονται ποτέ δύο φορές
Η σύνοψη καταγράφει τις αποστολές και το checkpoint της πριν στείλει, οπότε μια κατάρρευση ή μια επανεκτέλεση μπορεί να χάσει το πολύ ένα email και ποτέ να μην επαναλάβει κάποιο. Η σύνδεση γίνεται με σύνδεσμο μέσω email, και αποθηκεύονται μόνο hashes των tokens συνδέσμων, συνεδριών και κλειδιών API.
Αποφάσεις και συμβιβασμοί
Η βάση είναι το μόνο σημείο ενοποίησης
Χωρίς message bus και χωρίς κλήσεις μεταξύ υπηρεσιών. Κοστίζει λίγη ευελιξία, αλλά τέσσερις διεργασίες που μοιράζονται μόνο ένα σχήμα είναι εύκολες στην κατανόηση και τρέχουν άνετα σε ένα μηχάνημα.
Ιδιωτικότητα από τον σχεδιασμό
Τα δημόσια αρχεία αναφέρουν ονόματα ατομικών επιχειρήσεων. Εμφανίζονται στις εγγραφές όπου υπάρχουν, ποτέ σε δική τους σελίδα· το API δεν επιστρέφει ποτέ ΑΦΜ αναδόχων, και οι μαζικές εξαγωγές δεν περιέχουν καθόλου στοιχεία αναδόχων.
Στατική έκδοση χωρίς server
Κάθε τρεις ώρες ένα workflow του GitHub Actions επαναφέρει μια κρυπτογραφημένη βάση εργασίας, φέρνει νέες εγγραφές με το ίδιο pipeline και γράφει το site ως απλά αρχεία. Οι ειδοποιήσεις γίνονται RSS feeds και δεν υπάρχει API, αλλά η αναζήτηση, οι σελίδες φορέων και τα σήματα λειτουργούν κανονικά.
Ουδέτερα σήματα, όχι κατηγορίες
Ένας ανταγωνιστικός διαγωνισμός με μία μόνο προσφορά, ή μια απευθείας ανάθεση λίγο κάτω από το νόμιμο όριο, σημειώνεται ως κάτι που αξίζει δεύτερη ματιά, χωρίς ετυμηγορία. Το συμπέρασμα το βγάζει ο αναγνώστης.
Τι δεν κάνει ακόμα
- Η πλήρης έκδοση, με λογαριασμούς, ειδοποιήσεις email και κλειδιά API, είναι έτοιμη και δοκιμασμένη από άκρη σε άκρη αλλά δεν έχει γίνει ακόμα deploy· αυτό που τρέχει είναι η στατική έκδοση.
- Το όνομα μπορεί ακόμα να αλλάξει πριν το λανσάρισμα.