Mengemas CatatanKu menjadi installer profesional: memahami target WiX, NSIS, DMG, dan DEB, menyiapkan code signing untuk Windows/macOS, dan menyusun strategi distribusi per platform hingga metadata aplikasi

CatatanKu sudah lengkap secara fungsional — UI, data lokal, background task, theming, aksesibilitas. Namun aplikasi yang belum bisa di-install pengguna bukanlah produk. Packaging mengubah folder proyek menjadi installer yang bisa didistribusikan: file .exe di Windows, .dmg di macOS, dan .deb/.AppImage di Linux. Distribution adalah cara installer itu sampai ke pengguna: website, store, atau update server.
Episode ini membahas target installer tiap platform, code signing (tanda tangan digital yang menentukan kepercayaan OS), dan strategi distribusi. Ini titik di mana banyak aplikasi bagus gagal di lapangan — installer yang gagal, peringatan "unknown publisher", atau unduhan yang diblokir antivirus.
Setiap platform punya format installer yang menjadi harapan penggunanya:
| Platform | Installer | Karakteristik |
|---|---|---|
| Windows | MSI (WiX), NSIS EXE, MSIX | WiX untuk enterprise, NSIS untuk fleksibilitas, MSIX untuk Store |
| macOS | DMG, PKG | DMG untuk "drag to Applications", PKG untuk instalasi terpandu |
| Linux | DEB, RPM, AppImage, Flatpak | DEB/RPM per distro, AppImage portabel, Flatpak ter-sandbox |
{
"bundle": {
"active": true,
"targets": ["nsis", "dmg", "deb", "appimage"],
"icon": ["icons/32x32.png", "icons/128x128.png", "icons/icon.ico", "icons/icon.icns"],
"category": "Productivity",
"shortDescription": "Aplikasi catatan offline-first",
"publisher": "CatatanKu",
"windows": {
"nsis": { "installerIcon": "icons/icon.ico", "installMode": "currentUser" }
}
}
}{
"build": {
"appId": "id.catatanku.app",
"productName": "CatatanKu",
"win": {
"target": ["nsis", "msi"],
"publisherName": "CatatanKu"
},
"mac": {
"target": ["dmg", "zip"],
"category": "public.app-category.productivity"
},
"linux": {
"target": ["AppImage", "deb"],
"category": "Utility",
"maintainer": "catatanku@example.com"
}
}
}Pola yang sama untuk Flutter (flutter build + tools seperti msix untuk Windows, dmg builder untuk macOS). Kuncinya bukan menghafal semua format, melainkan memahami mana yang dipakai untuk audiens mana: enterprise Windows memakai MSI, pengguna Linux modern memakai Flatpak/AppImage, pengguna macOS menunggu DMG.
Note
Prinsip paket: installer untuk pengguna akhir harus semudah mungkin — tanpa command line, tanpa pengaturan manual. Installer untuk enterprise (MSI) boleh membawa fleksibilitas (deployment via GPO, silent install) karena dikelola admin. Bedakan keduanya di strategi kalian.
Saat pengguna menjalankan aplikasi, OS mengecek: siapa yang menandatangani binary ini? Tanda tangan digital membuktikan (1) identitas penerbit, dan (2) bahwa file tidak diubah sejak ditandatangani.
# 1. Build unsigned
# 2. Tandatangani dengan Developer ID Application
codesign --deep --force --sign "Developer ID Application: CatatanKu" \
"dist/CatatanKu.app"
# 3. Kirim ke Apple untuk notarization
xcrun notarytool submit "dist/CatatanKu.dmg" --wait
# 4. Tempel notary ticket ke installer
xcrun stapler staple "dist/CatatanKu.dmg"# 1. Dapatkan sertifikat Authenticode dari CA (DigiCert, Sectigo, dll)
# 2. Sign semua file yang didistribusikan
signtool sign /f catatanku.pfx /p PASSWORD /tr http://timestamp.digicert.com \
/td sha256 /fd sha256 "dist/CatatanKu Setup 1.0.0.exe"Poin penting: signing harus berjalan di CI/CD (episode 17), dengan secret dikelola aman — bukan di laptop masing-masing developer.
brew, choco, scoop, winget untuk pengguna teknis.Installer yang baik memuat metadata yang benar:
appId/productName berubah antar build merusak update dan integrasi sistem.Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita menyambungkan packaging ke pengguna jangka panjang: auto-update & versioning — saluran rilis, update tanpa gangguan, dan rollback yang aman. Sampai jumpa di episode 13!