Skip to main content

What is Ever Async

Ever Async is the context layer for async work. It sits between your team's chat and the tools their work actually lives in, and it makes sure a message carries enough context for somebody in another timezone to act on it — without a round trip.

It is one static Rust binary, one TOML file, and an embedded SQLite database. everasync serve is a complete deployment. Everything beyond that is optional and additive: Postgres or MySQL instead of the file, a login wall with SSO instead of an open private network, many isolated tenants instead of one.

The problem​

Someone posts this at 17:58, then logs off:

Hi, can I get some help?

Nobody can do anything with it. Not because the author was careless — because chat rewards speed and async work needs context. What follows is the ten-message discovery loop:

09:02  Hi, can I get some help?
09:04 › sure, with what?
… 6 hours pass, different timezone …
15:31 the deploy
15:33 › which deploy?
… 6 hours …
09:12 the one from yesterday, it failed
09:15 › do you have the link?
… 6 hours …
15:40 https://github.com/…/actions/runs/…
15:44 › ah, that's the migration step — the DB URL is unset

Four days for a fix that takes four minutes. Every arrow is a person waiting. The same exchange in one message would have been:

Hi — the api deploy failed on the migration step, log here: https://github.com/…/actions/runs/… . I think it's an env var but I'm not sure which. @alex any idea?

The gap between those two messages is the entire product.

How Ever Async fixes it​

Two moves, in this order:

  1. Fill the gap silently when it can. "Can someone review the PR?" — Ever Async asks the GitHub connector which pull request the author has open, and posts the link and its status as a reply in the thread. Nobody was corrected; the message just became actionable.
  2. Nudge privately when it can't. If nothing resolves the reference, the author — and only the author — gets an ephemeral message a couple of minutes later: what is missing, why it matters according to the team's own charter, and a suggested rewrite with a Post this button.

Two rules are non-negotiable, and both exist because this product dies the moment people resent it:

  • Nudges are always private. Never a public correction. See the private-nudge rule.
  • Precision over recall. The default sensitivity acts only on textbook cases. Missing a bad message costs nothing; flagging a good one costs trust. See sensitivity.

The model: Source → Ever Async → Target​

Everything in the codebase is one of three things.

  • Source — a channel verifies the platform's signature and normalizes its webhook into one internal InboundEvent. Nothing downstream ever sees a Slack-shaped payload.
  • Ever Async — the pipeline classifies, enriches, decides and acts.
  • Target — the same channel plugin turns the decision back into a platform API call: an ephemeral nudge, a thread reply, a DM.

Connectors are what make the enrich step possible: they turn "the PR" and "my last task" into a URL with a status. AI providers are optional — they only judge the ambiguous middle that the deterministic rules refuse to guess at.

What it costs to run​

Required servicesnone — SQLite is embedded. Postgres, MySQL and an in-memory backend are one config line away
Required AInone — the heuristic path costs microseconds and zero tokens
Required loginnone by default ([auth] mode = "local_trusted"). Static API tokens, local password users, or SSO against Slack · Discord · GitHub · Google · Ever Gauzy when you want one
Deploymentone binary + one TOML file
Default nudge grace window150 s, cancelled the moment the author self-corrects

The LLM and the notification provider are both optional. Turn them off and Ever Async still catches naked greetings, artifact-without-link messages, and contentless help pleas — deterministically.

The default asks for no credential

That is deliberate — the common self-hosted case is a private network, and a login wall there is friction with no attacker behind it. But /api/v1 is writable, so the moment the port is reachable from the internet the default is wrong. See Security & authentication.

Where to go next​

If you want to…Read
Have it running in five minutesGetting started
Understand how it decidesThe pipeline
Connect it to SlackSlack
Resolve "the PR" / "my last task"Connectors
Pick and configure an AI providerAI providers
Know every config keyConfiguration
Run it in productionSelf-hosting · Operations
Put a login in front of itSecurity & authentication · Setting up SSO
Run it for more than one companyMulti-tenancy
Write a pluginArchitecture

Ever Async uses the Apache License 2.0. Its source repository is ever-co/ever-async. Contact Ever Co. about repository access.