Category: Tutorial

  • Cara Membuat Video Viral Pakai AI: Tiru Formatnya dengan Hypit (ATM Konten)

    Cara Membuat Video Viral Pakai AI: Tiru Formatnya dengan Hypit (ATM Konten)

    Kamu pasti pernah begini: nemu reel yang views-nya jutaan, lalu kepikiran, “Format kayak gini cocok banget buat bisnisku.” Hook-nya pas, caption-nya muncul tepat di kata yang penting, B-roll-nya ganti tiap dua detik.

    Lalu kamu buka CapCut, coba bikin ulang… dan dua jam kemudian hasilnya masih jauh dari aslinya.

    Di dunia konten, cara ini sudah lama dikenal sebagai ATM: Amati, Tiru, Modifikasi. Bedanya, sekarang bagian “tiru” itu bisa dikerjakan AI. Di artikel ini kami bahas cara membuat video viral pakai AI dengan meniru format video yang sudah terbukti ramai, memakai alat open source bernama Hypit. Lengkap dengan cara pasang, biaya, aturan lisensi, dan batas etikanya.

    EBOOK PREMIUM HYPIT

    Mau langsung praktik? Download panduan lengkapnya.

    150+ halaman: uji coba nyata meregenerasi reel viral dengan Hypit, langkah instalasi, 8 resep format, kontrol biaya, dan pustaka prompt siap salin.

    ⬇ Download Ebook Premium Hypit (Rp15.000)

    Cuplikan video Arrazy Inovasi tentang Hypit: repo GitHub 23 ribu bintang, langkah cari reel yang ramai, dan ganti isi video
    Cuplikan video kami tentang Hypit di Instagram @arrazyinovasi. Angka views di layar contoh ilustrasi.

    Kenapa Video Viral Lebih Mudah Ditiru Formatnya, Bukan Isinya

    Video yang viral jarang viral karena satu hal saja. Biasanya ada pola yang bisa diulang:

    • Hook di detik pertama, sering berupa pertanyaan atau pernyataan yang bikin penasaran.
    • Ritme potongan: berapa detik sekali gambar berganti.
    • Caption per kata yang muncul pas dengan suara, dengan kata kunci diberi warna.
    • B-roll dan efek yang masuk di kata tertentu, bukan di detik acak.
    • Struktur cerita: masalah, bukti, solusi, ajakan.

    Isinya (wajah, produk, kalimat) boleh beda total. Yang membuat video itu “nempel” justru formatnya. Inilah inti ATM yang sehat: kamu meniru cara bercerita yang sudah terbukti, lalu mengisinya dengan produk, suara, dan pesanmu sendiri.

    Masalahnya, meniru format secara manual itu lama. Kamu harus menonton ulang frame demi frame, mencatat kapan caption muncul, lalu menyusunnya lagi di aplikasi edit. Di sinilah AI agent mulai berguna.

    Apa Itu Hypit?

    Hypit adalah proyek open source di GitHub (hypit-ai/hypit) yang memberi AI agent seperti Claude Code dan Codex kemampuan membuat video. Repo ini dibuat 29 Juli 2026 dan per 21 Oktober 2026 sudah mengumpulkan 24.289 bintang serta 2.747 fork. Itu angka yang jarang untuk proyek yang umurnya belum tiga bulan.

    Cara kerjanya: kamu memberi video referensi, lalu agent mengkloningnya sebagai satu workflow utuh. Bukan cuma naskahnya, tapi footage, caption, B-roll, dan efeknya. Semuanya ditambatkan ke tiap kata, bukan ke detik. Jadi kalau kalimatnya diganti, caption dan efeknya ikut bergeser menyesuaikan.

    Di balik layar, video ditulis dalam bahasa markup milik Hypit bernama SVML, lalu bisa dilihat dan diedit di Studio-nya. Kamu tidak wajib membaca kodenya. Instruksi ke agent cukup ditulis dengan bahasa biasa.

    Bedanya dengan CapCut atau aplikasi AI edit video biasa

    • CapCut dan sejenisnya: kamu yang mengedit, AI membantu bagian tertentu (caption otomatis, hapus background). Template-nya milik aplikasi.
    • Hypit: AI agent yang menyusun videonya dari referensi pilihanmu. Kamu tinggal mengarahkan dan merevisi. Satu workflow juga bisa dipakai ulang untuk membuat banyak varian sekaligus.

    Hypit bukan aplikasi HP. Ia dipakai lewat coding agent di laptop. Kalau kamu cuma butuh edit cepat di HP, CapCut tetap lebih praktis.

    Cara Membuat Video Viral Pakai AI dengan Hypit (3 Langkah)

    Yang perlu disiapkan

    • Coding agent yang mendukung skill, misalnya Claude Code atau Codex, sudah terpasang di laptop.
    • Node.js versi terbaru (dokumentasi Hypit menyebut 22.15 ke atas).
    • Video referensi (file .mp4) atau cukup deskripsi video yang kamu mau.
    • Akun model AI kalau videonya butuh gambar, video, atau suara buatan AI. Detailnya di bagian biaya.

    Langkah 1: Cari reel yang sudah terbukti ramai

    Pilih video yang formatnya cocok dengan bisnismu, bukan sekadar yang views-nya paling besar. Contoh: format “3 kesalahan saat…”, format review cepat, atau format sebelum-sesudah. Untuk iklan, Meta Ad Library bisa jadi sumber referensi iklan yang sudah lama tayang, tanda iklannya jalan.

    Langkah 2: Pasang Hypit dan berikan video ke AI agent

    Buka terminal, lalu pasang skill Hypit dengan satu perintah:

    npx skills add hypit-ai/hypit -g

    Kamu tidak perlu clone repo. Saat pertama dipakai, agent akan mengecek dan menyiapkan sendiri program hypit yang dibutuhkan. Setelah itu, buka Claude Code atau Codex dan tulis perintahnya, misalnya:

    /hypit Clone this video: /path/ke/video-referensi.mp4, ganti host-nya dengan saya, produknya aplikasi kasir kami, bahasa Indonesia.

    Agent akan membedah video referensi: hook, potongan, caption, sampai efeknya. Sebelum mengerjakan bagian yang berbayar, agent wajib menunjukkan perkiraan biaya dan meminta persetujuanmu dulu.

    Langkah 3: Ganti apa pun yang kamu mau

    Di sinilah bagian “modifikasi” dari ATM. Karena semua elemen ditambatkan ke kata, kamu bisa menukar satu bagian tanpa merusak bagian lain:

    • Ganti pembawa acara dengan wajahmu atau tanpa wajah sama sekali.
    • Ganti hook, misalnya buat lima versi kalimat pembuka untuk diuji.
    • Ganti produk dan B-roll-nya.
    • Ganti bahasa, misalnya versi Indonesia dan Inggris dari satu video.

    Tidak punya video referensi? Hypit juga bisa mulai dari template atau deskripsi saja, misalnya “buat video ranking 5 aplikasi kasir dengan gaya tier list”.

    Panduan resmi yang lebih lengkap ada di hypit.ai/quickstart.

    Cara Membuat Video Iklan Pakai AI dengan Banyak Varian

    Buat pemilik bisnis yang beriklan di Meta atau TikTok, fitur paling menarik justru ini: satu workflow bisa menghasilkan banyak varian. Iklan yang sama bisa dibuat dengan hook berbeda, durasi berbeda, atau bahasa berbeda, lalu diuji mana yang paling murah biaya per hasilnya.

    Dulu, membuat 10 varian iklan berarti 10 kali edit manual. Dengan workflow yang sama, yang berubah hanya bagian yang kamu tukar. Kalau kamu sedang menghitung anggaran iklan, baca juga panduan kami soal cara menentukan budget iklan online untuk UMKM.

    Berapa Biaya Membuat Video dengan Hypit?

    Hypit sendiri gratis dipakai. Tidak ada biaya per kursi, tidak ada biaya per render, dan tidak ada watermark. Yang kamu bayar ada di dua tempat:

    1. Coding agent: langganan Claude atau Codex yang sudah kamu punya.
    2. Model AI generatif (kalau dipakai): untuk membuat gambar, video, atau suara. Hypit mendukung layanan hosted HypiHub, API milikmu sendiri, model lokal, atau penyedia partner. Model yang disebut di dokumentasinya antara lain Seedance, GPT Image, MiniMax, Nano Banana, Grok Imagine, dan Wan.

    Sebagai gambaran, contoh di README resmi Hypit mencatat biaya sekitar $1,07 sampai $1,15 per video berdurasi 18 sampai 26 detik. Dengan kurs sekitar Rp16.500 per dolar, berarti kira-kira Rp17.500 sampai Rp19.000 per video. Angka ini tergantung model yang dipilih dan seberapa banyak bagian yang dibuat AI.

    Ada juga cara yang hampir tanpa biaya model: kalau videonya cukup berisi caption, motion graphic, dan visual berbasis kode, Hypit bisa merakitnya tanpa memanggil model generatif sama sekali.

    Bolehkah Hasil Hypit Dipakai untuk Klien atau Iklan?

    Hypit memakai lisensi Apache 2.0 yang dimodifikasi. Ringkasnya, berdasarkan file LICENSE di repo-nya:

    • Boleh dipakai untuk kerja komersial organisasimu sendiri, termasuk mengerjakan video untuk klien.
    • Hasil video sepenuhnya milikmu, tetapi tetap tunduk pada ketentuan penyedia model AI yang kamu pakai.
    • Tidak boleh tanpa lisensi komersial: menjadikan Hypit layanan SaaS untuk banyak pengguna (berbayar maupun gratis), menjual atau membundel Hypit di dalam produk, dan menghapus nama, logo, atau hak cipta Hypit.

    Jadi agensi atau kreator yang mengerjakan konten klien aman memakainya. Yang perlu izin terpisah adalah kalau kamu ingin membuat aplikasi “kloning video” sendiri berbasis Hypit lalu menjualnya ke publik.

    Batas Etika: Tiru Format, Bukan Videonya

    ATM yang sehat itu meniru cara bercerita, bukan mengambil karya orang. Beberapa pegangan sederhana:

    • Pakai footage, foto, dan suara yang memang hakmu. Video referensi cukup jadi contoh struktur, jangan diunggah ulang.
    • Jangan memakai wajah atau suara orang lain tanpa izin, termasuk tokoh terkenal.
    • Kalau ada bagian realistis yang dibuat AI, ikuti aturan label konten AI di platform tempat kamu mengunggah.
    • Tetap tambahkan sudut pandangmu sendiri. Video yang cuma salinan jarang bertahan lama, karena penonton sudah pernah melihat aslinya.

    EBOOK PREMIUM HYPIT

    Mau langsung praktik? Download panduan lengkapnya.

    150+ halaman: uji coba nyata meregenerasi reel viral dengan Hypit, langkah instalasi, 8 resep format, kontrol biaya, dan pustaka prompt siap salin.

    ⬇ Download Ebook Premium Hypit (Rp15.000)

    Pertanyaan yang Sering Muncul

    Apakah harus bisa coding untuk memakai Hypit?

    Tidak harus. Kamu perlu mau membuka terminal dan menjalankan perintah pasang. Setelah itu, instruksi ke agent ditulis dengan bahasa biasa. Membaca kode SVML tidak wajib.

    Apakah Hypit gratis?

    Framework-nya gratis. Biaya datang dari langganan coding agent dan model AI yang kamu pilih. Agent akan menunjukkan perkiraan biaya sebelum mengerjakan bagian yang berbayar.

    Bisa dipakai selain Claude Code?

    Bisa. Hypit dirancang untuk coding agent yang mendukung skill, dan dokumentasinya menyebut Claude Code serta Codex.

    Apakah harus punya video referensi?

    Tidak. Kamu bisa mulai dari template bawaan atau cukup mendeskripsikan video yang kamu mau.

    Bisa untuk konten berbahasa Indonesia?

    Bisa. Bahasa termasuk elemen yang bisa ditukar, dan Hypit juga mendukung lokalisasi satu video ke beberapa bahasa. Hasil suara Indonesia tergantung model suara yang kamu pilih.

    Apa bedanya dengan memotong video panjang jadi klip?

    Hypit membuat video baru dengan meniru format. Kalau yang kamu butuhkan adalah memotong podcast atau live panjang jadi klip pendek, baca panduan kami cara potong video jadi klip pakai Claude.

    Mau Sistem Produksi Konten Sendiri untuk Bisnismu?

    Kalau timmu rutin membuat konten atau iklan video, alur seperti ini bisa dijadikan sistem sendiri: tinggal pilih referensi, isi produk dan pesan, lalu varian video keluar dengan identitas brand yang konsisten, tanpa harus membuka terminal. Kami membangun sistem seperti ini lewat layanan jasa AI agent, dan untuk kebutuhan lain lewat pembuatan sistem dan aplikasi.

    Kami sudah mengerjakan lebih dari 30 project untuk perorangan, UMKM, maupun perusahaan. Konsultasinya gratis: DM Instagram @arrazyinovasi atau chat WhatsApp 0812-9323-4100.

    Suka cara kerja AI yang praktis? Coba juga prompt Claude untuk merapikan Google Drive tanpa menghapus file.

  • Cara Potong Video Jadi Klip Pakai Claude, Plus Ebook Gratis

    Cara Potong Video Jadi Klip Pakai Claude, Plus Ebook Gratis

    Bikin klip pendek dari video panjang biasanya berakhir di aplikasi klip berbayar. Hampir semuanya menghitung biaya per menit video, per token, atau per bulan. Live dua jam bisa langsung menghabiskan kuota, dan token yang tidak terpakai sering hangus setelah 30 sampai 60 hari.

    Padahal kalau kamu sudah berlangganan Claude, langganan itu bisa dipakai untuk memotong video panjang jadi klip Reels dan TikTok, lengkap dengan judul dan caption animasi. Kami sudah mencobanya sendiri pada 20 Oktober 2026, mencatat setiap langkahnya, lalu merangkumnya jadi ebook gratis 18 halaman yang bisa kamu unduh di halaman ini.

    ⬇ Download Ebook Gratis (PDF, 18 halaman)

    Tanpa daftar, tanpa isi email. Klik, simpan, langsung baca.

    Isi Ebook Bikin Klip Video Pakai Claude

    Ebook ini bukan rangkuman teori. Semua screenshot diambil dari uji coba sungguhan di laptop kami, termasuk bagian yang sempat macet. Isinya:

    • Kenapa cara ini, lengkap dengan kekurangannya, supaya kamu bisa memutuskan apakah cocok atau tidak.
    • Daftar yang perlu disiapkan: Claude Code atau Codex, ffmpeg, Node.js, dan akun transkrip.
    • 5 langkah dengan screenshot asli, dari membuka Claude Code sampai klip jadi.
    • Hasil uji coba: podcast 18 menit menjadi 3 klip vertikal siap upload.
    • Prompt siap salin untuk memasang skill, memotong video, dan merevisi hasil.
    • 36 prompt gaya editing Remotion: caption sorot per kata, stabilo kata penting, transisi light leak, grade sinematik, layar terbelah, watermark logo, sampai caption transparan untuk CapCut.
    • Kendala yang kami alami dan solusinya, plus tips hemat token.
    Cuplikan halaman ebook: langkah pasang skill, proses editing, hasil klip, dan kumpulan prompt Remotion
    Beberapa halaman isi: langkah, proses, hasil, dan kumpulan prompt.

    Cara Kerjanya Secara Singkat

    Claude tidak “menonton” videonya. Dia membaca transkrip per kata, memilih momen terbaik, lalu memotong tepat di batas kata. Alat yang dipakai ada dua skill open source:

    • video-use (github.com/browser-use/video-use, lisensi MIT) untuk transkrip, memilih momen, memotong, crop ke 9:16, dan color grade.
    • Remotion (github.com/remotion-dev/skills) untuk judul hook dan caption animasi.

    Alurnya lima langkah:

    1. Taruh video panjang di satu folder, buka terminal di folder itu, lalu jalankan claude.
    2. Minta Claude memasang skill video-use dan Remotion. Kamu tidak perlu memasangnya manual.
    3. Tulis permintaanmu dengan bahasa biasa, misalnya “cari 3 momen paling menarik, potong vertikal, kasih judul dan caption”.
    4. Baca rencana yang diajukan Claude, lalu setujui atau minta revisi.
    5. Biarkan dia bekerja. Sebelum menyerahkan hasil, Claude mengecek tampilannya sendiri.
    Rencana 3 klip yang diajukan Claude Code lengkap dengan timestamp, durasi, dan teks hook
    Rencana yang diajukan Claude sebelum memotong: 3 momen, timestamp, durasi, dan teks hook.

    Prompt lengkap tiap langkah, termasuk prompt revisi dan prompt untuk video berikutnya, ada di ebook.

    Hasil Uji Coba Kami

    Kami memakai 18 menit pertama sebuah podcast. Sekitar 5 menit kemudian, Claude sudah mengajukan 3 momen. Setelah disetujui, hasilnya 3 klip vertikal 1080×1920 berdurasi 35 sampai 40 detik, lengkap dengan judul hook di detik pertama, caption kuning per kata, crop ke orang yang sedang bicara, dan loudness standar Reels/TikTok.

    Tiga klip vertikal hasil Claude Code dan video-use dengan judul hook dan caption
    Hasil uji coba. Sumber video: YouTube Raditya Dika, dipakai hanya sebagai contoh dan tidak kami unggah ulang.

    Seluruh proses memakan sekitar 50 menit, termasuk sekitar 15 menit tertahan karena unduhan komponen Remotion yang macet. Cara mengatasinya ada di bagian kendala ebook.

    Apakah Lebih Murah dari Aplikasi Klip?

    Jawaban jujurnya: tergantung. Aplikasi klip lokal ada yang mulai dari sekitar Rp25 ribu untuk ratusan menit video. Kalau kamu cuma bikin klip sesekali dan belum punya langganan AI, aplikasi seperti itu lebih praktis.

    Cara di ebook ini masuk akal kalau:

    • Kamu sudah berlangganan Claude atau ChatGPT, jadi tidak perlu bayar aplikasi lagi.
    • Kamu rutin bikin konten dan mau gaya klip yang konsisten dengan brand, bukan template aplikasi.
    • Kamu tidak mau token hangus karena tidak terpakai.

    Yang perlu diingat: langganan Claude dan Codex punya batas pemakaian, dan transkrip per kata lewat ElevenLabs dihitung per jam audio. Kalau videonya ada di YouTube dan punya subtitle, transkripnya bisa diambil gratis. Detailnya ada di ebook.

    Pertanyaan yang Sering Muncul

    Apakah harus bisa coding?

    Tidak. Kamu cukup mau membuka terminal dan mengetik perintah. Semua instruksi ke Claude ditulis dengan bahasa biasa, dan contohnya ada di ebook.

    Bisa pakai Codex atau DeepSeek?

    Bisa. Skill video-use bisa dipakai di Codex juga, dan prompt di ebook bisa dipakai apa adanya. Model lain seperti DeepSeek bisa dipakai lewat agent yang mendukung skill.

    Boleh memotong video orang lain?

    Sebaiknya tidak untuk diunggah ulang. Pakai video milikmu sendiri seperti podcast, live, webinar, atau rekaman kelas, atau video yang kamu punya izinnya.

    Apakah ebook ini benar-benar gratis?

    Ya. Tidak perlu daftar atau mengisi email. Kalau bermanfaat, bagikan saja ke teman yang juga sering bikin konten.

    ⬇ Download Ebook Gratis Sekarang

    Mau Sistem Clipper Sendiri untuk Bisnismu?

    Kalau timmu rutin memotong video, alur di ebook ini bisa dijadikan sistem sendiri: tinggal upload video, momen dipilih otomatis, klip keluar dengan caption dan logo brand, tanpa harus membuka terminal. Kami membangun sistem seperti ini lewat layanan jasa AI agent, dan untuk kebutuhan lain lewat pembuatan sistem dan aplikasi.

    Kami sudah mengerjakan lebih dari 30 project untuk perorangan, UMKM, maupun perusahaan. Konsultasinya gratis: DM Instagram @arrazyinovasi atau chat WhatsApp 0812-9323-4100.

    Suka prompt Claude yang praktis? Coba juga prompt Claude untuk merapikan Google Drive tanpa menghapus file.

  • Prompt Claude untuk Merapikan Google Drive Tanpa Menghapus File

    Google Drive yang berantakan biasanya bukan karena malas, tapi karena file masuk terus dari banyak arah: lampiran email, hasil scan, foto dari HP, dan file “Copy of” yang dibuat tanpa sadar. Lama-lama ratusan file numpuk di halaman paling atas Drive, dan mencari satu dokumen penting bisa makan waktu lebih lama daripada mengerjakannya.

    Artikel ini berisi prompt lengkap untuk merapikan Google Drive pakai Claude, yang kami bagikan di video Instagram kami. Prompt-nya dirancang dengan satu prinsip: Claude boleh menyusun ulang folder, tapi tidak boleh menghapus file apa pun, dan wajib menunjukkan rencana sebelum memindahkan sesuatu.

    Yang Perlu Disiapkan Sebelum Mulai

    • Akun Claude berbayar. Merapikan Drive dilakukan lewat ekstensi Claude in Chrome, yang saat artikel ini ditulis hanya tersedia untuk paket berbayar.
    • Browser Google Chrome dengan ekstensi Claude in Chrome terpasang dan sudah login ke akun Claude.
    • Akun Google yang Drive-nya mau dirapikan, sudah login di Chrome yang sama.
    • Waktu untuk membaca rencana. Bagian terpenting dari proses ini adalah kamu sendiri yang menyetujui rencana Claude, jadi sisihkan waktu 10 sampai 15 menit untuk memeriksanya.

    Langkah Merapikan Google Drive dengan Claude

    1. Pasang ekstensi Claude in Chrome dari Chrome Web Store, lalu login dengan akun Claude berbayar.
    2. Buka Google Drive di tab Chrome, lalu klik ikon Claude di toolbar untuk membuka panel samping.
    3. Tempel prompt di bawah ke panel Claude dan kirim.
    4. Baca rencana yang ditunjukkan Claude. Rencana berbentuk tabel: nama folder baru, jumlah file yang akan masuk, dan contoh file. Kalau ada yang tidak cocok, minta Claude mengubahnya.
    5. Setujui rencananya kalau sudah sesuai, lalu biarkan Claude memindahkan file. Tetap pantau tabnya selama proses berjalan.
    6. Periksa folder “99 Cek Dulu” di akhir. Di situ Claude menaruh file yang diduga dobel atau tidak jelas isinya, supaya kamu yang memutuskan file mana yang dihapus.

    Prompt Lengkap Merapikan Google Drive

    Salin seluruh teks di bawah ini apa adanya. Kalau Drive kamu besar, ganti kata “seluruh Drive saya” di kalimat pertama dengan nama satu folder dulu, misalnya “folder Kantor 2025”.

    Halo Claude, tolong bantu rapikan seluruh Drive saya.
    
    1. Scan semua file dan folder sampai folder paling dalam, termasuk file yang berserakan di luar folder (My Drive paling atas).
    2. Usulkan struktur folder yang rapi berdasarkan isi file saya. Beri nomor di depan nama folder (01, 02, 03, ...) supaya urutannya tetap.
    3. Tandai file yang kemungkinan dobel (nama atau isinya mirip) dan file yang tidak jelas isinya (misalnya "Untitled", "Copy of", "download (3)"). Kalau perlu, buka isinya dulu untuk menebak file itu tentang apa.
    4. Taruh file dokumen pribadi (KTP, KK, ijazah, slip gaji, rekening) di satu folder khusus "00 Pribadi", jangan dicampur.
    
    Aturan penting:
    - Tunjukkan RENCANA dulu dalam bentuk tabel (nama folder baru, berapa file yang masuk, contoh file). Jangan memindahkan apa pun sebelum saya setuju.
    - JANGAN menghapus file apa pun. File dobel dan file tidak jelas cukup dipindah ke folder "99 Cek Dulu" supaya saya periksa sendiri.
    - Kalau ragu sebuah file masuk mana, tanya saya dulu.
    - Setelah selesai, beri ringkasan: berapa file yang dipindah, berapa yang ditandai dobel, dan berapa yang belum jelas.

    Kenapa Prompt-nya Disusun Seperti Itu

    Setiap bagian prompt punya alasan. Kalau kamu mau memodifikasinya, pertahankan bagian aturan penting.

    • Rencana dulu, baru eksekusi. AI bisa salah menebak isi file dari namanya. Dengan meminta tabel rencana, kesalahan seperti itu ketahuan sebelum ada file yang berpindah.
    • Larangan menghapus. File yang terlihat dobel belum tentu benar-benar sama, misalnya dua versi proposal yang isinya beda sedikit. Memindahkan ke folder “99 Cek Dulu” jauh lebih aman daripada menghapus.
    • Nomor di depan nama folder. Google Drive mengurutkan folder berdasarkan nama. Awalan 01, 02, 03 membuat urutannya tetap seperti yang kamu mau, tidak berubah mengikuti abjad.
    • Folder khusus dokumen pribadi. KTP, slip gaji, dan data rekening sebaiknya terkumpul di satu tempat, supaya mudah dicari dan mudah diatur siapa saja yang boleh mengaksesnya.
    • Ringkasan di akhir. Angka file yang dipindah dan ditandai memudahkan kamu memastikan tidak ada yang terlewat.

    Tips Supaya Hasilnya Rapi dan Aman

    • Mulai dari satu folder dulu. Kalau Drive kamu berisi ribuan file, proses sekaligus akan lama dan rencananya sulit diperiksa. Rapikan satu folder, lihat hasilnya, baru lanjut ke bagian lain.
    • Jangan tinggalkan prosesnya. Claude bekerja di tab browser kamu. Tetap pantau, dan hentikan kalau ada langkah yang tidak sesuai rencana.
    • Hati-hati dengan folder yang dibagikan ke orang lain. Memindahkan file di folder bersama bisa mengubah letak file untuk rekan kerja juga. Kalau perlu, kecualikan folder bersama di prompt.
    • Kosongkan “99 Cek Dulu” secara manual. Biasakan memeriksa folder ini sendiri, dan baru hapus file yang memang yakin tidak terpakai.

    Kalau Masalahnya Bukan Cuma Drive yang Berantakan

    Drive yang rapi membantu, tapi untuk tim yang setiap hari mengelola dokumen seperti kontrak, invoice, laporan, atau berkas pelanggan, folder saja sering tidak cukup. Yang dibutuhkan biasanya sistem yang tahu dokumen mana milik siapa, statusnya sampai mana, dan siapa yang harus menyetujui.

    Arrazy Inovasi membangun sistem digital, website, dan aplikasi yang dibuat sesuai cara kerja bisnismu. Kalau mau diskusi dulu, konsultasi gratis lewat WhatsApp 0812-9323-4100.

  • Cara Membuat Website Sekolah: 3 Jalur, Biaya, dan Langkahnya

    Cara Membuat Website Sekolah: 3 Jalur, Biaya, dan Langkahnya

    Ada tiga jalur untuk membuat website sekolah. Pertama, bikin sendiri pakai WordPress atau platform gratisan, modalnya sekitar Rp500 ribu sampai Rp1 juta per tahun untuk domain dan hosting, sisanya dibayar pakai waktu dan tenaga. Kedua, sewa platform website sekolah yang sudah jadi, biayanya sekitar Rp1 juta sampai Rp3 juta per tahun. Ketiga, pesan ke pengembang, biayanya mulai Rp3 juta sampai Rp15 juta sekali bangun, tergantung fitur yang diminta.

    Tidak ada jalur yang salah. Yang salah itu memilih jalur tanpa melihat kondisi SDM dan dana sekolah sendiri. Kami menulis panduan ini dari sisi yang jarang dibahas tutorial lain, yaitu pengalaman membangun website sekolah sungguhan untuk klien, salah satunya SMK Sekar Bumi Nusantara. Dari proyek seperti itu kami tahu persis bagian mana yang bikin proyek molor, fitur mana yang akhirnya tidak pernah dipakai, dan kesalahan apa yang paling sering terjadi setelah website jadi.

    Tiga jalur membuat website sekolah, dibandingkan jujur

    Sebelum masuk ke langkah teknis, tentukan dulu jalurnya. Tabel ini rangkuman dari yang kami lihat di lapangan.

    Aspek Bikin sendiri (WordPress) Platform sekolah jadi Pesan ke pengembang
    Biaya Rp500 ribu s.d. Rp1 juta per tahun Rp1 juta s.d. Rp3 juta per tahun Rp3 juta s.d. Rp15 juta sekali bangun
    Waktu sampai jadi 2 s.d. 8 minggu, tergantung waktu luang 1 s.d. 2 minggu 3 s.d. 6 minggu
    Hasil Tergantung kemampuan yang mengerjakan Rapi tapi seragam, template yang sama dipakai banyak sekolah Desain dan fitur mengikuti kebutuhan sekolah
    Beban perawatan Sepenuhnya di sekolah Server dirawat penyedia, konten tetap urusan sekolah Bisa dikontrakkan ke pengembang

    Jalur pertama cocok kalau sekolah punya guru TIK atau staf yang memang mau belajar dan diberi waktu untuk merawat website. Kata kuncinya bukan bisa, tapi mau dan sempat. Banyak guru TIK yang sebenarnya mampu, tapi jam mengajarnya sudah penuh.

    Jalur kedua cocok untuk sekolah yang butuh cepat online dengan anggaran rutin tahunan. Kelemahannya, tampilan dan fitur mengikuti template penyedia. Kalau suatu saat ingin pindah, proses migrasi data kadang tidak mudah karena data ada di sistem mereka.

    Jalur ketiga masuk akal kalau sekolah ingin website jadi wajah resmi lembaga, butuh fitur khusus seperti PPDB online, dan tidak punya SDM untuk urusan teknis. Dana BOS dan dana komite umumnya bisa dipakai untuk ini karena masuk kategori pengembangan sistem informasi sekolah, tinggal sesuaikan dengan juknis yang berlaku di daerah masing-masing. Sekolah swasta biasanya lebih leluasa karena bisa pakai dana yayasan atau komite.

    Rentang harga jalur ketiga memang lebar. Website profil sederhana ada di kisaran bawah, sedangkan angka belasan juta biasanya sudah termasuk fitur seperti PPDB online, halaman per jurusan, dan pelatihan admin. Yang perlu diwaspadai justru penawaran yang terlalu murah tanpa kejelasan siapa yang merawat setelah serah terima, karena di situlah banyak sekolah akhirnya terlantar.

    Urus domain sch.id dulu, jangan pakai .com

    Apa pun jalurnya, alamat website sekolah sebaiknya pakai domain sch.id, misalnya namasekolah.sch.id. Alasannya sederhana. Domain sch.id hanya bisa didaftarkan oleh lembaga pendidikan yang bisa menunjukkan dokumen resmi. Orang tua yang membuka website dengan alamat sch.id tahu bahwa situs itu benar milik sekolah, bukan situs abal-abal. Domain .com bisa dibeli siapa saja tanpa syarat, jadi nilai kepercayaannya lebih rendah untuk lembaga pendidikan.

    Secara umum, registrar yang mengikuti ketentuan PANDI meminta dua hal untuk pendaftaran sch.id:

    • KTP penanggung jawab domain, biasanya kepala sekolah atau staf yang ditunjuk
    • SK pendirian lembaga dari instansi berwenang, atau surat permohonan resmi bertanda tangan kepala sekolah dengan kop surat sekolah

    Detail persyaratan bisa sedikit berbeda antar registrar, jadi cek langsung di tempat Anda mendaftar. Prosesnya sendiri tidak lama. Setelah dokumen diunggah dan diverifikasi, domain biasanya aktif dalam satu sampai tiga hari kerja. Harganya murah, umumnya di bawah Rp100 ribu per tahun.

    Satu saran penting dari kami: daftarkan domain atas nama lembaga dengan email resmi sekolah, bukan email pribadi guru. Simpan juga salinan dokumen pendaftaran dan data akun registrar di arsip tata usaha. Alasannya kami bahas di bagian kesalahan umum, karena kehilangan akses domain adalah masalah yang paling merepotkan untuk dipulihkan.

    Siapkan konten dulu, ini yang paling sering bikin molor

    Ini bagian yang hampir tidak pernah dibahas tutorial lain. Dari pengalaman kami mengerjakan website sekolah, penyebab proyek molor hampir tidak pernah masalah teknis. Yang bikin lama itu menunggu konten dari pihak sekolah. Website sudah siap, tapi halaman profil masih kosong karena teks belum dikirim.

    Jadi sebelum menyentuh urusan teknis atau menghubungi pengembang, siapkan dulu bahan-bahan ini:

    • Profil sekolah: sejarah singkat, visi misi, dan akreditasi. Cukup 3 sampai 5 paragraf, tidak perlu panjang
    • Foto asli kegiatan sekolah. Upacara, praktikum, ekstrakurikuler, lomba. Foto asli jauh lebih meyakinkan daripada foto stok, walau kualitasnya foto HP biasa
    • Data guru dan staf yang boleh dipublikasikan. Minta izin dulu, karena tidak semua guru nyaman nama dan fotonya tampil di internet. Untuk foto siswa, terutama yang wajahnya terlihat jelas, sebaiknya ada persetujuan orang tua lewat surat edaran di awal tahun ajaran
    • Struktur organisasi terbaru
    • Kalender akademik tahun berjalan
    • Informasi PPDB: jadwal, syarat, alur pendaftaran, dan kontak panitia
    • Kontak resmi: alamat lengkap, nomor telepon aktif, email sekolah, dan titik lokasi di Google Maps

    Kalau bahan ini sudah lengkap sejak awal, jalur mana pun yang dipilih akan jalan jauh lebih cepat. Website yang kami kerjakan bisa selesai sesuai jadwal justru karena kliennya rajin menyetor konten.

    Struktur halaman minimal yang layak untuk website sekolah

    Website sekolah tidak perlu banyak halaman untuk terlihat profesional. Yang penting halaman intinya ada dan isinya terawat:

    • Beranda: identitas sekolah, foto unggulan, dan pengumuman terbaru
    • Profil: sejarah, visi misi, akreditasi, struktur organisasi
    • Guru dan staf
    • Berita dan agenda kegiatan
    • Galeri foto
    • Halaman PPDB atau pendaftaran
    • Kontak

    Daftar fitur yang lebih lengkap beserta prioritasnya sudah kami tulis di artikel fitur website sekolah yang wajib ada.

    Satu catatan jujur soal fitur. Ada beberapa fitur yang sering diminta di awal tapi jarang benar-benar dipakai setelah website jalan. Forum diskusi hampir selalu sepi karena semua orang sudah di grup WhatsApp. E-learning penuh di website sekolah biasanya kalah praktis dibanding Google Classroom yang sudah dipakai guru. Fitur yang terbukti paling berguna justru yang sederhana: pengumuman yang rutin diperbarui, galeri foto kegiatan, dan halaman PPDB yang jelas.

    Khusus PPDB online, fitur ini memang layak dipertimbangkan serius karena dipakai setiap tahun dan mengurangi antrean pendaftaran fisik. Penjelasan lengkapnya ada di artikel apa itu PPDB online.

    Langkah teknis kalau memilih bikin sendiri

    Kalau sekolah memutuskan jalur pertama, urutan kerjanya seperti ini:

    1. Beli hosting dan daftarkan domain sch.id. Paket hosting sekitar Rp300 ribu sampai Rp600 ribu per tahun sudah cukup untuk website sekolah biasa
    2. Install WordPress. Hampir semua penyedia hosting punya installer sekali klik
    3. Pilih tema yang sederhana dan ringan. Tema gratis bawaan WordPress pun tidak masalah, yang penting rapi dan cepat dibuka dari HP
    4. Buat halaman inti sesuai struktur di atas, isi dengan konten yang sudah disiapkan
    5. Pasang plugin backup otomatis dan aktifkan pembaruan keamanan. Dua hal ini sering dilewati, padahal paling penting

    Estimasi waktu 2 sampai 8 minggu itu bukan waktu kerja penuh, tapi realita orang mengerjakan ini di sela tugas utama. Kalau ada satu orang yang bisa fokus, dua minggu cukup.

    Setelah website tayang, ada dua langkah kecil yang sering dilupakan. Pertama, buka website dari HP dan minta beberapa rekan mencobanya juga, karena mayoritas orang tua mengakses dari ponsel. Kedua, daftarkan website ke Google Search Console supaya muncul di hasil pencarian ketika orang mengetik nama sekolah. Dua langkah ini gratis dan selesai dalam satu sore.

    Kapan jalur ini masuk akal? Kalau ada guru atau staf yang memang tertarik, diberi SK tugas yang jelas, dan sekolah sadar konsekuensinya: kalau orang itu pindah tugas, harus ada serah terima akses dan pengetahuan. Kalau syarat itu tidak terpenuhi, lebih aman ambil jalur platform sewa atau pengembang.

    Kesalahan umum setelah website jadi

    Membuat website itu baru setengah pekerjaan. Setengahnya lagi adalah merawatnya, dan di sinilah kebanyakan website sekolah gagal. Ini pola yang paling sering kami temui:

    Website tidak pernah diupdate. Berita terakhir dua tahun lalu, kalender akademik masih tahun ajaran lama. Website seperti ini justru menurunkan citra sekolah di mata orang tua. Solusinya bukan teknologi, tapi penugasan: tunjuk satu admin resmi dengan SK, lalu buat jadwal posting minimal dua konten per bulan. Dokumentasi kegiatan sekolah selalu ada, tinggal difoto dan ditulis tiga paragraf.

    Akun penting pakai email pribadi. Domain, hosting, dan admin website didaftarkan pakai Gmail pribadi seorang guru. Ketika guru itu mutasi atau resign, sekolah kehilangan akses ke websitenya sendiri. Kasus seperti ini nyata dan sering. Selalu pakai email resmi sekolah yang kredensialnya dipegang lembaga, bukan perorangan.

    Tidak ada backup. Website kena hack atau server bermasalah, dan seluruh konten bertahun-tahun hilang karena tidak pernah ada cadangan. Backup otomatis mingguan itu gratis lewat plugin, cukup sekali setting. Simpan salinannya di luar server, misalnya di Google Drive milik akun sekolah, supaya kalau servernya yang bermasalah, cadangannya tetap aman.

    Konten hasil salin tempel. Beberapa website sekolah mengisi halaman berita dengan artikel yang disalin dari situs lain agar terlihat aktif. Ini percuma. Orang tua mencari kabar sekolah anaknya, bukan artikel umum yang bisa mereka temukan di mana saja. Tiga paragraf tentang lomba antar kelas jauh lebih berharga daripada sepuluh artikel salinan.

    Biaya perawatan tahunan dan kapan sebaiknya ke pengembang

    Website sekolah punya biaya rutin yang perlu masuk anggaran tahunan. Rinciannya kira-kira begini:

    • Perpanjangan domain sch.id: di bawah Rp100 ribu per tahun
    • Perpanjangan hosting: Rp300 ribu sampai Rp600 ribu per tahun
    • Perawatan teknis kalau dikontrakkan: Rp500 ribu sampai Rp2 juta per tahun, mencakup update sistem, backup, pemantauan keamanan, dan perbaikan ketika ada error

    Kalau dirawat sendiri, biaya perawatan teknis nol rupiah, tapi tugasnya tetap harus dikerjakan seseorang: update WordPress dan plugin tiap bulan, cek backup jalan atau tidak, dan memperbaiki kalau ada halaman rusak.

    Lalu kapan sebaiknya langsung ke pengembang? Menurut kami, jalur ini paling masuk akal dalam tiga kondisi. Pertama, sekolah butuh fitur di luar kemampuan template, misalnya PPDB online dengan verifikasi berkas dan pengumuman hasil seleksi. Kedua, tidak ada SDM yang bisa ditugaskan mengurus teknis dalam jangka panjang. Ketiga, sekolah ingin tampilan yang mencerminkan identitasnya sendiri, bukan template yang sama dengan puluhan sekolah lain.

    Kalau kondisi sekolah Anda masuk salah satu dari tiga itu, silakan lihat layanan jasa pembuatan website sekolah dari kami. Di sana ada rincian paket, harga, dan apa saja yang termasuk perawatan. Kalau belum, tidak apa-apa. Mulai saja dari jalur yang sesuai kemampuan sekarang, karena website sederhana yang terawat selalu lebih baik daripada website canggih yang terbengkalai.

    Pertanyaan yang sering ditanyakan

    Berapa biaya membuat website sekolah?

    Tergantung jalurnya. Bikin sendiri sekitar Rp500 ribu sampai Rp1 juta per tahun untuk domain dan hosting. Sewa platform jadi sekitar Rp1 juta sampai Rp3 juta per tahun. Pesan ke pengembang mulai Rp3 juta sampai Rp15 juta sekali bangun, ditambah biaya perawatan tahunan kalau dikontrakkan.

    Apakah website sekolah bisa dibuat gratis?

    Bisa, pakai Google Sites atau WordPress.com versi gratis. Tapi alamatnya bukan sch.id dan ada batasan fitur serta iklan. Untuk website resmi lembaga pendidikan, kami sarankan minimal keluar biaya domain sch.id dan hosting, karena alamat resmi itu yang membuat orang tua percaya.

    Berapa lama proses pembuatan website sekolah?

    Kalau konten sudah disiapkan lengkap, platform sewa bisa online dalam 1 sampai 2 minggu, pengembang butuh 3 sampai 6 minggu, dan bikin sendiri 2 sampai 8 minggu tergantung waktu luang pengerjanya. Faktor penentu terbesar bukan teknis, tapi kecepatan sekolah menyiapkan konten.

  • Cara Membuat Link Bio Instagram Bisnis Biar Akun Kamu Auto Kelihatan Profesional dan Cuan Terus!

    Cara Membuat Link Bio Instagram Bisnis Biar Akun Kamu Auto Kelihatan Profesional dan Cuan Terus!

    Digital Marketing – Cara Membuat Link Bio Instagram Bisnis itu sekarang udah bukan sekadar tempelan link random yang cuma numpang lewat di profil. Duh, please ya… zaman udah geser kayak playlist galau jam 2 pagi. Kalau bio IG bisnis kamu masih polos tanpa arah, itu ibarat buka toko tapi lampunya mati. Orang mampir bentar, terus cabut.

    Makanya, Cara Membuat Link Bio Instagram Bisnis jadi hal penting banget buat kamu yang pengen akun terlihat lebih niat, lebih profesional, dan pastinya lebih cuan-able. Tenang aja, Cara buat Link Bio Instagram Bisnis nggak ribet kok. Jadi, yuk lanjut baca biar IG bisnis kamu nggak cuma rame viewers tapi juga banjir klik!

    1. Tentuin Tujuan Link Bio Kamu Dulu

    Sebelum sibuk nyari template lucu atau warna pastel gemoy, kamu wajib ngerti dulu tujuan utama dari Cara Membuat Link Bio Instagram Bisnis. Jangan asal tempel link marketplace terus selesai. Hadeh, itu mah kayak kasih alamat tanpa petunjuk jalan.

    Kamu harus mikir, link bio ini mau dipakai buat apa? Mau jualan? Ngarahin ke WhatsApp? Nunjukin katalog? Atau ngajak orang booking jasa? Nah, dari situ baru deh isi link bio kamu jadi lebih jelas dan nggak berantakan kayak chat mantan yang belum move on. Semakin fokus tujuan bio kamu, makin gampang orang ngeklik tanpa mikir dua kali.

    2. Pakai Platform Link Bio yang Simpel Tapi Kece

    Di tahap Cara Membuat Link Bio Instagram Bisnis ini, kamu bisa pakai platform link bio yang tampilannya clean dan gampang dipakai. Jangan yang ribet sampai loading-nya bikin emosi jiwa. Orang internet tuh maunya serba cepat, bestie.

    Pilih desain yang warnanya sesuai branding bisnis kamu. Kalau jual skincare aesthetic tapi link bio neon tabrak warna, duh… vibes-nya langsung hilang diterpa kenyataan. Bikin tampilan yang enak dilihat. Tambahin foto logo, judul singkat, dan tombol yang jelas. Semakin simpel, semakin gampang orang paham harus klik yang mana.

    Baca juga: Tutorial PostgreSQL di Laravel: Setup, JSONB, dan Full-Text Search

    3. Masukin Link yang Emang Penting

    Kesalahan paling sering pas Cara Membuat Link Bio Instagram Bisnis adalah masukin terlalu banyak link sampai kayak daftar menu warteg. Semua dimasukin. Ending-nya? Orang malah bingung. Cukup masukin link yang paling penting aja, misalnya:

    • Website bisnis
    • WhatsApp admin
    • Marketplace
    • Katalog produk
    • Testimoni pelanggan

    Udah. Jangan lebay. Bio yang terlalu penuh bikin orang males baca. Ingat, perhatian netizen tuh tipis banget, kayak tisu kena air. Kalau kamu butuh website bisnis atau sistem digital yang lebih profesional, Arrazy Inovasi tuh jasa terpercaya untuk transformasi digital bisnis, menghadirkan solusi teknologi inovatif yang membantu bisnis tumbuh dan berkembang.

    4. Gunakan Kata-Kata yang Bikin Orang Penasaran

    Nah ini dia bumbu rahasia dalam Cara Membuat Link Bio Instagram Bisnis. Jangan cuma nulis “Klik di sini.” B aja banget kayak chat “P” tanpa konteks. Coba pakai kalimat yang lebih hidup dan ngajak orang penasaran, misalnya:

    “Lihat promo rahasia di sini!”

    “Diskon pecah telur cuma hari ini!”

    “Cek katalog biar nggak kepo terus!”

    Kalimat kecil kayak gini tuh efeknya gede. Orang jadi lebih pengen klik karena ada rasa penasaran kecil yang nyolek pelan di kepala mereka.

    5. Pastikan Link Nggak Error, Please!

    Percuma capek-capek bikin aesthetic kalau link-nya malah error 404. Sakitnya tuh bukan di hati aja, tapi di peluang penjualan juga. Dalam Cara Membuat Link Bio Instagram Bisnis, kamu wajib rutin cek semua link. Jangan sampai calon pelanggan udah niat beli, eh malah nyasar ke halaman kosong. Itu tuh vibes-nya kayak udah dandan sejam tapi acara batal. Tes link pakai HP lain. Lihat tampilannya. Pastikan semuanya jalan mulus tanpa drama.

    Kesimpulan

    Jangan biarin bio Instagram bisnis kamu sepi kayak warung pas hujan deras. Saatnya bikin tampilan yang lebih hidup, lebih niat, dan lebih profesional. Apalagi sekarang persaingan digital tuh kenceng banget, kayak balapan diskon tanggal kembar.

    Biar transformasi digital bisnis kamu makin maksimal Kenalan dulu sama Arrazy Inovasi. Arrazy Inovasi tuh jasa terpercaya untuk transformasi digital bisnis, menghadirkan solusi teknologi inovatif yang membantu bisnis tumbuh dan berkembang. Jadi, setelah paham Cara Membuat Link Bio Instagram Bisnis, sekarang waktunya kamu gercep upgrade bisnis biar makin dilirik banyak orang!

  • Contoh Implementasi Observer di Laravel 12: Auto-Slug, Audit Trail, dan Cache

    Artikel ini melanjutkan penjelasan konsep Observer di Laravel 12 dengan studi kasus implementasi lengkap: sistem audit trail dan auto-slug generation.

    Studi Kasus 1: Auto-Slug Generation

    Masalah umum: setiap kali artikel dibuat atau diupdate, slug harus di-generate dari title. Tanpa Observer, logika ini tersebar di berbagai controller.

    Dengan Observer, cukup satu tempat:

    <?php
    
    namespace AppObservers;
    
    use AppModelsArticle;
    use IlluminateSupportStr;
    
    class ArticleObserver
    {
        public function creating(Article $article): void
        {
            $article->slug = $this->generateUniqueSlug($article->title);
        }
    
        public function updating(Article $article): void
        {
            if ($article->isDirty('title')) {
                $article->slug = $this->generateUniqueSlug($article->title, $article->id);
            }
        }
    
        private function generateUniqueSlug(string $title, ?int $excludeId = null): string
        {
            $slug  = Str::slug($title);
            $query = Article::where('slug', $slug);
    
            if ($excludeId) {
                $query->where('id', '!=', $excludeId);
            }
    
            if (!$query->exists()) {
                return $slug;
            }
    
            // Tambah angka kalau slug sudah ada
            $counter = 1;
            while (Article::where('slug', "{$slug}-{$counter}")
                          ->when($excludeId, fn ($q) => $q->where('id', '!=', $excludeId))
                          ->exists()) {
                $counter++;
            }
    
            return "{$slug}-{$counter}";
        }
    }

    Studi Kasus 2: Audit Trail Otomatis

    Rekam semua perubahan pada model penting, berguna untuk compliance, debugging, atau fitur “lihat riwayat perubahan”:

    <?php
    
    namespace AppObservers;
    
    use AppModelsArticle;
    use AppModelsAuditLog;
    
    class ArticleObserver
    {
        public function created(Article $article): void
        {
            $this->log('created', $article, [], $article->getAttributes());
        }
    
        public function updated(Article $article): void
        {
            $this->log('updated', $article, $article->getOriginal(), $article->getChanges());
        }
    
        public function deleted(Article $article): void
        {
            $this->log('deleted', $article, $article->getAttributes(), []);
        }
    
        private function log(string $action, Article $article, array $old, array $new): void
        {
            AuditLog::create([
                'user_id'     => auth()->id(),
                'model_type'  => Article::class,
                'model_id'    => $article->id,
                'action'      => $action,
                'old_values'  => $old,
                'new_values'  => $new,
                'ip_address'  => request()->ip(),
            ]);
        }
    }

    Model AuditLog:

    Schema::create('audit_logs', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete();
        $table->string('model_type');
        $table->unsignedBigInteger('model_id');
        $table->string('action'); // created, updated, deleted
        $table->json('old_values')->nullable();
        $table->json('new_values')->nullable();
        $table->string('ip_address')->nullable();
        $table->timestamp('created_at');
    
        $table->index(['model_type', 'model_id']);
    });

    Studi Kasus 3: Cache Invalidation

    Cache artikel halaman statis dan harus di-clear saat artikel berubah:

    <?php
    
    namespace AppObservers;
    
    use AppModelsArticle;
    use IlluminateSupportFacadesCache;
    
    class ArticleObserver
    {
        public function saved(Article $article): void
        {
            // Clear cache artikel individual
            Cache::forget("article:{$article->id}");
            Cache::forget("article:{$article->slug}");
    
            // Clear cache daftar artikel
            Cache::forget('articles:latest');
            Cache::forget("articles:category:{$article->category_id}");
        }
    
        public function deleted(Article $article): void
        {
            Cache::forget("article:{$article->id}");
            Cache::forget("article:{$article->slug}");
            Cache::forget('articles:latest');
        }
    }

    Studi Kasus 4: Observer dengan Multiple Models

    Kalau beberapa model butuh audit trail yang sama, buat Observer yang reusable:

    <?php
    
    namespace AppObservers;
    
    use AppModelsAuditLog;
    
    class AuditableObserver
    {
        public function created($model): void
        {
            AuditLog::create([
                'user_id'    => auth()->id(),
                'model_type' => get_class($model),
                'model_id'   => $model->id,
                'action'     => 'created',
                'new_values' => $model->getAttributes(),
            ]);
        }
    
        public function updated($model): void
        {
            AuditLog::create([
                'user_id'    => auth()->id(),
                'model_type' => get_class($model),
                'model_id'   => $model->id,
                'action'     => 'updated',
                'old_values' => $model->getOriginal(),
                'new_values' => $model->getChanges(),
            ]);
        }
    }

    Register ke beberapa model sekaligus:

    // Di AppServiceProvider
    Article::observe(AuditableObserver::class);
    Product::observe(AuditableObserver::class);
    Order::observe(AuditableObserver::class);

    Bypass Observer saat Seeding

    <?php
    
    namespace DatabaseSeeders;
    
    use AppModelsArticle;
    
    class ArticleSeeder extends Seeder
    {
        public function run(): void
        {
            // Bypass observer agar tidak trigger audit trail saat seeding
            Article::withoutObservers(function () {
                Article::factory(100)->create();
            });
        }
    }

    Baca Juga

    Butuh tim yang bantu implementasi arsitektur yang clean di aplikasi Laravel? Lihat layanan pengembangan aplikasi kami.

    Baca Juga

  • Contoh Implementasi Policy dan Gate di Laravel 12: Studi Kasus CMS Multi-Role

    Artikel ini melanjutkan penjelasan konsep Policy dan Gate di Laravel 12 dengan studi kasus implementasi lengkap: sistem manajemen konten dengan beberapa level akses.

    Studi Kasus: Sistem CMS dengan Multi-Role

    Skenario: aplikasi CMS dengan role admin, editor, dan author. Aturannya:

    • Admin bisa lakukan semua aksi di artikel mana saja
    • Editor bisa buat, edit, dan publish artikel mana saja
    • Author hanya bisa buat dan edit artikel miliknya sendiri

    Setup Model User dengan Role

    <?php
    
    namespace App\Models;
    
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        protected $fillable = ['name', 'email', 'password', 'role'];
    
        public function isAdmin(): bool
        {
            return $this->role === 'admin';
        }
    
        public function isEditor(): bool
        {
            return in_array($this->role, ['admin', 'editor']);
        }
    }

    ArticlePolicy Lengkap

    <?php
    
    namespace App\Policies;
    
    use App\Models\Article;
    use App\Models\User;
    
    class ArticlePolicy
    {
        // Ini dijalankan sebelum semua method lain
        // Return true = admin bypass semua check
        public function before(User $user, string $ability): ?bool
        {
            if ($user->isAdmin()) {
                return true;
            }
    
            return null; // null = lanjut ke check berikutnya
        }
    
        public function viewAny(?User $user): bool
        {
            // Semua orang bisa lihat daftar artikel yang published
            return true;
        }
    
        public function view(?User $user, Article $article): bool
        {
            if ($article->status === 'published') {
                return true;
            }
    
            // Draft hanya bisa dilihat pemilik atau editor
            return $user && ($article->user_id === $user->id || $user->isEditor());
        }
    
        public function create(User $user): bool
        {
            return $user->hasVerifiedEmail();
        }
    
        public function update(User $user, Article $article): bool
        {
            // Editor bisa edit semua, author hanya punya sendiri
            return $user->isEditor() || $article->user_id === $user->id;
        }
    
        public function delete(User $user, Article $article): bool
        {
            // Hanya admin (via before()) atau pemilik artikel
            return $article->user_id === $user->id;
        }
    
        public function publish(User $user, Article $article): bool
        {
            // Hanya editor ke atas yang bisa publish
            return $user->isEditor();
        }
    
        public function restore(User $user, Article $article): bool
        {
            return $user->isEditor() || $article->user_id === $user->id;
        }
    }

    Menggunakan Policy di Controller

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Models\Article;
    use App\Http\Requests\StoreArticleRequest;
    
    class ArticleController extends Controller
    {
        public function index()
        {
            $this->authorize('viewAny', Article::class);
    
            $articles = Article::with('author')
                               ->when(!auth()->user()?->isEditor(), fn ($q) =>
                                   $q->where('status', 'published')
                                     ->orWhere('user_id', auth()->id())
                               )
                               ->paginate(15);
    
            return view('articles.index', compact('articles'));
        }
    
        public function edit(Article $article)
        {
            $this->authorize('update', $article);
            return view('articles.edit', compact('article'));
        }
    
        public function destroy(Article $article)
        {
            $this->authorize('delete', $article);
            $article->delete();
            return redirect()->route('articles.index')
                             ->with('success', 'Artikel dihapus.');
        }
    
        public function publish(Article $article)
        {
            $this->authorize('publish', $article);
            $article->update(['status' => 'published', 'published_at' => now()]);
            return back()->with('success', 'Artikel dipublish.');
        }
    }

    Policy di Blade Template

    @foreach ($articles as $article)
        <div>
            <h2>{{ $article->title }}</h2>
    
            @can('update', $article)
                <a href="{{ route('articles.edit', $article) }}">Edit</a>
            @endcan
    
            @can('publish', $article)
                @if($article->status === 'draft')
                    <form action="{{ route('articles.publish', $article) }}" method="POST">
                        @csrf @method('PATCH')
                        <button>Publish</button>
                    </form>
                @endif
            @endcan
    
            @can('delete', $article)
                <form action="{{ route('articles.destroy', $article) }}" method="POST">
                    @csrf @method('DELETE')
                    <button>Hapus</button>
                </form>
            @endcan
        </div>
    @endforeach

    Gate untuk Aksi Global

    Untuk akses fitur yang tidak terkait model tertentu, pakai Gate:

    // Di AppServiceProvider
    Gate::define('access-analytics', fn (User $user) => $user->isEditor());
    Gate::define('export-all-data',  fn (User $user) => $user->isAdmin());
    
    // Di controller
    Gate::authorize('access-analytics');
    return view('analytics.dashboard');
    
    // Di Blade
    @can('access-analytics')
        <a href="/analytics">Analytics</a>
    @endcan

    Baca Juga

    Butuh tim yang bantu implementasi sistem otorisasi yang tepat untuk aplikasi Laravel Anda? Lihat layanan pengembangan aplikasi kami.

    Baca Juga

  • Contoh Penggunaan Concurrency di Laravel 12: Dashboard, API Paralel, dan Defer

    Artikel sebelumnya membahas konsep Concurrency di Laravel 12. Artikel ini fokus pada implementasi: studi kasus nyata bagaimana Concurrency bisa mempercepat aplikasi secara signifikan.

    Studi Kasus 1: Dashboard dengan Banyak Data Source

    Dashboard admin yang butuh data dari beberapa tabel berbeda. Ini biasanya jadi bottleneck karena diquery satu per satu.

    Sebelum (sequential — sekitar 800ms):

    public function dashboard()
    {
        $totalOrders    = Order::thisMonth()->count();          // ~200ms
        $totalRevenue   = Order::thisMonth()->sum('total');     // ~200ms
        $pendingOrders  = Order::where('status', 'pending')->count(); // ~150ms
        $newCustomers   = User::thisMonth()->count();           // ~150ms
        $topProducts    = Product::topSelling(5)->get();       // ~100ms
    
        return view('dashboard', compact(...));
    }

    Sesudah (paralel — sekitar 200ms):

    use IlluminateSupportFacadesConcurrency;
    
    public function dashboard()
    {
        [$totalOrders, $totalRevenue, $pendingOrders, $newCustomers, $topProducts] =
            Concurrency::run([
                fn() => Order::thisMonth()->count(),
                fn() => Order::thisMonth()->sum('total'),
                fn() => Order::where('status', 'pending')->count(),
                fn() => User::thisMonth()->count(),
                fn() => Product::topSelling(5)->get(),
            ]);
    
        return view('dashboard', compact(
            'totalOrders', 'totalRevenue', 'pendingOrders', 'newCustomers', 'topProducts'
        ));
    }

    Studi Kasus 2: Multiple API Calls

    Halaman product detail yang butuh data dari beberapa API eksternal:

    use IlluminateSupportFacadesConcurrency;
    
    public function productDetail(Product $product): View
    {
        [$reviews, $stock, $shippingOptions] = Concurrency::run([
            fn() => $this->reviewApi->getProductReviews($product->id),    // API 1
            fn() => $this->inventoryApi->getStock($product->sku),         // API 2
            fn() => $this->shippingApi->getOptions($product->weight),     // API 3
        ]);
    
        return view('products.detail', compact('product', 'reviews', 'stock', 'shippingOptions'));
    }

    Kalau masing-masing API butuh 500ms, tanpa concurrency total 1.5 detik. Dengan concurrency, cukup ~500ms.

    Studi Kasus 3: Defer untuk Aksi Non-Blocking

    User logout — beberapa aksi perlu terjadi tapi tidak perlu selesai sebelum response dikirim:

    use IlluminateSupportFacadesConcurrency;
    
    public function logout(Request $request): RedirectResponse
    {
        $user = $request->user();
    
        Auth::logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
    
        // Jalankan setelah response dikirim
        Concurrency::defer([
            fn() => $this->activityLog->record($user, 'logout'),
            fn() => $this->deviceTokenService->revokeAll($user),
            fn() => $this->sessionCleanup->cleanup($user),
        ]);
    
        return redirect('/');
    }

    Studi Kasus 4: Generate Laporan Parallel

    Generate beberapa bagian laporan sekaligus lalu gabungkan:

    public function generateAnnualReport(int $year): array
    {
        [$salesData, $customerData, $productData, $regionData] = Concurrency::run([
            fn() => $this->salesReport->compile($year),
            fn() => $this->customerReport->compile($year),
            fn() => $this->productReport->compile($year),
            fn() => $this->regionReport->compile($year),
        ]);
    
        return [
            'year'     => $year,
            'sales'    => $salesData,
            'customers' => $customerData,
            'products' => $productData,
            'regions'  => $regionData,
            'generated_at' => now()->toIso8601String(),
        ];
    }

    Error Handling di Concurrency

    Kalau salah satu closure melempar exception, Concurrency akan meneruskan exception tersebut:

    use IlluminateSupportFacadesConcurrency;
    
    try {
        [$data1, $data2] = Concurrency::run([
            fn() => riskyApiCall(),
            fn() => anotherApiCall(),
        ]);
    } catch (Exception $e) {
        // Handle error — biasanya fallback ke data cached atau default
        Log::warning("Concurrency error: {$e->getMessage()}");
        [$data1, $data2] = [getFromCache('data1'), getFromCache('data2')];
    }

    Kapan Tidak Pakai Concurrency

    Jangan pakai untuk operasi yang sangat cepat. Overhead membuka child process (~50-100ms) lebih mahal dari manfaatnya kalau setiap closure selesai dalam 5ms.

    Gunakan untuk operasi yang masing-masing butuh 100ms ke atas, terutama I/O seperti HTTP request, query database, atau baca file besar.

    Baca Juga

    Butuh tim yang bantu optimasi performa aplikasi Laravel Anda? Lihat layanan pengembangan aplikasi kami.

    Baca Juga

  • Contoh Penggunaan Contract di Laravel 12: Implementasi dan Binding

    Kalau Anda sudah membaca artikel tentang apa itu Contract di Laravel 12, artikel ini melanjutkannya dengan contoh penggunaan nyata: bagaimana membuat implementasi Contract sendiri dan kapan ini berguna dalam proyek.

    Menggunakan Contract Bawaan Laravel

    Contract bawaan Laravel ada di namespace IlluminateContracts*. Contoh yang paling sering dipakai adalah type-hinting di constructor untuk decoupling:

    <?php
    
    namespace AppServices;
    
    use IlluminateContractsCacheRepository as CacheContract;
    use IlluminateContractsMailMailer as MailerContract;
    
    class NotificationService
    {
        public function __construct(
            private CacheContract  $cache,
            private MailerContract $mailer,
        ) {}
    
        public function sendIfNotSent(string $userId, string $template): void
        {
            $cacheKey = "notification:{$userId}:{$template}";
    
            if ($this->cache->has($cacheKey)) {
                return; // Sudah dikirim
            }
    
            $this->mailer->send($template, [], fn ($m) => $m->to($userId));
            $this->cache->put($cacheKey, true, now()->addDay());
        }
    }

    Service ini bisa ditest dengan mudah — tinggal inject mock CacheContract dan MailerContract.

    Membuat Contract Sendiri

    Studi kasus: aplikasi yang butuh fitur kirim notifikasi ke berbagai channel (email, SMS, WhatsApp). Dengan Contract, kita bisa ganti implementasi tanpa mengubah kode yang memakainya.

    Buat Contract interface di app/Contracts/NotificationChannel.php:

    <?php
    
    namespace AppContracts;
    
    interface NotificationChannel
    {
        public function send(string $recipient, string $message): bool;
        public function isAvailable(): bool;
    }

    Buat beberapa implementasi:

    <?php
    
    namespace AppServicesNotifications;
    
    use AppContractsNotificationChannel;
    use IlluminateSupportFacadesMail;
    
    class EmailChannel implements NotificationChannel
    {
        public function send(string $recipient, string $message): bool
        {
            try {
                Mail::raw($message, fn ($m) => $m->to($recipient));
                return true;
            } catch (Exception $e) {
                return false;
            }
        }
    
        public function isAvailable(): bool
        {
            return config('mail.default') !== null;
        }
    }
    
    <?php
    
    namespace AppServicesNotifications;
    
    use AppContractsNotificationChannel;
    
    class WhatsAppChannel implements NotificationChannel
    {
        public function __construct(
            private WhatsAppApiClient $client
        ) {}
    
        public function send(string $recipient, string $message): bool
        {
            return $this->client->sendMessage($recipient, $message);
        }
    
        public function isAvailable(): bool
        {
            return !empty(config('services.whatsapp.token'));
        }
    }
    

    Bind Contract ke Implementasi di Service Provider

    <?php
    
    namespace AppProviders;
    
    use AppContractsNotificationChannel;
    use AppServicesNotificationsWhatsAppChannel;
    use IlluminateSupportServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        public function register(): void
        {
            // Bind default implementation
            $this->app->bind(NotificationChannel::class, WhatsAppChannel::class);
        }
    }

    Sekarang di mana saja Anda type-hint NotificationChannel, Laravel otomatis inject WhatsAppChannel:

    <?php
    
    namespace AppHttpControllers;
    
    use AppContractsNotificationChannel;
    
    class AlertController extends Controller
    {
        public function __construct(
            private NotificationChannel $channel
        ) {}
    
        public function send(Request $request): Response
        {
            $sent = $this->channel->send(
                $request->recipient,
                $request->message
            );
    
            return response()->json(['success' => $sent]);
        }
    }

    Manfaat: Mudah Ganti Implementasi

    Kalau besok ingin switch dari WhatsApp ke SMS, cukup ganti binding di service provider:

    $this->app->bind(NotificationChannel::class, SmsChannel::class);

    Controller dan semua kode yang pakai NotificationChannel tidak perlu diubah sama sekali.

    Contoh: Kontekstual Binding

    Kalau perlu inject implementasi berbeda di class berbeda:

    $this->app->when(AlertController::class)
              ->needs(NotificationChannel::class)
              ->give(WhatsAppChannel::class);
    
    $this->app->when(ReportController::class)
              ->needs(NotificationChannel::class)
              ->give(EmailChannel::class);

    Baca Juga

    Mau tim yang bantu bangun arsitektur aplikasi Laravel yang scalable? Lihat layanan pengembangan aplikasi kami.

    Baca Juga

  • Observer Adalah? Pengertian dan Cara Pakai Observer di Laravel 12

    Kalau Event dan Listener cocok untuk “sesuatu terjadi di aplikasi, beri tahu komponen lain”, Observer punya fokus berbeda: “ketika Eloquent model berubah, jalankan kode ini.”

    Artikel ini menjelaskan apa itu Observer di Laravel 12, perbedaannya dengan Event Listener, dan kapan sebaiknya dipakai.

    Observer Adalah: Pengertian Singkat

    Secara bahasa, observer adalah pengamat, yaitu pihak yang memperhatikan sesuatu lalu bereaksi ketika ada perubahan. Dalam pemrograman, istilah ini berasal dari observer pattern: sebuah pola desain di mana satu objek (yang diamati) memberi tahu objek-objek lain (para observer) setiap kali keadaannya berubah, sehingga mereka bisa menjalankan tugasnya masing-masing tanpa saling terikat erat.

    Contoh sederhananya notifikasi: ketika status pesanan berubah menjadi “dikirim”, bagian yang mengirim email dan bagian yang mencatat riwayat ikut bereaksi tanpa kode pengubah status perlu tahu siapa saja yang mendengarkan. Laravel menerapkan pola ini khusus untuk model database lewat fitur Observer.

    Apa Itu Observer di Laravel?

    Observer adalah kelas yang merespons event lifecycle Eloquent model: saat model dibuat, diupdate, dihapus, dll. Daripada pasang listener di banyak tempat, Observer mengumpulkan semua hook untuk satu model di satu kelas.

    Event lifecycle yang bisa di-observe:

    • creating / created
    • updating / updated
    • saving / saved
    • deleting / deleted
    • restoring / restored (untuk soft deletes)
    • forceDeleting / forceDeleted

    Membuat Observer

    php artisan make:observer ArticleObserver --model=Article

    File dibuat di app/Observers/ArticleObserver.php:

    <?php
    
    namespace AppObservers;
    
    use AppModelsArticle;
    use IlluminateSupportStr;
    
    class ArticleObserver
    {
        public function creating(Article $article): void
        {
            // Auto-generate slug sebelum disimpan
            if (empty($article->slug)) {
                $article->slug = Str::slug($article->title);
            }
        }
    
        public function created(Article $article): void
        {
            // Kirim notifikasi ke admin
            cache()->forget('articles.count');
        }
    
        public function updating(Article $article): void
        {
            // Update slug kalau title berubah
            if ($article->isDirty('title')) {
                $article->slug = Str::slug($article->title);
            }
        }
    
        public function deleting(Article $article): void
        {
            // Hapus gambar terkait sebelum artikel dihapus
            $article->images()->each(fn ($img) => $img->delete());
        }
    }

    Registrasi Observer

    Di app/Providers/AppServiceProvider.php:

    <?php
    
    namespace AppProviders;
    
    use AppModelsArticle;
    use AppObserversArticleObserver;
    use IlluminateSupportServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        public function boot(): void
        {
            Article::observe(ArticleObserver::class);
        }
    }

    Atau bisa dengan attribute di model (Laravel 12):

    use AppObserversArticleObserver;
    use IlluminateDatabaseEloquentAttributesObservedBy;
    
    #[ObservedBy([ArticleObserver::class])]
    class Article extends Model
    {
        // ...
    }

    Observer vs Event Listener: Kapan Pakai Yang Mana?

    Kondisi Pilihan
    Hook spesifik ke satu Eloquent model Observer
    Aksi yang dipicu dari banyak model berbeda Event Listener
    Logika bisnis yang tidak terkait model Eloquent Event Listener
    Semua hook untuk satu model ingin dikumpulkan di satu tempat Observer

    Menonaktifkan Observer Sementara

    Berguna saat import data massal, agar Observer tidak dipanggil ribuan kali:

    // Import tanpa trigger Observer
    Article::withoutObservers(function () {
        foreach ($rows as $row) {
            Article::create($row);
        }
    });
    
    // Atau nonaktifkan event model seluruhnya
    Article::unsetEventDispatcher();

    Setelah import selesai, event otomatis aktif kembali.

    Baca Juga

    Mau tim yang bantu setup arsitektur model-driven di aplikasi Laravel Anda? Lihat layanan pengembangan aplikasi kami.