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","how-i-got-150-stars-nextjs-portfolio-template"],"q":"","i":false,"f":[[["",{"children":["(root)",{"children":["blogs",{"children":[["slug","how-i-got-150-stars-nextjs-portfolio-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:T4c2,{"@context":"https://schema.org","@type":"BlogPosting","headline":"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template","description":"The story behind minimal-next-portfolio — an open-source Next.js 16 portfolio template that grew from a personal project to 148 stars, 41 forks, and developers worldwide using it to showcase their work.","datePublished":"2026-02-01T00:00:00.000Z","dateModified":"2026-02-01T00: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/how-i-got-150-stars-nextjs-portfolio-template","mainEntityOfPage":{"@type":"WebPage","@id":"https://h-maghrabi.tech//blogs/how-i-got-150-stars-nextjs-portfolio-template"},"image":"https://h-maghrabi.tech//blogs/star-history-portfolio.svg","keywords":"Next.js, Open Source, GitHub, Portfolio, React","wordCount":827,"timeRequired":"PT6M","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\":\"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template\",\"item\":\"https://h-maghrabi.tech//blogs/how-i-got-150-stars-nextjs-portfolio-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":"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template"}]]}]}]}],["$","$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","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"}],"$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","GitHub",{"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":"GitHub"}] 20:["$","span","Portfolio",{"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":"Portfolio"}] 21:["$","span","React",{"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":"React"}] 22:["$","h1",null,{"className":"font-heading text-3xl sm:text-4xl md:text-5xl leading-tight text-foreground mb-4","children":"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template"}] 23:["$","p",null,{"className":"text-lg text-muted-foreground leading-relaxed mb-6","children":"The story behind minimal-next-portfolio — an open-source Next.js 16 portfolio template that grew from a personal project to 148 stars, 41 forks, and developers worldwide using it to showcase their work."}] 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":"2026-02-01T00: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 1, 2026"]}],["$","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"]}],6," min read"]}]]}] 25:["$","$L1e",null,{"direction":"up","delay":0.05,"children":["$","figure",null,{"className":"mb-10","children":["$","$L28",null,{"src":"/blogs/star-history-portfolio.svg","alt":"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template","width":768,"height":400,"className":"w-full h-auto rounded-lg border border-border object-cover","priority":true}]}]}] 29:T1b97,

In early 2024 I needed a portfolio. I looked at dozens of templates and none of them felt right — either they were over-engineered React apps that took hours to customize, or they were bare CSS sites with zero interactivity. So I built my own, open-sourced it, and today it sits at 148+ stars and 41 forks on GitHub.

Here's the story of what I built, what decisions mattered, and what I learned about building open-source projects that developers actually want to use.

Repo: github.com/namanbarkiya/minimal-next-portfolio · Live: nbarkiya.xyz


The Core Idea: Object-Driven Architecture

Most portfolio templates require you to edit JSX or dig into components to add your information. That's the wrong abstraction. Your portfolio data — projects, experience, skills — is content, not code.

I designed the entire template around configuration objects. You fill in TypeScript config files and everything renders automatically:

// config/projects.ts — this is all you edit
export const featuredProjects: ProjectConfig[] = [
  {
    id: "convot",
    title: "Convot - AI Chatbot Platform",
    description: "Embeddable RAG chatbot for businesses",
    techStack: ["nextjs", "typescript", "fastapi"],
    links: {
      live: "https://convot.ai",
      github: "https://github.com/namanbarkiya/convot",
    },
  },
  // ... add more, remove some — that's it
];

No JSX to touch. No components to modify. This single decision is what made the template genuinely easy to adopt, and I believe it's the #1 reason developers star and fork it.


The Tech Stack That Works

Layer Choice Why
Framework Next.js 16 + App Router SSR, ISR, route groups, metadata API
Language TypeScript (strict) Config objects need type safety
Styling Tailwind CSS + shadcn/ui Rapid iteration, consistent design tokens
Animations Framer Motion Smooth page transitions, scroll reveals
Themes next-themes + CSS variables 7 themes with zero JS overhead
Analytics Vercel Analytics + GA No-config observability
Deployment Vercel git push → live in 30 seconds

7 Built-In Themes

One feature that consistently surprised people: the template ships with 7 fully designed themes — Dark, Light, Retro, Cyberpunk, Aurora, Synthwave, and Paper. They all use CSS custom properties, so adding your own is trivial:

.cyberpunk {
  --background: 240 10% 4%;
  --foreground: 60 5% 90%;
  --primary: 180 100% 50%;
  /* ... all tokens defined */
}

Users switch themes with a single dropdown — no page reload, no flash.


What Made It Grow

1. Lighthouse 100 Out of the Box

