What's New

Keep up with the latest releases, improvements, and fixes.


+3904
🌐 WebCRM

Open booking details in a slide-out panel for faster review

Clicking any booking card or table row now opens a detail panel alongside the list, so the team can inspect and act on a booking without navigating away:

  • Full customer and vehicle summary: Customer name, phone, email, address, vehicle brand/model/year, plate number, color, service city, and vehicle location are all displayed in one organized view
  • Pricing and inspection at a glance: Package name, quoted price, discount, transport fee, inspection date and time, order status, and attendance confirmation are visible without scrolling through the full form
  • Inline status changes: Staff with update permission can change the booking status directly from the panel using quick-select buttons, with immediate confirmation feedback
  • One-tap actions: Copy booking data, generate an invoice, or send it via email, all accessible from the detail panel
  • Responsive layout: Opens as a side sheet on desktop and a bottom drawer on mobile, adapting to the screen size automatically

+857350
⚙️ BackendLaporan Cepat

Stop Gmail from grouping invoice emails into one conversation

Each invoice email now carries a unique identifier in its headers, preventing Gmail from collapsing multiple invoices into a single conversation thread. Customers will now see every invoice as a separate, clearly distinguishable message in their inbox instead of a single collapsed thread.

⚙️ BackendLaporan Cepat

Let inspectors edit sidak records at any time

The sidak inspection workflow has been simplified by removing the draft and finalized states:

  • Always-editable records: Inspection records can now be saved and updated at any time. Previously, records were created as drafts and had to go through a separate finalization step before being considered complete, and finalized records could not be edited at all.
  • Simpler workflow: The separate "Finalisasi" action has been removed entirely. Inspectors only need to save their work, with no risk of getting locked out of their own records.
  • Database cleanup: The status tracking columns have been removed, reducing complexity in the data layer.
🌐 WebCRM

Add a quick-view panel and simplify sidak editing

  • Quick-view detail panel: Tapping any sidak card or table row now opens a slide-out panel showing the full inspection breakdown, including customer name, vehicle, plate number, inspector, date, time, location, per-aspect checklist scores, and grade. On desktop it appears as a right-side panel; on mobile it slides up from the bottom as a drawer.
  • Edit and delete from the panel: The detail panel includes quick-access edit and delete buttons, so records can be managed without navigating away from the list view.
  • Always-editable checklist: All checklist items (compliance status, score, findings, follow-up plan) can now be changed at any time, removing the previous restriction that locked items after finalization.
  • Better mobile navigation: The sidebar menu now closes automatically after selecting a page on mobile, so users are not left with the menu covering their content.

+4.1k297
🌐 WebCRM

Add sidak spot-audit module for evaluating inspector field performance

A complete sidak (spot-audit) module is now available in the CRM sidebar, allowing head inspectors to evaluate field inspectors against a standardized 55-item checklist.

  • 55-item checklist grouped into 15 evaluation aspects: Each item can be marked as Sesuai (compliant), Perlu Perbaikan (needs improvement), or Belum Dicek (unchecked), with a score from 1 to 10 for graded items
  • Automatic grading: The system calculates an average score and assigns a grade: A (Sangat Baik), B (Baik), C (Perlu Pembinaan), or D (Teguran Resmi)
  • List page: All sidak records appear in a table (desktop) or card layout (mobile) with grade badges, inspector name, customer, vehicle plate, and status
  • Create flow: Pick a booking, select an inspector, set date and time, then fill the full 55-item checklist on the detail page
  • Draft and finalize workflow: Records start as drafts that can be saved and revisited. Finalization locks the record permanently and requires all 55 items to be checked
  • Finding notes and follow-up: Items marked "needs improvement" prompt for a written finding and a follow-up action plan
🌐 WebCRM

Add per-page access control with smart redirect in CRM

Each page in the CRM now enforces its own permission check instead of relying on a single gate at the layout level.

  • Smart landing page: After login, users are redirected to the first module they have permission to access, instead of always landing on Bookings
  • Users without access see a clear message: If someone has no permissions for any module, they see a message telling them to contact their administrator instead of a blank page
  • Logo links to the right home: Clicking the Palapa logo in the sidebar now navigates to the user's first accessible page
  • Dynamic page titles: The header now displays the correct page title (e.g., "Bookings" or "Sidak") based on the current route
🌐 WebCRM

Show loading notifications when generating invoices and sending emails

Invoice generation and email sending now use prominent toast notifications instead of small spinning icons on the buttons.

  • Invoice download: Clicking the invoice button shows a toast ("Membuat invoice...") that updates to a success message when the PDF is ready and automatically downloads
  • Email sending: The send email button triggers a loading toast ("Mengirim invoice...") with a success or error message once the email is dispatched
  • No more button state confusion: Previously, the button text and icon changed during loading, which was subtle and easy to miss. The toast approach makes the status clearly visible
🌐 WebLaporan Cepat

Add per-page access control with smart redirect in Laporan Cepat

The Laporan Cepat dashboard now checks permissions for each route individually, so users only see the modules they are authorized to access.

  • Per-route permission checks: Review, user management, inspector management, and branch pages each require their own specific permissions instead of a blanket dashboard access
  • Smart redirect after login: Users land on the first page they have access to (e.g., a user with only review permissions goes straight to the review page)
  • Access denied page: Users without any module permissions see an "Akses Ditolak" screen with a message to contact the administrator
  • Breadcrumb "Home" links correctly: The home breadcrumb in the header navigates to the user's first allowed page instead of always pointing to the dashboard root
⚙️ BackendLaporan Cepat

Allow sidak creation even when the inspection is still in progress

Head inspectors can now create sidak records before an inspection is completed, removing a workflow bottleneck where spot audits had to wait for the full inspection to finish.

  • Inspection is no longer required: The inspection link in a sidak record is now optional, so a sidak can be created while the inspector is still on-site
  • Direct data entry: Customer name, vehicle details, inspection location, and inspector name are entered directly by the head inspector instead of being pulled from other database records
  • Validation remains strict: All required fields (customer name, vehicle plate, vehicle unit, location, inspector name, date, and time) must still be provided before saving
⚙️ BackendLaporan Cepat

Switch to Resend for reliable invoice email delivery

Invoice emails are now sent through Resend, a dedicated email delivery service, replacing the previous self-managed SMTP connection.

  • Professional sending domain: Emails are sent from cs@palapainspeksi.com through Resend's infrastructure instead of a personal Gmail SMTP connection
  • Simpler configuration: The system now needs only an API key and a sender address, removing the need to manage SMTP host, port, username, and password separately
  • More reliable delivery: Resend handles deliverability, bounce handling, and rate limiting, reducing the chance of invoices ending up in spam
⚙️ BackendLaporan Cepat

Fix resource leaks when generating invoice PDFs

