KmpPrinter: Library ESC/POS Thermal Printing Multiplatform dengan Kotlin
Back to Blog
Development July 11, 2026 5 min read

KmpPrinter: Library ESC/POS Thermal Printing Multiplatform dengan Kotlin

Panduan lengkap KmpPrinter β€” library Kotlin Multiplatform untuk ESC/POS thermal printing yang support Android, iOS, Desktop, Web, dan Wasm. Bluetooth, BLE, USB, Network TCP.

Pendahuluan

Thermal printer masih menjadi tulang punggung sistem kasir, restoran, dan logistik di seluruh dunia. Tapi membangun aplikasi yang bisa mencetak ke thermal printer dari berbagai platform β€” Android, iOS, Desktop, Web β€” adalah tantangan besar.

KmpPrinter hadir sebagai solusi: library Kotlin Multiplatform open-source yang menyatukan semua transport thermal printer dalam satu API.

Dengan 2.200+ baris kode, 6 bahasa pemrograman, dan dukungan untuk Bluetooth Classic, BLE, USB, Network TCP, Serial, hingga Virtual, KmpPrinter adalah library thermal printing paling komprehensif di ekosistem Kotlin.

πŸ“Š Metadata Proyek

ItemDetail
Repository[ringga-dev/kmp-printer](https://github.com/ringga-dev/kmp-printer)
LisensiMIT β€” gratis untuk komersial dan personal
Stars⭐ 5
BahasaTypeScript (42%), Kotlin (38%), JavaScript (17%), Vue (1.7%), CSS, Swift, C#
Release Terbaruv2.2.2 (11 Juni 2026)
PlatformAndroid, iOS, JVM/Desktop, Web (JS), Wasm
Dokumentasi[ringga-dev.github.io/kmp-printer](https://ringga-dev.github.io/kmp-printer/)

✨ Fitur Unggulan

CODE
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  KmpPrinter API                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  πŸ” Discovery     β†’ Bluetooth, BLE, Network, USB   β”‚
β”‚  πŸ”— Connection    β†’ TCP, BLE, USB, Serial, Virtual  β”‚
β”‚  πŸ“ Receipt DSL   β†’ Text, Tables, QR, Barcode       β”‚
β”‚  πŸ“Š Monitoring    β†’ Paper out, Cover, Error          β”‚
β”‚  πŸ›‘οΈ Concurrency   β†’ Mutex safety, Chunked sending   β”‚
β”‚  πŸ‘οΈ Preview       β†’ Virtual render untuk UI preview  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Multi Transport

KmpPrinter support 6 tipe koneksi:

TransportAndroidiOSDesktopWeb
Bluetooth Classicβœ…βŒβœ…βœ…
BLEβœ…βœ…βœ…βœ…
USBβœ…βŒβœ…βœ…
Network TCPβœ…βœ…βœ…βœ…
Serialβš οΈβŒβœ…βŒ
Virtualβœ…βœ…βœ…βœ…
BLE-only di iOS karena Apple tidak menyediakan API Bluetooth Classic untuk pihak ketiga.

Receipt Builder DSL

API utama KmpPrinter menggunakan DSL Kotlin yang intuitif:

KOTLIN
// Contoh cetak struk kopi β€” 15 baris kode
printer.print(config) {
    alignCenter()
    bold(true)
    line("β˜• COFFEE SHOP")
    bold(false)
    divider()
    tableRow(listOf("Americano", "2", "6.00"), listOf(2, 1, 1))
    tableRow(listOf("Latte", "1", "4.50"), listOf(2, 1, 1))
    divider()
    line("Total: $10.50", align = "RIGHT")
    feed(1)
    qrCodeNative("https://example.com", center = true)
    feed(3)
    cut()
}.collect { status -> println(status) }

Printer Discovery (Flow-based)

Menggunakan Kotlin Coroutines Flow untuk discovery real-time:

KOTLIN
printer.discovery("NETWORK") { log ->
    println("Scanning: $log")
}.collect { devices ->
    devices.forEach { device ->
        println("Found: ${device.name} di ${device.address}:${device.port}")
    }
}

Status Monitoring Real-time

Pantau kondisi printer secara periodik:

KOTLIN
printer.monitorStatus(config, intervalMs = 2000).collect { status ->
    when {
        status.isPaperOut -> alert("πŸ“’ Kertas habis!")
        status.isCoverOpen -> alert("πŸ”“ Cover terbuka!")
        !status.isOnline -> alert("⚠️ Printer offline!")
    }
}

πŸ—οΈ Arsitektur

KmpPrinter dibangun di atas Kotlin Multiplatform dengan arsitektur berlapis:

CODE
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Application                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚          KmpPrinter API (commonMain)     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Androidβ”‚ β”‚   iOS  β”‚ β”‚ Desktop/JVM  β”‚  β”‚
β”‚  β”‚  BLE   β”‚ β”‚ CoreBLEβ”‚ β”‚  BlueZ + TCP β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  USB   β”‚ β”‚ TCP/IP β”‚ β”‚  Web Serial  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Keunggulan arsitektur KMP:

  • 90% kode dibagi antar platform (commonMain)
  • Platform-specific hanya untuk implementasi transport (Bluetooth, USB)
  • Type-safe dengan sealed class untuk konfigurasi koneksi
  • πŸ”§ Cara Install

    Gradle (KMP Project)

    KOTLIN
    // settings.gradle.kts
    dependencyResolutionManagement {
        repositories {
            maven {
                url = uri("https://raw.githubusercontent.com/ringga-dev/kmp-printer/maven-repo")
            }
        }
    }
    
    // build.gradle.kts
    kotlin {
        sourceSets {
            commonMain.dependencies {
                implementation("io.github.ringga-dev:kmp_printer:2.2.2")
            }
        }
    }

    Platform-Specific Setup

    Android: Tambahkan permission di AndroidManifest.xml:

    XML
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.INTERNET" />

    Desktop (Linux): Butuh udev rule untuk USB:

    BASH
    # /etc/udev/rules.d/99-thermal-printer.rules
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0416", MODE="0666"

    πŸ§ͺ Contoh Aplikasi

    KmpPrinter sudah include aplikasi demo Vue 3 untuk web:

    CODE
    kmp-printer/
    β”œβ”€β”€ composeApp/        # Android + Desktop app (Compose Multiplatform)
    β”œβ”€β”€ demo-web/          # Vue 3 demo aplikasi web
    β”œβ”€β”€ kmp-printer/       # Library utama (commonMain)
    β”‚   β”œβ”€β”€ src/commonMain
    β”‚   β”œβ”€β”€ src/androidMain
    β”‚   β”œβ”€β”€ src/iosMain
    β”‚   β”œβ”€β”€ src/jvmMain
    β”‚   └── src/jsMain
    └── docs/              # Dokumentasi

    πŸ“ˆ Kode dan Metrik

    MetrikNilai
    Total baris kode1.097.000+
    TypeScript461.000 baris (42%)
    Kotlin420.000 baris (38%)
    JavaScript182.500 baris (17%)
    Release terbaruv2.2.2
    Packageio.github.ringga-dev:kmp_printer

    πŸ’‘ Kasus Penggunaan

    1. Sistem POS Restoran

    KOTLIN
    // Cetak struk pesanan dapur
    printer.print(kitchenConfig) {
        bold(true)
        fontSize(2)
        line("🍳 DAPUR")
        divider()
        line("Meja 5 β€” #102")
        line("1x Nasi Goreng")
        line("1x Es Teh")
        feed(2)
        cut()
    }

    2. Logistik & Warehouse

    KOTLIN
    // Cetak barcode untuk tracking
    printer.print(labelConfig) {
        barcode(orderId, type = BarcodeType.CODE128)
        line("Order: $orderId")
        line("Tanggal: $date")
        qrCodeNative(trackingUrl, size = 8)
        cut()
    }

    3. Aplikasi Kesehatan

    KOTLIN
    // Cetak label obat
    printer.print(pharmacyConfig) {
        line("πŸ₯ Apotek Sehat")
        line("Pasien: ${patient.name}")
        line("Obat: ${medicine.name}")
        line("Dosis: ${medicine.dosage}")
        barcode(prescriptionId, type = BarcodeType.CODE39)
        cut()
    }

    πŸ”œ Roadmap

    Fitur yang direncanakan ke depan:

  • [ ] Rekoneksi otomatis β€” reconnect saat koneksi putus
  • [ ] Antrian cetak β€” queueing untuk multi-job
  • [ ] Driver ESC/POS kustom β€” untuk printer non-standar
  • [ ] Cloud print β€” kirim ke printer dari cloud
  • [ ] CUPS integration β€” Linux printing pipeline
  • [ ] Template engine β€” template struk terstruktur
  • Kesimpulan

    KmpPrinter adalah solusi thermal printing multiplatform yang matang, dengan:

  • βœ… 5 platform dalam 1 API
  • βœ… 6 transport koneksi
  • βœ… Receipt builder DSL yang ekspresif
  • βœ… Monitoring real-time
  • βœ… MIT License β€” bebas dipakai
  • Dengan 42% TypeScript dan 38% Kotlin, library ini memanfaatkan kekuatan KMP untuk memberikan performa native di setiap platform β€” cukup tulis sekali, cetak di mana saja.

    Mulai hari ini:

    BASH
    git clone https://github.com/ringga-dev/kmp-printer.git
    cd kmp-printer
    ./gradlew build

    πŸš€ Happy printing!