I was obsessive about this. Every image uses next/image with proper width, height, and priority attributes. Fonts use next/font with preloading. CSS is utility-first with no unused styles. The result: a perfect 100/100 Lighthouse score on every page.

This matters because developers evaluating templates often run a Lighthouse audit before they look at the code. A perfect score is an instant trust signal.

2. SEO Done Right

Every page has:

Several users told me they ranked on Google within weeks of deploying — directly attributable to the built-in SEO.

3. Genuine Features, Not Filler

The template includes things developers actually need:

4. A Good README

I treated the README as a product page. Screenshot at the top, feature list, one-command setup, clear customization guide, star history chart. A good README is AEO (Answer Engine Optimization) by default — AI search engines index GitHub READMEs aggressively.


The Growth Pattern

The star graph wasn't a hockey stick. It was:

  1. Week 1: 0 stars. Shared on X, got 3 likes.
  2. Month 1: ~15 stars. A few Reddit posts in r/reactjs and r/webdev gained modest traction.
  3. Month 3: ~50 stars. GitHub's "Trending" algorithm surfaced it once. That single day brought 20+ stars.
  4. Month 6: ~100 stars. Word-of-mouth from developers who had deployed it and linked back.
  5. Now: 148 stars, 41 forks. Consistent 2-3 stars/week from organic GitHub search.

The biggest lesson: consistency beats virality. There was no single moment that made it blow up. It grew because it's genuinely useful, well-documented, and easy to deploy.


Key Takeaways for Open Source

  1. Config-driven architecture lowers the adoption barrier more than any amount of documentation.
  2. Lighthouse 100 is a trust signal that compounds — it tells developers the author cares about craft.
  3. 7 themes made it shareable — people screenshot different themes and share them.
  4. The README is your landing page. Invest real time in it.
  5. Ship, iterate, respond to issues. Half the forks came from developers who opened an issue, got a response, and then starred.

If you're building something similar — whether a template, a CLI tool, or a library — focus on making the first 5 minutes effortless. Clone → install → see your data rendered beautifully. That's the moat.


Try it yourself: github.com/namanbarkiya/minimal-next-portfolio

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":"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template | Hussein Maghrabi - Senior PHP / Laravel Developer"}],["$","meta","1",{"name":"description","content":"The story behind minimal-next-portfolio — an open-source Next.js 16 portfolio template that grew from a personal project to 148 stars, 41 forks, and developers worldwide using it to showcase their work."}],["$","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,Open Source,GitHub,Portfolio,React"}],["$","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/how-i-got-150-stars-nextjs-portfolio-template"}],["$","meta","9",{"property":"og:title","content":"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template"}],["$","meta","10",{"property":"og:description","content":"The story behind minimal-next-portfolio — an open-source Next.js 16 portfolio template that grew from a personal project to 148 stars, 41 forks, and developers worldwide using it to showcase their work."}],["$","meta","11",{"property":"og:url","content":"https://h-maghrabi.tech//blogs/how-i-got-150-stars-nextjs-portfolio-template"}],["$","meta","12",{"property":"og:site_name","content":"Hussein Maghrabi - Senior PHP / Laravel Developer"}],["$","meta","13",{"property":"og:image","content":"https://h-maghrabi.tech//blogs/star-history-portfolio.svg"}],["$","meta","14",{"property":"og:image:width","content":"1200"}],["$","meta","15",{"property":"og:image:height","content":"630"}],["$","meta","16",{"property":"og:image:alt","content":"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template"}],["$","meta","17",{"property":"og:type","content":"article"}],["$","meta","18",{"property":"article:published_time","content":"2026-02-01"}],["$","meta","19",{"property":"article:modified_time","content":"2026-02-01"}],["$","meta","20",{"property":"article:author","content":"Hussein Maghrabi"}],["$","meta","21",{"property":"article:tag","content":"Next.js"}],["$","meta","22",{"property":"article:tag","content":"Open Source"}],["$","meta","23",{"property":"article:tag","content":"GitHub"}],["$","meta","24",{"property":"article:tag","content":"Portfolio"}],["$","meta","25",{"property":"article:tag","content":"React"}],["$","meta","26",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","27",{"name":"twitter:creator","content":"@husseinmaghrabi"}],["$","meta","28",{"name":"twitter:title","content":"How I Got 150+ Stars on GitHub for a Next.js Portfolio Template"}],["$","meta","29",{"name":"twitter:description","content":"The story behind minimal-next-portfolio — an open-source Next.js 16 portfolio template that grew from a personal project to 148 stars, 41 forks, and developers worldwide using it to showcase their work."}],["$","meta","30",{"name":"twitter:image","content":"https://h-maghrabi.tech//blogs/star-history-portfolio.svg"}],["$","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