[{"data":1,"prerenderedAt":1055},["ShallowReactive",2],{"featured-projects":3,"recent-articles":48},[4,28],{"id":5,"title":6,"date":7,"demoUrl":8,"description":9,"extension":10,"image":8,"isFeatured":11,"isSideProject":11,"meta":12,"postUrl":8,"stack":20,"stem":24,"tags":25,"__hash__":27},"projects\u002Fprojects\u002Finward-slide.md","InwardSlide",["Date","2024-06-01T20:02:04.364Z"],null,"A mini Instagram-like social media platform","md",true,{"body":13},{"type":14,"value":15,"toc":16},"minimark",[],{"title":17,"searchDepth":18,"depth":18,"links":19},"",2,[],[21,22,23],"Vue.js","Vuetify","tween.js","projects\u002Finward-slide",[26],"Side Project","tloPyFw6lloTWn_xBUrq9fzggnHQLWc63VSI-mToHjU",{"id":29,"title":30,"date":31,"demoUrl":8,"description":32,"extension":10,"image":8,"isFeatured":11,"isSideProject":33,"meta":34,"postUrl":8,"stack":39,"stem":45,"tags":46,"__hash__":47},"projects\u002Fprojects\u002Fclauseup.md","ClauseUP – AI-Powered Legal Document Navigation",["Date","2021-10-01T20:02:04.366Z"],"A SaaS platform under IntelliLease. ClauseUP is designed to help lawyers and law firms efficiently navigate legal documents by leveraging AI-powered document extraction and visualization",false,{"body":35},{"type":14,"value":36,"toc":37},[],{"title":17,"searchDepth":18,"depth":18,"links":38},[],[40,41,42,43,44],"TypeScript","Quasar","TipTap","ProseMirror","AWS (Textract, S3, SQS)","projects\u002Fclauseup",[26],"5E4rTqHMGJu0oLODiQ_cx53vI70N3pI1TH88a1YSlus",[49,277,796],{"id":50,"title":51,"body":52,"date":264,"description":265,"extension":10,"hasTwitterEmbed":33,"image":266,"meta":267,"navigation":11,"path":268,"readingTime":269,"seo":270,"stem":271,"tags":272,"__hash__":276},"blog\u002Fblog\u002F06.stable-system.md","System Goes Down Somewhere Between Guilin and Guangzhou",{"type":14,"value":53,"toc":262},[54,65,68,71,74,77,80,83,86,89,92,95,104,106,109,112,117,119,122,125,128,131,133,136,139,142,145,148,151,154,157,170,173,180,183,186,189,192,194,197,200,203,206,220,223,225,228,231,234,236,239,253,256,259],[55,56,57],"blockquote",{},[58,59,60,61,64],"p",{},"It’s been a while since I last wrote here.  ",[62,63],"br",{},"\nNot because nothing was happening. Quite the opposite.",[58,66,67],{},"The past few months were mostly spent working on Ordina and pushing fairly deep changes into the system. We shipped what internally became version 1.5 — a restructuring that touched almost every codepath in the platform.",[58,69,70],{},"We moved away from the older item structure into a more flexible category-based model, added support for variants, reworked parts of the POS flow, and somehow still kept backward compatibility with older app versions.",[58,72,73],{},"All of this happened during Ramadan. I’ll probably write about that separately.",[58,75,76],{},"But after weeks of long nights, production anxiety, and migration-related edge cases, things finally started to feel stable again.",[58,78,79],{},"Or stable enough.",[81,82],"hr",{},[58,84,85],{},"I’m currently in China for family-related business.",[58,87,88],{},"In the afternoon of Apr 14, somewhere on the highway between Guilin and Guangzhou, after a surprisingly calm morning in the countryside, I got a call.",[58,90,91],{},"It was around 8AM Libya time. A call at this hour usually means something is wrong.",[58,93,94],{},"Not a message. Not “check this when you’re free.”.",[58,96,97],{},[98,99,100],"em",{},[101,102,103],"strong",{},"A call",[81,105],{},[58,107,108],{},"The customers suddenly couldn’t make it past the initial loading screen of the app. At first, the issue didn’t make much sense.",[58,110,111],{},"The backend was healthy.\nAPIs were responding.\nNothing looked down.",[55,113,114],{},[58,115,116],{},"Which, operationally, means the system is down whether your monitoring agrees with you or not.",[81,118],{},[58,120,121],{},"The situation around me wasn’t ideal either.",[58,123,124],{},"My laptop battery was already dead.\nThe phone was on battery saver mode so I could not access my mail inbox.\nMost Google services barely worked without VPN access.\nAnd we were still hours away from Guangzhou.",[58,126,127],{},"So the debugging process became slow and awkward.",[58,129,130],{},"Trying to find the root cause using whatever I could inspect from my phone somewhere in southern China was painful.",[81,132],{},[58,134,135],{},"The actual issue turned out to be surprisingly small.",[58,137,138],{},"Our image CDN became inaccessible.",[58,140,141],{},"The root cause itself was even smaller: a Google Cloud payment did not go through.",[58,143,144],{},"Normally this should have been caught almost immediately through email notifications. Except I never saw the emails.",[58,146,147],{},"Google services in China already required VPN access, I had a long trip with an upcoming meeting so I set my phone on battery saver, and email sync had stopped in the background.",[58,149,150],{},"So the alert technically existed. I was just unaware of it.",[58,152,153],{},"And unfortunately, parts of the client app loading flow implicitly depended on those images being available.",[58,155,156],{},"So even though:",[158,159,160,164,167],"ul",{},[161,162,163],"li",{},"the backend was healthy",[161,165,166],{},"the APIs were responding",[161,168,169],{},"the ordering logic itself was functioning correctly",[58,171,172],{},"The user experience effectively collapsed.",[58,174,175,176,179],{},"Not because the core system failed.\nBut because a dependency that was ",[98,177,178],{},"supposed"," to be non-critical quietly became critical over time.",[58,181,182],{},"What made this more frustrating is that this was not the first time the image CDN caused issues.",[58,184,185],{},"The frontend was already supposed to gracefully handle image failures instead of blocking the user flow entirely. Funny enough, the first time this exact issue showed up was during Ramadan while I was praying Taraweeh. Apparently production incidents in Ordina prefer inconvenient timing.",[58,187,188],{},"However, somewhere between implementation details, assumptions, and QA, that behavior slipped through.",[58,190,191],{},"And we stumbled on it eventually in production.",[81,193],{},[58,195,196],{},"What stood out to me wasn’t the outage itself.",[58,198,199],{},"It was how small the real problem was compared to the operational impact.",[58,201,202],{},"One failing edge service.\nOne missing fallback.\nAnd suddenly a functioning system starts behaving like a dead one.",[58,204,205],{},"You can have:",[158,207,208,211,214,217],{},[161,209,210],{},"healthy servers",[161,212,213],{},"normal database metrics",[161,215,216],{},"successful API responses",[161,218,219],{},"stable business logic",[58,221,222],{},"and still end up with a product people simply cannot use.",[81,224],{},[58,226,227],{},"I ended up routing the images through another path and things recovered in roughly half an hour.",[58,229,230],{},"Not catastrophic. Not even a particularly large outage. It was early morning after all.",[58,232,233],{},"But, I have to say. There’s something strange about debugging production systems while moving across high-speed highways in China with a dead laptop and unreliable connectivity. The chances of experiencing such situations are almost zero.",[81,235],{},[58,237,238],{},"This incident reinforced something I have always yapped about to my colleges while designing solutions and writing code.",[55,240,241,246],{},[58,242,243],{},[98,244,245],{},"Murphy's Law",[58,247,248,249,252],{},"anything that can go wrong, ",[98,250,251],{},"will"," go wrong.",[58,254,255],{},"I have witnessed enough situations to say that real-world conditions will eventually expose every assumption you forgot you made.",[58,257,258],{},"Production has a way of finding the weakest point in the room.",[58,260,261],{},"Usually at the worst possible moment.",{"title":17,"searchDepth":18,"depth":18,"links":263},[],["Date","2026-05-06T20:02:04.370Z"],"A small CDN failure exposed how quickly ‘non-critical’ dependencies become production-critical under real-world conditions.","\u002Fblog\u002Fstable-system\u002Fstable-system.webp",{},"\u002Fblog\u002Fstable-system","5",{"title":51,"description":265},"blog\u002F06.stable-system",[273,274,275],"Development","Systems Thinking","Debugging","sGwIvGxZ0xLcxIT2W35KhIvxRzUxay9yitBgwL4kBhI",{"id":278,"title":279,"body":280,"date":785,"description":786,"extension":10,"hasTwitterEmbed":33,"image":787,"meta":788,"navigation":11,"path":789,"readingTime":790,"seo":791,"stem":792,"tags":793,"__hash__":795},"blog\u002Fblog\u002F05.end-of-2025-year-recap.md","2025 Year Recap",{"type":14,"value":281,"toc":772},[282,287,290,301,309,312,316,319,330,333,336,339,342,345,348,355,358,361,364,367,370,374,377,380,383,386,389,392,395,399,402,405,408,414,417,420,423,426,429,432,439,442,445,450,455,458,463,466,471,494,497,501,504,507,510,514,534,538,549,552,556,559,588,592,595,625,628,631,635,640,643,647,650,653,664,667,671,674,677,682,685,690,693,697,711,714,718,723,726,730,734,737,741,746,749,752,759,763,766,769],[283,284,286],"h3",{"id":285},"introduction","Introduction",[58,288,289],{},"I’m writing this knowing I probably won’t have the time, or  bandwidth, to polish it properly. If I wait for the “right moment,” this might never exist. So I’m publishing it as it is: incomplete, nonlinear, and written from the inside of a year that hasn’t fully settled yet. I just wanted to put it online before the end of 2025",[58,291,292,293,300],{},"Also: I only came back to the portfolio with this idea after abandoning it since June. Yes this is me finally shipping. And because Vercel “took over” Nuxt and ",[294,295,299],"a",{"href":296,"rel":297},"https:\u002F\u002Fhub.nuxt.com\u002Fchangelog\u002Fself-hosting-first#nuxthub-admin-sunset",[298],"nofollow","Nuxt Hub is sunsetting the Cloudflare integration on December 31",", I now have to set up my portfolio again before the year ends. Great timing.",[58,302,303,304,308],{},"Most of the content in this blog post comes from scattered notes: margins of a notebook, half-sentences in ",[305,306,307],"code",{},".txt"," files, fragments I type just to release the pressure after long hours of coding. This isn’t a diary, and it wasn’t written in one sitting. Some parts were aided by an LLM, but the thinking, the tone, and the \"why\" are all mine.",[58,310,311],{},"Leaving this here for future me—when I inevitably end up on one of those founder podcasts, I’ve got receipts. So I can pretend I planned it, lol.",[283,313,315],{"id":314},"last-semester-defense-day-and-graduation","Last Semester, Defense Day and Graduation",[58,317,318],{},"I started this year in the hellish hustle of the last semester finals of my Bachelors of Electrical and Electronics Engineering, with too many responsibilities piling on:",[158,320,321,324,327],{},[161,322,323],{},"My Final Engineering Bachelors semester exams.",[161,325,326],{},"A graduation project that, on paper, belonged to a group, but in reality slowly became almost handled by me.",[161,328,329],{},"End-of-year financial reconciliation for the marble company I work for.",[58,331,332],{},"The work was insane: short deadlines, long nights. My peers on the project weren’t handling their part well, so I ended up doing the simulation, research, and DATCOM solutions myself, learning MATLAB and Simulink quirks along the way.",[58,334,335],{},"I still don't know why I was studying and reviewing aerodynamic engineering books and YouTube videos when I was supposed to be a telecom student. It is what it is now...",[58,337,338],{},"The week before our thesis defense, I wasn’t even home.",[58,340,341],{},"I was in the capital, working for the marble company. Meetings, systems, and managers were waiting for answers that couldn’t be delayed because of “academic pressure.” I came back home on Tuesday, January 22nd, four days before the defense day. Went shopping for defense day clothes. We started working on the defense presentation on Thursday. Finalized everything on Friday in a mere 2-day time window. Defended on Saturday, January 25th. While defending, we were not asked any deep questions; we simply aced it. Frankly, I felt we won a war.",[58,343,344],{},"When I say it now, it sounds clean. It wasn’t.",[58,346,347],{},"For memory this is me, almost breaking the drone's wing when grabbing it out of the car backseat on the defense day.",[58,349,350],{},[351,352],"img",{"alt":353,"src":354},"Me pulling the drone wing on the defense day","\u002Fblog\u002Fend-of-2025-year-recap\u002Fpulling-drone-wing.gif",[58,356,357],{},"The graduation ceremony was on January 30, a Thursday. The night before, I remember staying up until almost 5 am preparing a separate, simpler version of the presentation for the ceremony by myself... I woke up late on the ceremony day. I don't know how I got dressed and was there in the hall on time. ",[58,359,360],{},"Five minutes before going on stage, it hit me: I hadn’t prepared a single sentence of what I would say. No opening. No closing. Nothing. My name was about to be called and my mind went blank. I had to man up right there. I pulled my phone out, typed a few thoughts, and shaped them into something that didn’t sound ridiculous. I even leaned on ChatGPT for structure three minutes before stepping onto the stage.",[58,362,363],{},"Standing there, lights in my face, I spoke. Hesitant at first but somehow I think words came out calm, I don't know if it was confidence or something else. After I walked off the stage, a friend came up to me and said, “You must’ve prepared that speech a week ago.” I smiled. He had no idea. My family also said I did well presenting and that I should become a \"Friday preacher\".",[58,365,366],{},"The following Saturday, I was back in the capital training employees on the new system. Lonely hotel nights, late work, supervising, transferring branches into the new system. Man it was tough - absorbing resistance without showing it.",[58,368,369],{},"By mid-February, I received a perfect grade on the graduation project. I remember I was in the capital that afternoon, discussing something and my project peer phone-called to congratulate me. I pulled my phone up to look it up and I was looking at it, feeling distant. Proud, maybe—but detached. I have decided years ago and knew the degree isn't the axis my life is rotating around but I gave it my best without interfering with my bigger plans. Now I am an engineer by name with a GPA above 90. But the trajectory had shifted quietly months before.",[283,371,373],{"id":372},"life-outside-of-the-university-campus","Life Outside of The University Campus",[58,375,376],{},"Even before I enrolled in the engineering program, I was already working in tech—freelancing, building side projects, and making connections that would later matter. I launched multiple side hustles (and at least one notable failure, Matajer), all while staying on top of my coursework and keeping my grades strong. I juggled freelance gigs and part-time\u002Ffull-time contracts with exams, labs, and a demanding graduation project, which taught me how to ship imperfect work, learn fast from failures, and balance client commitments with long-term goals. I even landed good job with freedom in 2024 towards the end of my university life.",[58,378,379],{},"Rasheed, my co-founder and I go way back. In 2018 we met for the first time, 2019 we worked on small projects and we were not very experienced. In 2023 our collaboration tightened: we contracted together on a few gigs; he handled Flutter really well while I juggled backend and product. December 2023 was finals hell for me, but once those projects wrapped, we rented a small office with one clear goal: build something profitable.",[58,381,382],{},"To test our working compatibility, we started with a lightweight POS for cafés and restaurants—menus, orders, receipts. A practical retail system that could earn passively without constant hand-holding. We even explored social media auto‑reply bots for businesses.",[58,384,385],{},"Rasheed has more business experience than me, he asked the bigger question: why not delivery and logistics? The market was already validated; other apps had existed for years. That’s how we landed on Ordina. A food delivery platform tailored to how things really work here, especially now that we have good network with restaurant and cafe shop owners and we have a good selling point, they have our trust in software and support.",[58,387,388],{},"I didn’t plan a startup. It was evenings after classes . We picked the smallest thing that could serve a real order: menus, driver \"matchmaking\", maps, and notifications. Then we kept ironing out the everyday rough edges.",[58,390,391],{},"Why this project? I don't really have an answer, I never planned on building such a project. But somehow I was prepared for this, the work with the marble company prepared me well, I already understood how bookkeeping work, how management and chain of command work in the local culture. It was a win to work within such a corporate.",[58,393,394],{},"We started the work on the platform in April 2024, but because both of us are doing this part-time, we have other things to do. A freaking engineering degree for me, working with the marble company, family business, and a \"trivial\" graduation project, just this simple list and my new \"entrepreneurship path.\"",[283,396,398],{"id":397},"ordina","Ordina",[58,400,401],{},"Fast forward to May this year, We are almost ready we just need to finish the work on the iOS version. We created the developer account on May 20th. Apple's annual subscription payment was made without ceremony. Just another commitment that couldn’t be undone.",[58,403,404],{},"June through August was preparation disguised as waiting. Testing. Paperwork. E-payment hell. Moamalat’s outdated documentation, endless phone calls, Eid holidays stretching delays into weeks. A month and a half just to open a bank account properly.",[58,406,407],{},"Apple terrified us. We assumed rejection was inevitable. That’s why we chose the app name carefully. We were ready to abandon it if needed before publishing to Google Play, which we thought would be easier. We passed the automated review of the App Store, and I have a celebratory picture of that moment.",[58,409,410],{},[351,411],{"alt":412,"src":413},"Successful submission of Ordina iOS App","\u002Fblog\u002Fend-of-2025-year-recap\u002Fordina-ios-app-uploaded.jpg",[58,415,416],{},"Manual review followed. Time slowed.",[58,418,419],{},"July 14: we received the email “We noticed an issue with your submission.” That sentence still tightens something in my chest. It turned out minor—permissions workflow tweaks. Three hours of work, resubmitted.",[58,421,422],{},"July 15: “Welcome to the App Store.”",[58,424,425],{},"Google Play took longer. Twelve days of waiting felt endless. We kept adding features just to stay sane. First release: August 5.",[58,427,428],{},"At that point we hadn’t marketed anything. No real drivers. The app is running on dummy test data. And yet—someone ordered dinner. Paid using his E-Wallet. Through the app. A real person, trusting software we built in isolation.",[58,430,431],{},"By late August and early September, we conducted test orders with family and friends, spending over 3,000 LYD for testing. We hired drivers, pushed the first production-ready version 1.0.4 to Google Play, and the first real order came on September 2.  We launched simply with the mentality: ship now, test the system, perfectionism is the enemy. And it worked. (I add my line here, even Microsoft ships buggy Windows updates)",[58,433,434,435,438],{},"September 5 marked the start of regular orders. I was coding, and suddenly I called out ",[98,436,437],{},"“Rasheed, a real order.”"," We stared at the screen like children watching a TV show. Driver matched. The restaurant accepted. Live map moving. We called the driver repeatedly, expecting the app to collapse.",[58,440,441],{},"We moved into our new office for Ordina earlier in May. A mundane coincidence: it was the same day as my birthday. The office is no longer quiet like I used to enjoy. Now it hums with laptops, voices, and the chaos of creation. I work all week—including Fridays—balancing the ordinary stress of running a startup with moments of laughter and fun. The core team of Ordina is just three members, including Rasheed's brother. Somehow, we managed all the work: development, data entry, and accounting. We’re slowly hiring to relieve ourselves, still investing and losing money to build and distribute.",[58,443,444],{},"I remember taking this picture of our live data screen when, for the first time, the system is handling 31 orders simultaneously. I knew I have designed our matchmaker and realtime part of the infrastructure to support not less than 500 simultaneous orders but I was worried. I quickly pulled the live health data, our memory usage, CPU usage, charts. Adrenaline kicked in: \"Are we seeing any delays or lags?, any unaccounted-for race conditions? Is the response time affected?\". It was all good.",[55,446,447],{},[58,448,449],{},"Every item on my \"When in doubt of bad design, check\" checked. No memory leaks observed and every single delivery man was in sync. Nothing got logged in our errors telemetry screen.",[58,451,452],{},[351,453],{"alt":353,"src":454},"\u002Fblog\u002Fend-of-2025-year-recap\u002Fordina-operation-center.jpg",[58,456,457],{},"Still, multiple challenges remain, especially marketing. Agencies have been unreliable.",[55,459,460],{},[58,461,462],{},"Lack of sleep and anxiety about system going down or a random bug appearing were constant.",[58,464,465],{},"I definitely will write more detailed blog posts on Ordina. A series of lessons learned.",[467,468,470],"h4",{"id":469},"financially-we-spent","Financially, We Spent:",[158,472,473,476,479,482,488,491],{},[161,474,475],{},"A few thousand USD on POS machines",[161,477,478],{},"A couple thousand USD on Apple devices for iOS testing",[161,480,481],{},"Several cars for operations",[161,483,484,487],{},[101,485,486],{},"Monthly expenses",": five-figure LYD salaries, hundreds of LYD car maintenance, hundreds of LYD internet for POS, office rent, a couple hundred USD hosting, a few hundred USD ads, a few thousand LYD influencers",[161,489,490],{},"Tens of thousands of LYD in core business offers\u002Fdiscounts",[161,492,493],{},"An unknown amount or I cannot remember but still numbers are piling",[58,495,496],{},"Split between the three of us in Ordina, we managed to pay these expenses. I am still proud of myself doing this all alone without relying on loans or borrowing money from the family, I keep on burning my savings lol :3 .",[283,498,500],{"id":499},"family-support","Family support",[58,502,503],{},"I of course still have to handle some responsibilities in the family business being the tech guy and the one who can communicate in English but my role is limited being busy with the other stuff I work on. They are not the type to cheer or say you got this but they are not the type to pull me back and put obstacles, they gave me freedom to choose. They saw I was dedicated in tech and the work on Ordina.",[58,505,506],{},"My father was, out of care and worry, always asking if I needed help, should he set me up for a job in a state-owned company, I refused repeatedly, saying \"I can handle myself no worries\". He is extra worrying I waste the effort I put on my engineering degree and that the project might fail as Matajer did back during the Corona Pandemic.",[58,508,509],{},"My cousin, who I highly hold respect for, kinda insisted on \"leaving me doing things on my own\", he says they should give me some independence, I  might succeed and if not I get out with connections and life lessons.",[283,511,513],{"id":512},"achievements-im-proud-of","Achievements I’m Proud of",[158,515,516,519,522,525,528,531],{},[161,517,518],{},"Launching Ordina and keeping it alive",[161,520,521],{},"Building the marble company’s stock and sync systems",[161,523,524],{},"Earning my engineering degree with a strong GPA",[161,526,527],{},"Securing early partnerships for Ordina",[161,529,530],{},"Becoming calmer, clearer, and more disciplined",[161,532,533],{},"Shipping my portfolio (still a work in progress)",[283,535,537],{"id":536},"things-i-had-to-sacrifice-the-ugly-part","Things I Had to Sacrifice, The Ugly Part",[158,539,540,543,546],{},[161,541,542],{},"Low-effort dopamine (games)",[161,544,545],{},"Weekend anime binges",[161,547,548],{},"A bit of social time and moments with friend and hangouts",[58,550,551],{},"I skipped more workouts than I’d wanted to. My body missed the consistency I used to have. I relied more on fast food this year because cooked food at home was nearly impossible with my schedule. I feel bad for these habits, but I also acknowledge them as part of the trade-off for building something from scratch.",[283,553,555],{"id":554},"unfulfilled-wishlist-items","Unfulfilled Wishlist Items",[58,557,558],{},"A short list of things I planned but never fully followed through on this year:",[158,560,561,567,573,579,585],{},[161,562,563,566],{},[101,564,565],{},"Enroll in an English language center.","\nI swapped an in-person course for an online option but never found the time; However, I could say the family-business online meetings helped a bit fulfilling this plan.",[161,568,569,572],{},[101,570,571],{},"Properly celebrate my graduation","\nThe almost 5-years of grind in the Faculty of Engineering while maintaining my life outside of the campus as a freelance and employed software developer deserved a a bigger celebration with friends and project peers instead of the small family gathering. I couldn't, again because of my schedule.",[161,574,575,578],{},[101,576,577],{},"Take the planned vacation in May",", Unfortunately commitments stacked up and the trip was postponed.",[161,580,581,584],{},[101,582,583],{},"Completing my online portfolio."," While I have successfully launched the bare-minimum of content to call it a portfolio it still doesn't capture the true depth of the projects I have worked on and is not up to date. Even my weekend hack, presentation tool \"Inward Slide\" still the wrong description at the time of writing.",[161,586,587],{},"(More items to add...)",[283,589,591],{"id":590},"job-offers-and-projects-i-rejected","Job Offers and Projects I Rejected",[58,593,594],{},"You might not believe me if I say I rejected multiple job offers and opportunities to work on tech projects. I don't market myself at all and I am rarely visible on social media or any platform. However people from the marble company, family business, friends, and relatives keep giving my contact info to random people, out of good intentions. Examples of work opportunities I was offered:",[596,597,598,605,616,619,622],"ol",{},[161,599,600,601,604],{},"Random guys calling me through a friend asking if I can develop an app for them; one guy wanted to develop a platform for his home appliances business, another a platform for online courses. The demand for ",[101,602,603],{},"qualified"," software engineers is so high even me, who is not visible in the market, get contacted.",[161,606,607,608,611,612,615],{},"The marble company I work for connected me with a big player in the medical equipment and pharmacies sector to set up an ERP system for them. Then in November, came a meeting with ",[98,609,610],{},"an airline"," who they have connections with; they offered ",[98,613,614],{},"a six-figure USD budget"," to overhaul their aging software.",[161,617,618],{},"My cousin asked if I could develop a new modern POS system for his supermarket and promised five other markets would immediately buy it. A deal worth over 100,000.",[161,620,621],{},"A state-operated free zone, the biggest in the country, reached out saying my university recommended me for a training course on LTE equipment (being a telecom graduate). While meeting with them, they were so impressed by my portfolio and the amount of experience I have in tech that they offered me a different job in their IT dept. They themselves knew they could not pay the right amount to hire a person with such skills, and suggested I should continue with the path I was on.",[161,623,624],{},"A meeting with a major, state-owned oil and gas distributor. Halfway in the meeting I was offered a job for the skills and ability to develop effective software solutions. Of course, I was honored to be offered such a job after a brief meeting.",[58,626,627],{},".. I kindly refused these offers either they interfere with my schedule, family business schedule or I don't see them fit to me.",[58,629,630],{},"I probably have forgotten some offers and the list goes on. I am not sharing this to flex or brag, but I just kept the list because it resonated with what I had read in Cal Newport's \"So Good They Can't Ignore You\" and that \"control\" can only be acquired through hard work and in exchange for skill. At 22 I feel I’ve gained enough skills to exchange for \"control\" over my career that I don't have any restrictive attendance schedules—a job that still allows me to improve and work on my side hustles and pays the right amount.",[283,632,634],{"id":633},"random-facts-and-texts","Random Facts and Texts",[58,636,637],{},[98,638,639],{},"From this point onward, the statements are in random order and may not be factual...",[58,641,642],{},"\u002F",[467,644,646],{"id":645},"a-section-about-habits","A Section About Habits",[58,648,649],{},"This year, I’ve acquired new habits. I laugh at mistakes, tolerate setbacks, and allow myself to step back without losing momentum. I’ve come to understand that discipline isn’t about perfection but about persistence and emotional control.",[58,651,652],{},"My co-founder Rasheed is not a perfectionist in the same way as I am; if not for him, our startup would probably never have been released to the public. I learned from him that \"it will always work out\". I have observed this fact multiple times",[158,654,655,658],{},[161,656,657],{},"I, a chronic perfectionist, would make the decision I would have probably left the marble company ages ago saying I cannot handle doing two things at the same time, yet the company is very satisfied with my work and raised the pay multiple times along with multiple benefits.",[161,659,660,661,663],{},"In November, my brother informed me the family business requires us to travel to China, while I was happy to have the opportunity to visit China it was not the right time for me, Ordina is there I cannot leave the team at this critical moment. However I cannot say no to this, I already have left and delayed a lot of work related to the family business on my part, and of course I want to visit China. ",[62,662],{},"\nSo it was decided November 28th was the day we travel to China and before that we need a week in Tunisia for the visa paperwork and not to forget the Turkish Visa we needed to apply to because on our way back both of us need to stop there to oversee a few things. We went on and started the paperwork, however I internally wished for a delay, and my luck China and Japan had diplomatic issues and the work on our Chinese visa is delayed and that gave room to finish a few pending tasks.",[58,665,666],{},"I may not have gained or developed any major technical skill, I have not learned any new significant language or tool because I was so focused on Ordina. The only meaningful tool I have acquired would be OpenVPN. Other than that I focused on learning Redis and production-ready strategies. Next year I plan on better sharpening and expanding my toolset. Still my soft skills have much improved with meetings with international industry leaders in different sectors.",[467,668,670],{"id":669},"almost-burning-out","Almost Burning Out",[58,672,673],{},"The year demanded more than focus and endurance; it required keeping a clear head under constant pressure. When things felt overwhelming,",[58,675,676],{},"In short, 2025 has been a year of endurance, work, and growth. My year has been intense, messy, and unforgettable, filled with moments of reflection, subtle joy, and the quiet satisfaction of surviving chaos while keeping my mind and heart intact.",[55,678,679],{},[58,680,681],{},"I kinda enjoy playing life on \"Hard\" mode.",[58,683,684],{},"One quote I liked this year is",[55,686,687],{},[58,688,689],{},"people think entrepreneurs work on a single project at a time, while in reality, work is always stacking.",[58,691,692],{},"I don't like calling myself an entrepreneur but by definition I am one. I just do not seek \"flashed of success\".",[467,694,696],{"id":695},"this-year-in-numbers-roughly","This Year in Numbers (roughly):",[158,698,699,702,705,708],{},[161,700,701],{},"Over 1200 GitHub commits",[161,703,704],{},"A handful of in-person meetings with foreign companies for family business",[161,706,707],{},"Dozens of online meetings with international holding groups",[161,709,710],{},"Five meetings with government officials to make connection.",[58,712,713],{},"Socially, time was scarce. I can remember a 2-day pool \"Istiraha\" break and it was a luxury.",[467,715,717],{"id":716},"random-night-in-december-18","Random Night in December 18",[58,719,720],{},[98,721,722],{},"a note",[58,724,725],{},"I was in the capital and I have just arrived, I feel numb to stress, sore-throated, stacked with undone work, preparing for end-of-year stock reconciliation. I maintained my introverted personality but handled high-stakes business meetings today.",[467,727,729],{"id":728},"random-evening-in-december-26","Random evening in December 26",[58,731,732],{},[98,733,722],{},[58,735,736],{},"I just wanna lazy this day out.. it is a cozy evening enjoying my 15 mins of silence and overthinking, stressed about the fact I need to go to the office. there is an issue with our yesterday version of the restaurant POS system. the printing feature I implemented in a hurry without proper QA is not working as intended. I hear kids in the background playing football, man I envy them, why did I choose this lifestyle, I should have settled with a regular boring routine job... Time to get off to work, lol I'm still laying on the floor staring at the ceiling, closed eyes kids voices filling the space,",[467,738,740],{"id":739},"the-emotional-toll-to-all-of-this","The Emotional Toll to All of This",[58,742,743],{},[98,744,745],{},"LLMs seem to handle this better I no longer want to edit this section",[58,747,748],{},"The releases are the visible part. The real work is handling uncertainty every day — fixing new problems in the morning and ending the day with fresh ones.",[58,750,751],{},"Focus has a cost: you delay breaks, reschedule plans, and say “not yet” to things that would be easier right now because the long arc matters more.",[58,753,754,755,758],{},"Building a company takes emotional stamina. I tried my best to keep the work strong, while \"keep the person ",[98,756,757],{},"me"," intact\".",[467,760,762],{"id":761},"unfinished-texts","Unfinished Texts",[58,764,765],{},"I need to look up a few pictures, oh I better not forget the laptop dent when it fell off",[58,767,768],{},"The lifestyle I chose is stressful, demanding, but rewarding. Sustained focus and discipline come at an emotional cost. There are evenings when I take a short break for lunch or a coffee (LLM is making things up, I don't drink coffee, and I am too lazy to edit this paragraph) , letting myself breathe and reset. Even mundane moments like heating a quick meal or stepping outside for five minutes help me maintain mental clarity.",[58,770,771],{},"Our biggest competitor has bad software, while we have the upper hand in that, we hired their main support team member, and gathered intel on their operations. This is taking too long in editing; I am just leaving this as is ...",{"title":17,"searchDepth":18,"depth":18,"links":773},[774,776,777,778,779,780,781,782,783,784],{"id":285,"depth":775,"text":286},3,{"id":314,"depth":775,"text":315},{"id":372,"depth":775,"text":373},{"id":397,"depth":775,"text":398},{"id":499,"depth":775,"text":500},{"id":512,"depth":775,"text":513},{"id":536,"depth":775,"text":537},{"id":554,"depth":775,"text":555},{"id":590,"depth":775,"text":591},{"id":633,"depth":775,"text":634},["Date","2025-12-30T20:02:04.370Z"],"A personal log of 2025. Launches, mistakes, small wins—written fast and shipped before midnight.","\u002Fblog\u002Fend-of-2025-year-recap\u002Fend-of-2025-year-recap.webp",{},"\u002Fblog\u002Fend-of-2025-year-recap","12",{"title":279,"description":786},"blog\u002F05.end-of-2025-year-recap",[794],"Personal","9HJ6yh_TMTmZdkm_xOd9fNeMC74ahc5aVexhiTc6Jr0",{"id":797,"title":798,"body":799,"date":1044,"description":1045,"extension":10,"hasTwitterEmbed":33,"image":1046,"meta":1047,"navigation":11,"path":1048,"readingTime":1049,"seo":1050,"stem":1051,"tags":1052,"__hash__":1054},"blog\u002Fblog\u002F04.when-prodiciton-isnt-what-you-expect.md","When Production Isn’t What You Expect: Debugging My Portfolio",{"type":14,"value":800,"toc":1042},[801,804,825,828,831,838,843,851,854,868,981,988,1002,1008,1035,1038],[58,802,803],{},"I barely have time to work on my personal portfolio—let alone debug production issues. This post is a quick look at a frustrating but valuable learning experience I had while trying to get my Nuxt-powered site to behave properly in production.",[58,805,806,807,812,813,816,817,820,821,824],{},"Building my personal portfolio with ",[294,808,811],{"href":809,"rel":810},"https:\u002F\u002Fnuxt.com\u002F",[298],"Nuxt"," seemed like a great choice—modern, clean, and perfect for SEO with its slick SSR. I used ",[101,814,815],{},"Nuxt Content"," for managing dynamic content and deployed via ",[101,818,819],{},"Nuxt Hub"," on ",[101,822,823],{},"Cloudflare",", relying on their promise of smooth integration.",[58,826,827],{},"I noticed that the landing page of my portfolio—which includes sections that load dynamic data from Nuxt Content —was failing in production. These sections work flawlessly in development but fail to load on production, leading to hydration mismatch errors and even my site 404ing on every fresh route hit except for the index page. To make matters worse, these sections seemed to load just fine sometimes, and sometimes they just refused to load silently without any errors logged. ",[58,829,830],{},"I couldn't narrow down the hydration mismatch error to a single root culprit and dived in a cycle of fixing random errors related to how I structured the html in these sections, but the issues didn't disappear. ",[58,832,833,834,837],{},"After hours of research, going through GitHub issues, and searching in old threads on the Nuxt Discord server. I felt like I was debugging the internals of the promised \"plug and play\" system. I found hope  when I noticed that while running a local simulation of the production environment using ",[305,835,836],{},"npx nuxthub preview",". I noticed  the wrangler's DevTool shows the following error message whenever I refresh the page - cold starting and kicking the SSR mechanism of Nuxt (more on this later).",[55,839,840],{},[58,841,842],{},"H3Error: [db0] [d1] binding `DB` not found",[55,844,845],{},[58,846,847,848,850],{},"For Context: ",[305,849,836],{}," is a utility to quickly scaffold a local simulation of the production environment using Cloudflare's warngler.",[58,852,853],{},"Nuxt Content uses a SQL-based approach to store and serve content, choosing different adapters based on the environment. In development, it defaults to SQLite, which works seamlessly without any setup. In production, however, it expects a different adapter like Cloudflare D1 or Postgres.",[58,855,856,857,860,861,864,865],{},"After many failed attempts and hours of CPU time wasted on building and debugging production, I had to ",[101,858,859],{},"manually enable the database in the Nuxt Hub config"," and also ",[101,862,863],{},"set the database binding"," myself. The fix to my issues was to simply add these lines to the ",[305,866,867],{},"nuxt.config.ts",[869,870,874],"pre",{"className":871,"code":872,"language":873,"meta":17,"style":17},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F ....\ncontent: {\n  database: {\n    type: 'd1',\n    bindingName: 'DB',\n  },\n},\n\nhub: {\n  \u002F\u002F ...\n  database: true,\n},\n","typescript",[305,875,876,885,895,902,918,931,937,943,949,957,963,976],{"__ignoreMap":17},[877,878,881],"span",{"class":879,"line":880},"line",1,[877,882,884],{"class":883},"sJ8bj","\u002F\u002F ....\n",[877,886,887,891],{"class":879,"line":18},[877,888,890],{"class":889},"sScJk","content",[877,892,894],{"class":893},"sVt8B",": {\n",[877,896,897,900],{"class":879,"line":775},[877,898,899],{"class":889},"  database",[877,901,894],{"class":893},[877,903,905,908,911,915],{"class":879,"line":904},4,[877,906,907],{"class":889},"    type",[877,909,910],{"class":893},": ",[877,912,914],{"class":913},"sZZnC","'d1'",[877,916,917],{"class":893},",\n",[877,919,921,924,926,929],{"class":879,"line":920},5,[877,922,923],{"class":889},"    bindingName",[877,925,910],{"class":893},[877,927,928],{"class":913},"'DB'",[877,930,917],{"class":893},[877,932,934],{"class":879,"line":933},6,[877,935,936],{"class":893},"  },\n",[877,938,940],{"class":879,"line":939},7,[877,941,942],{"class":893},"},\n",[877,944,946],{"class":879,"line":945},8,[877,947,948],{"emptyLinePlaceholder":11},"\n",[877,950,952,955],{"class":879,"line":951},9,[877,953,954],{"class":889},"hub",[877,956,894],{"class":893},[877,958,960],{"class":879,"line":959},10,[877,961,962],{"class":883},"  \u002F\u002F ...\n",[877,964,966,968,970,974],{"class":879,"line":965},11,[877,967,899],{"class":889},[877,969,910],{"class":893},[877,971,973],{"class":972},"sj4cs","true",[877,975,917],{"class":893},[877,977,979],{"class":879,"line":978},12,[877,980,942],{"class":893},[58,982,983,984,987],{},"Of course, I also had to set up the binding ",[305,985,986],{},"DB"," on the Cloudflare dashboard for my Worker manually.\nBut according to the docs, Nuxt Content \"automatically enables the NuxtHub database\" and configures Cloudflare D1 for you.  Here is an excerpt from the docs page on how to deploy a Nuxt Content app via NuxtHub;",[55,989,990,996],{},[58,991,992,993,995],{},"Nuxt Content module automatically enables NuxtHub database. And update database configuration to use Cloudflare D1 with ",[305,994,986],{}," binding name. (This is default configuration for NuxtHub database.)",[58,997,998,999,1001],{},"You can override the database configuration by providing your own database configuration in ",[305,1000,867],{},".",[58,1003,1004,1005,1007],{},"To make things more frustrating, The local preview tool (",[305,1006,836],{},") also failed to mirror production accurately. At the time of writing, it still fails to load the dynamic section whilst the actual production does, though it was the sole helper when everything failed me including modern day GPTs 😏.",[58,1009,1010,1011,1014,1015,1018,1019,1022,1023,1026,1027,1030,1031,1034],{},"And I also figured out that these sections could load just fine sometimes because Nuxt Content ",[98,1012,1013],{},"does"," seem to have a fallback—if the data is fetched on the client-side e.g., in the context of a ",[305,1016,1017],{},"\u003CClientOnly>"," or a component\u002Fpage with ",[305,1020,1021],{},".client.vue"," suffix. This is achieved by Nuxt Content serving a binary dump of the SQLite file. Some GitHub issues suggested turning the whole site into a ",[101,1024,1025],{},"client-rendered app"," to avoid the problem. But I didn’t want to give up on ",[101,1028,1029],{},"SSR"," and ",[101,1032,1033],{},"SEO"," just for convenience.",[58,1036,1037],{},"Throughout all this I learned that “it works on my machine” is a big deal when cloud bindings and serverless functions are involved. But, using docker for a portfolio is an overkill so I take it as is.",[1039,1040,1041],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":17,"searchDepth":18,"depth":18,"links":1043},[],["Date","2025-06-11T20:02:04.370Z"],"A behind-the-scenes look at the frustrating journey of getting my Nuxt portfolio to work in production","\u002Fblog\u002Fwhen-prodiciton-isnt-what-you-expect\u002Fwhen-prodiciton-isnt-what-you-expect.webp",{},"\u002Fblog\u002Fwhen-prodiciton-isnt-what-you-expect","6",{"title":798,"description":1045},"blog\u002F04.when-prodiciton-isnt-what-you-expect",[273,1053],"Debug Journey","fhcHKJHCuoMM_V-Io_Emt-I002o6kK6M7eoT4EoRbmo",1779825724008]