Mengapa Saya Menambahkan Telinga untuk AI Assistant
Cerita membangun cc-hooks karena bingung Claude Code lagi kerja atau hang. Dari sound effect sederhana sampai AI yang bisa ngomong pakai ElevenLabs.
Demo: Lihat cc-hooks in Action
Sebelum cerita panjang lebar, tonton dulu gimana cc-hooks bekerja dengan premium ElevenLabs TTS:

Problem yang Bikin Kesel
Gini ceritanya. Saya lagi asik coding, Claude Code kerja di background. Tab browser kebuka banyak, dokumentasi di sebelah kiri, spotify nyala. Terus tiba-tiba saya kepikiran… eh tunggu, Claude masih working apa udah stuck nih?
Gak ada feedback sama sekali. Layar terminal diem aja. Gak tau dia lagi mikir, lagi baca file, atau emang udah hang. Saya harus bolak-balik tab buat ngecek, berkali-kali dalam sehari. Annoying banget.
Sometimes Claude lagi processing yang ribet—baca banyak file, analisa code, generate solution. Tapi dari sisi user? Complete silence. Gak ada tanda-tanda apapun.
Nah di situ “aha moment” muncul: Kenapa AI assistant gue gak punya suara sih? 🤔
Kenapa Audio Feedback Penting
Manusia itu natural-nya pakai banyak sense. Kita coding kebanyakan rely on visual aja. Padahal audio feedback itu punya kelebihan unik:
Bisa aware tanpa ganggu flow Saya tetap bisa kerja di IDE atau browser lain, gak perlu aktif monitoring terminal. Bunyi “cetek” udah tau Claude selesai pakai tool. Bunyi “tek” berarti Claude mulai kerja lagi.
Ngurangin context switching Context switching itu productivity killer. Dengan audio, saya bisa stay focused sambil telinga yang monitoring.
Bikin lebih personal Don’t get me wrong, kedengarannya cheesy, tapi pas AI assistant ada voice-nya somehow jadi lebih… nyata gitu? Kayak pair programming sama orang beneran yang ngasih tau “Gue lagi kerja nih” atau “Udah selesai, cek yuk.”
Dari Sound Effect Sederhana
Awalnya cc-hooks itu simple banget. Claude Code punya hooks system yang bisa trigger command pas event tertentu. Jadi tinggal bikin Python script yang play audio file.
{
"hooks": {
"PreToolUse": [{
"type": "command",
"command": "uv run hooks.py --sound-effect=sound_effect_tek.mp3"
}]
}
}
Python script-nya pun gampang, pake pygame buat play sound. Done. Tapi immediately setelah dicoba: this changes everything.
Yang menarik adalah sound design choices. Saya pakai naming Indonesia: “tek”, “cetek”, “klek”, “tung”. Somehow ini lebih organic dan gak bikin berisik dibanding typical system beeps 😄
Terus Dikasih Suara
Sound effects oke, tapi sometimes butuh lebih banyak context. Claude lagi ngapain sih sebenernya? Makanya saya integrate Text-to-Speech.
Pilihan TTS provider ada beberapa dengan trade-offs masing-masing:
Google TTS (gTTS) Free, reliable, voice quality lumayan. Tapi butuh internet dan customization-nya terbatas.
ElevenLabs Voice quality-nya luar biasa bagus (seriously, denger aja demo video di atas). Bisa customize voice. Tapi bayar. Worth it sih kalau dipake harian.
Prerecorded Audio No API calls, super cepat, gratis. Tapi ya gitu, limited vocabulary dan harus manual recording.
Solution-nya? Multi-provider fallback system dengan caching. Jadi kalau ElevenLabs gagal, fallback ke Google TTS, kalau itu juga gagal, fallback ke prerecorded. Smart.
Yang bikin impressed, dengan caching system ini, frequently used announcements kayak “Session started” atau “Task completed” langsung playback tanpa API calls. Instant.
AI-Powered Contextual Messages
Ini adalah game changer-nya. Instead of static announcements kayak “Tool use completed”, what if Claude Code bisa generate messages yang actually understand context?
Contoh real-world:
- Static: “Tool use completed”
- Contextual: “I’ve successfully created the authentication middleware you requested”
Beda jauh kan? 😁
Implementation-nya pakai OpenRouter buat akses LLMs. Saya pilih GPT-4o-mini karena fast dan murah. Each generation cuma ~$0.0001, totally reasonable buat daily usage.
Tantangan yang Gak Disangka
Multi-Instance Support Ternyata orang mau run multiple Claude Code sessions sekaligus, masing-masing dengan audio settings berbeda. Session A mungkin bahasa Indonesia, Session B English. Jadilah bikin session-specific config:
# Session 1: Indonesian with Google TTS
cld --language=id --tts-providers=gtts,prerecorded
# Session 2: English with ElevenLabs premium
cld --language=en --elevenlabs-voice-id=21m00Tcm4TlvDq8ikWAM
Latency Optimization TTS generation sama playback bisa introduce delay yang kerasa. Original implementation sequential: generate → cache → play. Complained karena delay-nya noticeable.
Solution-nya async everything. Jadi audio generation jalan parallel sama logging dan metrics. Perceived latency turun dari ~800ms ke ~200ms. Big difference.
Audio Conflicts Multiple hooks firing cepet-cepet bisa bikin audio overlap. Imagine PreToolUse fires “tek”, terus langsung PostToolUse fires “cetek” sebelum sound pertama selesai. Berisik banget 😂
Jadilah implement audio queue system biar audio plays satu-satu dengan proper ordering.
Hasilnya Surprisingly Good
Yang awalnya cuma “nice to have” ternyata jadi indispensable dalam daily workflow.
Developer Flow Improvement Subjectively, produktivitas naik karena reduced context switching. Hard to quantify, tapi feeling-nya beda banget. Bisa focus coding sambil Claude kerja di background.
Multi-tasking Capability Sekarang saya comfortable run 2-3 Claude Code sessions sekaligus:
- Session 1: Debug production issue (serious English voice)
- Session 2: Explore library baru (casual Indonesian voice)
- Session 3: Nulis dokumentasi (silent, mostly reading)
Technical Stack
Python 3.12+ dengan uv
Pilih Python karena fast prototyping dan rich audio ecosystem. Plus uv
bikin dependency management painless. Script-nya pakai PEP723 inline dependencies, jadi gak perlu pyproject.toml ribet-ribet.
Multi-Provider TTS Architecture Fallback system dengan providers as plugins. Gampang banget nambah provider baru kalau mau.
Event-Driven Architecture Claude Code hooks align perfectly dengan event-driven design:
SessionStart → 🔊 "Starting new session"
PreToolUse → 🔊 "tek" (working indicator)
PostToolUse → 🔊 "cetek" (completed indicator)
Stop → 🔊 "Task completed: [contextual message]"
Clean separation of concerns, gampang di-extend.
Lessons Learned
Start Simple, Iterate Initial version cuma 100 lines Python buat play sound effects. Gak usah over-engineer dari awal. Build, pakai, identify pain points, improve.
Configuration Flexibility Matters Setiap developer beda preferensi. Ada yang mau loud notifications, ada yang prefer subtle. Ada yang mau AI announcements, ada yang cukup sound effects aja. Flexibility tanpa overwhelming defaults adalah sweet spot.
Performance is Non-Negotiable Untuk developer tools, even 500ms delay udah annoying. Every optimization—caching, async operations—compounds jadi significantly better UX.
Documentation Drives Adoption cc-hooks punya tiered documentation: Quick Start, Intermediate, Advanced. Users bisa productive dalam 2 menit, terus progressively unlock features. Approach ini dramatically increased adoption.
Solve Your Own Problem First Saya build cc-hooks karena saya butuh. That authenticity dan deep understanding of use case translated into tool yang actually useful, bukan cuma technically impressive tapi impractical.
Kesimpulan
cc-hooks adalah tool yang pas working well, you barely notice it’s there. Tapi kalau tiba-tiba di-disable, immediately you feel the absence. That’s hallmark dari good developer tools.
Yang paling satisfying dari building cc-hooks adalah melihat evolusi dari “wouldn’t it be cool if…” jadi daily essential tool. Not just for me, tapi buat developers globally.
Key takeaways:
- Multi-sensory feedback improves developer experience
- Simple solutions untuk real problems beats complex solutions untuk imagined problems
- Flexibility dan performance are non-negotiable untuk dev tools
- Open source amplifies impact beyond initial vision
Kalau pengen coba cc-hooks, check it out di github.com/husniadil/cc-hooks. Quick Start-nya literally 2 menit, dan I promise bakal change how you interact dengan Claude Code.
Next time kamu building developer tools, think beyond just visual interface. Telinga kita itu powerful sensors yang severely underutilized dalam developer workflows. Sometimes, adding “ears” to your tools adalah exactly what they need untuk jadi truly great.
Now if you’ll excuse me, saya perlu get back to coding. Claude Code just played “tek” sound—time to see what it’s working on 😁