Šķîþ ţö ḿàîñ çöñţéñţ

Ļöçàļ Đéṽéļöþḿéñţ

À ƒüļļ bowrain îñšţàñçé îš à ƒéŵ çööþéŕàţîñĝ þŕöçéššéš: ţĥé šéŕṽéŕ (ŔÉŠŢ + ĝŔÞÇ ÀÞÎ; àļšö đŕîṽéš ţĥé kapi ļööþ'š ŕüñš), àñ àšýñç ŵöŕķéŕ (þŕöçéššéš ţĥé đŕàƒţîñĝ ĵöƃš ţĥöšé ŕüñš éñǫüéüé, àñđ þüšĥ îñĝéšţîöñ), àñđ ƃàçķîñĝ šéŕṽîçéš: ÞöšţĝŕéŠǪĻ, ÉļàšţîçḾǪ (ŠǪŠ-çöḿþàţîƃļé ĵöƃ ǫüéüé), Ŕéđîš (éṽéñţ ƃüš), ḾîñÎÖ (ƃļöƃ šţöŕàĝé), Ķéýçļöàķ (ÖÎĐÇ), àñđ Ḿàîļþîţ (ŠḾŢÞ). Ţĥé šéŕṽéŕ àñđ ŵöŕķéŕ šĥàŕé ţĥé ĵöƃ ǫüéüé àñđ ţĥé ƃļöƃ šţöŕé; þüšĥ þŕöçéššîñĝ îš àšýñçĥŕöñöüš.

Ţĥéŕé àŕé ţĥŕéé ŵàýš ţö ŕüñ ţĥîš ļöçàļļý, đéþéñđîñĝ öñ ŵĥàţ ýöü àŕé ŵöŕķîñĝ öñ:

ḾöđéŴĥàţ ŕüñš ŵĥéŕéÉñţŕý þöîñţÇöḿḿàñđ
À · Ĥöšţ + ĤḾŔđéþš + Ţŕàéƒîķ îñ Đöçķéŕ; šéŕṽéŕ + ŵéƃ öñ ţĥé ĥöšţ (ĥöţ ŕéļöàđ)https://bowrain.mymacdocker compose up + make dev-server/dev-web
Ƃ · Ƒüļļ Đöçķéŕ (šĥàŕéđ)šéŕṽéŕ + ŵöŕķéŕ + ŵéƃ îñ Đöçķéŕ, ŕéüšîñĝ ḿöđé À'š đéþš + Ţŕàéƒîķhttps://bowrain.mymacmake stack-up-shared
Ƃ · Ƒüļļ Đöçķéŕ (šţàñđàļöñé)éṽéŕýţĥîñĝ îñ Đöçķéŕ, þļàîñ ĤŢŢÞ, šéļƒ-çöñţàîñéđ, ñö ĥöšţ šéţüþhttp://localhost:8080make stack-up

Ḿöđéš À àñđ ţĥé šĥàŕéđ ƒüļļ-Đöçķéŕ ḿöđé àŕé ţĥé šàḿé Çöḿþöšé þŕöĵéçţ àñđ ţĥéŕéƒöŕé šĥàŕé öñé Ţŕàéƒîķ; ţĥéŕé îš ñö :80/:443 çļàšĥ. Ýöü ḿöṽé ƃéţŵééñ à ĥöšţ-ŕüñ šéŕṽéŕ (ƒöŕ ĥöţ ŕéļöàđ) àñđ à çöñţàîñéŕîžéđ öñé ƃý àđđîñĝ öŕ ŕéḿöṽîñĝ ţĥé àþþ öṽéŕļàý; ţĥé çöñţàîñéŕ'š ŕöüţéŕ öüţ-þŕîöŕîţîžéš ţĥé ĥöšţ ƒîļé-ŕöüţéš ŵĥîļé îţ îš üþ, àñđ ţĥé šàḿé Ţŕàéƒîķ ƒàļļš ƃàçķ ţö ţĥé ĥöšţ šéŕṽéŕ ŵĥéñ îţ îš ĝöñé. Ţĥé šţàñđàļöñé ḿöđé îš à šéþàŕàţé, šéļƒ-çöñţàîñéđ þŕöĵéçţ (îţš öŵñ đéþš, ñö Ţŕàéƒîķ) ƒöŕ ÇÎ àñđ ǫüîçķ šţàŕţš.

Ƒöŕ ŕüññîñĝ à þŕöđüçţîöñ îñšţàñçé, šéé Šéļƒ-Ĥöšţîñĝ îñšţéàđ. Àļļ çöḿḿàñđš ƃéļöŵ ŕüñ ƒŕöḿ ţĥé bowrain/ đîŕéçţöŕý.

Þŕéŕéǫüîšîţéš

  • Đöçķéŕ (ŵîţĥ Çöḿþöšé ṽ2) àñđ Ĝö.

  • Ţĥé kapi-bowrain þļüĝîñ, ţö đŕîṽé à þŕöĵéçţ ŵîţĥ ţĥé kapi ÇĻÎ: brew install neokapi/tap/bowrain-cli.

  • Ƒöŕ ţĥé *.bowrain.mymac (ŢĻŠ) ḿöđéš öñļý, ţĥé öñé-ţîḿé ĥöšţ šéţüþ: ļöçàļ ĐÑŠ ƒöŕ *.mymac àñđ à ļöçàļļý-ţŕüšţéđ çéŕţîƒîçàţé:

    brew install dnsmasq mkcert
    echo 'address=/.mymac/127.0.0.1' >> "$(brew --prefix)/etc/dnsmasq.conf"
    sudo brew services restart dnsmasq
    sudo mkdir -p /etc/resolver && echo 'nameserver 127.0.0.1' | sudo tee /etc/resolver/mymac
    mkcert -install && make certs

    Ţĥé šţàñđàļöñé ḿöđé ñééđš ñöñé öƒ ţĥîš.

Ḿöđé À: ĥöšţ šéŕṽéŕ + ŵéƃ (ĥöţ ŕéļöàđ)

Ƃàçķîñĝ šéŕṽîçéš àñđ ţĥé šĥàŕéđ Ţŕàéƒîķ ŕüñ îñ Đöçķéŕ; ţĥé šéŕṽéŕ àñđ Ṽîţé đéṽ šéŕṽéŕ ŕüñ öñ ţĥé ĥöšţ šö çĥàñĝéš ŕéļöàđ îḿḿéđîàţéļý. Ţŕàéƒîķ ŕöüţéš bowrain.mymac ţö ţĥé ĥöšţ'š :8080 (ÀÞÎ) àñđ :5173 (ŵéƃ).

docker compose up -d --wait # deps + Traefik (auto-loads compose.override.yaml)
make dev-server # bowrain-server on host :8080
make dev-web # Vite HMR for apps/web on :5173
make dev-worker # optional: the worker, for push → draft → pull
ŠéŕṽîçéÜŔĻ
Ŵéƃ + ÀÞÎhttps://bowrain.mymac
Ķéýçļöàķhttps://auth.bowrain.mymac (àđḿîñ/àđḿîñ)
Ḿàîļþîţhttps://mail.bowrain.mymac

Ḿöđé Ƃ (šĥàŕéđ): ƒüļļ šţàçķ ƃéĥîñđ ţĥé šàḿé Ţŕàéƒîķ

Àđđš ţĥé šéŕṽéŕ, ŵöŕķéŕ, àñđ ŵéƃ çöñţàîñéŕš ţö ḿöđé À'š đéþš + Ţŕàéƒîķ þŕöĵéçţ (compose.app.yaml), ŕéàçĥàƃļé àţ ţĥé šàḿé https://bowrain.mymac. Ñö šéçöñđ þŕöẋý.

cp .env.example .env # optional: configure a real AI provider
make stack-up-shared # = docker compose -f compose.yaml -f compose.override.yaml -f compose.app.yaml up

Ƃéçàüšé ţĥîš îš ţĥé šàḿé þŕöĵéçţ àš ḿöđé À, ýöü çàñ ļéàṽé ţĥé đéþš + Ţŕàéƒîķ ŕüññîñĝ àñđ àđđ öŕ đŕöþ ţĥé àþþ öṽéŕļàý ţö šŵîţçĥ ƃéţŵééñ à ĥöšţ-ŕüñ àñđ à çöñţàîñéŕîžéđ šéŕṽéŕ. make stack-shared-down ţéàŕš îţ đöŵñ.

Ḿöđé Ƃ (šţàñđàļöñé): žéŕö-šéţüþ šéļƒ-çöñţàîñéđ šţàçķ

Éṽéŕýţĥîñĝ, îñçļüđîñĝ îţš öŵñ ƃàçķîñĝ šéŕṽîçéš, ƃüîļţ ƒŕöḿ šöüŕçé öñ þļàîñ-ĤŢŢÞ localhost (compose.full.yaml). Ñö *.mymac/ŢĻŠ ĥöšţ šéţüþ; ƃéšţ ƒöŕ ÇÎ àñđ ǫüîçķ šţàŕţš.

make stack-up # server + worker + deps on http://localhost:8080
make stack-up-web # …also build and serve the SaaS web UI at http://localhost:8080/

Ķéýçļöàķ îš öñ http://localhost:8180 (àđḿîñ/àđḿîñ) àñđ Ḿàîļþîţ öñ http://localhost:8025. Üšéƒüļ ţàŕĝéţš: make stack-ps, stack-logs, stack-down.

Ţĥé ŵöŕķéŕ

Ţĥé bowrain-worker þŕöçéššéš ţĥé đŕàƒţîñĝ ĵöƃš ţĥàţ ļööþ ŕüñš éñǫüéüé (à þüšĥ ţö àñ on-push þŕöĵéçţ šţàŕţš öñé). Îţš üþšţŕéàḿ þŕöṽîđéŕ ƒöŕ ţĥéšé þļàţƒöŕḿ ĵöƃš îš çöñƒîĝüŕéđ ƃý éñṽîŕöñḿéñţ:

  • BOWRAIN_PLATFORM_PROVIDER: demo (đéƒàüļţ), bedrock, gemini, openai, anthropic, öŕ ollama.
  • Ţĥé ÀÞÎ ķéý çöḿéš ƒŕöḿ BOWRAIN_PLATFORM_API_KEY öŕ à þŕöṽîđéŕ-šþéçîƒîç ṽàŕîàƃļé (GEMINI_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY); Ƃéđŕöçķ üšéš ţĥé ÀŴŠ çŕéđéñţîàļ çĥàîñ àñđ AWS_REGION.
  • BOWRAIN_PLATFORM_MODEL šéţš ţĥé đéƒàüļţ ḿöđéļ.

Ţĥé đéƒàüļţ demo þŕöṽîđéŕ îš àñ öƒƒļîñé, đéţéŕḿîñîšţîç šţüƃ, šö ţĥé ƒüļļ þîþéļîñé ŵöŕķš öüţ öƒ ţĥé ƃöẋ ŵîţĥ ñö ķéý. Šéţ à ŕéàļ þŕöṽîđéŕ îñ .env (šéé .env.example) ƒöŕ ŕéàļ đŕàƒţš, ƒöŕ éẋàḿþļé:

BOWRAIN_PLATFORM_PROVIDER=gemini
BOWRAIN_PLATFORM_MODEL=gemini-3.5-flash
GEMINI_API_KEY=AIza...

Đŕîṽîñĝ îţ ŵîţĥ ţĥé kapi þļüĝîñ

Þöîñţ --server àţ ŵĥîçĥéṽéŕ éñţŕý þöîñţ ýöüŕ ḿöđé éẋþöšéš (http://localhost:8080 ƒöŕ šţàñđàļöñé, https://bowrain.mymac ƒöŕ ţĥé ŢĻŠ ḿöđéš):

mkdir myapp && cd myapp
kapi init --server http://localhost:8080 --anonymous --source en --targets fr,de
echo '{"greeting":"Hello"}' > en.json
kapi add en.json
kapi up # catch fr,de up on the server: push → catch up → pull
cat fr.json # the drafted catalog

kapi init šçàƒƒöļđš ţĥé þŕöĵéçţ; ŵĥéñ --server îš ĝîṽéñ, ţĥé bowrain þļüĝîñ çöñţŕîƃüţéš ţĥé šéŕṽéŕ çöññéçţîöñ: îţ ŵŕîţéš ţĥé bowrain: ƃļöçķ àñđ šţöŕéš à çļàîḿ ţöķéñ (--anonymous), öŕ çŕéàţéš ţĥé þŕöĵéçţ üñđéŕ ýöüŕ àççöüñţ ŵĥéñ ýöü àŕé šîĝñéđ îñ (kapi auth login), öŕ àţţàçĥéš ţö àñ éẋîšţîñĝ öñé ŵîţĥ --project <id>. Îţ îš îđéḿþöţéñţ: ŕüññîñĝ kapi init --server … îñšîđé àñ éẋîšţîñĝ ļöçàļ kapi þŕöĵéçţ çöññéçţš îţ ţö bowrain, àñđ ļéàṽéš àñ àļŕéàđý-çöññéçţéđ þŕöĵéçţ üñţöüçĥéđ.

Ţĥé çüšţöḿ Ķéýçļöàķ ļöĝîñ ţĥéḿé îš öþţîöñàļ; ļöĝîñ ŕéñđéŕš ŵîţĥ ţĥé đéƒàüļţ ţĥéḿé üñţîļ ýöü ƃüîļđ îţ ŵîţĥ make keycloak-theme. Ƒöŕ ţĥé ñö-àüţĥ þàţĥ àƃöṽé (--anonymous), ñö Ķéýçļöàķ ļöĝîñ îš îñṽöļṽéđ àţ àļļ.