Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
5f0c407
refactor(frontend): remove the SaaS layer from the dashboard
patrickbrandao Oct 10, 2026
d4abfb2
refactor(backend): remove billing, Stripe and plan limits
patrickbrandao Oct 10, 2026
b01370f
chore: merge feat/12-remove-saas-dashboard into feat/14 to stack on #51
patrickbrandao Oct 11, 2026
071ae49
refactor(frontend): remove phone-home and Autofix from the dashboard
patrickbrandao Oct 11, 2026
dd0ad62
fix(frontend): opt new harnesses out of legacy Autofix until #16
patrickbrandao Oct 11, 2026
64f31b4
refactor(backend): remove waitlist, CRM, Gemini Free, free models, Gi…
patrickbrandao Oct 11, 2026
4b6dc2f
chore: merge #13 branch to stack #16 on #13 and #15
patrickbrandao Oct 11, 2026
7dfb718
feat(backend)!: remove Autofix and the Phoenix healer from the backend
patrickbrandao Oct 11, 2026
a07cccf
feat(backend)!: remove phone-home from the backend and the CLI
patrickbrandao Oct 11, 2026
d168f73
fix(cli): default to a local gateway instead of Manifest Cloud
patrickbrandao Oct 11, 2026
ce9fd33
Merge origin/main into feat/12-remove-saas-dashboard
patrickbrandao Oct 11, 2026
45a3af8
Merge the final #51 head into feat/14-remove-billing-backend
patrickbrandao Oct 11, 2026
061fbe1
Merge origin/main into feat/14-remove-billing-backend
patrickbrandao Oct 11, 2026
1213ffe
test(backend): route the billing drop e2e through the database guard
patrickbrandao Oct 11, 2026
56307a4
Merge the final #52 head into feat/15-remove-saas-backend
patrickbrandao Oct 11, 2026
a9a58eb
Merge origin/main into feat/15-remove-saas-backend
patrickbrandao Oct 11, 2026
498de23
test(backend): route the SaaS drop e2e through the database guard
patrickbrandao Oct 11, 2026
2538eb1
Merge the final #60 head into feat/16-remove-autofix-backend
patrickbrandao Oct 11, 2026
21ab015
test(backend): route the Autofix drop e2e through the database guard
patrickbrandao Oct 11, 2026
5eef655
Merge origin/main into feat/16-remove-autofix-backend
patrickbrandao Oct 11, 2026
631fda9
Merge feat/16-remove-autofix-backend head 5eef655 into feat/17-remove…
patrickbrandao Oct 11, 2026
d536bce
test(backend): route the install-metadata drop e2e through the databa…
patrickbrandao Oct 11, 2026
bfe9f1d
Merge origin/main into feat/17-remove-phonehome-backend
patrickbrandao Oct 11, 2026
8aa729a
test(backend): escape host names fully in the egress spec patterns
patrickbrandao Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ cd packages/backend && NODE_OPTIONS='-r dotenv/config' npx nest start --watch
npm run dev
```

The frontend runs on `http://localhost:3000` and proxies API requests to the backend on `http://localhost:3001`. The Wingman drawer in the bottom-right (FAB or `⌘/Ctrl+Shift+W`) embeds the hosted SPA at `https://wingman.manifest.build` — no local setup required. It only renders in dev mode and is stripped from production bundles.
The frontend runs on `http://localhost:3000` and proxies API requests to the backend on `http://localhost:3001`.

`npm run dev` is filtered to exactly `manifest-frontend` — adding a new workspace with a `dev` script will not silently join the dev set.

