Discovered
A call has been found with source, deadline, event, and retrieval time attached.
Target interaction specification
Which open call deserves attention, what evidence supports a talk for it, and is the application actually ready to send?
Speaking may discover, rank, and draft from the speaker profile, but every ranking must explain itself, every substantive claim must trace to existing evidence, deadline freshness must stay visible, and no submission or email may leave without an explicit final approval.
Case-study thesis
This is the behavior to build toward. The implementation receipts below remain the record of what exists today.
The product is not an outreach bot. It is an attention filter that compresses discovery and preparation while keeping authorship and the final send with the speaker.
State model
If two states would look identical to the person, the implementation is not finished.
A call has been found with source, deadline, event, and retrieval time attached.
A call stays visible as rejected with the reason instead of disappearing mysteriously.
The score is accompanied by matched talk ideas, audience rationale, and evidence.
The speaker intentionally chooses which calls deserve preparation effort.
A pack is generated only from profile evidence and keeps each claim inspectable.
An unsupported claim blocks readiness until it is removed or sourced.
Recipient, subject, content, deadline, attachments, and delivery method are previewed together.
Sending produces a receipt or a recoverable failure while preserving the prepared pack.
Edge cases
Definition of done
HAAM produktutgåva · Where the talk already exists
Open calls arrive faster than a careful pack. Speaking ranks confs.tech listings against listed evidence and talk ideas, writes a heuristic pack, and will not send until I approve. On the public host, mail is not configured, and filesystem writes stay local.

open calls
Rankconfs.tech listings scored against a speaker profile. Reasons stay attached.
profile only
InHeuristic packs may only use evidence that already sits in profile.evidence.
without approval
403The API refuses send unless approved is true. sendApplication throws otherwise.
desk UI
Livespeaking.haam.co is behind sign-in. Resend is not configured on that host.
The job
I wanted a ranked shortlist and a draft built from listed evidence, then a send I still have to approve. Invented metrics and unattended outreach would have been the opposite of a careful pack.
The desk is personal. It is not a multi-speaker SaaS. Speaker contact stays behind sign-in.
On Vercel the filesystem is read-only, so discover and prepare writes that need a folder stay local-only.
The desk
Mailto is the fallback when Resend is unset. Live send is optional and not set on speaking.haam.co.
01
confs.tech JSON is the listing source. Overdue calls drop. CI uses fixtures rather than the live feed.
02
Relevance is a number with reasons, matched to talk ideas and listed evidence, not a hidden embedding.
03
A heuristic draft: why this audience, evidence used, talk title. Evidence used has to be a subset of the profile.
04
Approval is a field the API checks. Without it, send is 403. With it, mail is mailto or Resend — never silent.
Design decisions
speaking.haam.co
Ranking
A shortlist without a why is just another pile. I kept relevance attached to the call so I can see why it rose before I spend time on a pack.
Grounding
Heuristic evidence ⊆ profile.evidence. That is a test, not a hope. Optional OpenAI drafts are unverified in this pass and are not required.
Send gate
sendApplication throws unless approved. The API returns 403 unless approved is true. Stubbed fetch covers the gate in tests. Resend errors would archive the folder and mark failed — and Resend is not configured on the public host.
The working stack
Listings
Open CFP JSON. Live feed is not used in CI; fixtures cover ranking.
Prepare
Draft from profile evidence and talk ideas. Generated folders gitignored.
Send
mailto or optional Resend. Public host has no RESEND_API_KEY.
Host
Vercel Next.js behind Clerk. Filesystem writes from discover/prepare do not persist there.
In evidence
01Open calls ranked against listed evidence with reasons attached
02Packs that cannot quote evidence the profile does not list
03Send blocked until approval, covered by tests
04A public desk that does not silently email anyone
Where it stops
No talks-accepted claim. Durable hosted storage for generated packs is not on Vercel. Expo is deferred.
Resend live send is optional and unset on speaking.haam.co. Discover and prepare writes are local-only on that host.
HAAM’s role
Approval boundary, evidence-only packs, ranking reasons, confs.tech ingest, prepare and send libraries, and tests. Direct work, 2026.
How we learned
Research followed the whole speaking workflow: open calls, existing evidence, talk ideas, application requirements, preparation, and the point where sending still needs approval. The product organizes that decision chain instead of treating every opportunity as a blank-page writing task.
Optional analytics. Google Analytics and Clarity load only if allowed; form, email, and chat content are excluded.