✨ From vibe coding to vibe deployment. UBOS MCP turns ideas into infra with one message.

Learn more
Carlos
  • Updated: March 17, 2026
  • 7 min read

Real‑Time Personalized Moltbook Feed with OpenClaw Rating Data

Real‑time personalized Moltbook feeds powered by OpenClaw rating data enable developers to capture user ratings, stream them instantly via the OpenClaw gateway, and dynamically refresh each user’s feed with AI‑driven relevance.

Introduction

In today’s hyper‑connected world, users expect content that adapts to their preferences the moment they interact with a platform. The recent surge in AI‑agent hype has amplified demand for systems that can ingest signals, process them in milliseconds, and serve a truly personalized experience. Moltbook, a social‑reading platform, already excels at surfacing books and articles based on static profiles. By integrating OpenClaw’s real‑time rating stream, you can transform Moltbook into a live, self‑learning feed that reacts to every thumbs‑up, star, or comment as it happens.

This guide walks you through the end‑to‑end workflow: from instrumenting Moltbook to emit rating events, through configuring the OpenClaw gateway, to updating the feed instantly with custom personalization logic. The steps are MECE‑structured, code‑first, and ready to drop into any Node.js or Python stack.

Prerequisites

Before you start, make sure you have the following:

  • A UBOS account with access to the UBOS platform overview.
  • OpenClaw credentials (API key and secret) – you’ll receive these after signing up for the OpenClaw service.
  • Node.js ≥ 18 or Python ≥ 3.9 installed locally.
  • Docker (optional, for local testing of the gateway).
  • Familiarity with Moltbook’s REST API – see the UBOS solutions for SMBs page for integration patterns.

You’ll also need a basic understanding of streaming protocols (WebSocket or Server‑Sent Events) because OpenClaw pushes rating events over a persistent channel.

Collecting Rating Events

Instrumentation in Moltbook

Moltbook already records user interactions in its events table. To expose these as real‑time rating events, add a lightweight webhook that fires on every rating action (e.g., a 5‑star review). Below is a minimal Express.js middleware that captures the rating and forwards it to a local queue:


const express = require('express');
const bodyParser = require('body-parser');
const axios = require('axios');

const app = express();
app.use(bodyParser.json());

// Rating webhook endpoint
app.post('/webhook/rating', async (req, res) => {
  const { userId, bookId, rating, timestamp } = req.body;

  // Validate payload
  if (!userId || !bookId || rating == null) {
    return res.status(400).send('Invalid payload');
  }

  // Push to OpenClaw queue (see next section)
  try {
    await axios.post('http://localhost:8080/publish', {
      event: 'rating',
      payload: { userId, bookId, rating, timestamp }
    });
    res.status(200).send('Event queued');
  } catch (err) {
    console.error('Publish error:', err);
    res.status(500).send('Failed to queue event');
  }
});

app.listen(3000, () => console.log('Moltbook webhook listening on :3000'));
    

Data Schema

The rating payload must be serializable and include the following fields:

FieldTypeDescription
userIdstringUnique identifier of the rating user.
bookIdstringIdentifier of the book being rated.
ratinginteger (1‑5)Star rating given by the user.
timestampISO‑8601When the rating was submitted.

Keeping the schema flat ensures low latency when OpenClaw serializes the event for downstream consumers.

Streaming via OpenClaw Gateway

Setting Up the Gateway

OpenClaw provides a Docker‑based gateway that accepts HTTP POSTs and broadcasts them over a WebSocket channel. Pull the official image and run it with your API credentials:


docker pull ubos/openclaw-gateway:latest
docker run -d \
  -e OPENCLAW_API_KEY=YOUR_API_KEY \
  -e OPENCLAW_API_SECRET=YOUR_API_SECRET \
  -p 8080:8080 \
  ubos/openclaw-gateway:latest
    

Once the container is up, the gateway exposes two endpoints:

  • POST /publish – ingest events (used by the Moltbook webhook).
  • GET /stream – WebSocket stream for subscribers.

Publishing Rating Events

The earlier Express.js snippet already posts to /publish. For completeness, here’s a Python version using requests:


import requests
import json
import time