The Chromium browser used to render invoice PDFs is now properly shut down after each generation, preventing gradual memory buildup on the server.

  • Explicit browser shutdown: After a PDF is generated, Chromium is closed with a 5-second timeout instead of relying on deferred cancellation that could fail silently
  • Prevents memory exhaustion: Previously, Chromium processes could linger in the background, consuming RAM with each invoice generated until the server slowed down or ran out of memory
  • Additional sandbox flags: Chromium now runs with stricter flags (disabled background networking, component updates, and sync) to reduce its footprint

+2.4k1.3k
🌐 WebCRM

Restrict bookings access by role permissions and add invoice email preview

The bookings management page now enforces role-based access control, so only authorized staff can view and manage customer bookings. Several improvements also make daily workflow smoother:

  • Permission-gated access: The bookings page is now protected by user permissions. Staff without the appropriate role are blocked from viewing customer data, with a clear message directing them to log in with the right account. Menu items in the sidebar are also hidden for users who lack the required permissions.
  • Real user identity in sidebar: The sidebar now displays the logged-in user's actual name and email instead of a generic "Admin" placeholder, making it easy to confirm which account is active when multiple people share the system.
  • Email preview before sending: When sending an invoice to a customer via email, admins now see a preview of the full email content, including the recipient address, subject line, and body text, before confirming delivery. This prevents accidental sends with incomplete information.
  • Today's bookings by default: The page now opens with today's date pre-selected as a filter, so staff immediately see the day's incoming bookings without having to manually set the date each time.
⚙️ BackendLaporan Cepat

Block invoice generation for bookings without a confirmed price

  • Price validation before invoice: The system now rejects invoice generation when a booking has not yet been given a quoted price, returning a clear error instead of producing an incomplete invoice. This prevents staff from accidentally sending customers an invoice with a missing amount.

+40614
⚙️ BackendLaporan Cepat

Send invoices directly to customer email addresses

The system can now generate an invoice PDF and email it to the customer in one step, instead of requiring staff to download and forward it manually.

  • Automatic email delivery: When triggered, the system generates the invoice PDF, composes a professional email with the customer's name, attaches the PDF, and sends it from the company's email address
  • Professional email template: Customers receive a personalized message with Palapa's branding, complete with customer service contact info and website details
  • Smart validation: The system blocks sending when no email address is on file for a booking, preventing failed deliveries
🌐 WebCRM

Add one-click invoice email and show customer contact details in dashboard

Staff can now send invoices straight to the customer's inbox without leaving the CRM dashboard.

  • "Kirim Email" button on every booking: A new email button appears on each booking card and table row, letting staff send the invoice PDF directly to the customer with one click
  • Contact column now shows email alongside phone: The dashboard table previously displayed only the customer's phone number. It now shows both phone and email under a "Kontak" column, so staff can verify the recipient before sending
  • Visual confirmation while sending: A loading spinner replaces the email icon while the message is in transit, so staff know the action is in progress

+3.6k52
⚙️ BackendLaporan Cepat

Add spot-audit scoring system for inspector field performance

Head inspectors can now formally evaluate an inspector's performance during a live inspection using a standardized 55-item checklist. Each audit is linked to a specific booking and inspection record, capturing the full context of who was inspected, when, and where.

  • Comprehensive evaluation areas: The checklist covers 14 categories including punctuality and discipline, uniform and grooming, tool completeness, inspection procedure compliance, photo documentation quality, data entry accuracy, finding thoroughness, communication ethics, independence from seller influence, composure under pressure, work safety, post-inspection consultation, completion speed, and general professionalism
  • Draft and finalize workflow: Head inspectors can save progress as a draft and return to complete the checklist later, then finalize to lock the record once every item has been evaluated
  • Automatic scoring and grading: Each checklist item is marked as compliant or needs improvement, with an optional score from 1 to 10. The system calculates the average score and assigns a letter grade (A for 9+, B for 7+, C for 5+, D below 5) automatically
  • Historical snapshot: Customer name, vehicle details, inspector name, and other context are captured at the time the audit is created, so the record remains accurate even if the source data changes later
  • Role-based access: Admin and inspector head roles have full access to create, read, update, finalize, and delete audit records

+9210
🌐 WebCRM

Generate invoices directly from the booking dashboard

Each booking now has a one-click Invoice button right in the action row, so admins can download a finished PDF without leaving the page:

  • One-click download: Clicking the Invoice button immediately generates and downloads a ready-to-send PDF, eliminating the need to navigate to a separate tool or page
  • Automatic package check: The button is disabled for bookings that do not yet have a package assigned, preventing empty or broken invoices from being created
  • Works on every screen size: The button appears on both the card layout (used on mobile) and the table layout (used on desktop), keeping the workflow consistent across devices
⚙️ BackendLaporan Cepat

Auto-fill fixed package prices and block invoices for incomplete bookings

Two improvements to how pricing and invoices are handled behind the scenes:

  • Fixed-price packages fill automatically: When a package has only one set price (no range), the system now fills it in without any manual input, saving time and eliminating a source of data-entry mistakes
  • Variable-price packages require confirmation: Packages with a price range now demand an explicit price before the booking can be saved, preventing bookings from going through with missing or zero pricing
  • Invoice generation guard: Trying to generate an invoice for a booking that has no package attached now returns a clear error instead of producing a blank or broken PDF
⚙️ BackendLaporan Cepat

Correct company phone number on invoices and fix downloaded filenames

  • Updated phone number: The contact number printed on all generated invoices has been changed to the correct business line, so customers always see a number that actually reaches the team
  • Cleaner filenames: Downloaded invoice files now display a properly formatted name in the browser's save dialog instead of a raw, unreadable string

+1.8k104
🌐 WebLaporan Cepat

Restrict editing, deleting, and merging inspections to authorized users

Write actions across the inspection review interface are now gated behind permission checks, so only authorized staff can modify data:

  • Merge and delete buttons on the review header are hidden from users without the update permission, preventing unauthorized changes to inspection records
  • Save button in the bottom action bar is gated behind the same permission, allowing users without access to view inspections in read-only mode
  • All inspection review pages (vehicle data, inspection summary, repair estimates, feature checks, photos, paint thickness) automatically switch to read-only when the user lacks update permission
  • Photo editing controls (saving label changes and deleting photos) are restricted to users with dedicated photo write access
  • Blockchain minting button in the inspection table is only shown to users who have inspection update permission
⚙️ BackendLaporan Cepat

Generate professional PDF invoices from booking data

