SynapStore is a modern, role-aware pharmacy and inventory management platform designed to connect store owners, suppliers, and administrators through a single coherent system. It focuses on correctness, traceability, and real-world operational flow rather than just CRUD abstractions.
The system is built to scale from a single pharmacy to a multi-store, multi-supplier network with strong data guarantees and event driven notifications.
Most inventory systems fail not because of missing features, but because they ignore how businesses actually operate.
SynapStore is designed around real flows:
- A user becomes a store owner by creating a store
- A supplier independently registers and connects to stores
- Inventory moves with purpose (sale, receipt, return, damage)
- Every important action is visible, auditable, and notified
The goal is not dashboards. The goal is clarity and control.
SynapStore enforces role boundaries at both API and UI levels.
-
Super Admin System level control. User moderation, store oversight, supplier governance.
-
Admin Operational administration with restricted system access.
-
Store Owner Owns a store, manages inventory, accepts suppliers, handles reorders.
-
Supplier Connects to stores, uploads medicines, responds to reorders.
-
Manager / Staff / Read Only Granular permissions for day to day operations.
No role exists only in name. Every role maps to explicit permissions.
Each store and supplier is uniquely identified by a slug, enabling:
-
Dedicated dashboards
/store/{slug}/dashboard/supplier/{slug}/dashboard -
Public, unauthenticated preview pages with partial information
-
Clean URL sharing without exposing internal IDs
- OTP based authentication
- Google OAuth for users and store owners
- Explicitly blocked Google login for Admin and Supplier roles
- JWT based session management
- Store scoped context resolution on every request
- Supplier registers independently
- Supplier browses all available stores
- Supplier sends a connection request
- Store owner accepts or rejects
- Notifications sent via email and in-app system
- Supplier gains scoped access to the store
No silent access. No implicit trust.
- Batch based inventory
- Expiry tracking
- FEFO compliance
- Stock movements with explicit reasons
- Damage and return handling
- Supplier uploads via structured Excel templates
Inventory is treated as a ledger, not a counter.
-
Redis backed queue
-
Guaranteed delivery semantics
-
Email and in-app notifications
-
Event driven triggers for:
- Supplier requests
- Inventory uploads
- Reorders
- Alerts (low stock, expiry, violations)
This is a system, not a toast message.
- Node.js + Express
- TypeScript
- Prisma ORM
- PostgreSQL
- Redis (queues and notifications)
- Zod for validation
- React
- TypeScript
- Modern state management
- Role driven UI rendering
- Slug based routing
- Docker for local services
- Environment driven configuration
- Clean separation of services
backend/
├─ src/
│ ├─ routes/
│ ├─ middleware/
│ ├─ lib/
│ ├─ services/
│ └─ prisma/
└─ index.ts
frontend/
├─ src/
│ ├─ components/
│ ├─ pages/
│ ├─ state/
│ └─ utils/
Structure favors discoverability over cleverness.
- Explicit over implicit
- Flows over features
- Data integrity over speed shortcuts
- Real business logic over demo logic
- Systems should explain themselves through structure
SynapStore is under active development. The architecture is stable, features are evolving, and scalability is a first-class concern.
This is not a demo project. It is being built to survive real usage.