[{"data":1,"prerenderedAt":1036},["ShallowReactive",2],{"featured-projects":3,"experience":979},[4,194,342,611,721,845],{"id":5,"title":6,"architecture":7,"body":32,"category":153,"company":154,"contribution":155,"cover":158,"description":159,"draft":160,"extension":161,"featured":162,"links":163,"meta":168,"metrics":169,"navigation":162,"order":179,"path":180,"role":181,"seo":182,"stem":183,"technologies":184,"timeline":190,"type":191,"year":192,"__hash__":193},"projects\u002Fprojects\u002Fvektorpedia.md","VektorPedia",[8,12,16,20,24,28],{"id":9,"label":10,"detail":11},"sources","GloBI · Wikidata · DBpedia · NCBITaxon","Four public knowledge graphs describing species, taxonomy and biotic interactions.",{"id":13,"label":14,"detail":15},"ingest","Ingestion & alignment","Entities from each source are ingested and aligned into one biodiversity knowledge graph.",{"id":17,"label":18,"detail":19},"graph","Biodiversity knowledge graph","Insects, viruses and plants connected by typed interaction edges.",{"id":21,"label":22,"detail":23},"analysis","Network analysis & scoring","Graph metrics score how likely an insect is to act as a vector for a plant virus.",{"id":25,"label":26,"detail":27},"api","Python web server","Handles queries and data processing for the search engine.",{"id":29,"label":30,"detail":31},"client","Vue client","Search UI for researchers to explore candidate vectors and their evidence.",{"type":33,"value":34,"toc":141},"minimark",[35,40,52,56,59,63,70,74,77,81,103,107,111,126,130,133,137],[36,37,39],"h2",{"id":38},"problem","Problem",[41,42,43,44,48,49,51],"p",{},"Plant viruses spread through insects, but the knowledge of ",[45,46,47],"em",{},"which"," insect carries ",[45,50,47],{}," virus is scattered across many biodiversity databases. Researchers and plant-disease practitioners had no single place to ask: \"which insects are likely vectors for this virus?\"",[36,53,55],{"id":54},"context","Context",[41,57,58],{},"This was my master's thesis at IPB University. The data already existed publicly — in Global Biotic Interactions (GloBI), Wikidata, DBpedia and the NCBI Taxonomy ontology — but in different shapes, identifiers and levels of completeness.",[36,60,62],{"id":61},"solution","Solution",[41,64,65,66,69],{},"I built ",[67,68,6],"strong",{},", a search engine backed by an integrated biodiversity knowledge graph. Data from the four sources was ingested and aligned into one graph that captures relationships between insects, viruses and plants. Network analysis on that graph surfaces and scores candidate insect vectors.",[36,71,73],{"id":72},"architecture","Architecture",[75,76],"architecture-explorer",{":nodes":72},[36,78,80],{"id":79},"technical-challenges","Technical challenges",[82,83,84,91,97],"ul",{},[85,86,87,90],"li",{},[67,88,89],{},"Heterogeneous sources"," — each knowledge graph uses its own identifiers and vocabulary, so entities had to be aligned before any analysis made sense.",[85,92,93,96],{},[67,94,95],{},"Signal from structure"," — interactions are sparse; network analysis was used to infer likely vectors from how species are connected, not just from direct records.",[85,98,99,102],{},[67,100,101],{},"Research to product"," — turning a research pipeline into a usable search application within about three months.",[36,104,106],{"id":105},"impact","Impact",[108,109],"metric-grid",{":metrics":110},"metrics",[41,112,113,114,117,118,125],{},"The work was published in a Scopus-indexed journal (",[45,115,116],{},"JISEBI",", 2024) and deployed at ",[119,120,124],"a",{"href":121,"rel":122},"https:\u002F\u002Fvektorpedia.ipb.ac.id\u002F",[123],"nofollow","vektorpedia.ipb.ac.id",".",[36,127,129],{"id":128},"lessons-learned","Lessons learned",[41,131,132],{},"Knowledge graphs are powerful precisely because they carry context — but most of the effort is in the unglamorous alignment work. A good search experience on top is what makes the research usable by people outside the lab.",[36,134,136],{"id":135},"snapshots","Snapshots",[138,139],"gallery",{":images":140},"[{\"src\":\"\u002Fimages\u002Fwork\u002Fvektorpedia\u002F1.jpeg\",\"alt\":\"Summary of the idea\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fvektorpedia\u002F2.jpeg\",\"alt\":\"Research stages\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fvektorpedia\u002F3.jpeg\",\"alt\":\"Interaction graph\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fvektorpedia\u002F4.jpeg\",\"alt\":\"Embedded taxon\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fvektorpedia\u002F5.jpg\",\"alt\":\"Insect vector scoring\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fvektorpedia\u002F6.jpg\",\"alt\":\"Detail information page\"}]",{"title":142,"searchDepth":143,"depth":143,"links":144},"",2,[145,146,147,148,149,150,151,152],{"id":38,"depth":143,"text":39},{"id":54,"depth":143,"text":55},{"id":61,"depth":143,"text":62},{"id":72,"depth":143,"text":73},{"id":79,"depth":143,"text":80},{"id":105,"depth":143,"text":106},{"id":128,"depth":143,"text":129},{"id":135,"depth":143,"text":136},"AI · Knowledge Graph","IPB University",{"team":156,"mine":157},"Research direction and supervision came from my thesis supervisors.","Data ingestion, knowledge-graph integration, network analysis, and the full search application (backend + frontend).","\u002Fimages\u002Fwork\u002Fvektorpedia\u002F6.jpg","A search engine that finds insect vectors of plant viruses by integrating four public knowledge graphs and running network analysis on top.",false,"md",true,[164,165],{"label":124,"url":121},{"label":166,"url":167},"Published paper","https:\u002F\u002Fe-journal.unair.ac.id\u002FJISEBI\u002Farticle\u002Fview\u002F50015",{},[170,173,176],{"value":171,"label":172},"4","public knowledge graphs integrated",{"value":174,"label":175},"3 mo","from design to deployed app",{"value":177,"label":178},"Scopus","indexed publication",1,"\u002Fprojects\u002Fvektorpedia","Researcher & Engineer (Master thesis)",{"title":6,"description":159},"projects\u002Fvektorpedia",[185,186,187,188,189],"Python","Vue","SPARQL","Knowledge Graph","Network Analysis","Aug 2022 — Dec 2023","engineering",2023,"b7KEWrhhnA8FnuwUaCAHa_fTp00VM1p5sOYETLjJims",{"id":195,"title":196,"architecture":197,"body":217,"category":309,"company":310,"contribution":311,"cover":314,"description":315,"draft":160,"extension":161,"featured":162,"links":316,"meta":320,"metrics":321,"navigation":162,"order":143,"path":331,"role":332,"seo":333,"stem":334,"technologies":335,"timeline":339,"type":191,"year":340,"__hash__":341},"projects\u002Fprojects\u002Fmakassar-raya-motor.md","Spatial Sales Intelligence",[198,202,206,209,213],{"id":199,"label":200,"detail":201},"data","Sales data + BPS indicators","Dealer sales records combined with GDP, per-capita income and population data from Statistics Indonesia (BPS).",{"id":203,"label":204,"detail":205},"geo","GeoJSON boundaries","Province, district and sub-district boundaries prepared with the spatial mapping team.",{"id":25,"label":207,"detail":208},"FastAPI spatial service","Processes spatial data and powers the mapping features.",{"id":210,"label":211,"detail":212},"viz","Plotly dashboards","Interactive maps and charts per province, district and sub-district.",{"id":214,"label":215,"detail":216},"app","Laravel Livewire web app","Data management, imports and the embedded dashboards in one place.",{"type":33,"value":218,"toc":299},[219,221,224,226,229,231,261,263,265,267,278,280,282,285,287,294,296],[36,220,39],{"id":38},[41,222,223],{},"PT. Makassar Raya Motor runs 10 Daihatsu branches across South, Central and Southeast Sulawesi. Sales decisions were made without a clear geographic view of where demand was strong, weak, or untapped.",[36,225,55],{"id":54},[41,227,228],{},"Sales data existed, but not tied to geography or to socio-economic context. The analysis had to work at multiple levels — province, district, sub-district and village — and be usable by non-technical stakeholders.",[36,230,62],{"id":61},[82,232,233,239,245,251],{},[85,234,235,238],{},[67,236,237],{},"Spatial analysis"," of sales across 3 provinces, 54 districts, 709 sub-districts and 7,394 villages.",[85,240,241,244],{},[67,242,243],{},"Maps with context"," — combined with GDP, per-capita income and population indicators from BPS, designed together with urban-planning experts.",[85,246,247,250],{},[67,248,249],{},"Interactive dashboards"," built with Python Plotly.",[85,252,253,256,257,260],{},[67,254,255],{},"A full-stack web app"," (Laravel Livewire) for data management, imports and the embedded dashboards, backed by a ",[67,258,259],{},"FastAPI"," service for spatial processing.",[36,262,73],{"id":72},[75,264],{":nodes":72},[36,266,80],{"id":79},[82,268,269,272,275],{},[85,270,271],{},"Absorbing and cleaning GeoJSON for three provinces at several administrative levels.",[85,273,274],{},"Keeping maps responsive while rendering hundreds of sub-district polygons.",[85,276,277],{},"Joining sales records to administrative areas consistently.",[36,279,106],{"id":105},[108,281],{":metrics":110},[41,283,284],{},"Stakeholders could explore sales performance next to socio-economic indicators at a glance, instead of reading spreadsheets per branch.",[36,286,129],{"id":128},[41,288,289,290,293],{},"The value of a dashboard is in the questions it lets people ask. Pairing sales with public socio-economic data turned \"where did we sell?\" into \"where ",[45,291,292],{},"should"," we sell?\".",[36,295,136],{"id":135},[138,297],{":images":298},"[{\"src\":\"\u002Fimages\u002Fwork\u002Fmakassar-raya-motor\u002Fmrm1.jpeg\",\"alt\":\"Map analysis\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fmakassar-raya-motor\u002Fmrm3.jpeg\",\"alt\":\"Dashboard analysis\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fmakassar-raya-motor\u002Fmrm2.jpeg\",\"alt\":\"Data management\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fmakassar-raya-motor\u002Fmrm4.jpeg\",\"alt\":\"Data import feature\"}]",{"title":142,"searchDepth":143,"depth":143,"links":300},[301,302,303,304,305,306,307,308],{"id":38,"depth":143,"text":39},{"id":54,"depth":143,"text":55},{"id":61,"depth":143,"text":62},{"id":72,"depth":143,"text":73},{"id":79,"depth":143,"text":80},{"id":105,"depth":143,"text":106},{"id":128,"depth":143,"text":129},{"id":135,"depth":143,"text":136},"Data · Geo-web","PT. Makassar Raya Motor",{"team":312,"mine":313},"Map design was done together with urban-planning experts on the spatial mapping team.","Spatial analysis, the Plotly dashboards, the FastAPI backend and the Livewire web application.","\u002Fimages\u002Fwork\u002Fmakassar-raya-motor\u002Fmrm1.jpeg","Spatial analysis and an interactive dashboard that maps sales performance across 3 provinces down to 7,394 villages for a Daihatsu dealer group.",[317],{"label":318,"url":319},"Client profile","https:\u002F\u002Fdaihatsumrm.co.id\u002F",{},[322,325,328],{"value":323,"label":324},"3","provinces analysed",{"value":326,"label":327},"709","sub-districts mapped",{"value":329,"label":330},"7,394","villages covered","\u002Fprojects\u002Fmakassar-raya-motor","Software Engineer & Data Analyst (Contract)",{"title":196,"description":315},"projects\u002Fmakassar-raya-motor",[185,259,336,337,338],"Plotly","Laravel Livewire","GeoJSON","Oct 2023 — Jun 2024",2024,"bGREcI692oktWbSfMrCeDO6Lms7uwU3asq7TIMqFZIc",{"id":343,"title":344,"architecture":345,"body":360,"category":580,"company":581,"contribution":582,"cover":584,"description":585,"draft":160,"extension":161,"featured":162,"links":586,"meta":590,"metrics":591,"navigation":162,"order":600,"path":601,"role":602,"seo":603,"stem":604,"technologies":605,"timeline":608,"type":191,"year":609,"__hash__":610},"projects\u002Fprojects\u002Ftimemarket.md","TimeMarket",[346,349,353,356],{"id":29,"label":347,"detail":348},"Mobile-first PWA","Installable from Chrome so it behaves like a native Android app.",{"id":350,"label":351,"detail":352},"ui","Livewire components","Interactive UI without a separate SPA, which kept development fast.",{"id":214,"label":354,"detail":355},"Laravel application","Programmes (proker), jobs, delegation rules and the role\u002Fpermission model.",{"id":357,"label":358,"detail":359},"db","MySQL","Employees, programmes, jobs and workload history.",{"type":33,"value":361,"toc":571},[362,364,367,369,391,393,418,425,427,429,431,438,559,561,563,566,568],[36,363,39],{"id":38},[41,365,366],{},"As part of Bank Indonesia's internal innovation programme, the Gorontalo office needed a way to delegate work accurately, monitor it, and keep each employee's workload within a reasonable limit.",[36,368,55],{"id":54},[41,370,371,372,375,376,375,379,382,383,386,387,390],{},"It had to be usable from anywhere and easy for every employee — from staff to the head of office. Four roles were involved: ",[67,373,374],{},"Employee",", ",[67,377,378],{},"Team Leader (Chief)",[67,380,381],{},"Head of Office (KPw)"," and ",[67,384,385],{},"Admin",", each with different rights over programmes (",[45,388,389],{},"proker",") and jobs.",[36,392,62],{"id":61},[82,394,395,402,408,415],{},[85,396,397,398,401],{},"An interactive UI with ",[67,399,400],{},"Livewire"," to keep development fast.",[85,403,404,407],{},[67,405,406],{},"Mobile-first"," design so it works equally well on desktop and phones.",[85,409,410,411,414],{},"A ",[67,412,413],{},"semi-PWA"," mode: with the right metadata, the app can be installed from Chrome and opened like a native Android app.",[85,416,417],{},"A user manual for rollout.",[41,419,420],{},[421,422],"video",{"src":423,"controls":162,"muted":162,"playsInline":162,"preload":424},"\u002Fimages\u002Fwork\u002Ftimemarket\u002Ftimemarket_homescreen.webm","none",[36,426,73],{"id":72},[75,428],{":nodes":72},[36,430,80],{"id":79},[41,432,433,434,437],{},"The permission model was the core of the product: who can create, edit, transfer or complete a job depends on the role ",[45,435,436],{},"and"," on whether the user leads that programme.",[439,440,441,461],"table",{},[442,443,444],"thead",{},[445,446,447,451,453,456,459],"tr",{},[448,449,450],"th",{},"Feature",[448,452,374],{},[448,454,455],{},"Chief",[448,457,458],{},"Head of Office",[448,460,385],{},[462,463,464,479,493,507,520,533,546],"tbody",{},[445,465,466,470,473,475,477],{},[467,468,469],"td",{},"View programmes & jobs",[467,471,472],{},"Yes",[467,474,472],{},[467,476,472],{},[467,478,472],{},[445,480,481,484,487,489,491],{},[467,482,483],{},"Add programme",[467,485,486],{},"—",[467,488,472],{},[467,490,486],{},[467,492,486],{},[445,494,495,498,501,503,505],{},[467,496,497],{},"Edit programme",[467,499,500],{},"If programme lead",[467,502,472],{},[467,504,486],{},[467,506,472],{},[445,508,509,512,514,516,518],{},[467,510,511],{},"Add \u002F edit \u002F delete job",[467,513,500],{},[467,515,500],{},[467,517,486],{},[467,519,486],{},[445,521,522,525,527,529,531],{},[467,523,524],{},"Transfer job to others",[467,526,500],{},[467,528,500],{},[467,530,486],{},[467,532,486],{},[445,534,535,538,540,542,544],{},[467,536,537],{},"Mark job completed",[467,539,472],{},[467,541,486],{},[467,543,486],{},[467,545,486],{},[445,547,548,551,553,555,557],{},[467,549,550],{},"Main calendar",[467,552,472],{},[467,554,472],{},[467,556,472],{},[467,558,486],{},[36,560,106],{"id":105},[108,562],{":metrics":110},[41,564,565],{},"The contract was extended for a second version, delivered in 3 months, followed by 6 months of maintenance.",[36,567,129],{"id":128},[41,569,570],{},"For internal tools, adoption beats features. Making it installable on the phones people already carried did more for usage than any single feature.",{"title":142,"searchDepth":143,"depth":143,"links":572},[573,574,575,576,577,578,579],{"id":38,"depth":143,"text":39},{"id":54,"depth":143,"text":55},{"id":61,"depth":143,"text":62},{"id":72,"depth":143,"text":73},{"id":79,"depth":143,"text":80},{"id":105,"depth":143,"text":106},{"id":128,"depth":143,"text":129},"Product · Full-stack","Bank Indonesia — Gorontalo Office",{"mine":583},"Full-stack development of v1 and v2, the PWA mode, and the user manual.","\u002Fimages\u002Fwork\u002Ftimemarket\u002Ftimemarket.png","A workload-management PWA for Bank Indonesia's Gorontalo office that balances how work is delegated across employees.",[587],{"label":588,"url":589},"timemarket.masuk.id","https:\u002F\u002Ftimemarket.masuk.id",{},[592,594,597],{"value":171,"label":593},"user roles with distinct permissions",{"value":595,"label":596},"6 mo","full-stack build of v1",{"value":598,"label":599},"v2","contract extended for a second version",3,"\u002Fprojects\u002Ftimemarket","Web Developer (Contract)",{"title":344,"description":585},"projects\u002Ftimemarket",[606,400,607,358],"Laravel","PWA","May 2021 — Aug 2022",2021,"IXjAXXBIvqG20D-syQXaeIRNsSWKhSxb7huCy3AP2qE",{"id":612,"title":613,"architecture":614,"body":629,"category":693,"company":613,"contribution":694,"cover":697,"description":698,"draft":160,"extension":161,"featured":162,"links":699,"meta":703,"metrics":704,"navigation":162,"order":711,"path":712,"role":713,"seo":714,"stem":715,"technologies":716,"timeline":719,"type":191,"year":192,"__hash__":720},"projects\u002Fprojects\u002Fcontag.md","Contag School",[615,619,622,626],{"id":616,"label":617,"detail":618},"clients","Back office & app","Admin back office and the end-user application.",{"id":25,"label":620,"detail":621},"NestJS API","Modular services with dependency injection, one module per domain.",{"id":623,"label":624,"detail":625},"domain","Academic domain modules","20+ modules covering academic-affairs workflows.",{"id":357,"label":627,"detail":628},"Database","Persistent academic data.",{"type":33,"value":630,"toc":684},[631,633,636,638,652,654,656,658,670,672,674,676,679,681],[36,632,39],{"id":38},[41,634,635],{},"Contag School builds SaaS products for university academic-affairs management. They needed a robust backend so their back office and apps could share data and automate workflows.",[36,637,62],{"id":61},[41,639,640,641,644,645,648,649,125],{},"I developed ",[67,642,643],{},"more than 20 API modules"," on ",[67,646,647],{},"NestJS",", tailored to Contag's academic workflows, and kept a steady delivery rhythm with ",[67,650,651],{},"800+ commits",[36,653,73],{"id":72},[75,655],{":nodes":72},[36,657,80],{"id":79},[82,659,660,663],{},[85,661,662],{},"Keeping a growing number of modules consistent and independent — NestJS modules + dependency injection helped enforce boundaries.",[85,664,665,666,669],{},"Applying ",[67,667,668],{},"SOLID"," principles so new features extend the system instead of rewriting it.",[36,671,106],{"id":105},[108,673],{":metrics":110},[36,675,129],{"id":128},[41,677,678],{},"With many modules, conventions matter more than cleverness. Clear naming and consistent structure made the codebase easy for the rest of the team to pick up.",[36,680,136],{"id":135},[138,682],{":images":683},"[{\"src\":\"\u002Fimages\u002Fwork\u002Fcontag\u002Fc1.jpeg\",\"alt\":\"Back office\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fcontag\u002Fc2.jpeg\",\"alt\":\"App\"}]",{"title":142,"searchDepth":143,"depth":143,"links":685},[686,687,688,689,690,691,692],{"id":38,"depth":143,"text":39},{"id":61,"depth":143,"text":62},{"id":72,"depth":143,"text":73},{"id":79,"depth":143,"text":80},{"id":105,"depth":143,"text":106},{"id":128,"depth":143,"text":129},{"id":135,"depth":143,"text":136},"Backend · SaaS",{"team":695,"mine":696},"Product direction and the client apps were owned by the Contag team.","Backend API modules, following SOLID and clean-code practices.","\u002Fimages\u002Fwork\u002Fcontag\u002Fc2.jpeg","Backend API modules for a SaaS platform that manages university academic affairs.",[700],{"label":701,"url":702},"contag.id","https:\u002F\u002Fcontag.id\u002F",{},[705,708],{"value":706,"label":707},"20+","API modules delivered",{"value":709,"label":710},"800+","commits",4,"\u002Fprojects\u002Fcontag","Backend Engineer",{"title":613,"description":698},"projects\u002Fcontag",[647,717,718],"Node.js","TypeScript","Mar 2023 — Oct 2023","WcTN4sstj_gq9EjpdSrOhdQMQJJ2bZQ2AeqlGPMYfiE",{"id":722,"title":723,"architecture":724,"body":738,"category":814,"company":723,"contribution":815,"cover":818,"description":819,"draft":160,"extension":161,"featured":162,"links":820,"meta":827,"metrics":828,"navigation":162,"order":835,"path":836,"role":837,"seo":838,"stem":839,"technologies":840,"timeline":842,"type":191,"year":843,"__hash__":844},"projects\u002Fprojects\u002Fdigimosque.md","Digimosque",[725,729,732,734],{"id":726,"label":727,"detail":728},"android","Android app","Mosque discovery, donations, takmir features.",{"id":25,"label":730,"detail":731},"Laravel API","Includes the nearest-mosque search algorithm.",{"id":357,"label":627,"detail":733},"Redesigned to support new features while keeping legacy data.",{"id":735,"label":736,"detail":737},"admin","Livewire admin panel","Mosque data, IoT device access, takmir verification.",{"type":33,"value":739,"toc":805},[740,742,745,747,750,752,777,779,781,783,785,788,790,793,795,798],[36,741,39],{"id":38},[41,743,744],{},"Digimosque is a digital mosque platform: find mosques nearby, donate to religious activities, manage mosque cash \u002F infaq \u002F qurban, and connect IoT devices (displays, AC, prayer times). The Android prototype needed a real API, and administrators needed a web panel.",[36,746,55],{"id":54},[41,748,749],{},"The existing data had to be kept, so we reverse-engineered the old database and adjusted it for new features. The deadline was close.",[36,751,62],{"id":61},[82,753,754,761,768],{},[85,755,756,757,760],{},"Advised on the ",[67,758,759],{},"database redesign"," with the product manager.",[85,762,763,764,767],{},"Built the ",[67,765,766],{},"nearest-mosque search"," API and several other endpoints.",[85,769,763,770,773,774,776],{},[67,771,772],{},"entire admin panel"," with ",[67,775,400],{}," — reusable components made it possible to ship 15 modules in under two months.",[36,778,73],{"id":72},[75,780],{":nodes":72},[36,782,106],{"id":105},[108,784],{":metrics":110},[41,786,787],{},"The app is available on the Play Store.",[36,789,129],{"id":128},[41,791,792],{},"Picking a tool for the deadline, not for the résumé: Livewire let me reuse components and move fast without building a separate SPA.",[36,794,136],{"id":135},[138,796],{":images":797},"[{\"src\":\"\u002Fimages\u002Fwork\u002Fdigimosque\u002Fdigi1.png\",\"alt\":\"Admin panel\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fdigimosque\u002Fdigi2.png\",\"alt\":\"Admin panel\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fdigimosque\u002Fdigi3.png\",\"alt\":\"Admin panel\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fdigimosque\u002Fdigi4.png\",\"alt\":\"Admin panel\"}]",[799,800],"iframe",{"src":801,"title":802,"loading":803,"allow":804,"allowFullScreen":162},"https:\u002F\u002Fwww.youtube-nocookie.com\u002Fembed\u002FuFxaXUciovo","DigiMosque Box & DigiMosque Mobile Apps","lazy","accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",{"title":142,"searchDepth":143,"depth":143,"links":806},[807,808,809,810,811,812,813],{"id":38,"depth":143,"text":39},{"id":54,"depth":143,"text":55},{"id":61,"depth":143,"text":62},{"id":72,"depth":143,"text":73},{"id":105,"depth":143,"text":106},{"id":128,"depth":143,"text":129},{"id":135,"depth":143,"text":136},"Backend · Admin",{"team":816,"mine":817},"Built with two other developers; deployment support from the team.","Nearest-mosque search API and other endpoints, database redesign input, and the entire admin panel.","\u002Fimages\u002Fwork\u002Fdigimosque\u002Fdigi6.png","Nearest-mosque search API and a 15-module admin panel for a digital mosque platform.",[821,824],{"label":822,"url":823},"Company profile","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fdigimosque",{"label":825,"url":826},"Play Store","https:\u002F\u002Fplay.google.com\u002Fstore\u002Fsearch?q=digimosque&c=apps",{},[829,832],{"value":830,"label":831},"15","admin modules",{"value":833,"label":834},"\u003C 2 mo","to build the admin panel",5,"\u002Fprojects\u002Fdigimosque","Web Developer (Project based)",{"title":723,"description":819},"projects\u002Fdigimosque",[606,400,841],"REST API","Mar 2022 — May 2022",2022,"vINwFzdy38Uy6AKCxrO0Ot0QhBnurFYlar8KK1xZU1U",{"id":846,"title":847,"architecture":848,"body":865,"category":955,"company":956,"contribution":957,"cover":959,"description":960,"draft":160,"extension":161,"featured":162,"links":961,"meta":962,"metrics":963,"navigation":162,"order":969,"path":970,"role":971,"seo":972,"stem":973,"technologies":974,"timeline":977,"type":191,"year":843,"__hash__":978},"projects\u002Fprojects\u002Fjadwalin.md","Jadwalin",[849,853,857,861],{"id":850,"label":851,"detail":852},"excel","Excel exports from SIAK","Course data and sample schedules, since direct API access wasn't allowed.",{"id":854,"label":855,"detail":856},"import","Import & validation","Familiar Excel workflow for staff.",{"id":858,"label":859,"detail":860},"rules","Rule engine","Department, lecturer, room and credit-hour (SKS) constraints as Laravel rules.",{"id":862,"label":863,"detail":864},"generator","Greedy generator","Automatically proposes a conflict-free schedule.",{"type":33,"value":866,"toc":946},[867,869,872,874,881,883,928,930,932,934,936,938,941,943],[36,868,39],{"id":38},[41,870,871],{},"The Faculty of Islamic Economics and Business at IAIN Sultan Amai Gorontalo needed to manage course schedules faculty-wide without clashes.",[36,873,55],{"id":54},[41,875,876,877,880],{},"Course data lived in the Academic Information System (SIAK), but API access was not permitted. What staff ",[45,878,879],{},"did"," have were Excel exports.",[36,882,62],{"id":61},[82,884,885,891,921],{},[85,886,887,890],{},[67,888,889],{},"Excel-based import",", so staff keep the workflow they know and integration doesn't depend on SIAK access.",[85,892,893,894],{},"Four conflict rules, implemented as Laravel validation rules so new ones are easy to add:\n",[895,896,897,903,909,915],"ol",{},[85,898,899,902],{},[67,900,901],{},"Department"," — a major's schedule may not collide.",[85,904,905,908],{},[67,906,907],{},"Lecturer"," — a lecturer can't teach two classes at once.",[85,910,911,914],{},[67,912,913],{},"Room"," — a room can't be double-booked.",[85,916,917,920],{},[67,918,919],{},"Credits (SKS)"," — the course's credits must match the time slot.",[85,922,923,924,927],{},"An ",[67,925,926],{},"automatic schedule generator"," using a greedy algorithm.",[36,929,73],{"id":72},[75,931],{":nodes":72},[36,933,106],{"id":105},[108,935],{":metrics":110},[36,937,129],{"id":128},[41,939,940],{},"When the ideal integration isn't available, meet users where their data already is. Excel import was less elegant than an API — and far more useful.",[36,942,136],{"id":135},[138,944],{":images":945},"[{\"src\":\"\u002Fimages\u002Fwork\u002Fjadwalin\u002Fjadwalin3.png\",\"alt\":\"Schedule overview\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fjadwalin\u002Fjadwalin1.png\",\"alt\":\"Schedule management\"},{\"src\":\"\u002Fimages\u002Fwork\u002Fjadwalin\u002Fjadwalin2.png\",\"alt\":\"Schedule detail\"}]",{"title":142,"searchDepth":143,"depth":143,"links":947},[948,949,950,951,952,953,954],{"id":38,"depth":143,"text":39},{"id":54,"depth":143,"text":55},{"id":61,"depth":143,"text":62},{"id":72,"depth":143,"text":73},{"id":105,"depth":143,"text":106},{"id":128,"depth":143,"text":129},{"id":135,"depth":143,"text":136},"Product · Algorithm","IAIN Sultan Amai Gorontalo",{"mine":958},"Sole developer — analysis, rules, generator and UI.","\u002Fimages\u002Fwork\u002Fjadwalin\u002Fjadwalin3.png","Faculty-scale course scheduling with conflict rules and a greedy auto-generator, fed by Excel exports instead of a locked API.",[],{},[964,966],{"value":171,"label":965},"conflict rules enforced",{"value":967,"label":968},"2 mo","build time",6,"\u002Fprojects\u002Fjadwalin","Full-stack Developer",{"title":847,"description":960},"projects\u002Fjadwalin",[606,975,976],"Greedy algorithm","Excel import","Apr 2022 — May 2022","Blf9BnXdC9KcjkqxNW-QkYQZ7s73cp7LKpUA-VXNW7c",{"id":980,"extension":981,"items":982,"meta":1033,"stem":1034,"__hash__":1035},"experience\u002Fdata\u002Fexperience.yml","yml",[983,991,998,1003,1012,1018,1023,1029],{"company":984,"role":985,"period":986,"kind":987,"summary":988,"highlights":989},"SingaPay","Software Engineer","2025 — Present","work","Building payment systems — payment gateway, B2B\u002FB2C flows and APIs.",[990],"Backend services for payment processing and integrations.",{"company":310,"role":332,"period":339,"location":992,"kind":987,"summary":993,"highlights":994,"project":997},"Makassar","Spatial sales intelligence for a Daihatsu dealer group across three provinces.",[995,996],"Spatial analysis of sales across 3 provinces, 54 districts, 709 sub-districts and 7,394 villages.","Plotly dashboards, FastAPI spatial backend and a Livewire web app.","makassar-raya-motor",{"company":613,"role":713,"period":719,"kind":987,"summary":999,"highlights":1000,"project":1002},"API modules for a university academic-affairs SaaS.",[1001],"20+ NestJS API modules and 800+ commits, following SOLID principles.","contag",{"company":154,"role":1004,"period":1005,"location":1006,"kind":1007,"summary":1008,"highlights":1009,"project":1011},"M.Sc. Computer Science","2021 — 2024","Bogor","education","Computational Intelligence & Optimization. GPA 3.83 \u002F 4.",[1010],"Thesis on biotic-interaction knowledge graphs and network analysis (Scopus indexed).","vektorpedia",{"company":581,"role":602,"period":608,"location":1013,"kind":987,"summary":1014,"highlights":1015,"project":1017},"Gorontalo","Built TimeMarket, a workload-management PWA, then its second version.",[1016],"v1 in 6 months of full-stack development; v2 in 3 months plus 6 months of maintenance.","timemarket",{"company":723,"role":837,"period":843,"kind":987,"summary":1019,"highlights":1020,"project":1022},"Nearest-mosque search API and the full admin panel.",[1021],"15-module admin panel in under two months with Livewire.","digimosque",{"company":1024,"role":1025,"period":1026,"location":1013,"kind":1007,"summary":1027,"project":1028},"Universitas Negeri Gorontalo","B.Sc. Information Systems","2016 — 2021","Best graduate of the Faculty of Engineering. GPA 3.53 \u002F 4.","sindasi",{"company":581,"role":1030,"period":1031,"location":1013,"kind":987,"summary":1032},"Web Developer (Internship)","Sep 2019 — Dec 2019","Built Raisa, a web app to monitor regional inflation with early warnings.",{},"data\u002Fexperience","P9YMR8Zxtff7uZYxMUHP-uJkatuZXR4ouTj7WramkLQ",1790853656065]