Map

acai.sh

Toolbox toolboxtypescriptelixirspec-driven-developmentai-agentscliwatchlistTypeScript (CLI)Elixir (server)Apache-2.0 ↳ show in map Markdown
title
acai.sh
type
toolbox
summary
Spec-driven dev toolkit where agents write code against numbered acceptance-criteria IDs
tags
typescript, elixir, spec-driven-development, ai-agents, cli, watchlist
language
TypeScript (CLI), Elixir (server)
license
Apache-2.0
created
2026-05-03
updated
2026-05-03

Open-source toolkit for spec-driven AI-assisted development built around feature.yaml specs and ACIDs (Acceptance Criteria IDs). The author's argument for why this exists and how it differs from spec-tooling neighbors lives in the specsmaxxing post.

The pitch in one line: stop asking the agent to remember what your feature is supposed to do across sessions; write a numbered list of acceptance criteria once, get the agent to reference those numbers from code and tests, and review requirements instead of files.

Components

The org ships three repos:

  • acai-sh/cli β€” TypeScript CLI distributed via npx @acai.sh/cli plus Linux/macOS GitHub releases. Apache-2.0, ~10β˜…, created 2026-03-22.
  • acai-sh/server β€” self-hostable Elixir/Phoenix/Postgres backend that runs the dashboard, REST API, database, backup service, and reverse proxy. Apache-2.0, ~3β˜…, created 2026-02-27.
  • acai-sh/docs β€” Mintlify-powered documentation site at acai.sh.

There's also a hosted version at app.acai.sh β€” author says "free for a while, or maybe forever" depending on whether usage gets expensive. The hosted/self-hosted split is conventional: code is OSS, hosting is a service.

How it fits together

feature.yaml  β†’  agent reads via `npx @acai.sh/cli skill`  β†’  agent writes code with `// AUTH-1` etc.
       β”‚
       └────  `acai push --all` from CI  β†’  app.acai.sh dashboard with requirement-by-requirement review surface

The CLI's skill subcommand teaches the agent the convention β€” install it once per project and the agent learns to read feature.yaml, write ACID-referenced code, and emit completion/blocked states. The dashboard exists because reviewing requirements is a different shape than reviewing diffs; you want a list of "AUTH-2-1: completed, assigned to claude-code, awaiting review" not a 600-line PR.

The intended end state is a plan β†’ implement β†’ review loop with the LLM as the implementer and the human as the reviewer at the requirement level. CI hook examples and the loop wiring are roadmap items as of this ingest.

feature.yaml format

feature:
    name: imaginary-api-endpoint
    product: api
    description: ...

components:
    AUTH:
      name: Authn and Authz
      requirements:
        1: Accepts Authorization header with `Bearer <token>`
        1-1: Token must be non-expired, non-revoked
        2: Respects the scopes configured for the owner
        2-note: See `access-tokens.SCOPES.1` for complete list of supported scopes

constraints:
    ENG:
      requirements:
        1: All actions are idempotent
        2: All HTTP 2xx JSON responses wrap their payload in a root `data` key

The split between components (functional requirements grouped by surface area) and constraints (cross-cutting engineering invariants) is the format's main opinionation. Hierarchical numbering (2-1) gives sub-requirements an address. Sibling *-note keys carry cross-references. deprecated and replaced_by flags exist for in-spec history when stable numbering forces a rename.

How the author positions it against neighbors

From the post:

  • GitHub SpecKit β€” "vibe coding with extra steps." Different problem (more prompts, more skills) than ACID-tracked alignment.
  • OpenSpec β€” disagrees on the philosophical premise: OpenSpec says specs describe how systems currently behave; acai says specs describe how systems should behave.
  • Kiro β€” converts unstructured .md to EARS syntax. acai's feature.yaml aims for the middle between .md and EARS.
  • Traycer.ai β€” uses plain .md files; acai is more opinionated about format.

Use it like this

# in your project
npx @acai.sh/cli skill            # teach the agent the convention
# (write feature.yaml, hand the agent a prompt referencing it)

# CI / push to dashboard
ACAI_API_TOKEN=<secret> acai push --all

The agent prompt the author suggests pasting verbatim:

Dear Claude, … Start by running npx @acai.sh/cli skill. This will teach you everything you need to know about our process for spec-driven development. Then, proceed to plan and implement the features specified in our spec files.

(The "Dear Claude / Love, [your-name]" framing is the author being playful; the load-bearing instruction is the npx @acai.sh/cli skill call.)

Status β€” watchlist

Filed on watchlist with re-check 2026-08-03. Reasons:

  • Single-author org, ~13β˜… across all repos as of ingest, all three repos created in the last 2-3 months.
  • Hosted dashboard is the review surface. Self-hosting works (server is OSS) but is heavy β€” Elixir/Phoenix/Postgres deployment, reverse proxy included. Most users will end up on app.acai.sh, which is the author's own hosted instance with no published business model. "Free forever maybe" is fragile.
  • Format lock-in is real. Once the codebase has hundreds of // AUTH-2-1 references, switching from feature.yaml to a different spec tool requires a migration script.
  • CI/CD wiring is a roadmap item, not shipped. The end-state pitch (reactive planβ†’implementβ†’review loops) depends on integrations that don't exist yet.

What would graduate it: a notable third-party project adopting the format publicly; the CI hook examples landing; a second contributor in the org; the hosted/self-hosted split clarified. The watchlist re-check should also peek at whether the author has published the "automated plan β†’ implement β†’ review loop" they hinted at.

Why it's worth tracking despite the watchlist filing

The ACID-as-bidirectional-reference convention has legs independently of acai.sh the product β€” see acceptance-criteria-ids for the portable version. Even if this specific tool fades, the pattern is likely to show up in larger systems (Cursor, Charlie Labs, GitHub) that have the distribution to make it stick.

Limitations

  • TypeScript CLI only; no Python or Go ports yet (probably trivial to write but currently a barrier for non-Node projects that don't want a Node dep at build time).
  • Server is Elixir, which is a higher self-hosting bar than the typical Go/Rust binary.
  • No editor integration documented β€” the agent learns ACIDs via the skill command, but humans authoring feature.yaml get plain YAML editing without schema validation, hover documentation, or "go to definition" on AUTH-2-1 references.
  • The convention is most useful for backend / functional features. UI features map awkwardly because the author explicitly excludes "design and superficial requirements" from spec scope.

Repo

github.com/acai-sh β€” cli (10β˜…), server (3β˜…), docs (Mintlify) β€” Apache-2.0