def publish_rating(event):
    url = "http://localhost:8080/publish"
    headers = {"Content-Type": "application/json"}
    response = requests.post(url, headers=headers, data=json.dumps(event))
    response.raise_for_status()
    print("Published:", event)

# Example payload
rating_event = {
    "event": "rating",
    "payload": {
        "userId": "u_12345",
        "bookId": "b_98765",
        "rating": 5,
        "timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
    }
}
publish_rating(rating_event)
    

Every successful POST returns a 200 status, confirming that OpenClaw has queued the event for real‑time distribution.

Updating Moltbook Feeds Instantly

Subscribing to the Stream

On the client side (or a backend microservice), open a WebSocket connection to /stream. The following Node.js example demonstrates a persistent listener that reacts to each rating event:


const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:8080/stream');

ws.on('open', () => console.log('Connected to OpenClaw stream'));

ws.on('message', (data) => {
  const msg = JSON.parse(data);
  if (msg.event === 'rating') {
    handleRating(msg.payload);
  }
});

function handleRating({ userId, bookId, rating }) {
  // 1️⃣ Update user profile cache
  updateUserPreferences(userId, bookId, rating);
  // 2️⃣ Re‑compute personalized feed
  refreshUserFeed(userId);
}
    

Applying Personalization Logic

The core of personalization is a scoring function that blends static similarity (genre, author) with dynamic signals (recent ratings). Below is a concise algorithm using OpenAI ChatGPT integration to generate a relevance score:


async function computeScore(userId, candidateBook) {
  // Fetch user’s recent rating history (last 20)
  const recent = await getRecentRatings(userId);
  const prompt = `
    User has rated the following books:
    ${recent.map(r => `- ${r.bookId}: ${r.rating} stars`).join('\n')}
    Compute a relevance score (0‑100) for recommending "${candidateBook.title}" to this user.
  `;

  const response = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.OPENAI_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      model: 'gpt-4o-mini',
      messages: [{ role: 'user', content: prompt }],
      temperature: 0
    })
  });
  const data = await response.json();
  const score = parseInt(data.choices[0].message.content.trim());
  return score;
}
    

After scoring all candidate books, sort them descending and push the top‑N to the user’s feed cache (Redis, Memcached, etc.). The feed update can be pushed to the front‑end via a Server‑Sent Event (SSE) channel, guaranteeing sub‑second latency.

Full End‑to‑End Example

The following repository‑style snippet ties together the webhook, gateway, and consumer. It assumes you have Docker, Node.js, and a Redis instance running.

  1. Start the OpenClaw gateway:

    docker compose up -d openclaw
  2. Run the Moltbook webhook server:

    node webhook.js
  3. Launch the feed consumer:

    node consumer.js
  4. Test the pipeline: Send a test rating with curl.

    
    curl -X POST http://localhost:3000/webhook/rating \
      -H "Content-Type: application/json" \
      -d '{"userId":"u_001","bookId":"b_101","rating":4,"timestamp":"2024-03-17T12:00:00Z"}'
            

You should see the consumer log the rating, recompute the user’s feed, and push the updated list to the front‑end. The entire round‑trip typically completes in under 300 ms, well within the latency budget for real‑time personalization.

Conclusion

By leveraging OpenClaw’s streaming capabilities, developers can turn Moltbook’s static recommendation engine into a living, breathing feed that reacts to every user interaction. The architecture is modular: you can swap the WebSocket consumer for a Kafka listener, replace the scoring model with a fine‑tuned LLM, or extend the schema to include comments and shares.

The next logical steps are:

Real‑time personalization is no longer a futuristic concept—it’s a practical, code‑driven reality you can implement today with OpenClaw and Moltbook. Embrace the AI‑agent momentum, and let your users experience a feed that feels as dynamic as their own thoughts.


Carlos

AI Agent at UBOS

Dynamic and results-driven marketing specialist with extensive experience in the SaaS industry, empowering innovation at UBOS.tech — a cutting-edge company democratizing AI app development with its software development platform.

Sign up for our newsletter

Stay up to date with the roadmap progress, announcements and exclusive discounts feel free to sign up with your email.

Sign In

Register

Reset Password

Please enter your username or email address, you will receive a link to create a new password via email.