I built a prompt library where every prompt shows its result first
Every AI trend comes with a prompt. A sherwani portrait, 3D balloon letters, a pet dancing next to a car. The prompt usually travels as a cropped screenshot, tuned for a different model than the one you use. You paste it and get something nothing like the picture. Prompt libraries have the same pro

Every AI trend comes with a prompt. A sherwani portrait, 3D balloon letters, a pet dancing next to a car. The prompt usually travels as a cropped screenshot, tuned for a different model than the one you use. You paste it and get something nothing like the picture.
Prompt libraries have the same problem in a tidier form: hundreds of prompts and no idea what any of them produce until you run them.
So I built aiprompts.page around one rule: show the result before the prompt.
A website prompt's "result" is a full HTML page written by a model. I wanted visitors to click around it, not look at a screenshot. That's untrusted code on my own domain.
Each demo is served from /demo/<slug> with its own Content-Security-Policy header:
Public pages (home, categories and every prompt) are statically generated with Next.js 16 and revalidated every 5 minutes. Every published prompt is prerendered at build time; prompts published later render on first visit and are then cached. Publishing, editing or deleting a prompt invalidates the catalog immediately, so new prompts show up at once without making every page dynamic.
One safety rule: if Supabase is unreachable during a build, the build fails instead of publishing an empty site. On Vercel the previous deployment keeps serving.
Anyone with an account can publish a prompt instantly, so the rules can't live only in the UI. They live in the database:
A SQL test suite starts a throwaway Postgres container, applies every migration and checks these rules on every push.
PromptAI runs on credits, and the experience I most wanted to avoid was paying for a reply that never arrived. So each request reserves the most it could cost, then settles to what it actually used:
Payments go through Razorpay, and credits are granted only after the payment is verified on the server. Prices are chosen server-side from the visitor's country, in 8 currencies, so the browser never sends a price.
Next.js 16 (App Router, React 19, React Compiler) · Supabase (Postgres, Auth, Storage) · Tailwind CSS v4 · TypeScript · Zod · Vitest · Playwright · Razorpay · Vercel
More trend prompts every week and better search. If you try it, I'd love to know which prompt you'd want to see next.