Εργοδότης Pre-launch 2024–present

Heartbeat Pharmacy Platform

Lead Developer

Πλήρης πλατφόρμα e-commerce για ελληνικό φαρμακείο, ιδιόκτητη (όχι SaaS χρεώσεις ανά συναλλαγή), με regulatory δεδομένα να ρέουν αυτόματα και AI να συντομεύει το SKU enrichment από μέρες σε ώρες.

Stack

  • Medusa 2.14
  • Next.js 16
  • PostgreSQL
  • Pharma SOAP API
  • MCP server
  • Anthropic SDK
  • Browser automation
  • Windows Service
Heartbeat Pharmacy Platform

Το σύστημα

Το Heartbeat Pharmacy χρειαζόταν ηλεκτρονικό κατάστημα που θα ξεκινούσε με πραγματικά regulatory φαρμακευτικά δεδομένα να ρέουν αυτόματα, θα δεχόταν πληρωμές χωρίς να χάνει margin σε SaaS προμηθευτή, και θα επέτρεπε σε έναν άνθρωπο να διαχειρίζεται χιλιάδες SKUs χωρίς να πληκτρολογεί κάθε περιγραφή με το χέρι. Έχτισα έξι ολοκληρωμένα συστήματα για να φτάσουμε εκεί: το Next.js 16 storefront που βλέπουν οι πελάτες, το Medusa 2.14 commerce backend που το τρέχει (αντικαθιστώντας ένα Shopify Plus που θα κόστιζε ανά συναλλαγή), ένα AI-augmented Product Information Management σύστημα σε Express 5 + TypeORM, το React 19 admin που χρησιμοποιεί καθημερινά η ομάδα του φαρμακείου, ένα Node 22 Windows Service που συγχρονίζει stock από τον on-site SQL Server κάθε 15 λεπτά, και την ενσωμάτωση των regulatory φαρμακευτικών δεδομένων. Όλα σε production στο theheartbeat.gr, όλα ιδιόκτητα από το φαρμακείο.

Αρχιτεκτονική

  • Storefront: Next.js 16 App Router + Medusa SDK 2.14, Meilisearch search via Instantsearch, PayPal checkout, Turnstile spam protection
  • Storefront API (Medusa backend): Medusa 2.14 με PostgreSQL + Redis + Meilisearch, PayPal payment, Resend email με React Email templates, PostHog analytics, SOAP ενσωμάτωση φαρμακευτικών δεδομένων για master-data lookups
  • Product Information Management (PIM) backend: Express 5 + TypeORM + Postgres, embedded MCP server για AI agent access (@modelcontextprotocol/sdk), Anthropic SDK + Google GenAI για product enrichment, headless browser automation για άντληση καταλόγων, BullMQ + Redis queues, S3 για assets
  • PIM admin frontend: React 19 + Vite + TanStack (Router/Query/Table/Virtual), shadcn/ui (full Radix set), Tiptap rich-text editor, dnd-kit drag-and-drop, kbar command palette, Recharts dashboards, served behind nginx
  • product-sync Windows Service: Node 22 daemon που συγχρονίζει on-site SQL Server (stock + orders) σε remote API + Skroutz XML feed κάθε 15 λεπτά, με transactional idempotency, DRY_RUN mode, LockManager, CircuitBreaker, Winston logging

Η συνεισφορά μου

Παρέδωσα ολόκληρο το stack ως Lead Developer, χωρίς άλλον developer στο project. Η δική μου αρχιτεκτονική απόφαση ήταν να σπάσω το σύστημα σε έξι μικρά παραγωγικά κομμάτια αντί για ένα μεγάλο monolith, και έχτισα το καθένα: το commerce backend με την ενσωμάτωση των regulatory δεδομένων, το AI-augmented PIM που επιτρέπει σε έναν άνθρωπο να διαχειρίζεται χιλιάδες SKUs, το admin frontend που η ομάδα του φαρμακείου ανοίγει κάθε μέρα, και το Windows Service που κρατάει τα stock συγχρονισμένα με το in-store ERP. Η τεχνολογία υπηρέτησε τους στόχους: BullMQ για άντληση supplier καταλόγων χωρίς timeouts, AES-secured credentials για supplier accounts, transactional idempotency στο sync service ώστε μια στιγμιαία απώλεια δικτύου να μην παραποιήσει τις απογραφές, embedded MCP server που επιτρέπει σε Claude agents να εμπλουτίσουν τον κατάλογο χωρίς να εκτεθεί το backend στο δημόσιο internet. Κάθε component έχει τα production essentials (daily-rotating logs, DRY_RUN mode, circuit breakers, παραγωγή Skroutz feed), ώστε το σύστημα να τρέχει χωρίς να το επιβλέπει κανείς.

Stack λεπτομέρειες

Το πιο ενδιαφέρον κομμάτι είναι ο embedded MCP server μέσα στο PIM backend (μέσω @modelcontextprotocol/sdk): οι Claude agents κάνουν direct tool calls στον κατάλογο προϊόντων χωρίς ενδιάμεσο REST hop, οπότε το AI enrichment τρέχει inline αντί για out-of-band scripts. Headless browser automation χειρίζεται τα supplier feeds που δεν εκθέτουν API, πίσω από per-supplier rate limiting. Για τα integration tests χρησιμοποιώ Testcontainers, πραγματική Postgres σε Docker per test run, χωρίς mocks. Το multi-stage Docker build εξασφαλίζει ότι τα production images δεν περιέχουν dev dependencies.

Αποτελέσματα

  • Πλήρες stack από API → admin → storefront έτοιμο για launch
  • Επαληθευμένη ενσωμάτωση ελληνικών φαρμακευτικών δεδομένων: διαφοροποίηση που οι περισσότερες Medusa builds δεν έχουν
  • AI-augmented product enrichment (Anthropic + Google) μειώνει manual data entry για χιλιάδες SKUs
  • Production cutover discipline (transactional sync, circuit breakers, daily-rotating logs)

Πρόκληση

Η πιο σύνθετη πρόκληση ήταν ο σχεδιασμός του embedded MCP server μέσα στο PIM backend. Ο στόχος ήταν να μπορεί ένας AI agent (Claude) να έχει direct access στον product catalog για enrichment tasks, χωρίς intermediate REST calls και χωρίς να εκθέτω το backend σε εξωτερικό δίκτυο. Η λύση: το PIM backend τρέχει παράλληλα ένα MCP server process μέσω @modelcontextprotocol/sdk, εκθέτοντας tools όπως get_product, update_description, enrich_batch. Ο agent συνδέεται μέσω stdio transport, local IPC, χωρίς HTTP overhead. Το δύσκολο κομμάτι ήταν η διαχείριση shared state: το MCP layer και το REST layer χρησιμοποιούν τον ίδιο TypeORM data source, οπότε transactions πρέπει να είναι safe από αμφότερα. Έλυσα αυτό μέσω explicit transaction scoping και read-only mode στα MCP tools που δεν χρειάζονται writes.

Σύνδεσμοι

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

  • Kleidarakos B2B & Papanikolaou Doors: άλλη μεγάλη commerce build, αλλά B2B αντί B2C
  • WooCommerce Plugins για pooq.gr: άλλο pharma-adjacent commerce work σε WordPress αντί Medusa
Επικοινωνία