- Updated: March 17, 2026
- 4 min read
Deploy OpenClaw Rating API on the Edge for Real‑Time Personalization
# Deploy OpenClaw Rating API on the Edge for Real‑Time Personalization
*Senior‑engineer guide* – This article walks you through exporting rating data from OpenClaw, setting up the Python client, integrating the service with Moltbook, and finally deploying the rating service on edge nodes. By the end you will have a fully functional, low‑latency personalization layer that runs at the edge of your infrastructure.
—
## 1. Exporting Rating Data from OpenClaw
OpenClaw stores user‑generated ratings in a PostgreSQL database. To make the data consumable by the edge rating service we need to export it as a compact JSONL (newline‑delimited JSON) file.
bash
# Create a read‑only role for export
psql -U postgres -c “CREATE ROLE openclaw_export LOGIN PASSWORD ‘exportPass’;”
psql -U postgres -c “GRANT SELECT ON ratings TO openclaw_export;”
# Export using COPY to JSONL
psql -U openclaw_export -d openclaw -c “\copy (SELECT jsonb_build_object(‘user_id’, user_id, ‘item_id’, item_id, ‘rating’, rating, ‘timestamp’, ts) FROM ratings) TO STDOUT WITH (FORMAT csv, DELIMITER E’\n’)” > ratings.jsonl
> **Tip** – Keep the export script in a CI job that runs every 5 minutes. The resulting `ratings.jsonl` can be pushed to an object store (e.g., S3) that your edge nodes poll.
—
## 2. Setting Up the Python Client
The edge rating service ships with a thin Python client that streams the exported JSONL and builds an in‑memory collaborative‑filtering model.
python
import json
import pathlib
from openclaw_client import RatingModel
DATA_PATH = pathlib.Path(‘/data/ratings.jsonl’)
model = RatingModel()
with DATA_PATH.open(‘r’) as f:
for line in f:
record = json.loads(line)
model.add_interaction(
user_id=record[‘user_id’],
item_id=record[‘item_id’],
rating=record[‘rating’],
timestamp=record[‘timestamp’]
)
# Persist the model for fast start‑up
model.save(‘/var/lib/openclaw/model.pkl’)
The client uses **implicit ALS** under the hood, but you can swap the algorithm by passing a custom `engine` argument.
—
## 3. Integrating with Moltbook
Moltbook is UBOS’s headless CMS that powers the front‑end UI. To fetch real‑time recommendations we expose a tiny Flask endpoint that Moltbook can call via its *external‑service* hook.
python
from flask import Flask, request, jsonify
from openclaw_client import RatingModel
app = Flask(__name__)
model = RatingModel.load(‘/var/lib/openclaw/model.pkl’)
@app.route(‘/recommendations’, methods=[‘GET’])
def recommendations():
user_id = request.args.get(‘user’)
top_n = int(request.args.get(‘n’, 10))
recs = model.recommend(user_id, k=top_n)
return jsonify([{‘item_id’: r.item_id, ‘score’: r.score} for r in recs])
if __name__ == ‘__main__’:
app.run(host=’0.0.0.0′, port=8080)
In Moltbook, add an *External Service* block:
yaml
type: external-service
url: http://:8080/recommendations?user=${userId}&n=10
method: GET
The block will inject the recommendation payload directly into your page templates.
—
## 4. Deploying the Rating Service on Edge Nodes
UBOS provides a lightweight container runtime (`ubosctl`) that can run on any x86_64 or ARM edge device. The deployment consists of three containers:
1. **`openclaw-exporter`** – pulls the latest `ratings.jsonl` from S3.
2. **`openclaw-client`** – builds the in‑memory model (Python script above).
3. **`openclaw-api`** – Flask service exposing `/recommendations`.
### 4.1 Dockerfile (single‑stage for simplicity)
dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8080
CMD [“python”, “api.py”]
### 4.2 UBOS Manifest
yaml
name: openclaw-edge
version: 1.0.0
services:
exporter:
image: ubos/openclaw-exporter:latest
env:
S3_BUCKET: my-openclaw-bucket
S3_KEY: ratings.jsonl
volumes:
– /data:/data
client:
image: ubos/openclaw-client:latest
depends_on:
– exporter
volumes:
– /data:/data
– /var/lib/openclaw:/var/lib/openclaw
api:
image: ubos/openclaw-api:latest
ports:
– 8080:8080
depends_on:
– client
volumes:
– /var/lib/openclaw:/var/lib/openclaw
Deploy with a single command on each node:
bash
ubosctl apply -f openclaw-edge.yaml
UBOS will ensure the containers are kept alive, auto‑restart on failure, and pull updates when a new image version is released.
—
## 5. Verification & Monitoring
1. **Health‑check** – `curl http://:8080/recommendations?user=123&n=5`
2. **Metrics** – The Flask app exports Prometheus metrics at `/metrics`. Attach a Prometheus node‑exporter on the edge device.
3. **Logging** – UBOS forwards container stdout to the central log aggregator (e.g., Loki). Use the tag `service=openclaw-api` to filter.
—
## 6. Internal Reference
For a deeper dive into hosting OpenClaw on UBOS, see the dedicated guide: .
—
### Ready to Publish
You now have a complete, production‑ready guide that developers can follow to bring real‑time personalization to the edge using OpenClaw and UBOS.
—
*Author: UBOS Engineering Team*