[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-content":3,"all-projects":58,"featured-projects":429,"case-reel-projects":645,"latest-blog-posts":861,"blog-\u002Fblog\u002Fbuilding-in-public-week-one":1114},{"id":4,"title":5,"availability":6,"bio":10,"email":13,"extension":14,"heroPortrait":15,"meta":16,"name":17,"nav":18,"services":34,"social":51,"stem":55,"tagline":56,"__hash__":57},"site\u002Fsite.json","Solo founder · products, hosting, ops",{"status":7,"label":8,"description":9},"open","Open to talk","Building my own products first. Happy to talk if the fit is clear — products, hosting, or a serious build.",[11,12],"Solo founder building end-to-end products — Stockify, Atlas Ink, Cyberly\u002FPotoo — then running them on Devnock with Studio Monitor in the loop.","Clients get peace of mind: I'm present, I've got their back, and pricing stays fair. If that fits what you're building, say hello.","hello@elbakkali.me","json","\u002Fimages\u002Fhero-conversation.png",{},"Adnane Elbakkali",[19,22,25,28,31],{"label":20,"href":21},"Work","#work",{"label":23,"href":24},"Services","#services",{"label":26,"href":27},"Projects","\u002Fprojects",{"label":29,"href":30},"About","#about",{"label":32,"href":33},"Contact","#contact",[35,39,43,47],{"number":36,"title":37,"description":38},"01","Product engineering","API + web + Flutter end to end — multi-tenant ops SaaS and consumer infra shipped by one operator.",{"number":40,"title":41,"description":42},"02","Client hosting","Devnock hosting born from my own fleet: peace of mind, a present operator, and fair pricing.",{"number":44,"title":45,"description":46},"03","Fleet ops","Studio Monitor — heartbeats, health pulls, and deploy discipline across every product I run.",{"number":48,"title":49,"description":50},"04","Bilingual market builds","Morocco-facing commerce and education surfaces built for FR\u002FAR day-to-day ops, not tourism clichés.",{"github":52,"linkedin":53,"x":54},"https:\u002F\u002Fgithub.com\u002Felbakkali","https:\u002F\u002Flinkedin.com\u002Fin\u002Fadnane-elbakkali","https:\u002F\u002Fx.com\u002Felbakkali","site","Solo founder shipping ops products and hosting — Stockify, Atlas Ink, Cyberly — with peace of mind and fair pricing for clients who want a human in the loop.","C_4ZNtYMm1N1A-hz-23ESeSc4_MvUf1b1JvqJvi4ewE",[59,145,202,259,349],{"id":60,"title":61,"body":62,"caseKind":123,"description":124,"extension":125,"featured":126,"links":127,"market":129,"meta":130,"navigation":126,"number":36,"oneLiner":131,"outcome":132,"path":133,"reelOrder":134,"role":135,"seo":136,"stack":137,"stem":142,"still":128,"thumbnail":128,"year":143,"__hash__":144},"projects\u002Fprojects\u002Fcyberly-potoo.md","Cyberly & Potoo",{"type":63,"value":64,"toc":116},"minimark",[65,77,82,85,89,105,109],[66,67,68,72,73,76],"p",{},[69,70,71],"strong",{},"Cyberly"," is the paid VPN product. ",[69,74,75],{},"Potoo"," is the freemium consumer twin. Same engineering discipline, different go-to-market: one sells reliability and control; the other lowers the barrier to try.",[78,79,81],"h2",{"id":80},"problem","Problem",[66,83,84],{},"Consumer VPN is crowded; operators still need billing, device clients, admin, and production ops that do not fall over when marketing is quiet. Building both a premium and freemium posture from one solo stack is the real constraint — not another landing page.",[78,86,88],{"id":87},"what-shipped","What shipped",[90,91,92,96,99,102],"ul",{},[93,94,95],"li",{},"Laravel APIs for auth, plans, and device sessions",[93,97,98],{},"Nuxt admin \u002F marketing surfaces",[93,100,101],{},"Flutter clients for the daily connection loop",[93,103,104],{},"Dockerized deploy paths and health reporting into Studio Monitor",[78,106,108],{"id":107},"why-it-matters-here","Why it matters here",[66,110,111,112,115],{},"This is flagship ",[69,113,114],{},"infra product"," proof: not a template VPN brochure, but owned SaaS with a live twin for contrast. When the case reel shows Cyberly \u002F Potoo, it is about shipping and running consumer infra — not agency mockups.",{"title":117,"searchDepth":118,"depth":118,"links":119},"",2,[120,121,122],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},"product","Paid VPN SaaS (Cyberly) alongside a freemium consumer twin (Potoo) — subscriptions, clients, and ops on the same craft.","md",true,{"live":128,"repo":128},null,"VPN SaaS",{},"Paid infra product and freemium twin — one operator, two market postures.","Live VPN surfaces with billing, clients, and studio-monitor heartbeats in production.","\u002Fprojects\u002Fcyberly-potoo",1,"Founder · full stack",{"title":61,"description":124},[138,139,140,141],"Laravel","Nuxt","Flutter","Docker","projects\u002Fcyberly-potoo",2025,"J5k3zkkpZJKqqOnEF1_HtxeIrZAbAalgEKx5JW5YUNo",{"id":146,"title":147,"body":148,"caseKind":123,"description":190,"extension":125,"featured":126,"links":191,"market":192,"meta":193,"navigation":126,"number":40,"oneLiner":194,"outcome":195,"path":196,"reelOrder":118,"role":135,"seo":197,"stack":198,"stem":200,"still":128,"thumbnail":128,"year":143,"__hash__":201},"projects\u002Fprojects\u002Fstockify.md","Stockify",{"type":63,"value":149,"toc":185},[150,155,157,160,162,176,178],[66,151,152,154],{},[69,153,147],{}," is multi-tenant wholesale ops software. Tenants manage stock, orders, and the messy middle of B2B commerce — built for operators, not for a slideshow.",[78,156,81],{"id":80},[66,158,159],{},"Wholesale teams juggle inventory truth, order flow, and multi-user access. Generic e-commerce kits skip tenancy and ops; spreadsheets do not scale. The product has to survive bilingual, day-to-day use.",[78,161,88],{"id":87},[90,163,164,167,170,173],{},[93,165,166],{},"Multi-tenant Laravel core with clear org boundaries",[93,168,169],{},"Nuxt surfaces for inventory and order workflows",[93,171,172],{},"Flutter where mobile ops matter",[93,174,175],{},"Patterns reusable across other studio products (tenancy, admin, deploy)",[78,177,108],{"id":107},[66,179,180,181,184],{},"Stockify is flagship ",[69,182,183],{},"commerce \u002F ops"," proof — density in the UI, real market constraints, end-to-end ownership from API to clients.",{"title":117,"searchDepth":118,"depth":118,"links":186},[187,188,189],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},"Multi-tenant wholesale operations — inventory, orders, and bilingual day-to-day workflows for real commerce teams.",{"live":128,"repo":128},"Wholesale ops",{},"Multi-tenant wholesale software for teams who live in stock and orders.","Operational SaaS used for real wholesale workflows — not a demo storefront.","\u002Fprojects\u002Fstockify",{"title":147,"description":190},[138,139,199,140],"PostgreSQL","projects\u002Fstockify","-_C5-JOXfD0BPclIo3SqVGXg6d6O-4ospLYtQGrsN1U",{"id":203,"title":204,"body":205,"caseKind":123,"description":247,"extension":125,"featured":126,"links":248,"market":249,"meta":250,"navigation":126,"number":44,"oneLiner":251,"outcome":252,"path":253,"reelOrder":254,"role":135,"seo":255,"stack":256,"stem":257,"still":128,"thumbnail":128,"year":143,"__hash__":258},"projects\u002Fprojects\u002Fatlas-ink.md","Atlas Ink",{"type":63,"value":206,"toc":242},[207,212,214,217,219,233,235],[66,208,209,211],{},[69,210,204],{}," (Madrasa) is an operating system for Moroccan education centres — enrolment, classes, staff, and the admin rhythm schools actually live in.",[78,213,81],{"id":80},[66,215,216],{},"Centres need more than a brochure site. They need bilingual operational software that matches how offices work on the ground — not a US-default LMS dropped into another market.",[78,218,88],{"id":87},[90,220,221,224,227,230],{},[93,222,223],{},"Laravel domain model for centres, cohorts, and staff roles",[93,225,226],{},"Nuxt admin suited to bilingual office use",[93,228,229],{},"Flutter where teachers or field staff need lighter clients",[93,231,232],{},"Product decisions driven by Moroccan market reality, not tourism clichés",[78,234,108],{"id":107},[66,236,237,238,241],{},"Atlas Ink is flagship ",[69,239,240],{},"education SaaS"," proof: Morocco bilingual ops as a serious product niche, owned end to end by one founder.",{"title":117,"searchDepth":118,"depth":118,"links":243},[244,245,246],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},"Operating system for Moroccan education centres (Madrasa) — bilingual admin, enrolment, and daily school ops.",{"live":128,"repo":128},"Education SaaS",{},"Moroccan centres and schools OS — bilingual ops, not a CMS skin.","Education operations product tailored to centres that run in FR\u002FAR day-to-day.","\u002Fprojects\u002Fatlas-ink",3,{"title":204,"description":247},[138,139,199,140],"projects\u002Fatlas-ink","WkVFuyVG4vNe90DDyajLKQID-qODpOtmKdxxbvTjFP8",{"id":260,"title":261,"body":262,"caseKind":333,"description":334,"extension":125,"featured":126,"links":335,"market":337,"meta":338,"navigation":126,"number":48,"oneLiner":339,"outcome":340,"path":341,"reelOrder":342,"role":343,"seo":344,"stack":345,"stem":347,"still":128,"thumbnail":128,"year":143,"__hash__":348},"projects\u002Fprojects\u002Fdevnock-monitor.md","Devnock & Studio Monitor",{"type":63,"value":263,"toc":328},[264,274,280,284,312,316,319,321],[66,265,266,269,270,273],{},[69,267,268],{},"Devnock"," started as the host for my own products. It matured into ",[69,271,272],{},"full-featured client hosting"," — same stack, same operator, clearer promise.",[66,275,276,279],{},[69,277,278],{},"Studio Monitor"," is the multi-product health plane: heartbeats, pull health, aggregates — so the fleet is visible without turning the portfolio into a live ops console.",[78,281,283],{"id":282},"narrative-arc","Narrative arc",[285,286,287,290,293],"ol",{},[93,288,289],{},"Dogfood — run Stockify, VPN, atlas surfaces on infrastructure I control",[93,291,292],{},"Productize — offer clients that same plane",[93,294,295,296,299,300,303,304,307,308,311],{},"Promise — ",[69,297,298],{},"peace of mind",": I am ",[69,301,302],{},"present",", I ",[69,305,306],{},"have your back",", pricing stays ",[69,309,310],{},"fair"," (human operator, not anonymous cloud markup)",[78,313,315],{"id":314},"what-this-is-not","What this is not",[66,317,318],{},"Not enterprise SLA theater. Not a faceless VPS brochure. Not a replacement for Stockify \u002F Atlas \u002F Cyberly product proof — it is the layer that runs them, and that clients can trust for the same reason.",[78,320,108],{"id":107},[66,322,323,324,327],{},"Solo founder ops maturity: I ship products ",[69,325,326],{},"and"," stay accountable after deploy. Clients who host with Devnock get a person who runs the same craft daily.",{"title":117,"searchDepth":118,"depth":118,"links":329},[330,331,332],{"id":282,"depth":118,"text":283},{"id":314,"depth":118,"text":315},{"id":107,"depth":118,"text":108},"ops","Hosting that began as my personal product fleet, then matured into full client hosting — plus a multi-product health plane I run myself.",{"live":336,"repo":128},"https:\u002F\u002Fmonitor.elbakkali.me","Hosting & ops",{},"Personal host → client hosting. Peace of mind, present operator, fair pricing — and a monitor plane for the fleet.","Client-ready hosting on the same plane as my products; Studio Monitor pulling health across the studio.","\u002Fprojects\u002Fdevnock-monitor",4,"Founder · ops",{"title":261,"description":334},[141,346,138,139,199],"Coolify","projects\u002Fdevnock-monitor","puJqsL2iZ5V9yZHciXruamCm__7rUM8HUIToZL2UeFs",{"id":350,"title":351,"body":352,"caseKind":411,"description":412,"extension":125,"featured":126,"links":413,"market":414,"meta":415,"navigation":126,"number":416,"oneLiner":417,"outcome":418,"path":419,"reelOrder":420,"role":421,"seo":422,"stack":423,"stem":427,"still":128,"thumbnail":128,"year":143,"__hash__":428},"projects\u002Fprojects\u002Fplaylist-metrics.md","Playlist metrics study",{"type":63,"value":353,"toc":405},[354,361,365,379,382,384,387,389,400,402],[66,355,356,357,360],{},"This case is a ",[69,358,359],{},"Spotify playlist metrics engineering study",": growth signals, audio-feature analytics, dashboard surfaces. It belongs on the portfolio as tooling rigor — the same calm studio visual language as the product cases.",[78,362,364],{"id":363},"framing-hard","Framing (hard)",[90,366,367,373],{},[93,368,369,372],{},[69,370,371],{},"In scope:"," analytics pipelines, dashboards, growth\u002Ffeature metrics, engineering problem → solution",[93,374,375,378],{},[69,376,377],{},"Out of scope on elbakkali.me:"," culture persona branding, neon-rap identity, community marketing skins",[66,380,381],{},"Product-specific playlist brands stay out of the hero and shell. If a data surface name appears, it is only for technical accuracy inside this write-up — never as personal brand.",[78,383,81],{"id":80},[66,385,386],{},"Playlist operators need measurable growth and feature insight without bolting a marketing persona onto every chart. The hard part is reliable ingestion, clear metrics, and UI that stays readable.",[78,388,88],{"id":87},[90,390,391,394,397],{},[93,392,393],{},"Ingestion and aggregation for playlist performance",[93,395,396],{},"Audio-feature views for analysis",[93,398,399],{},"Dashboard UI focused on charts and tables — not campaign art",[78,401,108],{"id":107},[66,403,404],{},"Optional fifth reel slot: proof that engineering studies get the same seriousness as shipped products — without drifting the personal site into a music persona brand.",{"title":117,"searchDepth":118,"depth":118,"links":406},[407,408,409,410],{"id":363,"depth":118,"text":364},{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},"study","Engineering study — playlist growth and audio-feature analytics tooling. Metrics dashboards only; not a culture or persona brand.",{"live":128,"repo":128},"Analytics tooling",{},"05","Playlist growth and audio-feature analytics — an engineering study, same calm studio shell.","Metrics dashboards and pipelines for playlist performance and audio features.","\u002Fprojects\u002Fplaylist-metrics",5,"Engineer",{"title":351,"description":412},[139,424,425,426],"TypeScript","APIs","Charts","projects\u002Fplaylist-metrics","n7LWPZ_K7De1WfvV1IQo5WwVCC0dgq5ZsiCT4LtPqbE",[430,470,508,546,596],{"id":60,"title":61,"body":431,"caseKind":123,"description":124,"extension":125,"featured":126,"links":466,"market":129,"meta":467,"navigation":126,"number":36,"oneLiner":131,"outcome":132,"path":133,"reelOrder":134,"role":135,"seo":468,"stack":469,"stem":142,"still":128,"thumbnail":128,"year":143,"__hash__":144},{"type":63,"value":432,"toc":461},[433,439,441,443,445,455,457],[66,434,435,72,437,76],{},[69,436,71],{},[69,438,75],{},[78,440,81],{"id":80},[66,442,84],{},[78,444,88],{"id":87},[90,446,447,449,451,453],{},[93,448,95],{},[93,450,98],{},[93,452,101],{},[93,454,104],{},[78,456,108],{"id":107},[66,458,111,459,115],{},[69,460,114],{},{"title":117,"searchDepth":118,"depth":118,"links":462},[463,464,465],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},{"live":128,"repo":128},{},{"title":61,"description":124},[138,139,140,141],{"id":146,"title":147,"body":471,"caseKind":123,"description":190,"extension":125,"featured":126,"links":504,"market":192,"meta":505,"navigation":126,"number":40,"oneLiner":194,"outcome":195,"path":196,"reelOrder":118,"role":135,"seo":506,"stack":507,"stem":200,"still":128,"thumbnail":128,"year":143,"__hash__":201},{"type":63,"value":472,"toc":499},[473,477,479,481,483,493,495],[66,474,475,154],{},[69,476,147],{},[78,478,81],{"id":80},[66,480,159],{},[78,482,88],{"id":87},[90,484,485,487,489,491],{},[93,486,166],{},[93,488,169],{},[93,490,172],{},[93,492,175],{},[78,494,108],{"id":107},[66,496,180,497,184],{},[69,498,183],{},{"title":117,"searchDepth":118,"depth":118,"links":500},[501,502,503],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},{"live":128,"repo":128},{},{"title":147,"description":190},[138,139,199,140],{"id":203,"title":204,"body":509,"caseKind":123,"description":247,"extension":125,"featured":126,"links":542,"market":249,"meta":543,"navigation":126,"number":44,"oneLiner":251,"outcome":252,"path":253,"reelOrder":254,"role":135,"seo":544,"stack":545,"stem":257,"still":128,"thumbnail":128,"year":143,"__hash__":258},{"type":63,"value":510,"toc":537},[511,515,517,519,521,531,533],[66,512,513,211],{},[69,514,204],{},[78,516,81],{"id":80},[66,518,216],{},[78,520,88],{"id":87},[90,522,523,525,527,529],{},[93,524,223],{},[93,526,226],{},[93,528,229],{},[93,530,232],{},[78,532,108],{"id":107},[66,534,237,535,241],{},[69,536,240],{},{"title":117,"searchDepth":118,"depth":118,"links":538},[539,540,541],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},{"live":128,"repo":128},{},{"title":204,"description":247},[138,139,199,140],{"id":260,"title":261,"body":547,"caseKind":333,"description":334,"extension":125,"featured":126,"links":592,"market":337,"meta":593,"navigation":126,"number":48,"oneLiner":339,"outcome":340,"path":341,"reelOrder":342,"role":343,"seo":594,"stack":595,"stem":347,"still":128,"thumbnail":128,"year":143,"__hash__":348},{"type":63,"value":548,"toc":587},[549,555,559,561,577,579,581,583],[66,550,551,269,553,273],{},[69,552,268],{},[69,554,272],{},[66,556,557,279],{},[69,558,278],{},[78,560,283],{"id":282},[285,562,563,565,567],{},[93,564,289],{},[93,566,292],{},[93,568,295,569,299,571,303,573,307,575,311],{},[69,570,298],{},[69,572,302],{},[69,574,306],{},[69,576,310],{},[78,578,315],{"id":314},[66,580,318],{},[78,582,108],{"id":107},[66,584,323,585,327],{},[69,586,326],{},{"title":117,"searchDepth":118,"depth":118,"links":588},[589,590,591],{"id":282,"depth":118,"text":283},{"id":314,"depth":118,"text":315},{"id":107,"depth":118,"text":108},{"live":336,"repo":128},{},{"title":261,"description":334},[141,346,138,139,199],{"id":350,"title":351,"body":597,"caseKind":411,"description":412,"extension":125,"featured":126,"links":641,"market":414,"meta":642,"navigation":126,"number":416,"oneLiner":417,"outcome":418,"path":419,"reelOrder":420,"role":421,"seo":643,"stack":644,"stem":427,"still":128,"thumbnail":128,"year":143,"__hash__":428},{"type":63,"value":598,"toc":635},[599,603,605,615,617,619,621,623,631,633],[66,600,356,601,360],{},[69,602,359],{},[78,604,364],{"id":363},[90,606,607,611],{},[93,608,609,372],{},[69,610,371],{},[93,612,613,378],{},[69,614,377],{},[66,616,381],{},[78,618,81],{"id":80},[66,620,386],{},[78,622,88],{"id":87},[90,624,625,627,629],{},[93,626,393],{},[93,628,396],{},[93,630,399],{},[78,632,108],{"id":107},[66,634,404],{},{"title":117,"searchDepth":118,"depth":118,"links":636},[637,638,639,640],{"id":363,"depth":118,"text":364},{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},{"live":128,"repo":128},{},{"title":351,"description":412},[139,424,425,426],[646,686,724,762,812],{"id":60,"title":61,"body":647,"caseKind":123,"description":124,"extension":125,"featured":126,"links":682,"market":129,"meta":683,"navigation":126,"number":36,"oneLiner":131,"outcome":132,"path":133,"reelOrder":134,"role":135,"seo":684,"stack":685,"stem":142,"still":128,"thumbnail":128,"year":143,"__hash__":144},{"type":63,"value":648,"toc":677},[649,655,657,659,661,671,673],[66,650,651,72,653,76],{},[69,652,71],{},[69,654,75],{},[78,656,81],{"id":80},[66,658,84],{},[78,660,88],{"id":87},[90,662,663,665,667,669],{},[93,664,95],{},[93,666,98],{},[93,668,101],{},[93,670,104],{},[78,672,108],{"id":107},[66,674,111,675,115],{},[69,676,114],{},{"title":117,"searchDepth":118,"depth":118,"links":678},[679,680,681],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},{"live":128,"repo":128},{},{"title":61,"description":124},[138,139,140,141],{"id":146,"title":147,"body":687,"caseKind":123,"description":190,"extension":125,"featured":126,"links":720,"market":192,"meta":721,"navigation":126,"number":40,"oneLiner":194,"outcome":195,"path":196,"reelOrder":118,"role":135,"seo":722,"stack":723,"stem":200,"still":128,"thumbnail":128,"year":143,"__hash__":201},{"type":63,"value":688,"toc":715},[689,693,695,697,699,709,711],[66,690,691,154],{},[69,692,147],{},[78,694,81],{"id":80},[66,696,159],{},[78,698,88],{"id":87},[90,700,701,703,705,707],{},[93,702,166],{},[93,704,169],{},[93,706,172],{},[93,708,175],{},[78,710,108],{"id":107},[66,712,180,713,184],{},[69,714,183],{},{"title":117,"searchDepth":118,"depth":118,"links":716},[717,718,719],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},{"live":128,"repo":128},{},{"title":147,"description":190},[138,139,199,140],{"id":203,"title":204,"body":725,"caseKind":123,"description":247,"extension":125,"featured":126,"links":758,"market":249,"meta":759,"navigation":126,"number":44,"oneLiner":251,"outcome":252,"path":253,"reelOrder":254,"role":135,"seo":760,"stack":761,"stem":257,"still":128,"thumbnail":128,"year":143,"__hash__":258},{"type":63,"value":726,"toc":753},[727,731,733,735,737,747,749],[66,728,729,211],{},[69,730,204],{},[78,732,81],{"id":80},[66,734,216],{},[78,736,88],{"id":87},[90,738,739,741,743,745],{},[93,740,223],{},[93,742,226],{},[93,744,229],{},[93,746,232],{},[78,748,108],{"id":107},[66,750,237,751,241],{},[69,752,240],{},{"title":117,"searchDepth":118,"depth":118,"links":754},[755,756,757],{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},{"live":128,"repo":128},{},{"title":204,"description":247},[138,139,199,140],{"id":260,"title":261,"body":763,"caseKind":333,"description":334,"extension":125,"featured":126,"links":808,"market":337,"meta":809,"navigation":126,"number":48,"oneLiner":339,"outcome":340,"path":341,"reelOrder":342,"role":343,"seo":810,"stack":811,"stem":347,"still":128,"thumbnail":128,"year":143,"__hash__":348},{"type":63,"value":764,"toc":803},[765,771,775,777,793,795,797,799],[66,766,767,269,769,273],{},[69,768,268],{},[69,770,272],{},[66,772,773,279],{},[69,774,278],{},[78,776,283],{"id":282},[285,778,779,781,783],{},[93,780,289],{},[93,782,292],{},[93,784,295,785,299,787,303,789,307,791,311],{},[69,786,298],{},[69,788,302],{},[69,790,306],{},[69,792,310],{},[78,794,315],{"id":314},[66,796,318],{},[78,798,108],{"id":107},[66,800,323,801,327],{},[69,802,326],{},{"title":117,"searchDepth":118,"depth":118,"links":804},[805,806,807],{"id":282,"depth":118,"text":283},{"id":314,"depth":118,"text":315},{"id":107,"depth":118,"text":108},{"live":336,"repo":128},{},{"title":261,"description":334},[141,346,138,139,199],{"id":350,"title":351,"body":813,"caseKind":411,"description":412,"extension":125,"featured":126,"links":857,"market":414,"meta":858,"navigation":126,"number":416,"oneLiner":417,"outcome":418,"path":419,"reelOrder":420,"role":421,"seo":859,"stack":860,"stem":427,"still":128,"thumbnail":128,"year":143,"__hash__":428},{"type":63,"value":814,"toc":851},[815,819,821,831,833,835,837,839,847,849],[66,816,356,817,360],{},[69,818,359],{},[78,820,364],{"id":363},[90,822,823,827],{},[93,824,825,372],{},[69,826,371],{},[93,828,829,378],{},[69,830,377],{},[66,832,381],{},[78,834,81],{"id":80},[66,836,386],{},[78,838,88],{"id":87},[90,840,841,843,845],{},[93,842,393],{},[93,844,396],{},[93,846,399],{},[78,848,108],{"id":107},[66,850,404],{},{"title":117,"searchDepth":118,"depth":118,"links":852},[853,854,855,856],{"id":363,"depth":118,"text":364},{"id":80,"depth":118,"text":81},{"id":87,"depth":118,"text":88},{"id":107,"depth":118,"text":108},{"live":128,"repo":128},{},{"title":351,"description":412},[139,424,425,426],[862,968],{"id":863,"title":864,"body":865,"cover":956,"date":957,"description":958,"extension":125,"meta":959,"navigation":126,"path":960,"readTime":342,"seo":961,"stem":962,"tags":963,"__hash__":967},"blog\u002Fblog\u002Fbuilding-in-public-week-one.md","Week one of building in public",{"type":63,"value":866,"toc":950},[867,870,874,877,880,905,909,927,931,934,940,944,947],[66,868,869],{},"I started sharing progress on elbakkali.me before the landing page felt \"done.\" That was intentional.",[78,871,873],{"id":872},"why-share-early","Why share early",[66,875,876],{},"Building in public is not a marketing stunt. It is a feedback loop. When you post what you shipped — even a rough v0 — you learn what resonates, what confuses people, and what you should cut.",[66,878,879],{},"Three things happened in week one:",[285,881,882,888,899],{},[93,883,884,887],{},[69,885,886],{},"Scope got smaller."," Comment threads pushed me to ship the portfolio core before chasing visual polish.",[93,889,890,893,894,898],{},[69,891,892],{},"Content became the product."," Moving copy into ",[895,896,897],"code",{},"site.json"," and Markdown made iteration faster than hard-coding Vue templates.",[93,900,901,904],{},[69,902,903],{},"Momentum compounded."," Small public wins made the next task feel lighter.",[78,906,908],{"id":907},"what-actually-shipped","What actually shipped",[90,910,911,918,921,924],{},[93,912,913,914,917],{},"Docker-first Nuxt app with typed ",[895,915,916],{},"@nuxt\u002Fcontent"," collections",[93,919,920],{},"Landing sections driven by content, not props scattered across pages",[93,922,923],{},"Lenis smooth scroll with reduced-motion respect",[93,925,926],{},"A blog scaffold — because writing is part of the studio, not an afterthought",[78,928,930],{"id":929},"what-broke-and-what-i-learned","What broke (and what I learned)",[66,932,933],{},"The first deploy attempt failed because I treated content warmup as optional. Nuxt Content v3 needs its SQLite tables ready before queries run in CI. I added a small readiness check instead of guessing at race conditions.",[935,936,937],"blockquote",{},[66,938,939],{},"Perfect is the enemy of shipped. Public accountability makes \"good enough to learn\" the default.",[78,941,943],{"id":942},"next-up","Next up",[66,945,946],{},"Blog list and detail pages, then back to landing polish — but only after the writing workflow feels good. If you are building solo, share one concrete update this week. A screenshot, a PR link, or a short note on what you cut.",[66,948,949],{},"That is enough.",{"title":117,"searchDepth":118,"depth":118,"links":951},[952,953,954,955],{"id":872,"depth":118,"text":873},{"id":907,"depth":118,"text":908},{"id":929,"depth":118,"text":930},{"id":942,"depth":118,"text":943},"\u002Fimages\u002Fblog\u002Fbuilding-in-public-week-one.svg","2025-07-08","What I shipped, what broke, and why sharing early beats waiting for perfect.",{},"\u002Fblog\u002Fbuilding-in-public-week-one",{"title":864,"description":958},"blog\u002Fbuilding-in-public-week-one",[964,965,966],"building in public","indie dev","nuxt","ce9T0HF3qJBlVlZF3u8fwtarwt-0jMU4duPXH5pOE2A",{"id":969,"title":970,"body":971,"cover":1104,"date":1105,"description":1106,"extension":125,"meta":1107,"navigation":126,"path":1108,"readTime":420,"seo":1109,"stem":1110,"tags":1111,"__hash__":1113},"blog\u002Fblog\u002Fwhy-indie-dev.md","Why indie dev instead of another job title",{"type":63,"value":972,"toc":1098},[973,980,984,987,1007,1010,1014,1058,1061,1065,1085,1089,1092,1095],[66,974,975,976,979],{},"I have worked across Laravel APIs, Nuxt frontends, and the glue in between. That stack is not the differentiator anymore. ",[69,977,978],{},"Ownership"," is.",[78,981,983],{"id":982},"the-studio-model","The studio model",[66,985,986],{},"An indie studio is not one app. It is a repeatable way to go from idea to revenue:",[90,988,989,995,1001],{},[93,990,991,994],{},[69,992,993],{},"One platform spine"," — auth, billing, observability, deploy patterns you reuse",[93,996,997,1000],{},[69,998,999],{},"Many small bets"," — products that can fail without sinking the whole operation",[93,1002,1003,1006],{},[69,1004,1005],{},"Public craft"," — documentation, blog posts, and open scaffolding that attract collaborators",[66,1008,1009],{},"I am building toward that model with elbakkali.me as the public front door.",[78,1011,1013],{"id":1012},"what-changes-when-you-own-the-outcome","What changes when you own the outcome",[1015,1016,1017,1030],"table",{},[1018,1019,1020],"thead",{},[1021,1022,1023,1027],"tr",{},[1024,1025,1026],"th",{},"Employee mindset",[1024,1028,1029],{},"Indie builder mindset",[1031,1032,1033,1042,1050],"tbody",{},[1021,1034,1035,1039],{},[1036,1037,1038],"td",{},"Ticket done → move on",[1036,1040,1041],{},"Did this move a user or metric?",[1021,1043,1044,1047],{},[1036,1045,1046],{},"Optimize for team process",[1036,1048,1049],{},"Optimize for learning speed",[1021,1051,1052,1055],{},[1036,1053,1054],{},"Polish in private",[1036,1056,1057],{},"Ship, narrate, iterate in public",[66,1059,1060],{},"Neither is wrong. I just know which one keeps me energized after year five.",[78,1062,1064],{"id":1063},"practical-constraints-i-accept","Practical constraints I accept",[90,1066,1067,1073,1079],{},[93,1068,1069,1072],{},[69,1070,1071],{},"Cash flow matters."," Freelance and contract work fund runway for product bets.",[93,1074,1075,1078],{},[69,1076,1077],{},"Scope is a weapon."," Every feature must earn its place in v1.",[93,1080,1081,1084],{},[69,1082,1083],{},"Docs are part of the product."," Future me (and future AI agents) should not need a oral history to change the codebase safely.",[78,1086,1088],{"id":1087},"the-bet","The bet",[66,1090,1091],{},"If I can ship small products consistently — VPN tooling, productivity utilities, practical AI assistants — while keeping the platform boring and reliable, the studio compounds.",[66,1093,1094],{},"This blog is where I document that compounding: decisions, mistakes, and the unglamorous work between launches.",[66,1096,1097],{},"If you are weighing the same path, start with one product and one public artifact per month. The rest sorts itself out.",{"title":117,"searchDepth":118,"depth":118,"links":1099},[1100,1101,1102,1103],{"id":982,"depth":118,"text":983},{"id":1012,"depth":118,"text":1013},{"id":1063,"depth":118,"text":1064},{"id":1087,"depth":118,"text":1088},"\u002Fimages\u002Fblog\u002Fwhy-indie-dev.svg","2025-06-22","Full-stack skills are table stakes. Owning the product end to end is the bet I am making.",{},"\u002Fblog\u002Fwhy-indie-dev",{"title":970,"description":1106},"blog\u002Fwhy-indie-dev",[965,1112,123],"studio","iCyEW5xcuH2vVc2HPlF3IzUvIxMnvOf5VYrmY0XAVDw",{"id":863,"title":864,"body":1115,"cover":956,"date":957,"description":958,"extension":125,"meta":1175,"navigation":126,"path":960,"readTime":342,"seo":1176,"stem":962,"tags":1177,"__hash__":967},{"type":63,"value":1116,"toc":1169},[1117,1119,1121,1123,1125,1141,1143,1155,1157,1159,1163,1165,1167],[66,1118,869],{},[78,1120,873],{"id":872},[66,1122,876],{},[66,1124,879],{},[285,1126,1127,1131,1137],{},[93,1128,1129,887],{},[69,1130,886],{},[93,1132,1133,893,1135,898],{},[69,1134,892],{},[895,1136,897],{},[93,1138,1139,904],{},[69,1140,903],{},[78,1142,908],{"id":907},[90,1144,1145,1149,1151,1153],{},[93,1146,913,1147,917],{},[895,1148,916],{},[93,1150,920],{},[93,1152,923],{},[93,1154,926],{},[78,1156,930],{"id":929},[66,1158,933],{},[935,1160,1161],{},[66,1162,939],{},[78,1164,943],{"id":942},[66,1166,946],{},[66,1168,949],{},{"title":117,"searchDepth":118,"depth":118,"links":1170},[1171,1172,1173,1174],{"id":872,"depth":118,"text":873},{"id":907,"depth":118,"text":908},{"id":929,"depth":118,"text":930},{"id":942,"depth":118,"text":943},{},{"title":864,"description":958},[964,965,966]]