LUMOSAI

View repository ↗

Six AI tools under one login is not six demos with a shared navbar. Article generation, titles, images, background removal, object removal, and resume analysis have different inputs, vendors, and cost profiles, but they have to feel like one product and one bill. The gap was a real SaaS surface: auth, a plan, a monthly limit, and tools that actually return a stored result. Connecting to an API is easy. Making a free user hit a wall before the vendor is billed is the product.

LUMOSAI still 2

Feature gating on the client is not security. A user who calls the image route directly still has to be rejected before ClipDrop or Gemini runs. Limits are per tool and per month, so the check belongs in middleware, not in a React disabled state. PDFs for the resume analyser need size validation and a parse step that text tools never see. Neon was chosen because a always-on Postgres instance for a side SaaS is idle cost; Clerk was chosen because OAuth, session, and subscription metadata are one SDK instead of three services.

LUMOSAI still 3

The stack is PERN: React, Node/Express, Neon Postgres. Clerk owns auth and plan; the UI hides premium routes and the API validates the same plan before any vendor call. Text tools go to Gemini and persist in Neon; image tools go ClipDrop then Cloudinary; the resume path is Multer, parse, Gemini. Vercel hosts it — a bypass of the frontend still hits the limit check.

Six tools is a product problem because the shared object is the subscription, not the UI kit. Client gating without a server check is a screenshot of a SaaS. Neon’s serverless model only pays off if every request is short — a resume parse that holds a connection is a different cost shape than a title generate. Clerk removed a month of auth work; it did not remove the need to treat subscription as a backend invariant.