[{"data":1,"prerenderedAt":410},["ShallowReactive",2],{"implementation-cases":3},[4,59,254,337],{"id":5,"title":6,"body":7,"date":41,"demoUrl":26,"description":42,"extension":43,"image":44,"imageWebp":45,"meta":46,"navigation":47,"path":48,"repoUrl":49,"seo":50,"stem":51,"tags":52,"__hash__":58},"projects\u002Fprojects\u002Fbarefeed.md","barefeed: A research publication on logistics, finance, and learning",{"type":8,"value":9,"toc":37},"minimark",[10,15,31,34],[11,12,14],"h1",{"id":13},"barefeed-publication","barefeed — publication",[16,17,18,22,23,30],"p",{},[19,20,21],"strong",{},"What it is:"," a publication of research syntheses on logistics, finance, and learning, live at ",[24,25,29],"a",{"href":26,"rel":27},"https:\u002F\u002Fbarefeed.dibotak.com",[28],"nofollow","barefeed.dibotak.com",".",[16,32,33],{},"barefeed takes one topic at a time — a logistics operation, a valuation question, a learning principle — and reports what research and primary sources actually say about it, written in third person and grounded in cited sources rather than opinion pieces.",[16,35,36],{},"Content is written with AI assistance and reviewed by a human editor. The disclosure appears in the footer, at the foot of every article, and in the page metadata.",{"title":38,"searchDepth":39,"depth":39,"links":40},"",2,[],"2026-10-10","A deployed publication of research syntheses on logistics, finance, and learning, written with AI assistance and reviewed by a human editor.","md","\u002Fassets\u002Fportfolio\u002Fbarefeed-preview.png","\u002Fassets\u002Fportfolio\u002Fbarefeed-preview.webp",{},true,"\u002Fprojects\u002Fbarefeed","https:\u002F\u002Fgithub.com\u002Fdibotak\u002Fbarefeed",{"title":6,"description":42},"projects\u002Fbarefeed",[53,54,55,56,57],"nuxt","content","writing","research","publishing","CcLqEZMacBSUGPanaagdflSohxrtfX4I3slX89JkRgI",{"id":60,"title":61,"body":62,"date":237,"demoUrl":213,"description":238,"extension":43,"image":239,"imageWebp":240,"meta":241,"navigation":47,"path":242,"repoUrl":243,"seo":244,"stem":245,"tags":246,"__hash__":253},"projects\u002Fprojects\u002Fdepok-map.md","depok-map: An interactive city map built on official Indonesian data sources",{"type":8,"value":63,"toc":230},[64,68,74,79,82,98,102,109,119,122,154,158,171,180,186,192,198,204,208,217,220,223,227],[11,65,67],{"id":66},"depok-map-implementation-case","depok-map — implementation case",[16,69,70,73],{},[19,71,72],{},"Implementation focus:"," assemble a city map from official government sources, keep it honest about what the data does and does not contain, and ship it as a static site with no backend.",[75,76,78],"h2",{"id":77},"problem","Problem",[16,80,81],{},"Kota Depok's public map services are either unusable offline or inconsistent between layers. Roads, administrative boundaries, public transport routes, and schools each come from a different authority, in a different format, with a different identifier scheme.",[16,83,84,85,88,89,93,94,97],{},"The specific difficulty was ",[19,86,87],{},"defective source data",". A school coordinate published as ",[90,91,92],"code",{},"0\u002F0"," is not a location. A latitude published as ",[90,95,96],{},"+6.3856"," is not wrong in isolation — it is a real latitude somewhere in Indonesia — but it puts a school in Sulawesi, 1,400 km from Depok. Building a map on top of that requires validating coordinates rather than trusting them, and deciding what to do when a record simply has none.",[75,99,101],{"id":100},"implementation","Implementation",[16,103,104,105,108],{},"A static site: ",[90,106,107],{},"index.html",", one vendored MapLibre build, and four generated JavaScript payloads. No framework, no build step, no backend. It is served from a CDN and the only runtime dependency is the basemap tiles.",[16,110,111,112,115,116,30],{},"The data is assembled by Python scripts that fetch from source, cache the raw responses, validate, and emit the payloads as committed ",[90,113,114],{},".js"," files loaded through ",[90,117,118],{},"\u003Cscript src>",[16,120,121],{},"What is in the map:",[123,124,125,136,142,148],"ul",{},[126,127,128,131,132,135],"li",{},[19,129,130],{},"63 kelurahan"," inside ",[19,133,134],{},"11 kecamatan",", from HDX\u002FBPS administrative boundaries, each with its official BPS code",[126,137,138,141],{},[19,139,140],{},"77 official roads"," from the city's spatial plan (Perda Kota Depok No. 9\u002F2022, Pasal 16), matched to geometry by name — 74 of 77 matched, and the three that did not are kept as text rather than guessed at",[126,143,144,147],{},[19,145,146],{},"46 angkot routes"," (16 within the city, 30 cross-border) from OpenStreetMap, plus 8 retired routes listed as inactive",[126,149,150,153],{},[19,151,152],{},"242 secondary schools"," at coordinates published by the ministry",[75,155,157],{"id":156},"decisions-and-constraints","Decisions and constraints",[16,159,160,163,164,166,167,170],{},[19,161,162],{},"The biggest coordinate problem was invisible to a range check."," One school is published at latitude ",[90,165,96],{},". A latitude-range validation passes it, because ",[90,168,169],{},"+6.38"," is a legitimate latitude in Indonesia. What identifies it as a typo is that the point misses the city polygon and its negation lands 106 m inside it. So the sign correction is gated on the city boundary, not on a plausible range — a check that would have accepted the bug.",[16,172,173,176,177,179],{},[19,174,175],{},"A missing coordinate is not a school to hide."," 18 of the 242 schools publish ",[90,178,92],{},", and one publishes a near-null-island value about 11,900 km away. Rather than drop them or attach a fabricated pin, they stay in the list and searchable, carry a \"no pin\" badge, and their card states plainly that the source has no coordinate. The same applies to the three unmatched roads.",[16,181,182,185],{},[19,183,184],{},"Never invent a location."," Where a source lacks a coordinate, the map shows nothing at that point. Every GeoJSON path is gated on the coordinate being present and finite, so a null can never produce an invalid feature or break the viewport fit.",[16,187,188,191],{},[19,189,190],{},"Reproducible over live."," Every upstream response is cached to disk by its identifier, so a rebuild makes zero network requests and produces a byte-identical payload. That is what makes the generated data reviewable: the claim \"this is what the source said\" is checkable, because the source bytes are in the repo.",[16,193,194,197],{},[19,195,196],{},"Generated data is committed, not fetched at runtime."," The payloads are ~1.7 MB of JavaScript in total. Serving them as committed files means the site has no API dependency, no cold start, and no runtime failure mode when an upstream service is slow. The deploy step prunes the source JSON and the build scripts, which the browser never loads.",[16,199,200,203],{},[19,201,202],{},"Separate the shipped app from the work."," The public repository holds only what a browser downloads plus the scripts that generate it. Design notes, the offline test harness, a canonical-data-model experiment, and one-off API probes live in a separate private checkout. The dependency runs one way: the lab reads the app's payloads, never the reverse.",[75,205,207],{"id":206},"outcome","Outcome",[16,209,210,211,216],{},"The live application at ",[24,212,215],{"href":213,"rel":214},"https:\u002F\u002Fdepok.dibotak.com",[28],"depok.dibotak.com"," covers the city's full administrative hierarchy, its official road names, its angkot routes, and every registered secondary school with an official coordinate where one exists. The four-tab interface works down to a 390 px viewport, and each tab is served from its own generated payload.",[16,218,219],{},"224 of 242 schools are plotted, from coordinates published by the ministry rather than geocoded. The source is the ministry's own portal, reached through a public JSON API that documents neither itself nor its rate limits — the two behaviours that fail silently, a region filter that wants a name rather than a code and a zero-based page index, cost more debugging time than the rest of the data pipeline combined.",[16,221,222],{},"No usage or business-impact metrics are claimed here.",[75,224,226],{"id":225},"stack","Stack",[16,228,229],{},"Plain JavaScript, MapLibre GL JS, HTML, and CSS on the front end; Python 3 with the standard library for the data pipeline. Upstream data from the Ministry of Primary and Secondary Education (Sekolah Kita), HDX\u002FBPS, OpenStreetMap via Overpass, and the city's spatial plan. Static hosting with no server-side runtime.",{"title":38,"searchDepth":39,"depth":39,"links":231},[232,233,234,235,236],{"id":77,"depth":39,"text":78},{"id":100,"depth":39,"text":101},{"id":156,"depth":39,"text":157},{"id":206,"depth":39,"text":207},{"id":225,"depth":39,"text":226},"2026-10-04","A deployed map of Kota Depok that drills through 11 kecamatan to 63 kelurahan, and plots 242 secondary schools at their official ministry coordinates.","\u002Fassets\u002Fportfolio\u002Fdepok-map-preview.png","\u002Fassets\u002Fportfolio\u002Fdepok-map-preview.webp",{},"\u002Fprojects\u002Fdepok-map","https:\u002F\u002Fgithub.com\u002Fdibotak\u002Fdepok-map",{"title":61,"description":238},"projects\u002Fdepok-map",[247,248,249,250,251,252],"javascript","maplibre","geospatial","data-pipeline","performance","frontend","bIFWWrQW4bDBr_ienB8k80CGWFXI_vpNDt0cH38sYC4",{"id":255,"title":256,"body":257,"date":320,"demoUrl":304,"description":321,"extension":43,"image":322,"imageWebp":323,"meta":324,"navigation":47,"path":325,"repoUrl":326,"seo":327,"stem":328,"tags":329,"__hash__":336},"projects\u002Fprojects\u002Ftraceo.md","traceO: An AI learning engine built around practice",{"type":8,"value":258,"toc":313},[259,263,268,270,273,275,278,281,283,297,299,308,310],[11,260,262],{"id":261},"traceo-implementation-case","traceO — implementation case",[16,264,265,267],{},[19,266,72],{}," progressive course generation with visible work-in-progress, resumable steps, and practical learner interaction.",[75,269,78],{"id":77},[16,271,272],{},"A conventional course can make it easy to consume material without applying it. The product needed to turn an open-ended topic into a structured learning path, then give the learner a reason to do the work rather than only watch or read.",[75,274,101],{"id":100},[16,276,277],{},"traceO transforms a topic into a four-stage blueprint—Hook → Core → Sandbox → Payoff. Hook and Core are prepared up front; Sandbox and Payoff are generated when the learner reaches them. This makes practice part of the product flow rather than an optional extra.",[16,279,280],{},"The application uses a Go API with PostgreSQL and a Vue 3 + TypeScript frontend. Generation runs through a visible FIFO worker; stages persist as they complete, and server-sent events stream progress to the interface. Provider configuration is stored in the database, allowing the endpoint\u002Fmodel settings to change without a redeploy.",[75,282,157],{"id":156},[123,284,285,288,291,294],{},[126,286,287],{},"Persist each completed stage so an interrupted build can resume from its partial blueprint.",[126,289,290],{},"Make topic preview free and editable before queueing generation.",[126,292,293],{},"Keep queue state visible and cancellable instead of hiding long-running work.",[126,295,296],{},"Default shared course links to read-only access.",[75,298,207],{"id":206},[16,300,301,302,307],{},"The deployed product at ",[24,303,306],{"href":304,"rel":305},"https:\u002F\u002Ftraceo.dibotak.com",[28],"traceo.dibotak.com"," delivers the complete flow from topic preview through generated blueprint and interactive stages. No usage or business-impact metrics are claimed here.",[75,309,226],{"id":225},[16,311,312],{},"Go, PostgreSQL 16, Vue 3, Vite, TypeScript, server-sent events, and an OpenAI-compatible LLM endpoint.",{"title":38,"searchDepth":39,"depth":39,"links":314},[315,316,317,318,319],{"id":77,"depth":39,"text":78},{"id":100,"depth":39,"text":101},{"id":156,"depth":39,"text":157},{"id":206,"depth":39,"text":207},{"id":225,"depth":39,"text":226},"2026-09-15","A deployed learning product that turns a topic into a progressive course and makes learners apply the material, built with Go, PostgreSQL, Vue, and an OpenAI-compatible LLM.","\u002Fassets\u002Fportfolio\u002Ftraceo-preview.png",null,{},"\u002Fprojects\u002Ftraceo","#",{"title":256,"description":321},"projects\u002Ftraceo",[330,331,332,333,334,335],"golang","vue","typescript","ai","postgres","sse","7JAQHYHJ4-rfQdDnxqCav_HjQe4DGcbwAKkKnXDF0Kg",{"id":338,"title":339,"body":340,"date":400,"demoUrl":384,"description":401,"extension":43,"image":402,"imageWebp":323,"meta":403,"navigation":47,"path":404,"repoUrl":326,"seo":405,"stem":406,"tags":407,"__hash__":409},"projects\u002Fprojects\u002Fcarigpx.md","CariGPX: A GPS track platform with data and privacy controls",{"type":8,"value":341,"toc":393},[342,346,351,353,356,358,361,364,366,377,379,388,390],[11,343,345],{"id":344},"carigpx-implementation-case","CariGPX — implementation case",[16,347,348,350],{},[19,349,72],{}," process GPS files, render tracks for exploration, and give users explicit control over track visibility.",[75,352,78],{"id":77},[16,354,355],{},"Outdoor enthusiasts need to inspect and share GPS tracks, while track data can reveal sensitive location information. The product therefore needed both a responsive visualization flow and clear sharing\u002Fprivacy options.",[75,357,101],{"id":100},[16,359,360],{},"CariGPX is a deployed web application built as a decoupled Go API and Nuxt 3 frontend. The API parses GPX data and converts it to GeoJSON; the frontend uses Leaflet to display tracks and elevation information.",[16,362,363],{},"A parse-first upload flow provides a client-side preview before final storage. Tracks support three visibility levels: public, unlisted by unique link, and private. Public tracks can appear in discovery; private tracks are restricted to their owner.",[75,365,157],{"id":156},[123,367,368,371,374],{},[126,369,370],{},"Separate track parsing and analysis from persistent storage so a preview can be shown before upload completion.",[126,372,373],{},"Make public, unlisted, and private visibility explicit rather than treating every share link the same.",[126,375,376],{},"Keep map rendering and track exploration in the browser while using Go for API and data-processing responsibilities.",[75,378,207],{"id":206},[16,380,381,382,387],{},"The live product at ",[24,383,386],{"href":384,"rel":385},"https:\u002F\u002Fcarigpx.com",[28],"carigpx.com"," supports GPX upload, visualization, and track sharing with visibility controls. No usage or business-impact metrics are claimed here.",[75,389,226],{"id":225},[16,391,392],{},"Go, Nuxt 3, Vue 3, TypeScript, Tailwind CSS, Leaflet, JWT, GPX parsing, and GeoJSON.",{"title":38,"searchDepth":39,"depth":39,"links":394},[395,396,397,398,399],{"id":77,"depth":39,"text":78},{"id":100,"depth":39,"text":101},{"id":156,"depth":39,"text":157},{"id":206,"depth":39,"text":207},{"id":225,"depth":39,"text":226},"2026-01-11","A deployed geospatial application for uploading, analyzing, visualizing, and sharing GPS tracks, implemented with Go and Nuxt.","\u002Fassets\u002Fportfolio\u002Fcarigpx-preview.png",{},"\u002Fprojects\u002Fcarigpx",{"title":339,"description":401},"projects\u002Fcarigpx",[330,53,331,332,249,408],"api-design","N0H01S0LKTwz25GBeJHUrXy59xEjVPkxnXaWP7vklvA",1791620052892]