Marketplace B2B de medicamentos e insumos medicos para clinicas, hospitales, distribuidores y proveedores.
Translation pending
CommerceSCSS · TypeScriptGitHub @Suminia-TechOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗B2B marketplace for medical supplies and equipment. Next.js 16 App Router frontend using vertical modules with light layers, React 19, Redux Toolkit / RTK Query, and TypeScript.
# 1. Install dependencies
pnpm install
# 2. Set up environment
cp .env.example .env.local
# 3. Start the backend (separate repository)
# See suminia-backend README — it must be running on port 8001
# 4. Start development server
pnpm dev
The app runs at http://localhost:3000 and talks to the API at http://localhost:8001.
Suminia is a B2B marketplace connecting suppliers (manufacturers, importers) with buyers (clinics, hospitals, distributors) of medicines and medical supplies in Colombia.
This repository is the web frontend. It is organized in vertical business modules that
mirror the backend's NestJS modules — auth, catalog, orders mean the same thing on
both sides of the stack. Boundaries between layers are enforced by ESLint, not convention.
The project started from a commercial e-commerce template (Voxo). That template is
quarantined under src/_template/ and is deleted screen by screen as real ones replace
it. See ARCHITECTURE.md for the retirement plan.
eslint-config-next├── src/
│ ├── app/ # Next.js App Router — routes only, no business logic
│ │ ├── layout.js # Root layout + global metadata
│ │ ├── providers.tsx # Server/client boundary: Redux + session bootstrap
│ │ ├── api/ # Template mock backend (21 handlers, to be deleted)
│ │ └── (main)/
│ │ ├── (suminia)/ # Real product routes
│ │ └── (template)/ # Voxo demo routes, deleted piece by piece
│ ├── modules/ # Business modules (auth, catalog, suppliers, orders…)
│ │ └── auth/ # api/ model/ lib/ hooks/ ui/ index.ts
│ ├── shared/ # Cross-cutting, no business logic
│ │ ├── api/ # baseApi — the single HTTP client
│ │ ├── lib/ # tokenStorage, validators, apiError
│ │ ├── ui/ # Reusable components
│ │ ├── config/ # Environment variables
│ │ └── i18n/ # i18next configuration and locales
│ ├── store/ # configureStore + typed hooks
│ └── _template/ # Voxo template in quarantine (delete-only)
├── public/ # Static assets and Sass sources
├── ARCHITECTURE.md # Structural source of truth
├── CLAUDE.md # Conventions and commands
├── Dockerfile # Multi-stage production image
└── ecosystem.config.js # PM2 process definition
The dependency rule, enforced by ESLint:
app → modules → shared
Before you begin, ensure you have the following installed:
npm install -g pnpm)Clone the repository
git clone [email protected]:Suminia-Tech/suminia-frontend.git
cd suminia-frontend
Install dependencies
pnpm install
Set up environment
cp .env.example .env.local
Edit .env.local and point NEXT_PUBLIC_API_URL at your backend.
Start the development server
pnpm dev
Environment variables live in .env.local (git-ignored). See .env.example.
# Backend API
# Any variable consumed by the browser must be prefixed NEXT_PUBLIC_.
NEXT_PUBLIC_API_URL=http://localhost:8001
Environment variables are read in a single place — src/shared/config/env.ts. Do not read
process.env anywhere else.
# Development (hot reload)
pnpm dev
# Production build
pnpm build
# Serve the production build
pnpm start
# Lint, including the architecture boundary rules
pnpm lint
# Type check (no emit)
npx tsc --noEmit
# Build the application
pnpm build
Before considering anything finished:
npx tsc --noEmit && pnpm lint && pnpm build
A boundary violation fails pnpm lint exactly like a syntax error would. There are no
tests in the project yet — types are the safety net during refactors.
For structure, module anatomy, and data flow, see:
Every business module follows the same internal layout:
modules/<name>/
├── api/ RTK Query endpoints, via baseApi.injectEndpoints
├── model/ Domain types + state slice
├── lib/ Pure functions (validation, formatting, calculations)
├── hooks/ React hooks owned by the module
├── ui/ Screens (…Screen.tsx) and pieces (ProductCard.tsx)
└── index.ts Public API ← the only thing importable from outside
| Command | Description |
|---|---|
pnpm dev | Start development server |
pnpm build | Production build (Turbopack) |
pnpm start | Serve the production build |
pnpm lint | Lint, including boundary rules |
npx tsc --noEmit | Type check |
Product routes live in the (suminia) route group. Names in parentheses are Next route
groups — they never appear in the URL.
| Route | Description |
|---|---|
/ | Home |
/register | Company registration (buyer or supplier) |
/forgot-password | Request a password reset link |
/reset-password | Set a new password (arrives with ?token=) |
/verify-email | Verify email address (arrives with ?token=) |
Login has no route of its own: it is a modal available from anywhere in the app.
Routes under /shop/…, /blog/…, /product/…, /voxo_plus/… and /page/… are template
demos and will be removed.
Created by the backend seeder (make db-seed in suminia-backend). Their organizations
are already approved, so they can be used for end-to-end flows.
| Password | Role | |
|---|---|---|
[email protected] | SupAdm!n2026 | supplier_admin |
[email protected] | SupOper!2026 | supplier_operator |
[email protected] | BuyAdm!n2026 | buyer_admin |
[email protected] | BuyOper!2026 | buyer_operator |
[email protected] | S3crEtP4ssw0rd! | superuser |
[email protected] | S3crEtP4ssw0rd! | admin |
The header shows which account is active — "Mi cuenta (Administrador · Proveedor)" versus "(Operador · Proveedor)" — which matters when testing several accounts in parallel.
The build produces a Next standalone output (output: "standalone" in
next.config.mjs), which ships only the dependencies the server actually needs.
Docker — multi-stage build, runs as a non-root user, with a healthcheck:
docker build -t suminia-frontend .
docker run -p 3000:3000 -e NEXT_PUBLIC_API_URL=https://api.example.com suminia-frontend
PM2 — ecosystem.config.js defines the suminia-frontend process on port 3000.
CI/CD lives in .github/workflows/deploy.yaml.
NEXT_PUBLIC_*variables are inlined at build time, not read at runtime. Changing the API URL requires rebuilding the image.
Private and proprietary. This repository additionally contains a commercial template
(Voxo) under src/_template/, licensed to Suminia and not redistributable.