Projects

Personal and freelance work

These are projects I built to understand the systems I work with — not showcases, but things I actually wanted to learn how to build. Sorted by relevance to my current focus.

AI / ML

ArchivedAI/ML

LLM Chatbot with RAG — Bahasa Indonesia

Self-hosted Telegram chatbot using PrivateGPT + BGE embeddings + Merak-7B, customised for Bahasa Indonesia.

Built to explore self-hosted RAG in a non-English language context. The challenge was making retrieval work well for Bahasa Indonesia, which has limited open-source embedding support. Used BGE multilingual embeddings with PrivateGPT as the orchestration layer and Merak-7B as the inference model. Implemented queue management to handle concurrent Telegram requests without overloading the inference server, and multi-DB logging to track query quality over time.

Stack

PrivateGPTBGEMerak-7BTelegram Bot APIPostgreSQL

Tags

RAGLLMNLPBahasa IndonesiaSelf-hosted
View on GitHub
ArchivedAI/ML

LLM Chatbot with Custom RAG Pipeline

Full RAG pipeline built from scratch using Haystack + GTE-Large + Qdrant + Zephyr-7B. Every layer independently configured.

A rebuild of the first RAG project, this time constructing the entire pipeline from scratch rather than relying on an all-in-one framework. Used Haystack for pipeline orchestration, GTE-Large for embeddings (better retrieval quality than BGE for this use case), Qdrant as the vector store, and Zephyr-7B as the generation model. The interesting part was understanding exactly why each component was making the decisions it made — forced a much deeper understanding of how retrieval, reranking, and generation interact.

Stack

HaystackGTE-LargeQdrantZephyr-7BFastAPI

Tags

RAGLLMVector DBHaystack
View on GitHub
ArchivedAI/ML

Sentiment Analysis Microservice System

Reddit comment sentiment pipeline using VADER/NLTK, deployed as Docker microservices on Linux VMs with a 24-hour auto-update cycle.

Designed as a distributed system rather than a monolith — each stage of the pipeline (data ingestion, preprocessing, sentiment scoring, storage) runs as a separate Docker container. Deployed across Linux VMs using VMware. The 24-hour cycle automatically pulls new Reddit comments via the API, processes them through the NLTK/VADER pipeline, and updates the stored sentiment scores. The microservice architecture made it easy to swap out individual components for testing.

Stack

NLTKVADERDockerPostgreSQLReddit APIVMware

Tags

NLPMicroservicesDockerLinux
View on GitHub
ArchivedAI/ML

OCR Machine Translation Desktop Tool

Desktop tool combining Tesseract OCR and the DeepL API for image and PDF text detection and translation.

A practical tool built for a specific use case: translating text embedded in images or scanned PDFs where copy-paste isn't possible. Tesseract handles text detection and extraction from images and PDF pages, DeepL handles translation. Wrapped in a simple desktop UI. The main technical challenge was handling image preprocessing to improve OCR accuracy — contrast adjustment, deskewing, and noise reduction before feeding to Tesseract.

Stack

Tesseract OCRDeepL APIPythontkinter

Tags

OCRTranslationDesktopPDF
View on GitHub

Web & Systems

PausedWeb

Dashboard Webapp — Ministry of Home Affairs

Full-stack dashboard for national vehicular tax data, built for a Subdirectorate of Indonesia's Ministry of Home Affairs (Kemendagri).

Engaged directly by a Subdirectorate Head at Kemendagri to design and develop a data recap dashboard for national vehicular tax data. Built a full-stack web application with React frontend, Node.js backend, and PostgreSQL database — including bar, pie, and line chart visualisations for categorical and historical tax data. Designed the data standards and system architecture for integrating regional vehicular tax data into a unified view. Led requirements meetings and coordinated with the Ministry of Data and Information Center (Pusdatin) on data consulting and deployment planning. Development was completed; deployment is pending data availability from regional agencies.

Development complete. Deployment pending inter-agency data availability.

Stack

ReactNode.jsPostgreSQLChart.js

Tags

Full-stackGovernmentData VizFreelance
LiveWeb

Blog Management System — APMIKINAS

CMS-based blog and content platform for APMIKINAS, an Indonesian micro-business association.

Designed and deployed a blog management system for an Indonesian association of micro and small business entrepreneurs. The platform allows non-technical association staff to publish articles, announcements, and resources without touching code. Built on a CMS to minimise operational overhead after handoff.

Stack

WordPressPHPMySQL

Tags

CMSWebFull-stack
ArchivedSystems

Patient Management System (C++)

Linked-list-based hospital management system in C++ with role-based access control and in-memory storage.

Built as a data structures exercise — every record lives in a doubly linked list, with no file I/O or database. Implements role-based access: doctor, nurse, and admin roles each have different read/write permissions on patient records. Supports admission, discharge, record update, and search by patient ID or name. The interesting constraint was doing everything in memory while keeping the code navigable and the access control clean.

Stack

C++

Tags

C++Data StructuresSystems
View on GitHub
ArchivedWeb

Java Cafeteria Management System

Three-tier web application using EJB + JSF + Tomcat with multi-role access, order management, and stock control.

A three-tier enterprise Java application: JSF on the frontend, EJB for business logic, Tomcat as the servlet container. Implements multiple user roles (customer, cashier, kitchen, admin) with role-appropriate views and permissions. Order flow covers submission, kitchen queue, preparation status, and billing. Stock management tracks ingredient levels and flags low-stock items. Built to practice the enterprise Java stack — EJB session beans, CDI injection, and JSF managed beans.

Stack

Java EEEJBJSFTomcatMySQL

Tags

JavaEJBJSFWeb App
View on GitHub