A friend-finding agent you set up once

See your people when it's easy.

opportune quietly watches your calendar, your RSVPs and where you are. When hanging out with someone you like would cost almost nothing, it taps you on the shoulder. Otherwise it stays out of your way.

What am I already doing that would be better with other people, at almost no cost to them? Whose plans could I join, at almost no cost to me?

opportunenow

You're at the grocery store. Rosa is home a block away and her porchlight is on until 8.

Ask if I can drop inNot nowShouldn't have bugged me
What it notices

Small coincidences you'd miss on your own.

Some of these work the day you sign up, using only your own data. The rest switch on the moment one friend joins.

Works with just you

Same party

Sam also RSVP'd to the Dolores Park picnic on Saturday. Want to go together?

From your Partiful and Luma confirmation emails
Works with just you

Friend nearby

Priya is a 4 minute walk from you and neither of you has anything on for an hour.

From friends who already share Google Maps location with you
Works with just you

They'd like this

That ceramics night you RSVP'd to looks like Rosa's kind of thing. Invite her?

From your RSVPs and what you've told it about your friends
Needs one friend

Porchlight

Say when you're happy to have people drop in. Friends nearby get a gentle heads-up, and your agent can say yes for you.

From your porchlight hours and their location
Needs one friend

A standing slot

You and Rosa are both free most Thursday evenings. Make it a dinner?

From both calendars, which neither of you sees
Needs one friend

Who's around tonight?

I asked 6 friends' agents. Two are likely free after 7, one's already in your neighborhood.

From each friend's agent, answering under their own rules
You choose the people

For people who like some people.

This isn't a meet-strangers app. You mark the friends you'd like to see more of, and it only ever looks for chances with them.

  • Tiers and per-friend settings. Acquaintance, friend or trusted sets the defaults, and you can override any of them for one person.
  • Private effort levels. How far you'd go out of your way for someone stays on your side. They never see it.
  • Friends of friends, if you want. If Bob's friends tend to be your kind of people, you can be more open to them. Bob has to agree to vouch first.
R
Rosalives a block from your grocery store
want more
  • Tiertrusted
  • Can ask if I'm free
  • Can drop in without asking
  • Can see my plans
  • How far I'd travel for heronly you see this

"Usually free Thursdays. Loves anything with pottery or live jazz."

How it works

Quiet by default. The AI only steps in when something concrete happens.

Plain rules spot the overlap. An AI judge then decides whether it's worth interrupting you, and every decision is logged so you can correct it.

Diagram: sources such as calendar, location and email feed a log; triggers spot overlaps; an AI judge decides; a nudge reaches your phone; your ratings feed back to the judge.
SourcesA calendar link, a location app, your RSVP emails. Each is one setup step.
LogEverything becomes a timestamped observation: where you were, what you're going to.
TriggersSimple rules find overlap: same event, within a few blocks, both free.
JudgeAn AI weighs it against your settings, quiet hours and recent nudges.
NudgeYour phone buzzes with one tap to act, and one tap to say it got it wrong.
It learns your taste in interruptions

It shows you what it didn't say, too.

Every choice it makes is on the record, including the times it stayed quiet. A daily digest lists what it skipped. Rate any call good or bad and it adjusts, per friend.

After you've said yes to a friend's drop-in a few times, it offers to start saying yes for you. Trust builds up from small things you've already approved.

Daily digest9:00

I stayed quiet about 3 things yesterday.

Theo was 2 km away at 11pmPast your quiet hours
Should have told me
Sam is going to the same talk on the 14thYou'd snoozed Sam this week
Should have told me
Maya's porchlight was on while you were at the gymYou were mid-workout
Should have told me
MonTueWedThuFriSatSun
You
Rosa
Both free Thursday evening, three weeks running. Neither of you sees the other's calendar.
Better with one friend

Useful alone. Much better in pairs.

On day one it reads your own RSVPs, calendar and location. When it finds a friend you'd like to see more of, it hands you an invite link for them.

Once they join, your agents can compare notes privately: "is she free Thursday?" gets an answer without either of you sharing your whole calendar.

A person outside a grocery store at night, their phone's rings reaching a nearby house with its porch light on.
The drop-in problem

You texted to see if you could drop by. She replied after you'd gone home.

With porchlight, she's already said evenings are open. Her agent sees you're a block away, says "likely yes", and gives her a few minutes to veto. You get a nudge while you're still in the checkout line.

Agents talking to agents

Your agent asks theirs. Their rules decide the answer.

Every person has an agent that can answer questions from friends' agents, limited to what that friend is allowed to know. It works the same on one shared server or between servers run by different people.

# Dev's agent asks Rosa's, signed with Dev's key
POST https://rosa.example/q
{
  "kind": "dropin",
  "text": "Dev is a block away. OK if she stops by?",
  "window": "now → 19:30"
}

# Rosa's agent answers under Rosa's policy
{
  "answer": "likely",
  "text": "She's home and her porchlight is on until 8.",
  "revealed": { "porchlight": "open" }
}
  • Permission classes, not free-for-all. Availability, drop-in, plans and whereabouts are separate asks with separate grants and rate limits.
  • Signed requests. Each person has a keypair. Invite codes work once, so a leaked link does nothing.
  • Nodes that grow each other. If your friend's node can't answer something, it says what plugin would help, and you get a one-line offer to set it up.
  • An audit log. Every question a friend's agent asked yours, and what it was told.
Glowing glass houses, each a node with a few people inside, linked by lines carrying sealed messages; the largest is labeled opportune.app.
Federated

Sign up on ours, or run your own. You can still be friends.

The protocol is open and every node speaks it. Run a node on a spare box for you and your housemates, and your agents still talk to everyone on the shared server.

Sources, triggers, channels and question types are all plugins: one folder each. If you want opportune to read your climbing gym check-ins, you can add that tonight.

Get started

About three minutes, and every choice can be changed later.

Easiest with an invite from a friend who's already on. Without one, you still get the solo features from day one.

Your own node

Self-host

Node 22 and SQLite. Bring an Anthropic key for the judge and a Telegram bot token for nudges.

git clone <repo> opportune
cd opportune && pnpm install
cp .env.example .env  # keys + NODE_URL
pnpm start

Your node publishes what it supports at /.well-known/opportune, so other nodes know what they can ask it.