A new invoice generation tool automatically creates branded PDF invoices from CRM booking records:

  • Automatic invoice creation pulls customer name, address, phone, email, vehicle details, inspection schedule, and pricing directly from the booking into a formatted PDF
  • Branded template uses the Palapa logo and Figtree font family, with company details (PT. Inspeksi Mobil Jogja, address, phone, email) in the header
  • Auto-generated invoice numbers follow the format INV/YYMMDD/NN, sequenced daily based on booking creation time, so every invoice has a unique and traceable reference
  • Complete pricing breakdown shows unit price, subtotal, discount, transport fee, and grand total, all formatted in Rupiah
  • Two-column layout clearly separates the company sender details from the customer recipient details
  • Payment instructions in the footer prompt customers to confirm payment with the admin
⚙️ BackendLaporan Cepat

Add bank account and payment confirmation details to invoices

Invoices now include specific bank transfer information so customers know exactly how and where to pay:

  • Bank account details are printed at the bottom of every invoice: BCA account number 0377077001 under the name INSPEKSI MOBIL JOGJA PT
  • WhatsApp payment confirmation instructs customers to send proof of transfer to 082230387859, making the payment process clearer and faster
  • Footer layout was simplified to give the payment section more visual prominence

+861284
🌐 WebLaporan Cepat

Replace role-based access with fine-grained permissions

Access control across the dashboard has been upgraded from broad role-based checks to a granular permission system, making it possible to control exactly which features each user can access.

  • Granular access per feature: Each page and action now checks for a specific permission (e.g., "read branches," "write users") instead of relying on broad roles. Access can be granted or revoked per feature without changing someone's overall role.
  • Permission-aware menus and buttons: The sidebar only shows pages the user has permission to visit. Action buttons for adding, editing, deleting, and exporting are automatically hidden from users who lack the matching write or export permission.
  • Customer Service dashboard access: Customer Service staff can now access the dashboard, matching their updated permission set in the backend.
  • Cleaner sidebar design: Both the desktop and mobile sidebars have been visually refreshed with a more compact layout and smoother styling.
🌐 WebLaporan Cepat

Fix photo label input clearing unexpectedly while editing

  • Inspectors editing a photo label will no longer have their typed text reset when the underlying photo data refreshes in the background. The input now only clears when the actual photo or its details change.

+650144
🌐 WebLaporan Cepat

Auto-paginate repair estimates and improve report navigation labels

  • Auto-paginated repair estimates: The Estimasi Perbaikan section now automatically splits across multiple pages when the content is too long for a single page, instead of overflowing. Categories are redistributed evenly so each page has a balanced amount of content.
  • Descriptive navigation labels: Report preview pages now show meaningful names (Data Kendaraan, Ringkasan Inspeksi, Fitur & Mesin, Ban Test Drive & Tools Test, Ketebalan Cat - Part 1, etc.) instead of generic labels like "Halaman 1" and "Halaman 2". The page count in the sidebar and progress bar updates dynamically to reflect the actual number of pages.
  • Smart grand total placement: The overall repair cost total and disclaimer footnote only appear on the final Estimasi Perbaikan page, avoiding redundant totals on intermediate split pages.
🌐 WebCRM

Automatically refresh expired sessions instead of logging users out

  • Transparent session renewal: When a user's login session expires, the system now silently refreshes it in the background and retries the failed request. Users will not notice anything unless the refresh itself fails.
  • Only redirects to login as a last resort: If the session cannot be renewed, the user is sent to the login page with a clear "session expired" message instead of encountering a cryptic error.
  • Works across all actions: The refresh logic applies to both regular data requests and file downloads, so users won't lose progress mid-download due to a quietly expired session.
🌐 WebCRM

Fix dashboard layout so header and sidebar stay in place while scrolling

  • Fixed header and sidebar: The top header and left sidebar now remain pinned to their positions while scrolling through long content, so the navigation is always accessible without scrolling back to the top.
  • Content-only scrolling: Only the main content area scrolls, matching standard dashboard behavior and making it easier to navigate between pages without losing context.

+137233
🌐 WebLaporan Cepat

Fix authentication and logout issues across the dashboard

  • Logout now works reliably: Previously, if the logout request to the server failed (network issue, expired session), the user could get stuck on the page. The logout button now always redirects to the login screen, whether the server call succeeds or fails.
  • More reliable session recovery: Users with expired access tokens are now properly re-authenticated on page load instead of being left on a blank loading screen. The app checks session validity first before deciding whether to ask for credentials again.
  • Pages wait for authentication before loading data: The review list and inspection edit pages now hold off on fetching data until the user's identity is confirmed, preventing errors and unnecessary network requests when a session has expired.
  • Faster page recovery after errors: The global error page now uses instant client-side navigation instead of a full page reload, so users can get back to the dashboard more quickly after encountering an unexpected error.

+3.1k610
🌐 WebCRM

Redesign CRM dashboard with sidebar navigation

The admin dashboard has been rebuilt with a proper sidebar layout, matching the structure used across other Palapa products:

  • Collapsible sidebar: A sidebar on the left with the Palapa CRM logo, a "Bookings" navigation link, and a user profile menu with logout at the bottom. On mobile, it opens as a slide-out sheet instead of taking up screen space.
  • Top header bar: A slim header with a sidebar toggle button and "Bookings" page title replaces the old tall sticky bar that contained the title, logout button, and all filter controls.
  • Inline page controls: Search bar, date filter, and items-per-page selector now sit within the page content area with proper padding, making better use of available screen space.
  • Redesigned login page: The login screen now uses a clean centered layout with the Palapa CRM logo and branding, replacing the old card-based "Admin Login" design.
  • Consistent theming: Colors throughout the dashboard have been updated from hardcoded gray values to semantic design tokens, improving visual consistency and enabling proper dark mode support.
⚙️ Backend🌐 WebCRM

Export bookings to CSV with date range filter

Admins can now download booking data as a CSV file for any date range:

  • Export dialog: A new Export button in the dashboard header opens a dialog with a calendar date range picker. Select a start and end date, then click Download CSV to get the file.
  • Complete data export: The CSV includes all booking fields: customer name, phone, email, address, vehicle details (brand, model, year, plate, color), service city, inspection date and time, status, package name, quoted price, discount, and transport fee.
  • Automatic filename: Downloaded files are named with the selected date range (for example, bookings-2026-05-01-to-2026-05-23.csv) for easy identification.

+4.3k1.1k
⚙️ Backend🌐 WebCRM

Connect CRM dashboard to the central booking system with dynamic pricing

The CRM admin panel now reads from and writes to the Laporan Cepat backend, replacing the old Google Sheets-based system:

  • Dynamic package list: Inspection packages are loaded from the server instead of being hardcoded in the code. When a new package is added to the system, it appears in the CRM dropdown automatically with no code deployment needed
  • Custom quoted price per booking: Admins can now set a specific price for each booking. Packages with a fixed price auto-fill the amount, while range-priced packages let the admin pick a value within the range
  • Password visibility toggle: The login page now has an eye icon to show or hide the password, making it easier to verify credentials before submitting
  • Better performance on large datasets: The booking list now uses a more efficient pagination approach, so browsing through hundreds of records feels snappier
