Projects

Koleksi project yang pernah saya kerjakan.

Purrpose: Finding Balance Between Hustle and Recovery

Purrpose: Finding Balance Between Hustle and Recovery

Most productivity apps only measure how much you get done. They push you to check more tasks but rarely ask if you have rested enough to keep going. Purrpose was built from that gap. It is a gamified web app that helps you track both productivity and recovery, so you can stay ambitious without burning out. The idea is simple. Every daily task is split into two categories. Hustle covers demanding work like jobs, studies and meetings. Humble covers recovery like sleep, meals, exercise and time to relax. You add tasks manually each day, set a level from one to five for how intense or restoring it feels, and add a duration in hours. The score is level multiplied by duration, which keeps the system transparent and easy to understand. The purpose is to reward balance over raw output. Each week the app shows a balance index from zero to one hundred, where fifty means an even split between hustle and humble. Lean too far to one side and the index drops with a gentle nudge to adjust. Unfinished tasks do not subtract points, but they lower your completion rate and affect your leaderboard standing, so consistency still matters. The goal is to help you see your patterns and build a rhythm you can sustain. The tech stack is modern and lean. The frontend uses Next.js 16, React 19 and TypeScript, styled with Tailwind CSS v4 and a Neo Brutalism system that gives the app its bold colors and playful look. Components come from shadcn/ui and Radix UI, charts use Recharts, and forms use React Hook Form with Zod. The backend runs on Firebase with Firestore, Auth for email and Google login, and Cloud Functions for scoring and scheduled jobs. It is hosted on Vercel for the frontend and Firebase for the backend. Gemini 1.5 Flash powers AI suggestions and ip2location.io handles city detection. Features bring the idea to life. You can create, edit and complete tasks with real time updates, see a live score preview and get a warning when you approach the daily limit. Scoring is server side with a sixteen hour cap per task and a twenty four hour cap per day enforced through transactions. Daily reports summarize what you finished, while weekly reports show balance, score distribution and a four week trend with suggestions that fall back to rule based advice if AI is unavailable. The weekly leaderboard groups about fourteen users by city with a province fallback and weighs scores by balance and completion rate, with demo PurrBots for new users so the board never feels empty. The top three each week earn gold, silver and bronze badges. Other details include timezone detection, secure sessions and strict Firestore rules that block direct score writes. Purrpose started as a task tracker but became something more. It shows that real productivity is not about doing more every day, but about finding a rhythm where hustle and recovery support each other.

#Next JS#Tailwind CSS#Firebase
Learn More
Kelolain : ERP IT Consulting

Kelolain : ERP IT Consulting

