Security
KhaataPOS binds sessions to a workspace. Public pages never accept a client-selected role as authority.
Each business is a tenant. Staff JWTs carry that tenant. Requests that do not match are rejected. Customer storefront sessions are scoped to the shop they signed into — not the whole platform.
Public shop logos and catalog images are stored on Cloudinary when those keys are configured. Sensitive documents use authenticated storage, not the public CDN.