Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
Coverage helps students run investment-banking networking: import your tracker spreadsheet, find bankers and verified emails, draft personal emails, and never miss a follow-up.
翻譯準備中
商業TypeScript · JavaScriptGitHub @Nathangong-coder上線中營運者未確認
試用過了嗎? 點一下就好,不需要登入。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A dashboard that handles the repetitive parts of investment banking recruiting:
[[AI: …]] lines, and create Gmail drafts with your resume attached.Everyone brings their own keys. Contacts, templates, your resume, and the uploaded workbook are stored in the browser (IndexedDB). The /api/* routes forward each request to Apollo, Serper, Anthropic, or Twilio with the caller's key and store nothing. Gmail calls go straight from the browser to Google. Several people can use one deployment without seeing each other's data.
Trade-off: data lives in a single browser. Use Settings → Export backup to move it to another machine.
Everything is set in Settings & keys in the app. Each service shows connected or not set, what it's for, and a link to get the key. The sidebar counts the four core services, and each feature tells you when a key it needs is missing.
open.bigmodel.cn), any OpenAI-compatible API, or a Vercel AI Gateway key. The model list comes from your key, and a model is switched to only after it answers a test prompt.| Service | Needed for | Cost |
|---|---|---|
| Apollo (or Hunter) | Enrich contact info: finds missing emails | Apollo free plan includes some credits · Hunter 25 free/month |
| Serper or Brave Search | Find people: web search of public LinkedIn profiles (Brave is the automatic backup) | Serper: 2,500 free searches · Brave: free plan |
| AI: Claude, GPT, Gemini, DeepSeek, GLM… | AI screening, auto-assigning templates, writing personalized lines, organizing imported templates | Pay per use, usually cents per batch (Gemini has a free tier) |
| Google OAuth Client ID (no secret needed) | Creating Gmail drafts and syncing sent mail and replies | Free |
| ntfy topic · WhatsApp (CallMeBot) · Twilio | Phone reminders (all optional) | ntfy and CallMeBot free · Twilio paid |
Without keys you can still upload your sheet, view and edit it, track statuses and follow-ups, fill templates (placeholders only, no AI), open drafts in your mail app, and export follow-ups to your calendar.
Follow-ups are due 7 days after your last email (Follow-up #1, then #2). After 2 follow-ups plus 7 more days, the app suggests moving on. All of these numbers are in Settings. The Follow-ups → Reminders & alerts tab groups everything due into one message per day at 9am.
| Channel | Free? | Can schedule ahead? | Setup |
|---|---|---|---|
| Calendar (.ics) | ✅ | ✅ any date | Download, open, and add to Google or Apple Calendar |
| ntfy push | ✅ | ✅ up to 3 days | Install the app and subscribe to a topic |
| WhatsApp via CallMeBot | ✅ (personal use) | ❌ send-now only | Message the bot once to get a key |
| Browser notification | ✅ | ❌ only while the dashboard is open | Click Enable |
| Twilio SMS | ❌ ~$1/mo number + ~1¢/text | ✅ 15 min – 35 days | See below |
Free and zero-effort: download the .ics now and then, and your phone calendar handles the alerts. Add ntfy if you want real push notifications.
coverage-yourname-8x2kq7. Anyone who guesses the topic can read it.I allow callmebot to send me messages.+14255550123) and the key into Settings, then click WhatsApp me today's list.This only messages your own number and can't schedule, so for now it's an on-demand "what's due today" ping. An automatic 9am ping is planned; see TODO.md.
MG…). Scheduled texts need it.MG… ID), and your own phone number.For US numbers, Twilio may require A2P 10DLC registration (a short form, a few days) before texts deliver reliably. Toll-free numbers need toll-free verification instead.
All data lives in your browser, so the server doesn't know who's due, and a server cron job has nothing to send. Scheduling ahead (ntfy, Twilio, calendar) covers this. Real server-side daily sends need a small database plus a Vercel Cron job. That's planned; see TODO.md.
npm install
npm run dev # http://localhost:3000
npm run check:workbook -- "your file.xlsx" # verify the parser against a real workbook
npm run check:templates -- "templates.docx" # preview how a templates doc will be imported
Easiest: push to GitHub, then at vercel.com/new import the repo. Every push to main deploys to production, and other branches get preview URLs.
Or from the CLI:
npm i -g vercel
vercel # first deploy, links the project
vercel --prod
No environment variables are required. Optional: NEXT_PUBLIC_GOOGLE_CLIENT_ID sets a default Gmail Client ID for everyone using your deployment, so each user only has to be added as a test user. Put it in .env.local for local dev. It is not a secret.
You only need the Client ID. You don't need the Client secret. The app signs in with Google's popup in the browser (token model), which uses only the Client ID. A secret must never be put in a web page, so keep it private or delete it. The same steps are in the app under Settings → Gmail → step-by-step setup, along with a Test Gmail connection button that tells you which step is wrong.
https://your-app.vercel.app, and http://localhost:3000 for local dev. No trailing slash..apps.googleusercontent.com) into Settings → Gmail, or set NEXT_PUBLIC_GOOGLE_CLIENT_ID in Vercel.Common errors:
Error 400: origin_mismatch: the exact site URL isn't in Authorized JavaScript origins. Changes take a few minutes to apply.Access blocked / access_denied: your Gmail isn't listed under Test users.Scopes: gmail.compose (create drafts) and gmail.readonly (sync sent mail and replies). The app never sends email itself; drafts wait for you in Gmail.
Official walkthrough: Gmail API JavaScript quickstart.
Two ways, and you can use both:
Why there's no automatic LinkedIn scraper: LinkedIn's User Agreement (§8.2) bans bots and scrapers, and it restricts accounts that load pages in an automated pattern, especially from cloud servers (which is where this app runs). The bookmark only reads the page you already have open, never loads LinkedIn pages itself, and runs only when you click it. That makes it about as risky as copy-pasting.
The bank list is built from your contacts, every bank tab (even empty ones), and any list of firms in the spreadsheet. That means a tab with an "Institution Name" column (plus an optional "Institution Type"), or a tab with one category per column like "Investment Banks (Bulge Bracket)". Only IB and PE categories are used from those. Name variants are merged (JPMorgan = JP Morgan, Jeffries = Jefferies, FinTech Partners = FT Partners…). Hide banks you're not recruiting for, add any by hand, or switch on a standard IB target list. A bank is reached once any email to someone there has gone out. It's gone quiet when it was reached, nobody replied, and nothing's been sent in 3+ weeks.
Once Gmail is connected (one click per browser session; the sidebar shows Connect Gmail sync), the app reads your Sent mail and inbox every 20 minutes while it's open:
Statuses only move forward (it never un-does a "replied" or lowers a follow-up count you set). Google doesn't let a web page get a Gmail token without a click, so fully background sync with the tab closed needs a server-side setup (see TODO.md).
[email protected] | LinkedIn) is added under your name, with the email and LinkedIn as blue, clickable links.
Set your email and LinkedIn URL in Settings → profile, or write a custom line: the word "LinkedIn" in it links to your profile, and phone
numbers stay plain text (not clickable). Drafts use Garamond by default (Settings → Email font).Messages you send while Claude is mid-task get handed over as soon as its current step finishes. To make a request wait until the
whole task is done, send it as /later <request> (a project command in .claude/commands/later.md). Slash commands are held until the turn ends.
The app ships with 14 ready-to-use templates adapted from a real IB networking playbook:
Fill in your profile in Settings (name, school, school nickname and city, major, club, hometown, and a one-line background) and they're ready. "Auto-assign" picks the right template for each contact from your notes and their school/title.
Import your own: Drafts → Templates → Import doc takes a Word .docx, a Google Doc (download as .docx, or paste a link to a doc shared as "anyone with the link"), or .txt/.md. It works best when:
NAME is resolved by position: in the greeting it's the contact, after "My name is" or as the sign-off it's you.
Is the import 100% accurate? Not guaranteed, which is why nothing is saved until you review it. The rule-based parser handles documents structured like the above very reliably. Every substitution is listed and highlighted, and unfamiliar ALL-CAPS words are flagged. The optional AI pass only names templates and resolves flagged blanks. If it changes any of your wording, its edits are thrown out automatically. For a one-time import, a two-minute skim of the review screen gets you to 100%.
Any tab with a Name column (or First Name + Last Name) plus an Email or LinkedIn column counts as a contact table. Optional columns: Position, Location/Team, Status, Connection / Comment, Company. The bank comes from a tab title like "JP Morgan Application Tracker", or from the tab name. SF and NY people live in the same bank tab; the region comes from the Location/Team column (for example NY · Tech). Rows with no location default to SF. Old (NY) tabs still work.
Status values: "Sent" means emailed. "Pending" means queued and not sent yet. Each bank has a cap on live people (default 2: emailed and still waiting for a reply). The bank view shows who's next when a slot opens.
Write-back only changes: emails found, status changes (e.g. "Sent", "Followed up (1x)", "Replied"), and new people added into blank numbered rows of the right bank tab, or into a new Prospects tab. Everything else in the workbook is left as is.
Saving back to your .xlsx works in Chrome and Edge (File System Access API). If the file lives in OneDrive, right-click it and choose Always keep on this device, and close it in Excel before saving. If the file changed on disk since you imported it (Excel autosave, OneDrive sync), the app re-reads it first and applies its changes on top, so your Excel edits aren't lost. "An operation that depends on state cached in an interface object…" means OneDrive or Excel touched the file mid-read. The app now retries automatically; if it persists, close Excel and wait for OneDrive to finish syncing.
Find people never logs in to LinkedIn or scrapes it. It only reads public Google search snippets, so a school or hometown sometimes can't be confirmed. Those people land under Maybe for you to review.
Apollo's search endpoint hides last names. Enabling Apollo in Find people spends credits to reveal each person.