⚙️ Backend🌐 WebLaporan Cepat

Enable customer service staff to log in and access the system

  • Customer service accounts can now authenticate: Previously, the login system only accepted admin, reviewer, and inspector head credentials. Customer service staff with valid accounts were blocked from logging in even though they had been created in the system
  • Automatic CRM permissions: The customer service role now has built-in access to the dashboard, booking management, package information, and inspection records, so newly created staff accounts are ready to use immediately
  • Safer user edits: Updating a user's profile now only changes the fields that were actually modified. Editing a name no longer accidentally resets the email or role if those fields were left blank
  • Dashboard error recovery: If something goes wrong inside the dashboard, the page now shows a "Something went wrong" message with a retry button instead of a full-screen crash. The sidebar and navigation remain visible so users can navigate away
  • Clearer login feedback: The login and registration flows now show a loading indicator with a success or error message, so users know exactly what happened instead of seeing a silent pause
🌐 WebLaporan Cepat

Fix spurious error message when logging out

An "Authentication Required" toast no longer flashes on screen immediately after clicking logout. The app now recognizes that the redirect to the login page is an intentional action and suppresses the misleading error notification.


+37291
📱 MobileInspector Form

Fix photo attention flag syncing from the inspector app

The mobile app was sending a mismatched field name for the photo attention flag, causing flagged photos to not be properly highlighted on the server side.

  • Corrected field name: The app now sends isAttentionNeeded to match the server's expected format, so photos flagged during inspection are properly marked
  • Released as version 3.0.3 to ensure all inspectors get the fix promptly
⚙️ BackendLaporan Cepat

Accept photo attention flags from both old and new app versions

Older versions of the inspector app send the attention flag with a different field name than the server expects. This PR makes the server handle both formats gracefully.

  • Backward compatibility: Inspectors who haven't updated yet can still flag photos as needing attention, and the flag is recorded correctly
  • Automatic normalization: Both isAttentionNeeded and needAttention are accepted, with the newer format taking priority when both are present
  • Zero downtime migration: No forced app update required; the server works with both old and new versions simultaneously
⚙️ Backend🌐 WebLaporan Cepat

Give reviewers full dashboard access

Reviewers were previously restricted to basic summary stats on the dashboard. They can now see the complete analytics view.

  • Trend charts: Reviewers can switch between bar and line charts to track inspection volume over time
  • Branch distribution map: Visual breakdown of inspections across all branches is now visible to reviewers, not just admins
  • Inspector performance table: Reviewers can see how each inspector is performing, helping them prioritize review work
  • Loading state fix: A separate bug was also fixed where a failed data fetch would incorrectly mark the dashboard as loaded, showing a blank page instead of a proper error
⚙️ BackendLaporan Cepat

Separate inspector permissions from general user management

Inspector-related actions (viewing, creating, editing inspectors and their PINs) previously shared the same permission as general user management. They now have their own dedicated permissions.

  • Customer service gains attendance access: Staff can now clock in and out directly, instead of relying on admins to record their attendance
  • Inspector heads gain attendance access: Field leaders can now record their own attendance alongside their team
  • Tighter access control: Inspector heads can still manage inspector accounts and PINs, but can no longer view or edit general back-office user accounts, matching their actual responsibilities
  • Admins retain full access: No changes to what admins can do; all existing capabilities are preserved
⚙️ BackendLaporan Cepat

Fix CRM booking search and list filters

The booking list search and date filters were silently producing incorrect results due to a query parameter mismatch.

  • Search and date filters now return correct results: The filter parameters were being sent to the wrong positions in the database query, causing filtered searches to return wrong or empty results
  • Pagination fixed: Both page-based and scroll-based (cursor) pagination now work correctly with active filters
  • Migration data normalization: The CRM data import tool now handles booking status values more consistently, treating "On Going", "on_going", and other variations as the same status

+2.2k1.3k
⚙️ BackendLaporan Cepat

Upgrade to permission-based access control and organize database structure

Replaced the old role-based access system with a more flexible permission-based authorization model:

  • Granular permissions instead of roles: Each action now requires a specific permission (e.g., inspections.read, crm.bookings.update, photos.write) rather than checking which role the user belongs to. This means new roles can be configured without changing any code, simply by assigning the right set of permissions.
  • 23 permissions across all modules: Permissions cover inspections (read, write, update, export, search), CRM bookings (read, update), user and role management, dashboard access, admin jobs, app updates, and photo management. Each of the five existing roles (admin, inspector head, inspector, reviewer, customer service) has been mapped to the exact permissions they need.
  • Database organized into logical groups: All database tables have been moved out of a single shared namespace into four organized categories: authentication (users, roles, tokens, face profiles), inspections (photos, compression jobs, cleanup jobs), attendance (check-in events), and CRM (packages, bookings). This makes the data layer easier to understand and maintain as the system grows.
  • CRM terminology refreshed: The booking management module now uses cleaner naming throughout: "submissions" is now "bookings", "pakets" is now "packages", and API routes have been simplified (e.g., the booking list moved from /crm/submissions to /bookings).

+4.6k155
⚙️ BackendLaporan Cepat

Add vehicle inspection booking management (CRM)

A new CRM module has been added to manage vehicle inspection booking submissions, replacing the previous Google Sheets workflow with a proper database system.

  • Inspection booking submissions: Customers can now submit vehicle inspection requests through a form, providing their personal details, vehicle information (brand, model, year, plate, color), preferred inspection date and time, and service location. All submissions are stored centrally in the database instead of a spreadsheet.
  • 13 pre-defined inspection packages: A catalog of inspection packages with pricing is now built in, covering vehicle categories from LCGC (Rp 300k) to Heavy Duty (Rp 3M-5M). Fixed-price packages auto-fill the quoted price when assigned, while range-priced packages (e.g., trucks) let staff set the price manually within the defined range.
  • Staff management dashboard: Admins and a new "customer service" role can view all submissions with search (by name, email, phone, or plate) and date filtering. Each booking can be updated through three statuses: On Going, Done, and Cancelled.
  • Pricing and cost control: Staff can assign an inspection package, set the quoted price, apply discounts, and add transport fees directly on each submission. Prices are validated against the package's defined range to prevent errors.
  • Data migration from Google Sheets: Existing CRM records stored in Google Sheets can be imported into the database via a dedicated migration tool, ensuring no historical data is lost during the transition.

+37128
📱 MobileInspector Form