Expand Down
1 change: 0 additions & 1 deletion deploy/apple-containers/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,6 @@ cmd_up() {
--env REQUEST_RECORDING_S3_ACCESS_KEY_ID="${REQUEST_RECORDING_S3_ACCESS_KEY_ID:-}" \
--env REQUEST_RECORDING_S3_SECRET_ACCESS_KEY="${REQUEST_RECORDING_S3_SECRET_ACCESS_KEY:-}" \
--env REQUEST_RECORDING_S3_FORCE_PATH_STYLE="${REQUEST_RECORDING_S3_FORCE_PATH_STYLE:-false}" \
--env MANIFEST_TELEMETRY_DISABLED="${MANIFEST_TELEMETRY_DISABLED:-0}" \
manifestdotbuild/manifest:latest

echo "waiting for manifest to become healthy..."
Expand Down
2 changes: 0 additions & 2 deletions deploy/easypanel/TUTORIAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ DB_POOL_MAX=10
AUTH_DB_POOL_MAX=5
REQUEST_RECORDING_STORAGE=filesystem
REQUEST_RECORDING_FILESYSTEM_PATH=/data/request-recordings
MANIFEST_TELEMETRY_DISABLED=0
```

Generate secrets locally:
Expand Down Expand Up @@ -107,7 +106,6 @@ Before publishing a template, smoke test the full first-run flow:
- Back up the PostgreSQL service through Easypanel or your server provider.
- Use a real HTTPS domain before enabling OAuth providers.
- Keep `BETTER_AUTH_SECRET` and `MANIFEST_ENCRYPTION_KEY` as separate values.
- Set `MANIFEST_TELEMETRY_DISABLED=1` to disable anonymous self-hosted telemetry.
- If you deploy more than one Manifest replica, lower database pool sizes or upgrade PostgreSQL connection capacity.

Relevant Easypanel docs:
Expand Down
1 change: 0 additions & 1 deletion deploy/easypanel/template/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ export function generate(input: Input): Output {
"AUTH_DB_POOL_MAX=5",
"REQUEST_RECORDING_STORAGE=filesystem",
"REQUEST_RECORDING_FILESYSTEM_PATH=/data/request-recordings",
`MANIFEST_TELEMETRY_DISABLED=${input.telemetryDisabled || "0"}`,
].join("\n"),
mounts: [
{
Expand Down
14 changes: 1 addition & 13 deletions deploy/easypanel/template/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ description:
instructions:
Open the generated domain after deployment and create the first admin account.
Fresh installs redirect to /setup. Use a real HTTPS domain before configuring
OAuth callback URLs or production authentication flows. Anonymous telemetry is
enabled by default and can be disabled from the template options.
OAuth callback URLs or production authentication flows.
changeLog:
- date: 2026-08-06
description: Persist compressed request recordings in a dedicated app volume
Expand Down Expand Up @@ -45,17 +44,6 @@ schema:
type: string
title: Database Service Name
default: manifest-db
telemetryDisabled:
type: string
title: Anonymous Telemetry
default: "0"
oneOf:
- enum:
- "0"
title: Enabled (default)
- enum:
- "1"
title: Disabled
benefits:
- title: One endpoint for AI agents
description:
Expand Down
1 change: 0 additions & 1 deletion deploy/fly/TUTORIAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ fly logs --app <your-fly-app>
- Tigris is shared across Machines, so recording storage remains consistent if you scale the Manifest app horizontally.
- For production, choose a larger Postgres configuration or Fly Managed Postgres instead of the small script default.
- Add a custom domain before configuring OAuth callback URLs.
- Set `MANIFEST_TELEMETRY_DISABLED=1` as a Fly secret if you want to disable anonymous self-hosted telemetry.
- Destroy the app, database, and recording bucket when testing is done. Export any recordings you need before destroying the bucket:

```bash
Expand Down
26 changes: 5 additions & 21 deletions docker/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -178,25 +178,9 @@ BETTER_AUTH_SECRET=
# AGENT_USAGE_DAILY_RUN_BUDGET_MS=5000


# ─── Error monitoring (optional) ───────────────────────────────────────────
# ─── Browser access from other origins (optional) ──────────────────────────
#
# Sentry stays completely uninitialised unless SENTRY_DSN is set. Error
# capture only — performance tracing, request bodies, headers, and user data
# are all disabled in code.
# SENTRY_DSN=
# SENTRY_ENVIRONMENT=production
# SENTRY_RELEASE=


# ─── Anonymous usage telemetry (optional, opt-out) ─────────────────────────
#
# Manifest sends one small anonymous usage report per 24h so the maintainers
# can see how the project is being used. Aggregates only — no prompts, no
# message contents, no API keys, nothing that identifies a user. Full field
# list + payload spec: https://manifest.build/llm-gateway/docs/self-hosted/#telemetry
#
# To disable, uncomment the line below.
# MANIFEST_TELEMETRY_DISABLED=1

# Or keep telemetry on and send it to your own collector instead.
# TELEMETRY_ENDPOINT=https://telemetry.example.internal/v1/report
# The dashboard is same-origin, so no other browser origin may call the
# gateway by default. List extra origins here (comma-separated) to allow a
# browser tool you run elsewhere.
# THINKER_CORS_ORIGINS=https://tools.example.internal
21 changes: 5 additions & 16 deletions docker/DOCKER_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,6 @@ docker compose up -d

Database migrations run automatically on boot, no manual steps. Your data in the `pgdata` volume is preserved across upgrades. Pin to a specific major version (e.g. `manifestdotbuild/manifest:6`) in `docker-compose.yml` if you want control over when major upgrades happen.

The dashboard checks GitHub once a day for the latest release and shows a "new version available" badge linking to the [changelog](https://manifest.build/changelog/). The check only reads the public release list and sends nothing about your install. To turn it off (for example on an air-gapped host), set `MANIFEST_UPDATE_CHECK_DISABLED=1` in `.env`.

## Backup & persistence

PostgreSQL state lives in the `mnfst_pgdata` named volume mounted at `/var/lib/postgresql/data` in the `postgres` service. The Compose install also stores local request recordings in the `mnfst_recordings` volume mounted at `/data/request-recordings`; those recordings are not included in a PostgreSQL dump. For ephemeral hosts or multiple instances, configure durable S3-compatible storage instead.
Expand Down Expand Up @@ -416,9 +414,6 @@ sets this automatically).
| `MANIFEST_DISABLE_HSTS` | No | unset | Set `1` to silence the boot warning about serving over plain HTTP on a LAN |
| `THROTTLE_LIMIT` / `THROTTLE_TTL` | No | `100` / `60000` | Rate limit: requests per window, window in ms |
| `DB_POOL_MAX` / `AUTH_DB_POOL_MAX` | No | `10` / `5` | PostgreSQL pool sizes (app pool, Better Auth pool) |
| `SENTRY_DSN` | No | unset | Opt-in error monitoring. Sentry is not initialised unless set |
| `MANIFEST_TELEMETRY_DISABLED` | No | `0` | Set `1` to disable anonymous usage telemetry |
| `TELEMETRY_ENDPOINT` | No | `https://telemetry.manifest.build/v1/report` | Send the usage report to your own collector instead |

`NODE_ENV` and `SEED_DATA` are deliberately fixed by the compose file and are
not knobs here: the image is a production artifact, and the demo-data seeder
Expand All @@ -428,18 +423,12 @@ first-run setup wizard to create your admin account.
Full env var reference:
[manifest.build/llm-gateway/docs/reference/environment-variables](https://manifest.build/llm-gateway/docs/reference/environment-variables/)

## Anonymous usage telemetry

Manifest sends a small anonymous usage report once per 24h so the maintainers
can see how the project is being used. Aggregates only — no prompts, no
message contents, no API keys, nothing that identifies a user. The report is
a random install UUID (generated once, no PII), the Manifest version, and
aggregate counters grouped by provider, routing tier, auth type, agent
platform, OS, and arch.
## No telemetry

To disable, set `MANIFEST_TELEMETRY_DISABLED=1` in your `.env` file and
restart the container. The full field list is published at
[manifest.build/llm-gateway/docs/self-hosted#telemetry](https://manifest.build/llm-gateway/docs/self-hosted/#telemetry).
The container makes no outbound call of its own: no usage telemetry, no update
check, no error reporting. It only reaches the inference providers you
configure and the public model catalogs (openrouter.ai, models.dev and, for
OpenCode Go, raw.githubusercontent.com).

## Links

Expand Down
4 changes: 0 additions & 4 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,6 @@ COPY --from=build --chown=nonroot:nonroot /app/packages/backend/dist packages/ba
COPY --from=build --chown=nonroot:nonroot /app/packages/frontend/dist packages/frontend/dist
COPY --chown=nonroot:nonroot packages/shared/package.json packages/shared/
COPY --chown=nonroot:nonroot packages/backend/package.json packages/backend/
# The telemetry sender reads the canonical Manifest version from this
# file at boot. Without it, readManifestVersion() falls back to "unknown"
# and the sender ends up posting invalid semver to the ingest endpoint.
COPY --chown=nonroot:nonroot packages/manifest/package.json packages/manifest/

EXPOSE 2099

Expand Down
17 changes: 2 additions & 15 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,27 +148,14 @@ services:
# anywhere reachable from the internet.
- MANIFEST_DISABLE_HSTS=${MANIFEST_DISABLE_HSTS:-}
# Extra browser origins allowed to call the gateway (comma-separated).
- WINGMAN_CORS_ORIGINS=${WINGMAN_CORS_ORIGINS:-}
# Error monitoring (opt-in). Sentry stays completely uninitialised
# unless SENTRY_DSN is set.
- SENTRY_DSN=${SENTRY_DSN:-}
- SENTRY_ENVIRONMENT=${SENTRY_ENVIRONMENT:-}
- SENTRY_RELEASE=${SENTRY_RELEASE:-}
# Anonymous usage telemetry (opt-out). Set MANIFEST_TELEMETRY_DISABLED=1
# to disable, or point TELEMETRY_ENDPOINT at your own collector. See
# https://manifest.build/llm-gateway/docs/self-hosted/#telemetry for the payload shape.
- MANIFEST_TELEMETRY_DISABLED=${MANIFEST_TELEMETRY_DISABLED:-0}
- TELEMETRY_ENDPOINT=${TELEMETRY_ENDPOINT:-}
# None by default: the dashboard is same-origin.
- THINKER_CORS_ORIGINS=${THINKER_CORS_ORIGINS:-}
# Daily Harness usage rollup. Reads stay off until backfill parity passes.
- AGENT_USAGE_DAILY_WORKER=${AGENT_USAGE_DAILY_WORKER:-}
- AGENT_USAGE_DAILY_READS=${AGENT_USAGE_DAILY_READS:-}
- AGENT_USAGE_DAILY_READ_TENANTS=${AGENT_USAGE_DAILY_READ_TENANTS:-}
- AGENT_USAGE_DAILY_BATCH_SIZE=${AGENT_USAGE_DAILY_BATCH_SIZE:-}
- AGENT_USAGE_DAILY_RUN_BUDGET_MS=${AGENT_USAGE_DAILY_RUN_BUDGET_MS:-}
# Update check (opt-out). Once a day the dashboard asks GitHub for the
# latest Manifest release so it can show a "new version available"
# badge. Set MANIFEST_UPDATE_CHECK_DISABLED=1 on air-gapped installs.
- MANIFEST_UPDATE_CHECK_DISABLED=${MANIFEST_UPDATE_CHECK_DISABLED:-0}
depends_on:
postgres:
condition: service_healthy
Expand Down
Loading
Loading