OpenLinker
OpenLinker keeps orders, inventory and fulfilment in sync across your store, marketplaces, invoicing and shipping. Self-hosted, Apache 2.0.
PharmaOS: 청구, 재고, 만료일, 구매, 고객 외상, GST 인보이스, 보고서, 다중 지점 관리를 위한 약국 관리 소프트웨어
PharmaOS by ChefoTech is pharmacy management software for billing, inventory, batches and expiry, purchases, customer credit (Baki), GST invoices, reports and multi-outlet control, with an optional AI
커머스TypeScript · JavaScriptGitHub @chefoindia온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기ChefoTech Inventory Management is a best platform to manage the inventory
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
PharmaOS — Pharmacy Management & Operations Platform
A ChefoTech product.
A multi-tenant, multi-outlet operating platform for pharmacies: products with batches and expiry, keyboard-first POS, purchases and GRN, credit (Baki), returns, transfers, prescriptions, documents, reports and analytics.README 전문 보기 ↗A ChefoTech product.
A multi-tenant, multi-outlet operating platform for pharmacies: products with batches and expiry, keyboard-first POS, purchases and GRN, credit (Baki), returns, transfers, prescriptions, documents, reports and analytics.
Status: Phases 0–9, 11 and 12 complete; Phase 10 (hardening) in progress. Every module in the sidebar is live end to end: catalogue, inventory with batches and FEFO, purchases and GRN, keyboard-first POS with credit and held bills, returns and transfers, prescriptions, PDF documents with a drag-and-drop template designer, invoice email, import/export, 33 reports, dashboard, notifications and plans. See docs/PHASES.md for what each phase delivers and what remains.
| Path | What |
|---|---|
apps/api | Node.js + TypeScript REST API (Express 5, Mongoose 9, zod 4, pino) |
apps/web | Next.js App Router frontend (Tailwind v4, Radix primitives, TanStack Query) |
packages/shared | Types, zod schemas, permission catalog, money/quantity helpers shared by both |
docs/ | Architecture, data model, API, security, frontend, edge cases, phases, ADRs |
Requirements: Node 20+, pnpm 10, a MongoDB replica set (Atlas or a local rs0; transactions are required).
pnpm install
cp apps/api/.env.example apps/api/.env # fill MONGODB_URI, JWT_ACCESS_SECRET, (optional) BREVO/CLOUDINARY
cp apps/web/.env.example apps/web/.env.local
pnpm --filter @pharmaos/shared build
pnpm dev # api on :4000, web on :3000
Open http://localhost:3000, click Start free trial, and register your organization. The first user becomes the Owner with a default MAIN outlet and the system roles seeded.
Each organization can connect its own Google Gemini API key under Settings → AI & Gemini. That unlocks a page-aware assistant (English / Hindi / Hinglish), invoice and prescription reading, natural-language reports and reorder suggestions. The key is encrypted at rest, never returned to the browser, and the assistant can only do what the signed-in user can already do; money and stock never move without a confirmation click. Without a key the platform runs exactly as before. Details in docs/PHASES.md (Phase 11) and docs/SECURITY.md.
The marketing site (home, features, solutions, pricing, FAQ, demo, contact, legal) lives in apps/web/src/app/(marketing). PharmaOS is presented as a ChefoTech product. The company details (contact person, phones, WhatsApp, inboxes, offices) and the emblem are defaults in apps/web/src/lib/site.ts; override or hide any of them with the NEXT_PUBLIC_* variables in apps/web/.env.local (see .env.example) — an empty value hides that item. Refresh product screenshots with node apps/web/scripts/capture-screenshots.mjs while the dev servers run.
pnpm typecheck # all packages
pnpm test # shared unit tests + api integration tests (in-memory Mongo replica set)
pnpm lint
pnpm build
orgFilter / outletFilter (apps/api/src/lib/scoped.ts). organizationId always comes from the token, never from the client.mongoose.sanitizeFilter is on globally; server-built operator filters are marked trusted via trustedFilter.requirePermission on the API; the web app only uses them to shape the UI.withTransaction and created through endpoints guarded by idempotent().AuditLog entry.More: docs/ARCHITECTURE.md, docs/DATA-MODEL.md, docs/API.md, docs/SECURITY.md, docs/FRONTEND.md, docs/EDGE-CASES.md, docs/adr/.