Inspiration

Onboarding a new company is death by a thousand fields. A vendor needs company info, billing contacts, SAML metadata, a data region, a security questionnaire â and no single person on the client side has all of it. It turns into a two-week email thread where the contact fills 6 of 10 fields, IT owns the SAML config, the security questionnaire is stuck behind a sign-off from someone on PTO, and nobody can see what's actually blocking what. We wanted the whole thing to feel as easy as sharing a Dropbox link.

What it does

OpenShare is a shared room for onboarding. You drop a spec into a room, send the link, and your team, the client's people, and an AI agent collect the data together in one chat. The agent does the legwork: it figures out who owns each field, asks the right person, checks the answers, and reroutes when someone's blocked. Humans stay in for the judgment calls and sign-offs. A live checklist shows everyone what's done, what's pending, and who's holding things up.

The privacy story matters because this is exactly the data you don't want leaking. Sensitive fields live behind Pomerium's zero-trust access, so only the right roles can see them. When the finished dataset ships out through Nexla, secrets go as a SHA-256 fingerprint plus a masked preview instead of plaintext, so the real values never ride the pipeline. The agent's reasoning runs on open-weight models served by AkashML rather than a black-box API.

How we built it

The front end is Next.js 16 and React 19. The agent is a serialized loop built on the Vercel AI SDK, talking to AkashML over an OpenAI-compatible endpoint. Messages and checklist updates stream to every open window over Server-Sent Events, backed by an in-memory store that's durable enough for a live demo. The agent works through a small set of tools â ask a field, generate an invite for a missing owner, mark something blocked, hand out a secure drop link, request a sign-off, and deliver the final dataset.

The fingerprint is just a truncated SHA-256:

$$ \text{fp}(v) = \text{SHA256}(v)_{[0..12]} $$

so a value shows up downstream as â¢â¢â¢â¢1234 · 2,048 chars and its hash, never the plaintext.

What we learned

"An agent that closes the loop" only lands if the loop is visible. Watching the checklist move a field from pending to blocked to invited to signed-off to delivered sells the autonomy far better than the chat does. The hard part also wasn't the LLM â it was multi-party real-time state. Serializing the agent's turns per room and fanning updates out over SSE is where most of the time went.

Challenges we faced

SSE and live room state don't survive a stateless serverless model, so we ran a single Node process behind a tunnel with an in-memory store for the demo. Keeping the agent from stalling on a blocked field took real iteration â it has to resequence to what the present participant can actually answer, then nudge the blocked owner once they show up. And the last stretch was wiring three sponsors so they genuinely fire in one under-three-minute demo: AkashML inference, Pomerium gating a real route, and a live Nexla webhook receiving the dataset, with secrets fingerprinted before they ever touch the pipeline.

Built With

  • agents
  • akashml
  • backed-by-an-in-memory-store-(durable-enough-for-a-live-demo).-agent-**tools**-for-the-loop:-ask-field
  • deepseek
  • generate-invite
  • issue-secure-drop-link
  • llm
  • mark-blocked
  • nexla
  • next.js
  • node.js
  • openai-compatible-api
  • pomerium
  • react
  • request-sign-off
  • running-open-weight-inference-on-**akashml**-via-an-openai-compatible-endpoint.-**server-sent-events**-stream-messages-and-checklist-updates-live-to-every-open-window
  • server-sent-events
  • single-flight-per-room
  • tailwindcss
  • typescript
  • vercel-ai-sdk
  • zod
Share this project:

Updates