Synaplan
기업을 위한 오픈소스 AI 플랫폼
Coverage는 학생들이 투자은행 네트워킹을 진행하도록 돕는다
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를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.