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

Heartbeat Pharmacy Platform

Lead Developer

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

Stack

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

Το σύστημα

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

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

  • Storefront: Next.js 16 App Router + Medusa SDK 2.14, Meilisearch search via Instantsearch, payment gateway checkout, Turnstile spam protection
  • Storefront API (Medusa backend): Medusa 2.14 με PostgreSQL + Redis + Meilisearch, payment gateway integrations, Resend email με React Email templates, PostHog analytics
  • 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, το 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
  • 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
Επικοινωνία