Skip to content

Commit e5215ca

Browse files
authored
Merge pull request #1527 from mnfst/chore/deprecate-manifest-plugin
chore: deprecate manifest OpenClaw plugin in favor of Docker
2 parents a775793 + 6610070 commit e5215ca

File tree

5 files changed

+149
-57
lines changed

5 files changed

+149
-57
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"manifest": patch
3+
---
4+
5+
Deprecate the self-hosted `manifest` plugin. The embedded-server plugin is no longer maintained — use the Docker image instead (`docker compose -f docker/docker-compose.yml up -d`). Existing installations keep working but now print a deprecation warning at startup. The plugin README is now checked into the repo directly instead of being overwritten from the root README at publish time.
Lines changed: 112 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,121 @@
1-
# manifest
2-
3-
Self-hosted [Manifest](https://manifest.build) plugin for [OpenClaw](https://openclaw.ai) — runs the full LLM router locally with an embedded NestJS server, SQLite database, and dashboard.
4-
5-
## Install
6-
7-
```bash
8-
openclaw plugins install manifest
9-
openclaw gateway restart
10-
```
11-
12-
Dashboard opens at **http://127.0.0.1:2099**. The plugin auto-generates an API key, starts the embedded server, and registers `manifest/auto` as a model. No configuration needed.
1+
<!--
2+
This file mirrors the root README.md of the monorepo.
3+
Keep them in sync when updating: changes to either should be applied to both.
4+
The deprecation banner at the top of this file is the only intentional
5+
divergence — everything below it is a verbatim copy of the root README.
6+
-->
7+
8+
> [!WARNING]
9+
> **This package is deprecated.** The `manifest` OpenClaw plugin is no longer maintained. For self-hosting, use the [Manifest Docker Image](https://hub.docker.com/r/manifestdotbuild/manifest) instead. See the [Self-hosted (Docker)](#self-hosted-docker) section below.
10+
11+
---
12+
13+
<p align="center">
14+
<picture>
15+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/mnfst/manifest/HEAD/.github/assets/logo-white.svg" />
16+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/mnfst/manifest/HEAD/.github/assets/logo-dark.svg" />
17+
<img src="https://raw.githubusercontent.com/mnfst/manifest/HEAD/.github/assets/logo-dark.svg" alt="Manifest" height="53" title="Manifest"/>
18+
</picture>
19+
</p>
20+
<p align="center">
21+
Affordable Personal AI
22+
</p>
23+
24+
![manifest-gh](https://github.com/user-attachments/assets/7dd74fc2-f7d6-4558-a95a-014ed754a125)
25+
26+
<p align="center">
27+
<span><img src="https://img.shields.io/badge/status-beta-yellow" alt="beta" /></span>
28+
&nbsp;
29+
<a href="https://github.com/mnfst/manifest/stargazers"><img src="https://img.shields.io/github/stars/mnfst/manifest?style=flat" alt="GitHub stars" /></a>
30+
&nbsp;
31+
<a href="https://www.npmjs.com/package/manifest"><img src="https://img.shields.io/npm/v/manifest?color=cb3837&label=npm" alt="npm version" /></a>
32+
&nbsp;
33+
<a href="https://www.npmjs.com/package/manifest"><img src="https://img.shields.io/npm/dw/manifest?color=cb3837" alt="npm downloads" /></a>
34+
&nbsp;
35+
<a href="https://hub.docker.com/r/manifestdotbuild/manifest"><img src="https://img.shields.io/docker/pulls/manifestdotbuild/manifest?color=2496ED&label=docker%20pulls" alt="Docker pulls" /></a>
36+
&nbsp;
37+
<a href="https://github.com/mnfst/manifest/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/mnfst/manifest/ci.yml?branch=main&label=CI" alt="CI status" /></a>
38+
&nbsp;
39+
<a href="https://app.codecov.io/gh/mnfst/manifest"><img src="https://img.shields.io/codecov/c/github/mnfst/manifest?label=coverage" alt="Codecov" /></a>
40+
&nbsp;
41+
<a href="LICENSE"><img src="https://img.shields.io/github/license/mnfst/manifest?color=blue" alt="license" /></a>
42+
&nbsp;
43+
<a href="https://discord.gg/FepAked3W7"><img src="https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white" alt="Discord" /></a>
44+
</p>
45+
46+
<p align="center">
47+
<a href="https://trendshift.io/repositories/12890" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12890" alt="mnfst%2Fmanifest | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
48+
</p>
49+
50+
## What is Manifest?
51+
52+
Manifest is a smart model router for Personal AI Agents like OpenClaw or Hermes. It sits between your agent and your LLM providers, scores each request, and routes it to the cheapest model that can handle it. Simple questions go to fast, cheap models. Hard problems go to expensive ones. You save money without thinking about it.
53+
54+
- Route requests to the right model: Cut costs up to 70%
55+
- Automatic fallbacks: If a model fails, the next one picks up
56+
- Set limits: Don't exceed your budget
57+
58+
## Quick start
59+
60+
### Cloud version
61+
62+
Go to [app.manifest.build](https://app.manifest.build) and follow the guide.
63+
64+
### Self-hosted (Docker)
65+
66+
Our <a href="https://hub.docker.com/r/manifestdotbuild/manifest">Manifest Docker Image</a> allows you to self-host Manifest router in your own infrastructure.
67+
68+
> [!WARNING]
69+
> Our [OpenClaw plugin](https://www.npmjs.com/package/manifest) is deprecated, for self-hosting we suggest using Docker instead.
1370
1471
## How it works
1572

16-
On gateway startup the plugin:
17-
18-
1. Generates a persistent API key (`mnfst_local_*`) stored in `~/.openclaw/manifest/config.json`
19-
2. Starts the embedded NestJS backend with SQLite at `~/.openclaw/manifest/manifest.db`
20-
3. Injects `manifest` as a provider into `~/.openclaw/openclaw.json`
21-
4. Serves the dashboard from the bundled frontend static files
22-
23-
If the server is already running on the configured port, the plugin reuses it instead of starting a new instance.
24-
25-
## Configuration
26-
27-
| Setting | Type | Default | Description |
28-
|---------|------|---------|-------------|
29-
| `port` | `number` | `2099` | Embedded server port |
30-
| `host` | `string` | `127.0.0.1` | Bind address |
73+
Every request to `manifest/auto` goes through a 23-dimension scoring algorithm (runs in under 2ms). The scorer picks a tier (simple, standard, complex, or reasoning) and routes to the best model in that tier from your connected providers.
74+
75+
All routing data (tokens, costs, model, duration) is recorded automatically. You see it in the dashboard. No extra setup.
76+
77+
## Manifest vs OpenRouter
78+
79+
| | Manifest | OpenRouter |
80+
| ------------ | -------------------------------------------- | --------------------------------------------------- |
81+
| Architecture | Local. Your requests, your providers | Cloud proxy. All traffic goes through their servers |
82+
| Cost | Free | 5% fee on every API call |
83+
| Source code | MIT, fully open | Proprietary |
84+
| Data privacy | Metadata only (cloud) or fully local | Prompts and responses pass through a third party |
85+
| Transparency | Open scoring. You see why a model was chosen | No visibility into routing decisions |
86+
87+
## Supported providers
88+
89+
Works with 300+ models across these providers:
90+
91+
| Provider | Models |
92+
| ------------------------------------------------------------------------------ | -------------------------------------------------------------------- |
93+
| [OpenAI](https://platform.openai.com/) | `gpt-5.3`, `gpt-4.1`, `o3`, `o4-mini` + 54 more |
94+
| [Anthropic](https://www.anthropic.com/) | `claude-opus-4-6`, `claude-sonnet-4.5`, `claude-haiku-4.5` + 14 more |
95+
| [Google Gemini](https://ai.google.dev/) | `gemini-2.5-pro`, `gemini-2.5-flash`, `gemini-3-pro` + 19 more |
96+
| [DeepSeek](https://www.deepseek.com/) | `deepseek-chat`, `deepseek-reasoner` + 11 more |
97+
| [xAI](https://x.ai/) | `grok-4`, `grok-3`, `grok-3-mini` + 8 more |
98+
| [Mistral AI](https://mistral.ai/) | `mistral-large`, `codestral`, `devstral` + 26 more |
99+
| [Qwen (Alibaba)](https://www.alibabacloud.com/en/solutions/generative-ai/qwen) | `qwen3-235b`, `qwen3-coder`, `qwq-32b` + 42 more |
100+
| [MiniMax](https://www.minimax.io/) | `minimax-m2.5`, `minimax-m1`, `minimax-m2` + 5 more |
101+
| [Kimi (Moonshot)](https://kimi.ai/) | `kimi-k2`, `kimi-k2.5` + 3 more |
102+
| [Amazon Nova](https://aws.amazon.com/ai/nova/) | `nova-pro`, `nova-lite`, `nova-micro` + 5 more |
103+
| [Z.ai (Zhipu)](https://z.ai/) | `glm-5`, `glm-4.7`, `glm-4.5` + 5 more |
104+
| [OpenRouter](https://openrouter.ai/) | 300+ models from all providers |
105+
| [Ollama](https://ollama.com/) | Run any model locally (Llama, Gemma, Mistral, ...) |
106+
| Custom providers | Any provider with an OpenAI-compatible API endpoint |
31107

32-
```bash
33-
openclaw config set plugins.entries.manifest.config.port 3099
34-
openclaw gateway restart
35-
```
36-
37-
## Cloud mode
38-
39-
For cloud routing without the embedded server, use the lightweight provider plugin instead:
40-
41-
```bash
42-
openclaw plugins install manifest-model-router
43-
openclaw providers setup manifest-model-router
44-
```
45-
46-
See [manifest-model-router](https://www.npmjs.com/package/manifest-model-router).
47-
48-
## Data
49-
50-
Telemetry, dashboard, and configuration data stays on your machine. LLM requests are forwarded to your configured providers (e.g. OpenAI, Anthropic) as part of normal routing.
108+
## Contributing
51109

52-
- **Database**: `~/.openclaw/manifest/manifest.db` (SQLite)
53-
- **API key**: `~/.openclaw/manifest/config.json`
54-
- **Provider config**: `~/.openclaw/openclaw.json`
110+
Manifest is open source under the [MIT license](LICENSE). See [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup, architecture, and workflow. Join the conversation on [Discord](https://discord.gg/FepAked3W7).
55111

56-
## Contributing
112+
## Quick links
57113

58-
This package lives at `packages/openclaw-plugins/manifest/` in the [mnfst/manifest](https://github.com/mnfst/manifest) monorepo.
114+
- [GitHub](https://github.com/mnfst/manifest)
115+
- [Docs](https://manifest.build/docs)
116+
- [Discord](https://discord.com/invite/FepAked3W7)
117+
- [Discussions](https://github.com/mnfst/manifest/discussions)
59118

60-
```bash
61-
npm run build --workspace=packages/openclaw-plugins/manifest
62-
npm test --workspace=packages/openclaw-plugins/manifest
63-
```
119+
## License
64120

65-
**Note:** On `npm publish`, this README is replaced by the root project README.
121+
[MIT](LICENSE)

packages/openclaw-plugins/manifest/__tests__/register.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,31 @@ describe("manifest plugin registration", () => {
111111
expect.stringContaining("Loading embedded server"),
112112
);
113113
});
114+
115+
it("logs deprecation warning during registration", () => {
116+
const api = makeApi();
117+
plugin.register(api);
118+
119+
expect(api.logger.warn).toHaveBeenCalledWith(
120+
expect.stringContaining("deprecated"),
121+
);
122+
});
123+
124+
it("falls back to logger.info for deprecation warning when logger.warn is undefined", () => {
125+
const api = {
126+
pluginConfig: {},
127+
config: {},
128+
logger: {
129+
info: jest.fn(),
130+
debug: jest.fn(),
131+
error: jest.fn(),
132+
},
133+
registerService: jest.fn(),
134+
};
135+
plugin.register(api);
136+
137+
expect(api.logger.info).toHaveBeenCalledWith(
138+
expect.stringContaining("deprecated"),
139+
);
140+
});
114141
});

packages/openclaw-plugins/manifest/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"scripts": {
3838
"prebuild": "rm -rf dist public",
3939
"build": "tsx build.ts && tsc -p tsconfig.server.json && node scripts/copy-assets.js",
40-
"prepublishOnly": "npm run build && cp ../../../README.md README.md",
40+
"prepublishOnly": "npm run build",
4141
"typecheck": "tsc --noEmit",
4242
"test": "jest"
4343
},

packages/openclaw-plugins/manifest/src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ module.exports = {
2323
const port = typeof inner.port === 'number' && inner.port > 0 ? inner.port : 2099;
2424
const host = typeof inner.host === 'string' && inner.host.length > 0 ? inner.host : '127.0.0.1';
2525

26+
const warnFn = logger.warn ?? logger.info;
27+
warnFn(
28+
'[manifest] This package is deprecated. Use the Docker image instead: https://github.com/mnfst/manifest#readme',
29+
);
2630
logger.info('[🦚 Manifest] Loading embedded server...');
2731

2832
registerLocalMode(api, port, host, logger);

0 commit comments

Comments
 (0)