Show all error messages in Indonesian and adapt to new server error format

  • 23 server error messages now translated to Indonesian: Errors like "invalid credentials", "user not found", and "inspection not found" are displayed in natural Indonesian instead of raw English text from the server
  • Cancellation handling improved: When an inspector cancels a submission mid-way, they see a clear info message instead of being treated as a generic error
  • Session expiry and token errors now use server messages directly: Ensures consistency between what the server reports and what the inspector sees on screen

+9682.2k
📱 MobileInspector Form

Prevent inspector data loss during form entry

Form data entered by inspectors is now saved proactively during the inspection flow, closing a gap where work could be lost if the app was closed unexpectedly.

  • Save on every step: Draft data is now saved immediately when an inspector swipes between form steps, instead of only when the app goes to the background. Previously, closing the app mid-inspection could lose everything entered on the current step.
  • Crash-safe file writes: All saved data now uses atomic writes (write to a temporary file first, then rename). If the app crashes or is killed mid-save, the original data remains intact and is never corrupted.
  • Automatic cleanup: Orphaned temporary files from interrupted saves are automatically cleaned up the next time the app loads that data, preventing storage bloat over time.
  • Faster background saves: When the app goes to the background, all form sections now save in parallel instead of one at a time, reducing the time the app needs before it can be safely suspended.
🌐 WebLaporan Cepat

Remove blank pages from inspection preview exports

Inspection preview reports no longer include an unnecessary blank page at the end of photo sections, producing cleaner printed and exported documents.

🌐 WebLaporan Cepat

Refresh icons and simplify management page layouts

All icons across the application have been replaced with a new, consistent icon set, and the admin management pages have been cleaned up to remove unnecessary visual clutter.

  • New icon system: Replaced two separate icon libraries (Lucide and React Icons) with a single Hugeicons set, ensuring every icon looks and behaves consistently across the login page, dashboard, sidebar, dialogs, charts, and public-facing pages.
  • Cleaner management pages: The branch, inspector, and user management pages had their decorative header cards (gradient backgrounds, large icons, subtitle text) removed in favor of simple, bold page titles, giving the admin area a more professional and less cluttered appearance.
  • Removed unused stats cards: The branch management page no longer shows decorative stat cards (total branches, cities) that duplicated information already visible in the table below them.
🌐 WebLaporan Cepat

Redesign inspection review header

The header on the inspection review detail page has been redesigned to be cleaner and less visually heavy.

  • Full-width layout: The page title, vehicle info, and action buttons now stretch across the full page width instead of being confined inside a bordered card, giving the page more breathing room.
  • Clearer text hierarchy: The vehicle plate and customer name are now displayed inline below the title with larger, more readable text instead of being tucked inside a card alongside a decorative icon.
  • Simplified buttons: Action buttons (Preview, Merge, Delete) now use the standard button variants instead of custom-colored classes, making them consistent with the rest of the application.

+19.0k4.6k
📱 MobileInspector Form

Dedicated tire data page with visual thickness slider

Inspectors can now record detailed tire data for each wheel position on a dedicated page, replacing the old single-line fields.

  • Each of the four positions (front right, front left, rear right, rear left) captures tire size, brand, type (tube vs. tubeless), and year
  • A new visual slider lets inspectors dial in tire thickness as a percentage, color-coded from red (worn) to green (good), making it quick and intuitive to enter
  • All fields are validated before submission, so incomplete tire records are caught before the form is sent

This is part of the Inspector Form version 3.0 release, a major update that restructures how tire and repair data flows through the inspection workflow.

📱 MobileInspector Form

Repair estimates organized by vehicle section

Repair cost estimates now have their own dedicated page, organized into five vehicle sections instead of a single flat list.

  • Estimates are grouped by Fitur, Interior, Eksterior, Mesin, and Kaki-kaki, matching how the rest of the inspection is structured
  • Each section supports multiple line items with part name and price, so inspectors can break down costs precisely
  • The form checks that every line item has both a part name and a price filled in, flagging incomplete rows before submission

This is part of the Inspector Form version 3.0 release.

🌐 WebLaporan Cepat

Inspection reports show structured tire data and categorized repair estimates

The inspection report preview now reflects the new data structure from the mobile app, with dedicated sections for tire data and repair estimates.

  • Tire data is displayed as a structured table showing all four wheel positions with their size, brand, thickness, type, and year
  • Repair estimates have been moved to their own report page, grouped by vehicle section with subtotals per category and a grand total at the bottom
  • The review and edit workflow has been rebuilt with a more reliable path-based system that handles nested data (like individual tire positions) correctly
⚙️ BackendLaporan Cepat

CSV exports now include tire data and repair estimates as dedicated columns

Monthly inspection CSV exports have been updated to include the new top-level data fields from the mobile app.

  • Tire data (size, brand, thickness, type, year) now appears as its own set of columns for each wheel position
  • Repair estimates are broken out by vehicle section (fitur, interior, eksterior, mesin, kaki-kaki) with individual line items
  • Legacy inspection records that stored this data in a different format are automatically migrated at read time, so older reports remain consistent alongside new ones
  • Column ordering has been adjusted so tire and estimate data appear in a logical position relative to other inspection fields

+1.4k547
📱 MobileInspector Form

Prevent duplicate inspection reports with server-side deduplication

Inspectors could accidentally submit the same report twice, for example by tapping the submit button multiple times or if the app restarted mid-submission. This is now handled reliably on the server side.

  • Each submission is assigned a unique key that is saved to the device, so it survives app restarts. If the same report is sent again, the server recognizes it and does not create a duplicate.
  • The old approach relied on comparing form data on the device itself, which could miss duplicates after an app restart. The server is now the single source of truth for preventing repeated submissions.
  • After a successful submission, the key is automatically cleared so the next inspection starts fresh.
🌐 WebCustomer Form

Make the inspection form faster and more reliable

The customer-facing inspection form now loads faster and handles errors more gracefully, especially for users on slower connections.

  • The form font is now bundled directly instead of loaded from an external service. This removes three network requests on page load and ensures the form displays immediately even with poor connectivity.
  • Dropdown menus and radio buttons now save and reset properly. Previously, selecting an option and then submitting again could show stale selections.
  • Form fields validate as users leave each field rather than only after clicking submit, catching mistakes earlier in the process.
  • Requests that take longer than 30 seconds are automatically canceled so users are not left waiting indefinitely on a stuck submission.
  • If the form encounters an unexpected crash, users now see a recovery screen with a retry button instead of a blank page.
🌐 WebAttendance

Add calendar date range picker to attendance history

Add calendar date range picker to attendance history

Admins viewing an employee's attendance history can now select a date range using a visual calendar instead of typing dates into separate fields.

  • A two-month calendar pops up when clicking the date button, letting admins pick a start and end date in a single interaction. The attendance list updates automatically as dates are selected.
  • The previous approach required manually entering two separate dates and clicking an "Apply" button, which was slower and prone to formatting mistakes.
  • The calendar defaults to the current month, providing an immediate view of the latest attendance records.