It started with the premise: a company sells a combination of products and services. It needed to manage human resources, finance, inventory, and sales in one centralized platform, rather than using various separate spreadsheets. However, behind that premise lay complex issues: a balanced accounting system, a payroll system that must comply with government regulations, consistent stock levels, and seamless integration of business processes. I designed this application to be entirely server-side rendered using Laravel Blade and Livewire, with no Single Page Applications, no mobile apps, and no third-party integrations consuming JSON APIs in the initial stages. It was a simple software design. However, the internal ERP tool used by some staff didn't require the operational burden of a separate frontend or the discipline of API version management. What was needed was rapid iteration and an intuitive, uncomplicated user interface. The combination of Blade and Livewire perfectly suited this. The system is structured into four business modules: Identity & Access Management, Finance & Accounting, Sales & Inventory, and HR & Payroll. Everything runs within a single Laravel application. Each module has its own migrations, routes, and service classes. These modules do not directly access each other's internal components. I made this decision solely because of the disciplines enforced by a microservices architecture: clear boundaries, prohibition on directly accessing tables belonging to other domains, and communication through explicit contracts. That's the approach offered by a modular monolith. The modules communicate with each other through Laravel events, rather than direct method calls. When a Sales Order is marked complete, the system doesn't immediately access the Finance module to create a journal entry. Instead, the system triggers the SalesOrderCompleted event. A listener within the Finance module then responds to the event through a queue, so slow or failed accounting operations don't hinder users from processing new Complete Orders. Because the boundaries between modules are event-based, adding another business module connected to the same accounting engine requires much less effort than if the Sales and Finance modules were tightly coupled from the start. Journal entry engine: Every financial transaction in the system—such as a completed sale, payroll processing, vendor invoice, or payment receipt—ultimately generates a journal entry with debit and credit lines that must balance precisely. The engine creating these entries rejects anything that is unbalanced, even down to the smallest cent. Once posted, the data becomes immutable. Errors are corrected through an explicit void action accompanied by a mandatory reason; the audit trail must withstand rigorous scrutiny. Indonesian employee income tax (PPh21): This is the part of the system I oversee most strictly. As of 2024, Indonesia calculates monthly income tax withholding using a scheme called TER (*Tarif Efektif Rata-rata* or Average Effective Rate)—a rate determined by a table of brackets based on the employee's marital status and number of dependents. I input the official rate table data directly from the relevant regulation (PMK 168/2023) and validate the calculation logic against the Indonesian tax authority's official calculator. The payroll module also handles prorated calculations based on attendance: if an employee is absent without authorization during a pay period, their base salary is reduced proportionally, whereas paid leave and sick days are not subject to deductions. Identity & Access Management: Role-based access control built upon granular permissions. Consequently, "Sales Staff" and "Finance Managers" possess genuinely distinct capabilities enforced at the policy layer, rather than merely having certain menu items hidden from view. Finance & Accounting: A hierarchical chart of accounts and the previously described journal entry engine with balance guarantees. Profit and loss statements and balance sheets are available; the balance sheet calculates retained earnings in real-time, as the system does not yet feature a year-end closing process. Sales & Inventory: A product catalog that distinguishes between physical goods and services; sales orders that can combine both within a single contract; and stock that is reserved when an order is created and subsequently released or fulfilled based on the order's completion status. Order completion triggers synchronous invoice generation and initiates an event that creates accounting entries. HR & Payroll: Management of employees, departments, and attendance, along with the previously described payroll system—complete with calculations for BPJS contributions (Indonesia's social security and health insurance scheme) that split the cost between the employee and the employer. User-customized dashboards: The displayed charts are determined by access rights and tailored to information relevant to the user's specific role. Sales staff view revenue trends and top-selling products; finance staff view cash flow and accounts receivable aging details; and HR staff view headcount and payroll cost breakdowns.

#PHP#Laravel#Tailwind#PostgreSQL#Docker#Railway
Learn More
Retinal Diseases Diagnosis

Retinal Diseases Diagnosis

Retinal diseases are among the leading causes of visual impairment worldwide, and their diagnosis becomes increasingly challenging because patients often present with multiple pathological conditions simultaneously. This study addresses the problem of multi-label retinal disease classification by proposing a class-wise ensemble learning method based on a weighted averaging algorithm. The proposed approach was evaluated using the ODIR dataset, which contains retinal fundus images from 3,500 patients categorized into eight disease labels with a highly imbalanced class distribution. The research workflow consisted of data preprocessing, including oversampling, image enhancement, and data augmentation, followed by fine-tuning two baseline deep learning models, EfficientNetB6 and DenseNet169. The core contribution of this study lies in assigning independent contribution weights to each model for every disease label according to its validation performance, and integrating these weights through a weighted averaging scheme during prediction. Model performance was evaluated using AUC, precision, recall, and F1-score at both the per-label and global levels. Experimental results demonstrate that the proposed class-wise ensemble achieved the best overall performance, with a micro-AUC of 0.89 and a macro-AUC of 0.85, outperforming both individual models and conventional ensemble methods without class-specific weighting. These findings indicate that the proposed method effectively improves multi-label retinal disease classification, particularly for minority disease labels with highly imbalanced distributions. To facilitate the development and evaluation of the proposed method, a prototype web-based application was developed using the Flask framework. The system enables users to upload retinal fundus images through a file uploader on the main interface, where a preview of the selected image is displayed automatically. Users can further configure prediction parameters, including the classification threshold and the model to be used, through dropdown menus. Once the image and model configuration have been selected, the prediction process is initiated by pressing the prediction button. Before inference, each uploaded fundus image undergoes an image enhancement preprocessing pipeline consisting of auto-cropping, Contrast Limited Adaptive Histogram Equalization (CLAHE), and resizing. The preprocessed image is then fed into the best-performing classification model to extract visual features and predict the presence of retinal disease labels. After the prediction process is completed, the web application presents the preprocessed image alongside the classification results, including the predicted probability for each disease label and the final positive labels detected in the retinal image.

#Python#Flask
Learn More
Healthcare Apointment System

Healthcare Apointment System

The Healthcare Appointment System is a website-based digital healthcare service. This website was created as a college assignment with the aim of revolutionizing the healthcare system from traditional to modern. The healthcare appointment system features appointment booking for users, patient medical record management by doctors, and data management by administrators. This website was built using the Laravel framework with an SQL database and payment gateway integration.

#Laravel#Tailwind CSS
Learn More
AvoTani Online Shop

AvoTani Online Shop

AvoTani provides high-quality grafted avocado seedlings, helping farmers, hobbyists, and orchard owners grow productive and healthy avocado trees. In this project, I created an online shop website with the goal of enabling AvoTani to further expand its business. This website has a homepage, about page, shop page, account page, and more. This website was built using WordPress with several supporting plugins such as Elementor, WooCommerce, and Duitku to fully support its features.

#WordPress#Elementor
Learn More
Hospital Management Integration System

Hospital Management Integration System

SIMRS is an abbreviation of Sistem Integrasi Manajemen Rumah Sakit (Hospital Management Integration System). SIMRS is a web-based system created to support the digitalization of hospital operations. In SIMRS there are various features ranging from registration, handling, prescribing, pharmacy, cashier, and others. The SIMRS website was developed using the Next JS and Tailwind CSS frameworks, the Typescript programming language, and Laravel backend.

#Next JS#Tailwind CSS#Laravel
Learn More
Personal Web Portofolio

Personal Web Portofolio

The portfolio website is a medium that contains various information about my personal track record. On this website there is information ranging from educational background, work, organizations, to projects that I have worked on or am currently working on. This portfolio website was developed using the Next JS and Tailwind CSS frameworks, the programming language used is Typescript, and the backend of this website uses Firebase.

#Next JS #Tailwind CSS #Supabase
Learn More
Sekola Landing Page

Sekola Landing Page

A landing page website developed to sell Sekola Online class products. On this website landing page there is various information about online class products, starting from class benefits, syllabus, user reviews, price lists, to checkout pages. This portfolio website was developed using the Next JS framework with vanilla CSS.

#Next JS#CSS
Learn More
PPMH Web Profil

PPMH Web Profil

This web profile was created to be an information center for an Islamic boarding school educational institution. This website contains various information such as the history of the boarding school, department information, student activities, and the registration timeline. This website was created using WordPress and the Elementor plugin.

#WordPress#Elementor
Learn More
Technoday Simple Timer

Technoday Simple Timer

This timer was created for a national level robot line follower competition called Technoday. This timer was created to record the time obtained by competing robot participants. This timer is supported by the functions of selecting a team, starting, stopping, recording time and resetting time. This timer is created with next js framework.

#Next JS#Tailwind CSS
Learn More