Kohnu - Hiring Signal B2B Lead Generation
B2B lead-generation dashboard yang mengubah hiring signal dari LinkedIn dan Indeed menjadi daftar company leads yang dapat diprioritaskan tim sales dan outbound.
- Role
- Full-stack Software Engineer
- Ownership
- Product and engineering contributor: TanStack Start frontend, Express pipeline, scraping adapters, authentication, PostgreSQL history, tests, dan deployment
- Company
- Kohnu
- Client
- Sales and outbound teams
- Team
- Multi-contributor product team
- Period
- 2026 - present
- Focus
- Web, Backend, Full-Stack Developer, Backend Developer, Frontend Developer
Overview
Kohnu adalah web app B2B untuk sales dan outbound team yang mencari perusahaan berdasarkan sinyal hiring. User memasukkan keyword, lokasi, ukuran company, industri, dan target role; sistem menjalankan pipeline untuk menemukan lowongan, mengambil company di balik lowongan, menyaring company yang sesuai ICP, lalu menghasilkan daftar leads yang siap ditindaklanjuti.
Saya berkontribusi pada implementasi frontend TanStack Start, backend Express, orkestrasi pipeline, source adapter LinkedIn dan Indeed, authentication, persistence run history di PostgreSQL, testing, dan deployment workflow.
Tech & Libraries
Teknologi dan library yang dipakai atau disentuh di project ini:
Problem
Riset account B2B dari hiring activity biasanya membutuhkan pencarian manual lintas job board, verifikasi company satu per satu, dan pencatatan hasil yang mudah hilang. Tim sales membutuhkan cara yang lebih terstruktur untuk menemukan company yang sedang hiring, memprioritaskan fit terhadap ICP, dan melihat bukti job serta company yang bisa diverifikasi.
My Role & Ownership
Product and engineering contributor: TanStack Start frontend, Express pipeline, scraping adapters, authentication, PostgreSQL history, tests, dan deployment
Technical Approach
Membangun dashboard TanStack Start dengan pipeline backend Express yang menjalankan discovery, qualify, dan enrich sebagai tahapan terpisah. LinkedIn Guest Jobs API dan Indeed guest-mode scraper menjadi sumber discovery tanpa login cookie; hasil dinormalisasi, dideduplikasi per company, diperkaya dari halaman publik LinkedIn, lalu dialirkan ke frontend melalui SSE progress.
Authentication email/password, session cookie, PostgreSQL-backed run history, dan export membuat hasil dapat ditinjau kembali.
Architecture Notes
Frontend dan backend dipisahkan sebagai dua runtime dalam Docker Compose.
- TanStack Start menangani route, dashboard, job-leads flow, history tab, dan SSE client state.
- Express memisahkan pipeline manager, source adapters, company qualification, run-history store, auth middleware, dan API routes.
- Discovery memakai adapter LinkedIn dan Indeed dengan schema input ter-normalisasi agar pipeline tidak bergantung pada bentuk source tertentu.
- Current pipeline state masih singleton in-memory per process, sedangkan user, run history, leads, search log, dan ownership disimpan di PostgreSQL.
- Guest-mode scraping menghindari cookie login; Indeed memakai impit untuk Chrome-like TLS dan HTTP/2 fingerprint.
Trade-offs
Kohnu memprioritaskan MVP yang dapat dipakai untuk riset hiring signal sebelum memindahkan seluruh orchestration ke worker durable.
- SSE singleton menjaga progress real-time tetap sederhana, tetapi belum horizontal-safe dan restart dapat menghapus current run state.
- LinkedIn Guest API dan Indeed guest mode mengurangi biaya serta kebutuhan credential, dengan konsekuensi ketergantungan pada public endpoint dan rate-limit behavior.
- Company leads dan beberapa enrichment masih disiapkan sebagai fase berikutnya; active pipeline hanya mengklaim job leads yang benar-benar wired end-to-end.
- Email dan phone personal tidak diarang karena provider publik biasanya tidak mengeksposnya; output menampilkan link LinkedIn dan role target untuk pencarian lanjutan.
Implementation Highlights
- Pipeline manager lima langkah dengan stop flag, reconnect, partial result, SSE bootstrap, dan progress event per tahap.
- LinkedIn Guest Jobs API dan Indeed guest-mode adapter dengan input normalization, regional domain, bounded concurrency, jitter, serta gzip cache.
- Company qualification berdasarkan public LinkedIn page, ICP filter, company deduplication, dan lead compilation berbasis account-level output.
- PostgreSQL run-history store menyimpan metadata run, pipeline inputs, stats, search log, ownership, leads, dan history snapshot.
- Authentication boundary dengan Better Auth, email/password verification, session cookie, CORS exact-origin, dan ownership middleware.
- Production Docker topology memisahkan TanStack Start web, Express API, PostgreSQL, dan Caddy HTTPS; current single-instance limitation didokumentasikan.
- Unit, integration, source adapter, auth, pipeline ownership, run route, dan end-to-end tests tersedia di server/test.
Results
- Mengurangi riset manual dengan pipeline lima langkah yang menemukan job posting, mengelompokkan company, memvalidasi ICP, memperkaya data publik, dan menyusun lead account-level untuk outreach.
- Job leads functional end-to-end dengan pipeline lima langkah discover, normalize, qualify, enrich, dan compile.
- Dashboard menampilkan SSE progress, execution log, stats, generated leads, serta run history yang dapat dibuka kembali.
- Authentication email/password dengan email verification dan session cookie tersedia; Google OAuth aktif ketika credential dikonfigurasi.
- LinkedIn dan Indeed guest-mode discovery berjalan tanpa login cookie atau paid scraping API pada jalur default.
- Kohnu production MVP tersedia di kohnu.com melalui Docker Compose, Caddy HTTPS, TanStack Start, Express API, dan PostgreSQL.
- 51 commit pada branch main per 2026-07-15.
- 98 blok test dan describe terdeteksi pada server/test.
- 5 tahap pipeline job leads functional end-to-end.
- 2 source discovery aktif: LinkedIn Guest Jobs API dan Indeed guest mode.
- 1 domain production aktif: kohnu.com.