+645415
⚙️ BackendLaporan Cepat

Prevent duplicate inspections when network causes retry attempts

Added deduplication protection for inspection submissions so that retrying a failed request does not create a second, duplicate inspection.

  • Inspectors working in areas with poor connectivity sometimes experience upload failures and tap submit again. Previously, each retry created a brand-new inspection record, leading to duplicates that had to be manually cleaned up.
  • The mobile app now generates a unique key for each submission attempt. If the server receives the same key twice, it returns the original inspection instead of creating a new one.
  • Duplicate prevention is scoped per inspector, so two different inspectors can still submit separate inspections simultaneously without conflict.
📱 MobileInspector Form

Speed up inspection submission with non-blocking draft cleanup

After an inspector submits a report, the app now navigates to the success screen immediately instead of waiting for draft data to be cleared.

  • Previously, the app cleared all saved form data (vehicle info, photos, inspector identity, etc.) before showing the success page. On slower devices or large reports, this caused a noticeable delay between tapping submit and seeing the confirmation.
  • Draft cleanup now runs in the background after the success page is already visible. Inspectors get instant feedback that their submission went through.
  • Orphaned temporary image files are also cleaned up automatically as part of this process, freeing up device storage without any action from the user.
🌐 WebLaporan Cepat

Support dark mode on the login page

Support dark mode on the login page

The login and sign-up pages now adapt to the device's dark mode setting, matching the rest of the app's appearance.

  • Users who have dark mode enabled on their device will see a properly themed login screen with dark backgrounds and light text, instead of a jarring white panel.
  • All form elements including input fields, labels, buttons, and the divider line respect the dark mode palette.

+1.4k683
⚙️ Backend🌐 WebLaporan Cepat

Rename engine inspection field and migrate existing records

The "Selang" (hose) field in the engine inspection section has been renamed to "Baut Kap Mesin" (engine cap bolt) to match the updated inspection standard.

  • Existing inspection data is automatically migrated — older records that still use the old field name are converted on the fly, so reports and detail views display the correct label without any manual fix
  • CSV exports also use the updated field name, keeping downloaded reports consistent with what appears on screen
  • A one-time backfill tool was added to permanently update all historical records in the database, ensuring long-term data consistency
📱 MobileInspector Form

Update engine inspection field label in the inspector app

The inspector app now shows "Baut Kap Mesin" (engine cap bolt) instead of "Selang" (hose) in the engine assessment section, matching the updated inspection standard used across the system.


+3513
⚙️ BackendLaporan Cepat

Harden server reliability with timeouts, memory limits, and graceful shutdown

Several improvements to prevent the server from becoming unresponsive under heavy load or when external services are slow:

  • Face verification requests now time out after 30 seconds, so the system won't freeze indefinitely if the recognition service is slow or unreachable. Previously, a stalled face verification could block the server thread permanently.
  • Photo processing memory is now capped at 50 MB, preventing the server from running out of memory during periods of high photo uploads. Previously, the image processing library could consume unbounded memory.
  • The server now shuts down gracefully when restarted or stopped, completing in-flight requests within a 15-second window instead of dropping them abruptly. This means users uploading reports during a deployment won't lose their work.

+77
🌐 WebLaporan Cepat

Fix photo grid showing wrong photos when switching pages

Fixed a bug where edited photo badges and replaced images would carry over to the wrong photos when navigating between inspection photo pages.

  • Edit markers and replacement images were persisting across page switches, causing inspectors to see incorrect edit states on photos they hadn't touched
  • The fix ensures each photo page loads a fresh state, so badges and edits are always shown on the correct photo
  • Affects all seven photo sections: engine, interior, exterior, undercarriage, tools, items needing attention, and document photos

+8423
🌐 WebLaporan Cepat

Fetch role choices from backend API instead of hardcoding

Role dropdowns in the admin panel now fetch available roles dynamically from the backend (GET /roles) instead of using hardcoded constants. This means any new roles added in the backend appear automatically in all frontend selectors without a code deployment.

Changes across the user management page:

  • Role list is loaded from the backend via a new Redux thunk getAllRoles, stored in adminSlice as roleList
  • Create user drawer now filters the backend role list instead of selecting from a hardcoded array
  • Edit role dialog (DialogEditRole) accepts an optional roles prop, replacing the legacy Role enum
  • View user drawer and role dropdowns (FormDropdown) similarly switched to data-driven rendering
  • Create drawer still filters out the inspector role, preserving existing access control

+1.8k566
⚙️ BackendLaporan Cepat

Add CRUD endpoints for role management

Added full CRUD API endpoints for managing user roles, so admins can create, view, update, and delete roles without direct database access.

  • Five new endpoints under /roles, all restricted to admin users only
  • Role names are normalized to lowercase and validated for uniqueness
  • Deleting a role is blocked if there are still users assigned to it
  • Includes a repository layer with raw SQL queries against the existing roles table
⚙️ Backend🌐 WebLaporan Cepat

Remove wallet and WhatsApp fields across backend and frontend

Removed the walletAddress and whatsappNumber fields from inspector accounts throughout the entire stack.

  • A new database migration drops both columns and their unique index from the users table
  • All backend SQL queries, repository methods, service logic, and DTOs were cleaned up
  • The frontend user management and inspector pages no longer show wallet or WhatsApp inputs
  • Removed the orphaned createInspectorUser Redux thunk that was never called
  • The staging data copy tool was updated to match the new schema
⚙️ Backend🌐 WebLaporan Cepat

Add admin custom inspector PIN flow with OTP UI

Added a new API endpoint and UI for admins to set a specific 6-digit PIN for inspector accounts, alongside the existing random PIN generator.

  • New PUT /users/inspector/{id}/pin endpoint validates the PIN is exactly 6 digits before hashing and storing it
  • The inspector detail drawer now includes an OTP-style 6-digit input for entering a custom PIN
  • A "Set Custom PIN" button appears once all 6 digits are filled, with loading state while saving
  • The existing "Generate New PIN" button remains available as an alternative
  • Drawer layouts on the inspector, user management, and branch pages were fixed for proper scrolling on smaller screens
  • The input-otp package was added to the frontend for the OTP input component

+1.5k636
⚙️ BackendLaporan Cepat

Migrate face verification from Microsoft Azure to self-hosted InsightFace

Replaced the Azure Face API dependency with a local InsightFace service for attendance face recognition:

  • Face embeddings are now stored directly in PostgreSQL as vector arrays instead of relying on Azure's faceId references
  • The system supports both InsightFace and Azure as providers, auto-detected from environment variables, making it easy to switch or fall back
  • A new InsightFaceVerifier implementation calls a local Python service with /detect and /verify endpoints
  • Database migration updated the user_face_profiles table to store reference_embedding (real array) instead of reference_face_id
