Inspiration

After every real sales call, the notes you actually need: who said what, what was agreed, what got pushed back on: usually get written poorly, late, or not at all. Meanwhile, the transcript already exists somewhere in your headset export, your CRM log, or your voice memo. The gap is just the step from "audio dump" to "useful memo." Cadence closes that step.

What it does

Paste or drop a sales or business call transcript and get back clean notes: a short title, a summary, the people and companies involved, sentiment, key points, objections, action items, dated calendar events, and a one-line next step. It also does the unglamorous thing first: it checks whether the text is actually a call. Paste a blog post or an email and it tells you why it didn’t run instead of handing you hallucinated notes. The result opens in a notebook-style overlay with draggable calendar and to-do widgets when there are events or action items. Notes live in the browser: localStorage with a cookie fallback. No accounts. No server storage.

How we built it

The app is a Next.js 16 App Router project deployed on Cloudflare Workers. The model calls go through one server route at /api/analyze. The browser holds the transcript and the note UI; the model never runs in the browser. We use two prompts in order. The first is a lightweight pass/fail gate: const { is_call } = await callModel(shortPrompt); if (!is_call) stop(); If it passes, the second prompt extracts the structured notes, including resolving relative dates against today. The model is nvidia/nemotron-3-super-120b-a12b on Nebius Token Factory. It’s a mixture-of-experts model with roughly 12B parameters active per token out of 120B total, and a 256K context window. That active-parameter count controls speed and cost per call, while the total context means a full transcript fits without chunking. For security, the route requires a Cloudflare Turnstile token, then issues a short-lived HMAC session token so the second call doesn’t re-check. It also enforces same-origin, 120 KB body cap, 40k prompt cap, generic upstream errors, in-memory burst limiting, and Cloudflare Workers rate limiting. Security headers cover CSP, HSTS, X-Frame-Options, Referrer-Policy, and Permissions-Policy.

Challenges we ran into

  • Next 16’s experimental cacheComponents and partialPrefetching flags hang in workerd because of its setTimeout implementation. Removing them fixed the first-request timeout.
  • OpenNext compiles all .env* modes into the Worker bundle, so dev secrets would have shipped. We solved this by hiding .env.local during the build step.
  • Cloudflare’s Workers rate limiting binding is approximate per location. To catch local bursts, we added a strict in-memory sliding-window limiter on top.
  • Turnstile’s invisible mode rejects headless browsers with error 600010. We had to structure the client so one verified session covers the whole analysis rather than relying on repeated challenges. ## Accomplishments that we're proud of The two-step prompt design actually works: the gate stops nonsense early, and the second call produces usable notes with resolved dates. The notebook UI with draggable calendar and to-do widgets feels solid. The whole stack is lightweight: one route, two calls, no database: and it deploys cleanly to Cloudflare with a custom domain and a hardened endpoint. ## What we learned OpenNext works with Next 16, but you have to read the current docs instead of relying on prior experience. Cloudflare Workers rate limiting is great, but approximate: if you need strict per-user limits you should use Durable Objects. And Turnstile invisible mode is fine for real users but unusable in automation, which taught me to structure the client around one verified session per analysis. ## What's next for Cadence A few things we’d add next: a proper license, automated tests, and the option to save notes to an account instead of just the browser. On the model side, we’d test whether shorter prompts or caching could cut latency further. If this goes anywhere, the next step is a polished landing page and a demo video.

Built With

Share this project:

Updates

Submission history