[{"data":1,"prerenderedAt":477},["ShallowReactive",2],{"home-work-en":3,"home-articles-en":297},[4,148,229],{"id":5,"title":6,"body":7,"category":119,"date":120,"description":121,"extension":122,"externalUrl":123,"featured":124,"locale":125,"meta":126,"navigation":124,"outcome":127,"path":132,"rank":133,"release":134,"role":135,"screenshot":136,"seo":137,"stack":138,"stem":143,"summary":144,"tier":145,"year":146,"__hash__":147},"projects\u002Fen\u002Fprojects\u002Faruna-dashboard.md","Aruna",{"type":8,"value":9,"toc":109},"minimark",[10,14,17,22,25,29,32,36,71,75,95,99,102,106],[11,12,13],"p",{},"Aruna is a personal product built for a specific pain point I kept noticing: Indonesian retail investors chart stocks without seasonal context — what a market does around election cycles, when sectors rotate, or which way institutional money is actually moving. There is plenty of raw market data available; almost nothing connects it to a decision.",[11,15,16],{},"I built the whole thing myself: product definition, design, backend analytics, frontend, and deployment. It runs as a progressive web app.",[18,19,21],"h2",{"id":20},"the-problem","The problem",[11,23,24],{},"Retail investors in the Indonesian market are pattern-hungry but data-short. Seasonal behavior is buried in years of history, institutional money flow is locked inside broker transaction data, and any analysis tool that adds context usually costs money or hides its data behind a subscription.",[18,26,28],{"id":27},"my-role","My role",[11,30,31],{},"Founder, product owner, and sole engineer. Ambiguous problem, real users, no specification waiting for me — exactly the kind of work I want to be known for.",[18,33,35],{"id":34},"technical-work","Technical work",[37,38,39,47,53,59,65],"ul",{},[40,41,42,46],"li",{},[43,44,45],"strong",{},"Seasonal analysis."," Historical return charts overlaid with political and election-cycle context, plus monthly and quarterly return heatmaps.",[40,48,49,52],{},[43,50,51],{},"Institutional money flow."," A custom scoring engine that pulls broker transaction data to evaluate accumulation versus distribution, exposed as a per-stock score.",[40,54,55,58],{},[43,56,57],{},"MSCI progress tracker."," Calculations estimating IDX stocks' free-float market-cap progress toward MSCI Standard and Small Cap inclusion thresholds.",[40,60,61,64],{},[43,62,63],{},"Local-first data."," Watchlist and portfolio state lives in the browser first, then merges and syncs to Supabase (with row-level security) once a user authenticates.",[40,66,67,70],{},[43,68,69],{},"Interactive visuals."," Relative Rotation Graphs, canvas-based market bubble maps, and TradingView-style candlestick charts.",[18,72,74],{"id":73},"decisions","Decisions",[37,76,77,83,89],{},[40,78,79,82],{},[43,80,81],{},"Local-first sync."," Stock-market watchlists change rapidly and are read constantly. Keeping state local-first made the app feel instant while auth happened in the background.",[40,84,85,88],{},[43,86,87],{},"Obfuscated API envelope."," The app proxies Yahoo Finance and Stockbit endpoints server-side. I wrapped responses in an XOR-obfuscated JSON envelope so the proxy isn't trivially scraped.",[40,90,91,94],{},[43,92,93],{},"Server-side cron for analytics."," Heavy scoring and screening run on scheduled jobs, not in the browser. The client stays a thin, fast interface and hosting stays cheap.",[18,96,98],{"id":97},"constraints","Constraints",[11,100,101],{},"A solo build on a small budget. Everything with recurring cost — analytics compute, data fetching — had to run somewhere cheap, and the frontend had to feel mobile-fast despite loading data-dense charts.",[18,103,105],{"id":104},"outcome","Outcome",[11,107,108],{},"Aruna went from an ambiguous idea (\"investors need seasonal context\") to a deployed PWA with real features and real data flows. It is the strongest demonstration I have of owning a product end to end.",{"title":110,"searchDepth":111,"depth":111,"links":112},"",2,[113,114,115,116,117,118],{"id":20,"depth":111,"text":21},{"id":27,"depth":111,"text":28},{"id":34,"depth":111,"text":35},{"id":73,"depth":111,"text":74},{"id":97,"depth":111,"text":98},{"id":104,"depth":111,"text":105},"Product · Fintech","2026-09-16","A mobile-first stock market analysis platform for Indonesian retail investors — seasonal context, institutional money flow, and local-first state.","md","https:\u002F\u002Farunaa.vercel.app",true,"en",{},[128,129,130,131],"Built seasonal pattern charts, Relative Rotation Graphs, and money flow scoring.","Shipped a local-first watchlist and portfolio synchronized through Supabase RLS.","Wrapped proxied market-data endpoints in an XOR-obfuscated response envelope.","Ran heavy analytics on server-side cron jobs to keep client bundles lean.","\u002Fen\u002Fprojects\u002Faruna-dashboard","1","2025","Full-stack Developer","\u002Fimg\u002Fprojects\u002Faruna.png",{"title":6,"description":121},[139,140,141,142],"Next.js","Supabase","React","PWA","en\u002Fprojects\u002Faruna-dashboard","A solo, data-dense financial product I took from an ambiguous idea to a running PWA — seasonal analysis, institutional money flow tracking, and offline-first sync.","standard",2025,"lxDKAUAVfifucW7R-AvYeEQfugm5ylRbNi4u1dgzwoE",{"id":149,"title":150,"body":151,"category":205,"date":120,"description":206,"extension":122,"externalUrl":207,"featured":124,"locale":125,"meta":208,"navigation":124,"outcome":209,"path":215,"rank":216,"release":217,"role":218,"screenshot":219,"seo":220,"stack":221,"stem":225,"summary":226,"tier":145,"year":227,"__hash__":228},"projects\u002Fen\u002Fprojects\u002Frealisasi-anggaran.md","BNPB Realisasi Anggaran",{"type":8,"value":152,"toc":200},[153,156,160,163,167,193,197],[11,154,155],{},"Realisasi Anggaran (\"budget realization\") was the first internal system I shipped at BNPB. It moved a spreadsheet-bound budget workflow into a web application where financial administration could be planned, tracked, and reported.",[18,157,159],{"id":158},"what-it-does","What it does",[11,161,162],{},"The system is built around the shape of government budget execution: activities and their sub-activities, the budget packages they draw on, and the absorption of those budgets over time. Users record financial absorption against packages, then produce the reports the reporting flow actually consumes.",[18,164,166],{"id":165},"engineering-notes","Engineering notes",[37,168,169,175,181,187],{},[40,170,171,174],{},[43,172,173],{},"Laravel 5.7 on PHP 7.1."," The framework and runtime of the era, chosen for the standard it set on authentication and CRUD structure.",[40,176,177,180],{},[43,178,179],{},"Authentication-backed workflows."," No unauthenticated data paths; all administration flows sit behind Laravel's auth.",[40,182,183,186],{},[43,184,185],{},"Reporting as a first-class output."," Beyond on-screen views, the system exports XLSX and PDF and supports printing — because a report, not a screen, is what finance departments consume.",[40,188,189,192],{},[43,190,191],{},"A hierarchical budget model."," Sub-activities live under activities and packages under sub-activities, so the model mirrors how budget data is aggregated.",[18,194,196],{"id":195},"place-in-the-story","Place in the story",[11,198,199],{},"This is where my government systems work started: model the record before the screen, keep status explicit, and make the output the thing people actually use. The same internship produced the Bantuan BPBD aid-management system and the Disposisi correspondence tracker; the same agency later engaged me as a freelancer on SIRINE.",{"title":110,"searchDepth":111,"depth":111,"links":201},[202,203,204],{"id":158,"depth":111,"text":159},{"id":165,"depth":111,"text":166},{"id":195,"depth":111,"text":196},"Government · Financial Administration","Government financial administration system for BNPB — activity planning, sub-activities, budget packages, financial absorption, and reporting with XLSX\u002FPDF export.","https:\u002F\u002Fgithub.com\u002Framadhanep\u002Fbnpb-realisasi-anggaran",{},[210,212,213],{"Modeled the government budget structure":211},"activities, sub-activities, and budget packages in a hierarchy.","Recorded financial absorption through authenticated CRUD workflows backed by Laravel authentication.",{"Shipped reporting output as first-class results":214},"XLSX and PDF export plus print workflows.","\u002Fen\u002Fprojects\u002Frealisasi-anggaran","4","Jan 2019","Web Developer (Internship)","\u002Fimg\u002Fprojects\u002Frealisasi-anggaran.jpg",{"title":150,"description":206},[222,223,224],"Laravel","MySQL","PHP","en\u002Fprojects\u002Frealisasi-anggaran","A Laravel-based financial administration system built during the BNPB internship — tracking activities, sub-activities, budget packages, and financial absorption with export and reporting workflows.",2019,"915p2-6WrCftkIvZ337LJKqfI1aQaGZqAczADW5nfY0",{"id":230,"title":231,"body":232,"category":280,"date":120,"description":281,"extension":122,"externalUrl":282,"featured":124,"locale":125,"meta":283,"navigation":124,"outcome":284,"path":288,"rank":289,"release":290,"role":218,"screenshot":291,"seo":292,"stack":293,"stem":294,"summary":295,"tier":145,"year":227,"__hash__":296},"projects\u002Fen\u002Fprojects\u002Fbantuan-bpbd.md","BNPB Bantuan BPBD",{"type":8,"value":233,"toc":275},[234,237,239,242,244,270,272],[11,235,236],{},"Bantuan BPBD is the aid-management side of the BNPB internship. Where Realisasi Anggaran tracked money, this system tracks relief: who the regions are, what aid is proposed and delivered, and how it is handed over.",[18,238,159],{"id":158},[11,240,241],{},"The system centers on regional entities — provinces, regencies\u002Fcities, and BPBD formations — and builds aid records on top of them. It covers aid types, aid proposals, and province- and regency-level aid distribution, keeping both detailed records and aggregate views for reporting. A BASTO-related workflow supports the handover paperwork that formalizes delivery, with PDF output for the reporting side.",[18,243,166],{"id":165},[37,245,246,252,258,264],{},[40,247,248,251],{},[43,249,250],{},"Laravel 5.7 with authentication and upload support."," Authorized data entry, with Laravel packages used for the file-handling parts such as BASTO documents.",[40,253,254,257],{},[43,255,256],{},"Entities before records."," The regional model comes first; every aid record references it, which keeps the data structured and searchable.",[40,259,260,263],{},[43,261,262],{},"User management."," Administration includes managing the users who enter and verify aid data.",[40,265,266,269],{},[43,267,268],{},"Detail and aggregate."," Individual aid records are captured precisely, while aggregate views answer the reporting questions leadership asks.",[18,271,196],{"id":195},[11,273,274],{},"Together with Realisasi Anggaran and Disposisi, this was the internship chapter about government administration systems: clear data structures, explicit status, and output that matches real reporting needs.",{"title":110,"searchDepth":111,"depth":111,"links":276},[277,278,279],{"id":158,"depth":111,"text":159},{"id":165,"depth":111,"text":166},{"id":195,"depth":111,"text":196},"Government · Aid Management","Government aid-management system for BPBD relief distribution — regional entities, aid proposals, aid records, and BASTO-related handover workflows with reporting.","https:\u002F\u002Fgithub.com\u002Framadhanep\u002Fbnpb-bantuan-bpbd",{},[285,286,287],"Modeled regional structure — provinces, regencies\u002Fcities, and BPBD formations — as first-class entities.","Handled aid types, aid proposals, and province- and regency-level aid records with detail and aggregate views.","Supported BASTO-related handover workflows plus PDF and reporting output.","\u002Fen\u002Fprojects\u002Fbantuan-bpbd","5","Feb 2019","\u002Fimg\u002Fprojects\u002Fbantuan-bpbd.jpg",{"title":231,"description":281},[222,223,224],"en\u002Fprojects\u002Fbantuan-bpbd","A Laravel aid-management system built during the BNPB internship — regional entities, aid types and proposals, province- and regency-level aid records, BASTO-related handover work, and reporting.","s2k39BbRAH6Kf1ppk-D9Yr0XlGkTSIsNPBD2urhiqf0",[298,440],{"id":299,"title":300,"body":301,"date":432,"description":433,"extension":122,"locale":125,"meta":434,"navigation":124,"path":435,"readingTime":436,"seo":437,"stem":438,"__hash__":439},"posts\u002Fen\u002Fposts\u002Freinforcement-learning-bitcoin-trading.md","Reinforcement Learning for Bitcoin Trading",{"type":8,"value":302,"toc":426},[303,306,326,330,341,344,354,357,361,364,370,376,379,382,386,389,392,395,398,402,405,408,417,423],[11,304,305],{},"In 2025, I had the opportunity to turn one of my interests in software and financial markets into an academic research paper.",[11,307,308,309,312,313,317,318,325],{},"Together with Sumanto, Indra Chaidir, and Adi Supriyatna, I published ",[43,310,311],{},"“Reinforcement learning for bitcoin trading: A comparative study of PPO and DQN”"," in ",[314,315,316],"em",{},"Jurnal Mandiri IT",", Vol. 14 No. 2, pages 159–169. The paper was published on August 22, 2025, and is available through DOI ",[319,320,324],"a",{"href":321,"rel":322},"https:\u002F\u002Fwww.ejournal.isha.or.id\u002Findex.php\u002FMandiri\u002Farticle\u002Fview\u002F455\u002F457",[323],"nofollow","10.35335\u002Fmandiri.v14i2.455",".",[18,327,329],{"id":328},"what-we-studied","What we studied",[11,331,332,333,336,337,340],{},"The main question was fairly straightforward: how do two deep reinforcement learning approaches, ",[43,334,335],{},"Proximal Policy Optimization (PPO)"," and ",[43,338,339],{},"Deep Q-Network (DQN)",", behave when applied to Bitcoin trading?",[11,342,343],{},"Bitcoin is an interesting environment for this kind of experiment because its price can move through very different market regimes. A strategy that behaves well during a strong uptrend does not necessarily behave the same way when the market becomes sideways or unstable.",[11,345,346,347,350,351,325],{},"Our experiments used hourly ",[43,348,349],{},"BTC\u002FUSDT"," data covering 2019 to early 2025. Instead of feeding the models raw price data alone, we built the trading state from several technical indicators, including ",[43,352,353],{},"RSI, MA20, volatility, MACD, volume trend, SMA200, and a weekly trend filter",[11,355,356],{},"The goal was not to build a system that could magically predict Bitcoin's next move. The focus was on observing how different reinforcement learning agents learn to make trading decisions under changing market conditions.",[18,358,360],{"id":359},"ppo-vs-dqn","PPO vs. DQN",[11,362,363],{},"One of the interesting parts of the research was seeing how differently the two algorithms behaved.",[11,365,366,369],{},[43,367,368],{},"PPO tended to trade more aggressively."," During bullish phases, this behavior could translate into stronger performance because the agent was more willing to participate in the market. The trade-off was greater exposure to unstable conditions.",[11,371,372,375],{},[43,373,374],{},"DQN behaved more selectively."," It generally made fewer decisions and showed more stable behavior when the market was sideways or choppy.",[11,377,378],{},"That difference was more important to me than simply asking which algorithm was better. The experiment suggested that the characteristics of an agent can interact heavily with the market regime it is operating in.",[11,380,381],{},"In other words, reinforcement learning for trading is not just about choosing a more sophisticated algorithm. It is also about understanding the environment in which that algorithm is expected to operate.",[18,383,385],{"id":384},"what-i-learned","What I learned",[11,387,388],{},"This research changed the way I think about the intersection between software engineering, machine learning, and financial systems.",[11,390,391],{},"A trading system is not simply a prediction model wrapped in an API. There are many layers involved: data preparation, feature construction, environment design, reward formulation, training, evaluation, and finally the interpretation of results.",[11,393,394],{},"The work also reinforced an important lesson about backtesting. A model can appear impressive in one market condition and behave very differently in another. That makes it dangerous to interpret a single performance result as proof that a strategy will work in the future.",[11,396,397],{},"For me, the most interesting result was therefore the difference in behavior between PPO and DQN rather than a simple winner. PPO and DQN showed complementary characteristics across different market regimes, which is a useful perspective when thinking about adaptive trading systems.",[18,399,401],{"id":400},"the-paper","The paper",[11,403,404],{},"This was my first published research work in this area, and it sits at an interesting intersection of several things I enjoy: programming, data, machine learning, and financial markets.",[11,406,407],{},"The full paper is available here:",[11,409,410],{},[43,411,412,413,416],{},"Prasetyo, R. E., Sumanto, S., Chaidir, I., & Supriyatna, A. (2025). ",[314,414,415],{},"Reinforcement learning for bitcoin trading: A comparative study of PPO and DQN",". Jurnal Mandiri IT, 14(2), 159–169.",[11,418,419],{},[319,420,422],{"href":321,"rel":421},[323],"Read the paper via DOI",[11,424,425],{},"This article is a personal summary of the research rather than a replacement for the full academic paper.",{"title":110,"searchDepth":111,"depth":111,"links":427},[428,429,430,431],{"id":328,"depth":111,"text":329},{"id":359,"depth":111,"text":360},{"id":384,"depth":111,"text":385},{"id":400,"depth":111,"text":401},"2025-08-22","A personal note on my research comparing PPO and DQN for Bitcoin trading across different market conditions.",{},"\u002Fen\u002Fposts\u002Freinforcement-learning-bitcoin-trading","4 min",{"title":300,"description":433},"en\u002Fposts\u002Freinforcement-learning-bitcoin-trading","iFvLakLuZ6DU7wmy9di5y3MeIOVoljRTEz7F-C7z8x8",{"id":441,"title":442,"body":443,"date":469,"description":470,"extension":122,"locale":125,"meta":471,"navigation":124,"path":472,"readingTime":473,"seo":474,"stem":475,"__hash__":476},"posts\u002Fen\u002Fposts\u002Fcoding-journey.md","Notes from my coding journey",{"type":8,"value":444,"toc":465},[445,448,452,455,459,462],[11,446,447],{},"The writing section on this site is where I keep notes about things I am learning, building, or cleaning up.",[18,449,451],{"id":450},"what-gets-written-here","What gets written here",[11,453,454],{},"I work across web, backend, and mobile: Nuxt, Vue, Node, Go, Flutter, Laravel — plus internal tools that need clear data flow. Not every post has to be a long tutorial. Sometimes a note about a technical decision, an interesting bug, or a small pattern worth remembering is enough.",[18,456,458],{"id":457},"why-articles-help","Why articles help",[11,460,461],{},"Writing helps me review how I think while building. If a solution is hard to explain clearly, there is usually some part of the architecture or the flow that is not yet clean enough to explain.",[11,463,464],{},"More notes will arrive as I work and find something worth recording. This is better written from real experience than produced just to fill a page.",{"title":110,"searchDepth":111,"depth":111,"links":466},[467,468],{"id":450,"depth":111,"text":451},{"id":457,"depth":111,"text":458},"2023-08-17","An introduction to the writing section — notes on software engineering, product work, and things I am still learning.",{},"\u002Fen\u002Fposts\u002Fcoding-journey","2 min",{"title":442,"description":470},"en\u002Fposts\u002Fcoding-journey","v3UoQGpIUWAvZDvvjW4y9DdOlXcwP9y-qjVfftBY2WM",1789641310547]