⚙️ BackendLaporan Cepat

Remove unnecessary face enrollment check from inspector login and improve logging

  • Inspector login no longer queries face enrollment status, speeding up the login flow
  • Attendance recording now logs structured fields for every event: distance from office, face match confidence, threshold, and whether verification passed
  • Fixed a bug in photo file extension handling that could produce incorrect file paths
🌐 WebAttendance

Overhaul attendance UX, add theme toggle, and prepare Docker deployment

A significant round of UI and architecture improvements to the Attendance web app:

  • Added a dark/light theme toggle across all pages (login, attendance, admin dashboard)
  • Attendance recording now uses a simplified action sheet flow: tapping an action button opens a bottom sheet for selfie capture, reducing visual clutter
  • The camera starts and GPS is requested automatically when the action flow opens, instead of requiring manual steps
  • Mobile vs web source is auto-detected from the user agent, including iPad and touch-enabled Macs
  • Extracted reusable components: ThemeToggleButton, LogoutButton, and LanguageToggle are now shared across pages
  • Replaced inline error banners with toast notifications for a cleaner experience
  • Added a Dockerfile with multi-stage builds for containerized deployment
  • Mobile sidebar now auto-closes when a navigation link is tapped
  • Admin dashboard header now shows dynamic page titles based on the current route
🌐 WebAttendance

Add social sharing metadata and branded OG image

  • Added Open Graph and Twitter Card metadata so the app renders a rich preview when shared on social media, messaging apps, and link previews
  • Page title and description set in Indonesian: "Absensi Palapa" with a description about digital attendance with face and location verification
  • Added a custom OG image with a black background for a professional appearance in link previews

+4.1k1.0k
🌐 WebAttendance

Move attendance monitor into dashboard sidebar layout

Restructured the admin interface into a proper dashboard with a sidebar navigation:

  • Attendance monitoring moved from the /admin route to a new /dashboard route with a dedicated sidebar layout
  • Added reusable UI components including sidebar, breadcrumbs, user nav, and mobile-responsive drawer
  • Individual user attendance detail view now lives under /dashboard/users/[userId]
  • Dark mode toggle and improved overall navigation structure
🌐 WebAttendance

Add English/Indonesian language toggle across all attendance flows

Implemented a full internationalization (i18n) system so users can switch between English and Indonesian:

  • Built a custom i18n provider with browser-language detection and localStorage persistence
  • Added a language toggle button in the header bar next to the dark mode switch
  • Translated all attendance pages: check-in/out, history, enrollment, user detail, and dashboard monitor
  • Extracted shared date/time formatting into locale-aware utilities (lib/date.ts) for consistent Jakarta timezone display in both languages
  • Added unit tests for the i18n provider (Vitest + Testing Library)
🌐 WebAttendance

Fix authentication redirect on logout

After logging out, the app now immediately navigates to the login page using a full page redirect, preventing stale session state from causing issues.

🌐 WebAttendance

Fix premature redirects before session loads

Pages now wait for the auth bootstrap to complete before checking authentication state, eliminating a race condition where authenticated users were briefly redirected to the login page on page load.

🌐 WebAttendance

Fix session bootstrap with token validation

Added a token validation step at the start of the auth bootstrap flow, matching the main Laporan Cepat frontend's pattern of validating the access token before loading the user profile.

⚙️ BackendLaporan Cepat

Filter attendance results to only enrolled face recognition users

Attendance event queries now join against user_face_profiles so that only users who have registered a face profile appear in attendance results. Previously, users without a face profile could show up in attendance data despite not being enrolled in the face recognition system.


+5224
⚙️ BackendLaporan Cepat

Fix duplicate app version upload and govips crash

Three related bug fixes for the photo processing and app update pipelines:

  • Duplicate APK uploads now succeed silently. Previously, uploading the same app version twice returned an error. The file is now replaced in object storage while the existing database record stays untouched.
  • Fixed SIGSEGV crash in govips image compressor. Removed ClearCache and ShutdownThread calls that were corrupting thread-local state, causing the test suite to crash. Memory was already configured to not persist between operations, so these cleanup calls were unnecessary.
  • Fixed unreliable compression test. The test payload was too small (10 bytes) to exceed the 75KB threshold that gates compression job enqueueing, so the test was never actually testing what it claimed to. Replaced with an 80KB payload.
🌐 WebAttendance

Prevent infinite redirect loop on expired auth tokens

When a user's session expired, the app would continuously redirect to the login page in a loop. This happened because the auth context tried to refresh the session while already on the login page, failed, and redirected again.

  • The /auth/me endpoint is now recognized as an auth endpoint, so it skips the token refresh retry logic
  • The login page now skips the session check entirely on mount, avoiding a failed refresh attempt
  • Redirects to /login use location.replace() instead of location.href, preventing the login page from being added to browser history

+13.2k265
🌐 WebAttendance

Build complete Attendance frontend

Initial release of the Palapa Attendance web app built with Next.js and shadcn/ui:

  • Attendance recording page where inspectors can check in/out, take lunch breaks, and submit selfies with GPS location for verification
  • Face enrollment flow for new users to register their reference face photo
  • Admin dashboard with a real-time overview table showing all inspectors' attendance status for the day, date picker for historical views, and per-user detail pages
  • Login page with authentication, role-based access control, and automatic redirection
  • Attendance history page for viewing past records
🌐 WebAttendance

Replace file upload with live camera feed for face enrollment

Face enrollment now uses a live camera feed directly in the browser instead of asking users to upload a photo file. This provides a smoother, more consistent enrollment experience across devices and ensures the photo is taken with the correct camera orientation on the spot.

🌐 WebAttendance

Extract shared CameraCapture component with face verification fixes

Refactored camera logic into a reusable CameraCapture component used by both the attendance and enrollment pages:

  • Images are now captured un-mirrored (the actual camera view rather than the flipped selfie preview) for more accurate face verification matching
  • Camera preview uses a portrait 3:4 aspect ratio for a more natural framing on mobile devices
  • Supports front and rear camera switching with a flip button

+4.7k80
⚙️ BackendLaporan Cepat

Add attendance tracking with face verification and office geofencing

Built a complete attendance system for Laporan Cepat, covering the full daily workflow from clock-in to clock-out.

  • Four-step daily flow: check-in, lunch break out, lunch break in, and check-out, enforced in sequence so employees follow the correct order
  • Face verification: Employees enroll a reference face photo, and every attendance event is verified against it using Microsoft Face API (recognition model recognition_04) with a configurable confidence threshold
  • Office geofencing: Attendance submissions include GPS coordinates and are validated against a configurable office location with a radius check, preventing off-site clock-ins
  • Permission-based access: New permissions and role_permissions tables control who can record attendance (attendance.self.record), view their own history (attendance.self.view), and monitor others (attendance.monitor.view, attendance.monitor.manage). Admins get monitoring permissions; inspectors and reviewers get self-record
  • Admin dashboard endpoints: Separate admin routes for viewing all attendance events and per-user history, enabling management oversight
  • Storage integration: Reference face photos and attendance selfies are stored via the existing object storage pipeline with organized key paths

