Bops
A team of AI bots that runs your business ops: inbox, pipeline, invoices, reports. Each one has its own computer, email and phone number, and remembers everything.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Pulse for leads
翻訳待ち
Loading the full README. The saved excerpt is shown below.
A solo-operator B2B CRM for butter & condensed-milk sales. Built to solve one problem: never drop a follow-up again.
Live app: https://leadpulse-one-ashen.vercel.app (installable as a home-screen PWA on iOS/Android)
In daily production use (solo mode, no auth). The app runs on a live Supabase backend with the full sales book — companies, contacts, deals, and every logged touch.Read the full README ↗A solo-operator B2B CRM for butter & condensed-milk sales. Built to solve one problem: never drop a follow-up again.
Live app: https://leadpulse-one-ashen.vercel.app (installable as a home-screen PWA on iOS/Android)
In daily production use (solo mode, no auth). The app runs on a live Supabase backend with the full sales book — companies, contacts, deals, and every logged touch.
mainsupabase/migrations/, soft-delete + undo on all entitiesnpm test; no CI runs them yetThe app is three pages, built around one weekly loop: see who needs you, act, log it.
/) — the daily page.
/deals) — the deals.
/companies) — companies with their people, contact channels (company routes such as a general LINE or info@ address), activity and customer health.From any row or card you can log a touch (call / email / DM / meeting / note), snooze, or move the deal's lane. Every change is logged with undo.
/lab is a hidden page for Laya experiments (fit judging and the terminal). Old URLs (/activity, /retention, /signals, /prospects, /contacts, /meetings, /add) redirect to the page that replaced them.
Each deal sits in a lane: outreach → reply → sample → testing → success (plus reschedule / parked). Lane transitions are gated — e.g. you can't mark a sample as sent without a delivery address.
Weighted 0–100 score (src/utils/lead-scoring.ts): stage (30) + priority (20) + deal value (20) + follow-up urgency (20) + last outcome sentiment (10), mapped to tiers S (Hot) → D (Cold). Pure arithmetic over CRM fields — no model involved, so it renders identically on any device. The model-facing Laya rules live separately in src/utils/laya-buyer-response.ts (buyer-response question) and src/utils/laya-evidence.ts (reviewer panel).
@supabase/supabase-jscd ~/Projects/Leadpulse
npm install
npm run dev # http://localhost:3000
Note: the Supabase project URL + anon key are currently hardcoded in
src/lib/supabase.ts(solo mode). Moving them to.env.localis on the debt list.
npm run dev # dev server
npm run build # production build
npm run test # vitest run (92 files)
npm run lint # eslint
npm run laya:serve # local Laya worker for lead recommendations
Laya runs on this Mac, not on Vercel. The default is the Typed Decisions 421M Core ML bundle (1,024 tokens, CPU/GPU), the checkpoint fine-tuned on typed business decisions. It replaced the multilingual 322M bundle on 2026-10-01. Its tokenizer is English: Thai text still runs but expect weaker answers. Download the pinned revision once, then start the local worker before opening a deal:
cd ~/Projects/LeadPulse
~/laya-coreml/.venv/bin/hf download aac6fef/laya-typed-decisions-coreml \
--revision 28d24fa8d67a3264556b23391ec6c3fd98573056 \
--local-dir ~/laya-coreml/models/typed-decisions
npm run laya:serve
The model stays on this Mac and loads offline after download. To go back to the
multilingual bundle, download aac6fef/laya-multilingual-coreml at revision
8139e9089273319512c730218903784074133187 and point LAYA_COREML_MODEL_PATH at it. The worker identifies the loaded bundle in
each scoring trace and reports its selected compute units in /health.
Then use Score with Laya in a deal. The live LeadPulse page calls only
http://127.0.0.1:8765 on the Mac that opened it; the worker is bound to loopback
and accepts the production app plus local development origins. Its input recipe is
industry, all tags, product, stage, value, follow-up status, and the complete latest
outcome. Selected text is not word-clipped. Dedicated identity, contact, address,
URL and company-note fields are excluded; free-text outcomes and tags can still
contain personal information. This is field minimization, not anonymization.
The result is recommendation-only; it never changes CRM data.
This is the beginning of the README. Read the rest at the original. Read the full README ↗