1:"$Sreact.fragment" 2:I[65875,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js"],"ThemeProvider"] 3:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/247eb132b7f7b574.js"],"default"] 4:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/247eb132b7f7b574.js"],"default"] 5:I[71311,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js"],"FloatingActions"] 6:I[20158,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js"],"Analytics"] 7:I[34863,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js"],"Toaster"] 8:I[79799,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js"],"ModalProvider"] 9:I[3995,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js","/_next/static/chunks/95a5e382a1e8200a.js","/_next/static/chunks/06fe5961b16f81d0.js","/_next/static/chunks/8c955ce35598c7b8.js"],"MainNav"] 10:I[68027,[],"default"] :HL["/_next/static/chunks/98b318e576119eda.css","style"] :HL["/_next/static/chunks/9f6b77641f836b5a.css","style"] :HL["/_next/static/media/83afe278b6a6bb3c-s.p.3a6ba036.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/_next/static/media/CalSans_SemiBold-s.p.4d9d14e3.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/_next/static/media/f6a709d5935db663-s.p.529c3631.woff2","font",{"crossOrigin":"","type":"font/woff2"}] 0:{"P":null,"b":"pOVubU_Kt6m3SrfLgqzM-","c":["","blogs","niya-saas-starter-template"],"q":"","i":false,"f":[[["",{"children":["(root)",{"children":["blogs",{"children":[["slug","niya-saas-starter-template","d"],{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/98b318e576119eda.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0a3f498ef71c618e.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/61bc785dc6bd3109.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/a676f0ced11453e9.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/_next/static/chunks/4b778b2e48718709.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","head",null,{"children":[["$","link",null,{"rel":"icon","href":"/portfolio/logos/logo-3.png","media":"(prefers-color-scheme: light)"}],["$","link",null,{"rel":"icon","href":"/portfolio/logos/logo-4.png","media":"(prefers-color-scheme: dark)"}]]}],["$","body",null,{"suppressHydrationWarning":true,"className":"min-h-screen bg-background font-sans antialiased inter_dd475d0c-module__9A3jha__variable fontheading_82debfef-module__MkcH8W__variable","children":["$","$L2",null,{"attribute":"class","defaultTheme":"dark","enableSystem":false,"themes":["light","dark","retro","cyberpunk","paper","aurora","synthwave"],"children":[["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}],["$","$L5",null,{}],["$","$L6",null,{}],["$","$L7",null,{}],["$","$L8",null,{}]]}]}],null]}]]}],{"children":[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/9f6b77641f836b5a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/95a5e382a1e8200a.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/06fe5961b16f81d0.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/8c955ce35598c7b8.js","async":true,"nonce":"$undefined"}]],["$","div",null,{"className":"flex min-h-screen flex-col bg-[#020617]","children":[["$","header",null,{"className":"sticky top-0 z-50 border-b border-white/10 bg-[#020617]/90 backdrop-blur","children":["$","div",null,{"className":"container flex h-20 items-center justify-between py-6","children":[["$","$L9",null,{"items":[{"title":"Home","href":"/"},{"title":"Projects","href":"/projects"},{"title":"Impact","href":"/#impact"},{"title":"Contact","href":"/#contact"}]}],["$","a",null,{"href":"/#contact","className":"hidden rounded-md bg-blue-600 px-4 py-2 text-sm font-semibold text-white transition hover:bg-blue-500 md:inline-flex","children":"Let's Talk"}]]}]}],["$","main",null,{"className":"container flex-1","children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],"$La","$Lb"]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":["$Lc",{"children":["$Ld",{"children":["$Le",{},null,false,false]},null,false,false]},null,false,false]},null,false,false]},null,false,false],"$Lf",false]],"m":"$undefined","G":["$10",[]],"S":true} 12:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/247eb132b7f7b574.js"],"OutletBoundary"] 13:"$Sreact.suspense" 15:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/247eb132b7f7b574.js"],"ViewportBoundary"] 17:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/247eb132b7f7b574.js"],"MetadataBoundary"] a:["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:1:props:style","children":404}] b:["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}] c:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] d:["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] e:["$","$1","c",{"children":["$L11",[["$","script","script-0",{"src":"/_next/static/chunks/15c613f0f258455e.js","async":true,"nonce":"$undefined"}]],["$","$L12",null,{"children":["$","$13",null,{"name":"Next.MetadataOutlet","children":"$@14"}]}]]}] f:["$","$1","h",{"children":[null,["$","$L15",null,{"children":"$@16"}],["$","div",null,{"hidden":true,"children":["$","$L17",null,{"children":["$","$13",null,{"name":"Next.Metadata","children":"$@18"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}] 19:I[88754,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js","/_next/static/chunks/95a5e382a1e8200a.js","/_next/static/chunks/06fe5961b16f81d0.js","/_next/static/chunks/8c955ce35598c7b8.js","/_next/static/chunks/15c613f0f258455e.js"],"ClientPageWrapper"] 1a:I[79520,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js","/_next/static/chunks/95a5e382a1e8200a.js","/_next/static/chunks/06fe5961b16f81d0.js","/_next/static/chunks/8c955ce35598c7b8.js","/_next/static/chunks/15c613f0f258455e.js"],""] 1c:I[73552,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js","/_next/static/chunks/95a5e382a1e8200a.js","/_next/static/chunks/06fe5961b16f81d0.js","/_next/static/chunks/8c955ce35598c7b8.js","/_next/static/chunks/15c613f0f258455e.js"],"AnimatedText"] 1d:I[22016,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js","/_next/static/chunks/95a5e382a1e8200a.js","/_next/static/chunks/06fe5961b16f81d0.js","/_next/static/chunks/8c955ce35598c7b8.js","/_next/static/chunks/15c613f0f258455e.js"],""] 1e:I[3601,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js","/_next/static/chunks/95a5e382a1e8200a.js","/_next/static/chunks/06fe5961b16f81d0.js","/_next/static/chunks/8c955ce35598c7b8.js","/_next/static/chunks/15c613f0f258455e.js"],"AnimatedSection"] 1b:T4aa,{"@context":"https://schema.org","@type":"BlogPosting","headline":"I Built a Free SaaS Starter Template — Here's Everything Inside","description":"Niya SaaS Template is a production-ready, open-source Next.js 15 starter kit with Supabase auth, Zustand, React Query, Magic UI animations, and clean architecture. Built for developers and AI startups who want to ship fast.","datePublished":"2025-02-20T00:00:00.000Z","dateModified":"2025-02-20T00:00:00.000Z","author":{"@type":"Person","name":"Hussein Maghrabi","url":"https://h-maghrabi.tech/","sameAs":["https://www.linkedin.com/in/hussein-maghrabi/","https://www.linkedin.com/in/hussein-maghrabi/"]},"publisher":{"@type":"Person","name":"Hussein Maghrabi","url":"https://h-maghrabi.tech/"},"url":"https://h-maghrabi.tech//blogs/niya-saas-starter-template","mainEntityOfPage":{"@type":"WebPage","@id":"https://h-maghrabi.tech//blogs/niya-saas-starter-template"},"image":"https://h-maghrabi.tech//projects/niya/logo.png","keywords":"Next.js, SaaS, Supabase, Open Source, Boilerplate","wordCount":827,"timeRequired":"PT8M","inLanguage":"en-US","isPartOf":{"@type":"Blog","name":"Hussein Maghrabi's Blog","url":"https://h-maghrabi.tech//blogs"}}11:["$","$L19",null,{"children":[["$","$L1a",null,{"id":"schema-blog-post","type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"$1b"}}],["$","$L1a",null,{"id":"schema-breadcrumb-post","type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https://h-maghrabi.tech/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blogs\",\"item\":\"https://h-maghrabi.tech//blogs\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"I Built a Free SaaS Starter Template — Here's Everything Inside\",\"item\":\"https://h-maghrabi.tech//blogs/niya-saas-starter-template\"}]}"}}],["$","article",null,{"className":"max-w-3xl mx-auto px-4 sm:px-6 py-8","children":[["$","$L1c",null,{"delay":0,"children":["$","nav",null,{"aria-label":"Breadcrumb","className":"mb-6","children":["$","ol",null,{"className":"flex items-center gap-1.5 text-sm text-muted-foreground","children":[["$","li",null,{"children":["$","$L1d",null,{"href":"/","className":"hover:text-foreground transition-colors","children":"Home"}]}],["$","li",null,{"aria-hidden":"true","children":["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-chevron-right w-3.5 h-3.5","children":[["$","path","mthhwq",{"d":"m9 18 6-6-6-6"}],"$undefined"]}]}],["$","li",null,{"children":["$","$L1d",null,{"href":"/blogs","className":"hover:text-foreground transition-colors","children":"Blogs"}]}],["$","li",null,{"aria-hidden":"true","children":["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-chevron-right w-3.5 h-3.5","children":[["$","path","mthhwq",{"d":"m9 18 6-6-6-6"}],"$undefined"]}]}],["$","li",null,{"className":"text-foreground font-medium truncate max-w-[200px] sm:max-w-[300px]","aria-current":"page","children":"I Built a Free SaaS Starter Template — Here's Everything Inside"}]]}]}]}],["$","$L1e",null,{"direction":"up","children":["$","header",null,{"className":"mb-8","children":[["$","div",null,{"className":"flex flex-wrap gap-2 mb-4","children":[["$","span","Next.js",{"className":"inline-flex items-center px-2.5 py-1 rounded-md text-xs font-medium bg-primary/10 text-primary border border-primary/20","children":"Next.js"}],["$","span","SaaS",{"className":"inline-flex items-center px-2.5 py-1 rounded-md text-xs font-medium bg-primary/10 text-primary border border-primary/20","children":"SaaS"}],"$L1f","$L20","$L21"]}],"$L22","$L23","$L24"]}]}],"$L25","$L26","$L27"]}]]}] 28:I[85437,["/_next/static/chunks/0a3f498ef71c618e.js","/_next/static/chunks/61bc785dc6bd3109.js","/_next/static/chunks/a676f0ced11453e9.js","/_next/static/chunks/4b778b2e48718709.js","/_next/static/chunks/95a5e382a1e8200a.js","/_next/static/chunks/06fe5961b16f81d0.js","/_next/static/chunks/8c955ce35598c7b8.js","/_next/static/chunks/15c613f0f258455e.js"],"Image"] 1f:["$","span","Supabase",{"className":"inline-flex items-center px-2.5 py-1 rounded-md text-xs font-medium bg-primary/10 text-primary border border-primary/20","children":"Supabase"}] 20:["$","span","Open Source",{"className":"inline-flex items-center px-2.5 py-1 rounded-md text-xs font-medium bg-primary/10 text-primary border border-primary/20","children":"Open Source"}] 21:["$","span","Boilerplate",{"className":"inline-flex items-center px-2.5 py-1 rounded-md text-xs font-medium bg-primary/10 text-primary border border-primary/20","children":"Boilerplate"}] 22:["$","h1",null,{"className":"font-heading text-3xl sm:text-4xl md:text-5xl leading-tight text-foreground mb-4","children":"I Built a Free SaaS Starter Template — Here's Everything Inside"}] 23:["$","p",null,{"className":"text-lg text-muted-foreground leading-relaxed mb-6","children":"Niya SaaS Template is a production-ready, open-source Next.js 15 starter kit with Supabase auth, Zustand, React Query, Magic UI animations, and clean architecture. Built for developers and AI startups who want to ship fast."}] 24:["$","div",null,{"className":"flex flex-wrap items-center gap-4 text-sm text-muted-foreground pb-6 border-b border-border","children":[["$","address",null,{"className":"flex items-center gap-1.5 not-italic","children":[["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-user w-4 h-4","children":[["$","path","975kel",{"d":"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"}],["$","circle","17ys0d",{"cx":"12","cy":"7","r":"4"}],"$undefined"]}],["$","a",null,{"rel":"author","href":"https://h-maghrabi.tech/","className":"hover:text-foreground transition-colors","children":"Hussein Maghrabi"}]]}],["$","time",null,{"dateTime":"2025-02-20T00:00:00.000Z","className":"flex items-center gap-1.5","children":[["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-calendar w-4 h-4","children":[["$","path","1cmpym",{"d":"M8 2v4"}],["$","path","4m81vk",{"d":"M16 2v4"}],["$","rect","1hopcy",{"width":"18","height":"18","x":"3","y":"4","rx":"2"}],["$","path","8toen8",{"d":"M3 10h18"}],"$undefined"]}],"February 20, 2025"]}],["$","span",null,{"className":"flex items-center gap-1.5","children":[["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-clock w-4 h-4","children":[["$","circle","1mglay",{"cx":"12","cy":"12","r":"10"}],["$","polyline","68esgv",{"points":"12 6 12 12 16 14"}],"$undefined"]}],8," min read"]}]]}] 25:["$","$L1e",null,{"direction":"up","delay":0.05,"children":["$","figure",null,{"className":"mb-10","children":["$","$L28",null,{"src":"/projects/niya/logo.png","alt":"I Built a Free SaaS Starter Template — Here's Everything Inside","width":768,"height":400,"className":"w-full h-auto rounded-lg border border-border object-cover","priority":true}]}]}] 29:T1df4,
Every time I started a new SaaS project, I spent the first 2 weeks on the same boilerplate: auth flow, dashboard layout, state management setup, form validation, dark mode toggle. Two weeks of zero product work, every single time.
So I extracted all of it into Niya — a free, open-source SaaS starter template that gives you a production-ready foundation in minutes, not weeks. It already has 32 stars on GitHub and developers are using it for AI dashboards, admin panels, and MVP launches.
Repo: github.com/namanbarkiya/niya-saas-template
Niya isn't a landing page template. It's a full-stack application foundation with everything wired together and working out of the box.
| Layer | Technology | Why |
|---|---|---|
| Framework | Next.js 15 + App Router | Server components, streaming, Turbopack |
| Auth | Supabase Auth | Email/password, OAuth, magic links, MFA-ready |
| Database | Supabase (Postgres) | Real-time subscriptions, Row Level Security |
| Styling | Tailwind CSS 4 | Latest version, utility-first, zero dead CSS |
| State (client) | Zustand | 1KB, no boilerplate, TypeScript-native |
| State (server) | React Query | Caching, background refetch, optimistic updates |
| Validation | Zod | Runtime type checking that mirrors TypeScript |
| Animations | Framer Motion + Magic UI | Smooth transitions, hero animations |
| Forms | React Hook Form + Zod | Zero-re-render forms with type-safe validation |
This was the non-negotiable. Most starter templates either skip auth entirely or give you a half-baked integration. Niya includes:
// middleware.ts — this is all the auth routing you need
export async function middleware(req: NextRequest) {
const session = await getSession(req);
if (!session && req.nextUrl.pathname.startsWith("/dashboard")) {
return NextResponse.redirect(new URL("/login", req.url));
}
}
The template ships with a complete dashboard layout:
I see too many starters that either use Context for everything (re-render hell) or skip state management entirely. Niya uses the Zustand + React Query pattern:
// Zustand for UI state (sidebar open, theme, modals)
const useUIStore = create<UIStore>((set) => ({
sidebarOpen: true,
toggleSidebar: () => set((s) => ({ sidebarOpen: !s.sidebarOpen })),
}));
// React Query for server state (users, data, API responses)
const { data, isLoading } = useQuery({
queryKey: ["user-profile"],
queryFn: () => fetchProfile(),
});
Client state and server state stay cleanly separated. No prop drilling, no cache invalidation bugs.
This is where most templates fall apart — they dump everything into a flat structure and call it "simple." Niya uses a domain-driven structure that scales:
niya-saas-template/
├── app/ # Next.js 15 App Router
│ ├── api/ # API routes
│ ├── dashboard/ # Protected pages
│ ├── login/ # Auth pages
│ └── signup/ # Registration
├── components/
│ ├── auth/ # Auth-specific components
│ ├── dashboard/ # Dashboard components
│ ├── forms/ # Form components
│ ├── landing/ # Marketing page components
│ ├── providers/ # Context providers
│ └── ui/ # Base UI primitives
├── lib/
│ ├── hooks/ # Custom React hooks
│ ├── query/ # React Query config
│ ├── store/ # Zustand stores
│ ├── supabase/ # Supabase client
│ ├── utils/ # Utility functions
│ └── validations/ # Zod schemas
└── public/ # Static assets
Every folder has a clear responsibility. When you need to add a feature (say, a billing page) you know exactly where every piece goes.
Some features I'm actively building or considering based on community feedback:
If any of these matter to you — star the repo and open an issue. Community signal drives priority.
git clone https://github.com/namanbarkiya/niya-saas-template.git my-app
cd my-app
cp .env.example .env # add your Supabase credentials
npm install
npm run dev
That's it. You'll have a fully working app with auth, dashboard, dark mode, and beautiful UI in under 3 minutes.
Star it if it saves you time: github.com/namanbarkiya/niya-saas-template
26:["$","$L1e",null,{"direction":"up","delay":0.1,"children":["$","section",null,{"className":"blog-content","dangerouslySetInnerHTML":{"__html":"$29"}}]}] 27:["$","$L1e",null,{"direction":"up","delay":0.15,"className":"mt-16 pt-8 border-t border-border","children":["$","footer",null,{"className":"flex items-center justify-between","children":[["$","$L1d",null,{"href":"/blogs","className":"inline-flex items-center justify-center text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2 rounded-lg gap-2","children":[["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":24,"height":24,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-chevron-left w-4 h-4","children":[["$","path","1wnfg3",{"d":"m15 18-6-6 6-6"}],"$undefined"]}],"All posts"]}],["$","div",null,{"className":"text-sm text-muted-foreground","children":["Written by"," ",["$","$L1d",null,{"href":"https://www.linkedin.com/in/hussein-maghrabi/","target":"_blank","rel":"noopener noreferrer","className":"font-medium text-foreground hover:text-primary transition-colors","children":"Hussein Maghrabi"}]]}]]}]}] 16:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] 2a:I[27201,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/247eb132b7f7b574.js"],"IconMark"] 18:[["$","title","0",{"children":"I Built a Free SaaS Starter Template — Here's Everything Inside | Hussein Maghrabi - Senior PHP / Laravel Developer"}],["$","meta","1",{"name":"description","content":"Niya SaaS Template is a production-ready, open-source Next.js 15 starter kit with Supabase auth, Zustand, React Query, Magic UI animations, and clean architecture. Built for developers and AI startups who want to ship fast."}],["$","link","2",{"rel":"author","href":"https://h-maghrabi.tech/"}],["$","meta","3",{"name":"author","content":"Hussein Maghrabi"}],["$","link","4",{"rel":"manifest","href":"/manifest.webmanifest","crossOrigin":"$undefined"}],["$","meta","5",{"name":"keywords","content":"Next.js,SaaS,Supabase,Open Source,Boilerplate"}],["$","meta","6",{"name":"creator","content":"husseinmaghrabi"}],["$","meta","7",{"name":"robots","content":"index, follow, max-image-preview:large, max-snippet:-1"}],["$","link","8",{"rel":"canonical","href":"https://h-maghrabi.tech//blogs/niya-saas-starter-template"}],["$","meta","9",{"property":"og:title","content":"I Built a Free SaaS Starter Template — Here's Everything Inside"}],["$","meta","10",{"property":"og:description","content":"Niya SaaS Template is a production-ready, open-source Next.js 15 starter kit with Supabase auth, Zustand, React Query, Magic UI animations, and clean architecture. Built for developers and AI startups who want to ship fast."}],["$","meta","11",{"property":"og:url","content":"https://h-maghrabi.tech//blogs/niya-saas-starter-template"}],["$","meta","12",{"property":"og:site_name","content":"Hussein Maghrabi - Senior PHP / Laravel Developer"}],["$","meta","13",{"property":"og:image","content":"https://h-maghrabi.tech//projects/niya/logo.png"}],["$","meta","14",{"property":"og:image:width","content":"1200"}],["$","meta","15",{"property":"og:image:height","content":"630"}],["$","meta","16",{"property":"og:image:alt","content":"I Built a Free SaaS Starter Template — Here's Everything Inside"}],["$","meta","17",{"property":"og:type","content":"article"}],["$","meta","18",{"property":"article:published_time","content":"2025-02-20"}],["$","meta","19",{"property":"article:modified_time","content":"2025-02-20"}],["$","meta","20",{"property":"article:author","content":"Hussein Maghrabi"}],["$","meta","21",{"property":"article:tag","content":"Next.js"}],["$","meta","22",{"property":"article:tag","content":"SaaS"}],["$","meta","23",{"property":"article:tag","content":"Supabase"}],["$","meta","24",{"property":"article:tag","content":"Open Source"}],["$","meta","25",{"property":"article:tag","content":"Boilerplate"}],["$","meta","26",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","27",{"name":"twitter:creator","content":"@husseinmaghrabi"}],["$","meta","28",{"name":"twitter:title","content":"I Built a Free SaaS Starter Template — Here's Everything Inside"}],["$","meta","29",{"name":"twitter:description","content":"Niya SaaS Template is a production-ready, open-source Next.js 15 starter kit with Supabase auth, Zustand, React Query, Magic UI animations, and clean architecture. Built for developers and AI startups who want to ship fast."}],["$","meta","30",{"name":"twitter:image","content":"https://h-maghrabi.tech//projects/niya/logo.png"}],["$","link","31",{"rel":"shortcut icon","href":"/portfolio/logos/logo-3.png"}],["$","link","32",{"rel":"icon","href":"/portfolio/logos/logo-3.png"}],["$","link","33",{"rel":"apple-touch-icon","href":"/portfolio/logos/logo-3.png"}],["$","$L2a","34",{}]] 14:null