+2.8k1.1k
⚙️ Backend🌐 WebLaporan Cepat

Add Inspector Head role with admin-level access

Inspector Head is now a first-class role with the same access level as Admin across the dashboard, user management, branch management, inspections, and cleanup jobs. The role has its own distinct label and display name throughout the app while sharing admin-equivalent permission checks behind the scenes.

🌐 WebLaporan Cepat

Expand inspection form with 52 new fields and reorganized layout

The vehicle inspection form now covers 165 criteria, up from 117, with new fields added across Fitur, Mesin, Interior, Eksterior, Ban & Kaki-Kaki, and Test Drive sections:

  • PDF report pages have been reorganized to fit the expanded content
  • A dedicated photo page has been added for general vehicle photos
  • Existing field typos were also corrected as part of this update

+2.5k2.6k
📱 MobileInspector Form

Fix camera preview and add tap-to-focus

Fix camera preview and add tap-to-focus

The camera preview now fills the full width of the screen properly on all devices.

Tap-to-focus has been added:

  • Tap anywhere on the preview to focus on that area
  • A visual indicator shows where the camera is focusing
  • Lock focus on a specific point using the lock button, useful for tricky angles or close-ups
  • Focus resets automatically when switching between cameras
📱 MobileInspector Form

Add new assessment fields and fix form data handling

Added new evaluation criteria across all inspection categories: exterior, interior, engine, features, tires, and test drive. The inspection form now collects far more detailed scores for each area.

The form's internal data structure was also overhauled from a single flat list of 150+ fields into organized groups. This fixes a bug where editing one section could accidentally reset data in another section. The form now saves reliably even with partial edits.


+17927
⚙️ BackendLaporan Cepat

Switch to professional photo compression library

Switch to professional photo compression library

Switched the server's photo compression engine from Go's built-in library to libvips, the same image processing library used by Instagram and WhatsApp. This significantly reduces peak memory usage when processing photos, which means the server can handle more concurrent uploads without running out of memory. Memory is also released immediately after each photo is processed.

⚙️ BackendLaporan Cepat

Skip unnecessary photo compression

Added smart checks to avoid wasting resources on photos that don't need compression:

  • Small photos (under 75 KB) are kept as-is since they're typically thumbnails or already optimized
  • Incompressible photos — if compression doesn't make the file any smaller, the original is kept instead

Both checks run automatically during upload, replacement, and batch processing.

⚙️ BackendLaporan Cepat

Improve app update logging

App update-related requests now log descriptive messages (e.g., "android release uploaded", "latest android release fetched") instead of the generic "request completed" message. This makes it easier to monitor update activity in server logs.


+2.0k956
📱 MobileInspector Form

Fix storage leak and optimize photo compression

Fixed a storage leak that was accumulating up to 18 GB of invisible cache files on inspectors' phones. Every photo captured by the camera stored a raw uncompressed copy that was never cleaned up. Both the compressed and raw copies are now properly deleted after use.

Optimized photo compression to a two-pass process targeting around 50 KB per image. Photos that are already small or can't be compressed further are skipped entirely, saving processing time and battery.

Refactored the image handling into separate services for capture, compression, and gallery saving to make the system easier to maintain and less prone to bugs.


+1.0k123
🌐 WebLaporan Cepat

Add custom car loading animation

Add custom car loading animation

Replaced the generic loading spinner with a branded animated car:

  • The car is rendered entirely in code with spinning wheel rims, suspension bounce, and a moving road
  • Uses the Palapa brand colors
  • The same animation is now used consistently across all loading states in the app

+13222
⚙️ BackendLaporan Cepat

User account deactivation

User accounts can now be deactivated instead of deleted. This preserves all historical inspection data linked to the account while preventing the user from logging in. The system also records which admin performed the deactivation for accountability.

⚙️ BackendLaporan Cepat

Fix equipment checklist data loss

Fixed a bug where unchecking an item in the equipment checklist (like "Kunci Serep" or "BPKB") would cause that item to silently disappear from the saved inspection data. The system was incorrectly treating unchecked items as missing data and dropping them entirely. All 11 checklist items now save correctly regardless of their checked state.

⚙️ Backend📱 MobileInspector Form

Android in-app update system

Built a system for distributing Android app updates directly without relying on GitHub. When a new version is available, inspectors see an update screen in the app with release notes and a download button. The update installs directly without leaving the app.

Backend:

  • Stores app releases with version tracking and file validation
  • Rejects duplicate version numbers automatically
  • Files are stored securely in cloud storage

CI:

  • Release builds are now uploaded directly to the backend on merge, reducing the steps between code changes and a shipped update

+2.6k110
⚙️ Backend🌐 WebLaporan Cepat

Add Faktur and NIK Sertifikat to vehicle completeness check

Inspectors can now track two additional documents in the equipment checklist:

  • Faktur (vehicle purchase invoice)
  • NIK Sertifikat (certificate identity number)

The fields are tracked end-to-end from the inspection form through to the final report and CSV exports. The checklist was also refactored so new items can be added more easily in the future.

⚙️ Backend🌐 WebLaporan Cepat

Improve logging tiers and fix review data loss

Server logs now distinguish between three levels of severity:

  • Normal — successful requests
  • Warning — failed logins and rate-limited requests, making security issues easier to spot
  • Error — server-side problems that need attention

Previously all non-error responses were logged at the same level, so authentication failures were hard to notice in production.

Also fixed a bug in the review workflow where saving changes to one section could accidentally erase data from other sections (like tire details). The tire data display on the preview page was also improved to handle long text gracefully.


+538290
⚙️ Backend🌐 WebLaporan Cepat

Structured logging system and request tracking

Structured logging system and request tracking

The backend now has a proper logging system that tracks every API request with full context:

  • Logs automatically switch between a readable format for developers and structured data for production monitoring
  • Every request is recorded with the method, endpoint, response time, and which user made it
  • Failed login attempts now log the specific reason (expired token, wrong role, etc.) instead of a generic error
  • Error messages identify the action that failed (e.g., "inspection update failed") instead of just "request failed"

On the frontend, the review editing workflow was also improved to handle empty data more safely.

⚙️ BackendLaporan Cepat

Fix repair estimates disappearing from reports

Fixed a bug where repair estimates would sometimes not appear in inspection reports at all. When no repair estimates were added, the system was omitting the field entirely instead of showing it as empty. This has been corrected so the field is always present in the report.