Getting started
What you need#
Bun 1.4+, and Docker with Compose v2 for Postgres and the classifier pool. Python 3.9+ only if you want to run the classifier outside Docker.
Postgres and the classifier are services, not files, so they are never bundled into the binary.
Install#
FishTea is in private beta: the framework runs, but there are no published release binaries yet, so
there is no curl … | bash to hand you. Ask for access, or build it from a checkout — which
produces exactly what a published release would:
git clone <the repo> fishtea
./fishtea/install.sh --from ./fishtea
That compiles the binary and puts a standalone fishtea in ~/.fishtea/bin, with every version you
install kept side by side.
Or work from the checkout directly, with no install at all:
cd fishtea && bun install && bun fishtea templates
Make an application#
fishtea templates # the five archetypes
fishtea new myshop --template ecommerce --interactive # answer the interview
cd myshop
The interview turns a generic archetype into your business: what you sell, how people shop for it, whether stock is yours or a vendor's, what shipping and returns look like. Answers patch spec paths, enum vocabularies and seed rows — and sometimes more: telling the ecommerce archetype you are affiliate-only removes the cart shapes and the mid-purchase persona entirely.
Non-interactively, --answers answers.json, where the keys are the question ids in the template's
onboard.json.
Where it goes. An application is its own project, so it is never created inside the framework
checkout. It lands in the current directory, or wherever --dir says; --workspace (or
FISHTEA_WORKSPACE) sets the parent.
Run it#
fishtea up
Postgres with pgvector, the needle3 classifier pool, the core and the browser UI. The first classifier start downloads ~35 MB of weights; Docker keeps them in a volume.
fishtea doctor # spec, database, classifier, binding, framework compatibility
✓ framework 1.2.0 satisfies ^1.1.0
✓ spec My Shop v2026.09.22-1
✓ database postgres://fishtea:***@localhost:5432/fishtea
✓ classifier http://localhost:8081 · needle3 · 3/3 workers · 11 tools
✓ binding 0.0.0.0:3000 · other machines dial http://10.0.0.19:3000
A missing classifier is a warning: the core still runs and pours ask for text utterances. A missing
database stops start-up, with the command to fix it.
Without Docker#
With a Postgres that has pgvector on DATABASE_URL:
fishtea migrate && fishtea seed && fishtea dev
And with no classifier at all, for a scripted conversation with no UI:
fishtea headless
That uses the lexical classifier, which is a development harness and a benchmark baseline — never
production. If a step routes differently under lexical than under needle, adjust the script or the shape's
triggers, not the engine.
What is in the directory#
spec.json the business: entities, calls, rules, shapes, personas, envelope
calls/ SQL with $1..$n parameters, and compute modules
seed/ rows per entity
rules/ tables the spec names (tax, pricing)
scripts/ headless walkthroughs
plugins/ plugins local to this application
.fishtea/ provenance — commit manifest.json
docker-compose.yml its own stack
fishtea.ts finds the framework: installed, vendored, or a checkout
spec.json is the only source. If something entity-specific lives in code outside calls/, that is a
bug.
The operator console#
fishtea tui
Six screens on number keys:
- Dashboard — service dots, spec version, what is running
- Spec — browse, edit a value in place, open a section in
$EDITOR, add a shape - Conversations — visitors, their trails, the unmet channel, notify
- Run — migrate, seed, reload, restart, compose, headless, bench
- Onboard — the archetype interview
- Versions — what is running, what else is installed, update this application
Next#
- Archetypes — what each one is and what its interview asks
- Plugins — integrations, design systems, auth
- Versioning and updates — picking up framework changes without regenerating
- Spec reference — every section, generated from the schema