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:

TypeScriptReact 19TanStack StartTanStack RouterTanStack QueryViteExpress 5Node.jsPostgreSQLpgBetter AuthZodSSEimpitDocker ComposeCaddyVitest

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.

  1. TanStack Start menangani route, dashboard, job-leads flow, history tab, dan SSE client state.
  2. Express memisahkan pipeline manager, source adapters, company qualification, run-history store, auth middleware, dan API routes.
  3. Discovery memakai adapter LinkedIn dan Indeed dengan schema input ter-normalisasi agar pipeline tidak bergantung pada bentuk source tertentu.
  4. Current pipeline state masih singleton in-memory per process, sedangkan user, run history, leads, search log, dan ownership disimpan di PostgreSQL.
  5. 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.

  1. SSE singleton menjaga progress real-time tetap sederhana, tetapi belum horizontal-safe dan restart dapat menghapus current run state.
  2. LinkedIn Guest API dan Indeed guest mode mengurangi biaya serta kebutuhan credential, dengan konsekuensi ketergantungan pada public endpoint dan rate-limit behavior.
  3. Company leads dan beberapa enrichment masih disiapkan sebagai fase berikutnya; active pipeline hanya mengklaim job leads yang benar-benar wired end-to-end.
  4. 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.

Links