Target interaction specification

Speaking

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

What the finished product should prove.

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

The interface has to make these states real.

If two states would look identical to the person, the implementation is not finished.

01

Discovered

A call has been found with source, deadline, event, and retrieval time attached.

02

Ineligible or expired

A call stays visible as rejected with the reason instead of disappearing mysteriously.

03

Ranked

The score is accompanied by matched talk ideas, audience rationale, and evidence.

04

Shortlisted

The speaker intentionally chooses which calls deserve preparation effort.

05

Draft

A pack is generated only from profile evidence and keeps each claim inspectable.

06

Needs evidence

An unsupported claim blocks readiness until it is removed or sourced.

07

Ready for approval

Recipient, subject, content, deadline, attachments, and delivery method are previewed together.

08

Sent or failed

Sending produces a receipt or a recoverable failure while preserving the prepared pack.

Edge cases

The boring failures are part of the product.

  • The deadline changes after discovery
  • The event page disappears or redirects
  • Two listings refer to the same call
  • The call has no usable contact or submission endpoint
  • A drafting model proposes a claim not in the profile
  • The speaker edits the pack after approval but before send
  • Email or submission fails after the final click

Definition of done

The future case study needs these receipts.

  • Every ranking score can expand into the exact reasons and profile evidence that produced it
  • A draft containing an unsupported claim cannot reach Ready for approval
  • A final preview shows destination, content, deadline, and delivery mechanism before send
  • The API and UI both reject send without explicit approval of the current draft version
  • A failed send preserves the pack and error state so the person can retry or use a manual fallback
HAAMi tooted

HAAMi tooteväljaanne · Where the talk already exists

Speaking

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.

Speaking CFP desk with ranked open calls, relevance scores, and the Find opportunities action.
Evidence in the profileNo silent mail

open calls

Rank

confs.tech listings scored against a speaker profile. Reasons stay attached.

profile only

In

Heuristic packs may only use evidence that already sits in profile.evidence.

without approval

403

The API refuses send unless approved is true. sendApplication throws otherwise.

desk UI

Live

speaking.haam.co is behind sign-in. Resend is not configured on that host.

The job

Fewer calls, a pack that can be checked, a human send.

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

Discover. Rank. Prepare. Approve.

Mailto is the fallback when Resend is unset. Live send is optional and not set on speaking.haam.co.

01

Bring in open calls

confs.tech JSON is the listing source. Overdue calls drop. CI uses fixtures rather than the live feed.

02

Score against the profile

Relevance is a number with reasons, matched to talk ideas and listed evidence, not a hidden embedding.

03

Write the pack

A heuristic draft: why this audience, evidence used, talk title. Evidence used has to be a subset of the profile.

04

Send only after a yes

Approval is a field the API checks. Without it, send is 403. With it, mail is mailto or Resend — never silent.

Design decisions

What had to stay true in the interface.

speaking.haam.co

Ranking

The score has to bring its reasons.

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.

  • Discover and relevance scoring covered by tests
  • Overdue calls drop out
  • Talk ideas and evidence from the profile

Grounding

The pack may only quote what the profile already lists.

Heuristic evidence ⊆ profile.evidence. That is a test, not a hope. Optional OpenAI drafts are unverified in this pass and are not required.

  • Prepare tests for evidence grounding
  • Pack folder includes why this audience and evidence used
  • OpenAI path optional and unverified

Send gate

Approval is the only key that opens mail.

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.

  • No mail without an explicit yes
  • Mailto fallback when live mail is unset
  • Speaker contact behind Clerk on speaking.haam.co

The working stack

What actually runs.

Listings

confs.tech

Open CFP JSON. Live feed is not used in CI; fixtures cover ranking.

Prepare

Heuristic pack

Draft from profile evidence and talk ideas. Generated folders gitignored.

Send

Approval gate

mailto or optional Resend. Public host has no RESEND_API_KEY.

Host

speaking.haam.co

Vercel Next.js behind Clerk. Filesystem writes from discover/prepare do not persist there.

In evidence

What a reviewer can check.

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

The public UI is the desk, not an outreach bot.

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

I put the send button behind a person.

Approval boundary, evidence-only packs, ranking reasons, confs.tech ingest, prepare and send libraries, and tests. Direct work, 2026.

How we learned

Research

Workflow research

The bottleneck was not writing a talk. It was finding the right stage and knowing what already fits.

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.

  • Opportunity review
  • Evidence matching
  • Talk inventory
  • Approval workflow

Help improve this website?

Optional analytics. Google Analytics and Clarity load only if allowed; form, email, and chat content are excluded.