{"kind":"post","path":"/blog/lunatecz","post":{"metadata":{"title":"Lunatecz Client Website","summary":"A cinematic Next.js platform for an artist and company running shows, events, services, shop flows, and wearable lighting products.","publishedAt":"2025-12-19","projectDate":"2025-08-19","ascent":"#F45C7A","links":[{"label":"Live site","href":"https://lunatecz.com","type":"website"},{"label":"Instagram","href":"https://www.instagram.com/lunaivanaa","type":"social"},{"label":"YouTube","href":"https://youtube.com/c/LUNAflyttefrem","type":"social"}],"tags":["nextjs","commerce","events","stripe","webdev","fullstack"],"weight":20},"slug":"lunatecz","content":"\u003c!-- cover: /images/blog/lunatecz/cover.png --\u003e\n\nLunatecz is the public site and operating platform for Luna Ivana. It joins an artist portfolio with events, services, products, inquiries, and admin tools.\n\n## Visual Proof\n\n\u003cdiv className=\"bp-evidence-grid\" data-preview-gallery=\"true\"\u003e\n\u003cimg src=\"/images/blog/lunatecz/home_screen.png\" alt=\"Lunatecz home viewport screenshot\" /\u003e\n\u003cimg src=\"/images/blog/lunatecz/shop_screen.png\" alt=\"Lunatecz shop viewport screenshot\" /\u003e\n\u003cimg src=\"/images/blog/lunatecz/home_full.png\" alt=\"Lunatecz full home page screenshot\" className=\"preview-full\" /\u003e\n\u003cimg src=\"/images/blog/lunatecz/shop_full.png\" alt=\"Lunatecz full shop page screenshot\" className=\"preview-full\" /\u003e\n\u003c/div\u003e\n\n## Product Scope\n\nThe public site uses full-width performance images, dark surfaces, bright LED color, and editorial type. Business actions stay clear within that visual style.\n\n- Events support several date formats.\n- The shop supports stock, carts, checkout, and orders.\n- Contact forms create a clear inquiry path.\n- Admin pages manage events, media, products, posts, customers, and orders.\n\n\u003cdiv className=\"bp-evidence-grid bp-evidence-grid--compact\" data-preview-gallery=\"true\"\u003e\n\u003cimg src=\"/images/blog/lunatecz/about_full.png\" alt=\"Lunatecz full about page screenshot\" className=\"preview-full\" /\u003e\n\u003cimg src=\"/images/blog/lunatecz/blog_full.png\" alt=\"Lunatecz full blog page screenshot\" className=\"preview-full\" /\u003e\n\u003c/div\u003e\n\n## Architecture\n\nThe stack uses Next.js 16, React 19, TypeScript, Tailwind CSS 4, Drizzle, PostgreSQL, Clerk, Stripe, Redis, and Sentry.\n\nThe App Router separates public pages, admin pages, and API routes. Controllers own business rules. The Drizzle schema models contacts, posts, events, products, customers, carts, and orders.\n\n## Safe Checkout\n\nThe checkout route validates its input and allowed redirect hosts. It reads product prices from PostgreSQL instead of trusting prices from the browser.\n\nThe Stripe webhook verifies its signature and handles repeat events by session ID. It then saves the customer and order snapshot, creates order items, and reduces stock.\n\nClerk and role checks protect admin routes. Redis caching has a local fallback, while Sentry reports production errors."}}