App: Formbricks
Repo: https://github.com/formbricks/formbricks
Docs: https://formbricks.com/docs
Open-source survey and experience-management platform — build in-app, link, and website surveys; analyse responses with AI insights.
How to do this: follow Authoring catalog apps with an agent. Paste the prompt, append the inputs above, run it inside the malmo repo.
Gate findings (static screen, commit 9291f255c100):
GO (degraded) — four Gate D limitations to record in the manifest.
Compose architecture (7 services):
pgvector/pgvector:pg18 — Postgres sidecar at elected uid 999 (brings pgvector extension; do NOT swap to managed Postgres — the migration requires pgvector and managed images don't have it)
valkey/valkey — Redis-compatible cache sidecar (standard pattern)
formbricks-migrate — init container (node migration script, exits cleanly)
ghcr.io/formbricks/formbricks:latest — main Next.js app, runs as nextjs uid 1001 (clean)
hub-migrate — init container for Hub (goose + river migrations)
ghcr.io/formbricks/hub:latest — Formbricks Hub Go API, required
cubejs/cube:v1.6.6 — semantic analytics layer, requires ./cube/cube.js and ./cube/schema/ config files mounted read-only (must be bundled in the catalog entry)
Key adapt notes:
- Postgres sidecar: set
user: "999:999" so the official entrypoint skips chown+gosu — no stripped caps needed
NEXTAUTH_SECRET, ENCRYPTION_KEY, CRON_SECRET, HUB_API_KEY, CUBEJS_API_SECRET all map to secrets: cleanly
WEBAPP_URL / NEXTAUTH_URL → MALMO_APP_URL
- SMTP vars →
MALMO_MAIL_*; declare mail: {optional: true}
- Boot-time: confirm SAML DB setup (
create-saml-database.js) completes against the pgvector sidecar or fails gracefully when SAML is unconfigured
Gate D limitations to record:
- Link surveys / external reachability — sharing survey URLs with respondents outside the LAN is broken until remote access ships; in-app and embedded surveys work on LAN (
no-public-url, open)
- OAuth callbacks link-local —
WEBAPP_URL/NEXTAUTH_URL injected as .local mDNS; OAuth logins and email verification links break off-LAN (app-url-injection, same class as docuseal, open)
- SMTP optional — maps to
MALMO_MAIL_*; email verification and password reset disabled by default without SMTP (smtp-relay, mitigated)
- Third-party integrations — Google Sheets, Airtable, Slack, Notion, social SSO (GitHub, Google, Azure AD, OIDC, SAML), EE enterprise license key all require operator-supplied env vars with no in-app config surface (
operator-env-config, open)
Done when:
App: Formbricks
Repo: https://github.com/formbricks/formbricks
Docs: https://formbricks.com/docs
Open-source survey and experience-management platform — build in-app, link, and website surveys; analyse responses with AI insights.
How to do this: follow Authoring catalog apps with an agent. Paste the prompt, append the inputs above, run it inside the malmo repo.
Gate findings (static screen, commit 9291f255c100):
GO (degraded) — four Gate D limitations to record in the manifest.
Compose architecture (7 services):
pgvector/pgvector:pg18— Postgres sidecar at elected uid 999 (brings pgvector extension; do NOT swap to managed Postgres — the migration requires pgvector and managed images don't have it)valkey/valkey— Redis-compatible cache sidecar (standard pattern)formbricks-migrate— init container (node migration script, exits cleanly)ghcr.io/formbricks/formbricks:latest— main Next.js app, runs asnextjsuid 1001 (clean)hub-migrate— init container for Hub (goose + river migrations)ghcr.io/formbricks/hub:latest— Formbricks Hub Go API, requiredcubejs/cube:v1.6.6— semantic analytics layer, requires./cube/cube.jsand./cube/schema/config files mounted read-only (must be bundled in the catalog entry)Key adapt notes:
user: "999:999"so the official entrypoint skips chown+gosu — no stripped caps neededNEXTAUTH_SECRET,ENCRYPTION_KEY,CRON_SECRET,HUB_API_KEY,CUBEJS_API_SECRETall map tosecrets:cleanlyWEBAPP_URL/NEXTAUTH_URL→MALMO_APP_URLMALMO_MAIL_*; declaremail: {optional: true}create-saml-database.js) completes against the pgvector sidecar or fails gracefully when SAML is unconfiguredGate D limitations to record:
no-public-url,open)WEBAPP_URL/NEXTAUTH_URLinjected as.localmDNS; OAuth logins and email verification links break off-LAN (app-url-injection, same class as docuseal,open)MALMO_MAIL_*; email verification and password reset disabled by default without SMTP (smtp-relay,mitigated)operator-env-config,open)Done when:
catalog/<id>/manifest.ymlandcatalog/<id>/compose.ymlexistgo run ./cmd/malmo manifest check catalog/<id>/manifest.ymlpasses — schema + admission in one (run it yourself, don't trust the agent's claim)docker compose -f catalog/<id>/compose.yml config -qpassesgo run ./cmd/malmo manifest resolve catalog/<id>/manifest.ymlrun to fill image digests/sizes — orimages:omitted with a note if the registry was unreachableCloses #<N>