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

Learn more
Andrii Bidochko
  • Updated: March 23, 2026
  • 8 min read

Building a Web‑Based Human‑Approval Dashboard for OpenClaw Remediation Agents


<!– –>

A human‑approval dashboard for OpenClaw remediation agents is a web interface that lets authorized users review, approve, or reject remediation tasks in real time, ensuring that automated actions are validated before they affect production systems.

Why Human‑Approval Dashboards Matter for OpenClaw

OpenClaw’s AI‑driven remediation agents can automatically detect and fix security or compliance issues across your infrastructure. While automation accelerates response times, unchecked actions can introduce false positives, service disruptions, or compliance violations. A human‑approval layer adds a safety net, giving security engineers, compliance officers, or product owners the chance to verify each remediation step.

In the era of AI agents—where tools like ChatGPT, Claude, and other large language models are being embedded into operational pipelines—the demand for transparent, auditable decision points has never been higher. By coupling OpenClaw with a custom dashboard, you align with the AI‑agent hype while preserving governance.

UI/UX Design Overview

The dashboard should feel familiar to both technical and non‑technical users. Below is a MECE‑structured component breakdown:

  • Header: Brand logo, user avatar, and global navigation.
  • Sidebar: Links to “Pending Approvals”, “History”, “Settings”.
  • Main Panel: Table of remediation tasks with status badges, details, and action buttons.
  • Detail Modal: Expands a task to show logs, affected assets, and risk score.
  • Notification Toasts: Real‑time alerts from Moltbook.

Design considerations:

  • Use Tailwind CSS utility classes for rapid styling and responsive layouts.
  • Color‑code status badges (green = approved, red = rejected, yellow = pending) for instant visual scanning.
  • Provide keyboard shortcuts (e.g., A for approve) to speed up high‑volume review.

Setting Up the Project

Prerequisites

Before you start, make sure you have the following installed on your workstation:

  1. Node.js ≥ 18 (download from nodejs.org)
  2. Git
  3. An UBOS account (you’ll need API keys for deployment)
  4. OpenClaw API credentials (client ID & secret)
  5. Docker (for containerization)

Project Scaffolding

We’ll use Vite for a fast development experience. Run the commands below in your terminal:

npm create vite@latest openclaw-dashboard -- --template react
cd openclaw-dashboard
npm install
npm install tailwindcss@latest postcss@latest autoprefixer@latest
npx tailwindcss init -p

Configure Tailwind by editing tailwind.config.cjs:

module.exports = {
  content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'],
  theme: {
    extend: {},
  },
  plugins: [],
}

Building the Dashboard UI

Header & Navigation

Create a reusable Header.jsx component:

import React from 'react';

export default function Header() {
  return (
    <header className="flex items-center justify-between bg-white shadow p-4">
      <div className="flex items-center space-x-2">
        <img src="/logo.svg" alt="UBOS" className="h-8 w-8"/>
        <span className="font-bold text-xl">OpenClaw Dashboard</span>
      </div>
      <div className="flex items-center space-x-4">
        <button className="text-gray-600 hover:text-gray-800">Help</button>
        <img src="/avatar.png" alt="User" className="h-8 w-8 rounded-full"/>
      </div>
    </header>
  );
}

Task List Table

The core of the UI is a table that lists pending remediation tasks. Use react-table or plain HTML for simplicity.

import React from 'react';

export default function TaskTable({ tasks, onApprove, onReject }) {
  return (
    <table className="min-w-full divide-y divide-gray-200">
      <thead className="bg-gray-50">
        <tr>
          <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">ID</th>
          <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Description</th>
          <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Risk</th>
          <th className="px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase">Actions</th>
        </tr>
      </thead>
      <tbody className="bg-white divide-y divide-gray-200">
        {tasks.map(task => (
          <tr key={task.id}>
            <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-900">{task.id}</td>
            <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-700">{task.description}</td>
            <td className="px-6 py-4 whitespace-nowrap">
              <span className={`px-2 inline-flex text-xs leading-5 font-semibold rounded-full ${task.risk === 'high' ? 'bg-red-100 text-red-800' : 'bg-yellow-100 text-yellow-800'}`}>
                {task.risk}
              </span>
            </td>
            <td className="px-6 py-4 whitespace-nowrap text-center">
              <button onClick={() => onApprove(task.id)} className="bg-green-600 text-white px-3 py-1 rounded mr-2">Approve</button>
              <button onClick={() => onReject(task.id)} className="bg-red-600 text-white px-3 py-1 rounded">Reject</button>
            </td>
          </tr>
        ))}
      </tbody>
    </table>
  );
}

Status Badges & Toasts

Leverage Tailwind’s utility classes for quick badge styling. For real‑time notifications, we’ll integrate Moltbook (see next section).

Integrating Moltbook Notifications

Moltbook provides a lightweight SDK for push notifications and webhook handling. Install it with npm:

npm install @moltbook/sdk

Initialize the SDK in src/moltbook.js:

import Moltbook from '@moltbook/sdk';

const molt = new Moltbook({
  apiKey: import.meta.env.VITE_MOLTBOOK_API_KEY,
  endpoint: 'https://api.moltbook.io/webhook',
});

export default molt;

When a user approves or rejects a task, fire a notification:

import molt from './moltbook';

export async function sendDecisionNotification(taskId, decision) {
  await molt.send({
    title: `Task ${taskId} ${decision}`,
    message: `The remediation task ${taskId} was ${decision.toLowerCase()}.`,
    channel: 'dashboard',
  });
}

Configure a webhook endpoint on UBOS (see deployment section) to receive these events and optionally forward them to Slack or Teams.

Connecting to OpenClaw Remediation Agents

API Authentication

OpenClaw uses OAuth 2.0 client‑credentials flow. Create a helper file src/openclawApi.js:

import axios from 'axios';

const tokenUrl = 'https://api.openclaw.io/oauth/token';
const apiBase = 'https://api.openclaw.io/v1';

export async function getAccessToken() {
  const resp = await axios.post(tokenUrl, {
    client_id: import.meta.env.VITE_OPENCLAW_CLIENT_ID,
    client_secret: import.meta.env.VITE_OPENCLAW_CLIENT_SECRET,
    grant_type: 'client_credentials',
  });
  return resp.data.access_token;
}

Fetching Pending Tasks

export async function fetchPendingTasks() {
  const token = await getAccessToken();
  const resp = await axios.get(`${apiBase}/remediations/pending`, {
    headers: { Authorization: `Bearer ${token}` },
  });
  return resp.data.tasks;
}

Submitting Approval Decisions

export async function submitDecision(taskId, decision) {
  const token = await getAccessToken();
  await axios.post(
    `${apiBase}/remediations/${taskId}/${decision}`,
    {},
    { headers: { Authorization: `Bearer ${token}` } }
  );
  // Notify via Moltbook
  await sendDecisionNotification(taskId, decision);
}

Deployment Steps

Containerizing with Docker

Create a Dockerfile at the project root:

# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Production stage
FROM nginx:stable-alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

One‑Click Host on UBOS

UBOS offers a streamlined “host‑openclaw” service that provisions a container‑ready environment, injects environment variables, and sets up a CI/CD pipeline. Follow the guided wizard on the host OpenClaw on UBOS page to spin up the service in minutes.

Environment Variables

Define the following variables in the UBOS dashboard under “Environment Settings”:

  • VITE_OPENCLAW_CLIENT_ID
  • VITE_OPENCLAW_CLIENT_SECRET
  • VITE_MOLTBOOK_API_KEY

CI/CD Basics

UBOS integrates with GitHub Actions out of the box. Add a .github/workflows/deploy.yml file:

name: Deploy to UBOS
on:
  push:
    branches: [ main ]
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Node
        uses: actions/setup-node@v3
        with:
          node-version: '20'
      - run: npm ci
      - run: npm run build
      - name: Deploy to UBOS
        uses: ubos/ubos-deploy-action@v1
        with:
          api-token: ${{ secrets.UBOS_API_TOKEN }}

SEO Optimization for the Dashboard Guide

SEO‑Friendly Headings

We used a clear hierarchy (H2 → H3 → H4) that mirrors the tutorial’s logical flow. Each heading contains target keywords such as “OpenClaw”, “human approval dashboard”, “React tutorial”, and “Moltbook notifications”.

Crafting a Compelling Meta Description

Example meta description (to be placed in the page’s <head> tag):

Step‑by‑step guide to build a React‑based human‑approval dashboard for OpenClaw remediation agents, integrate Moltbook notifications, containerize with Docker, and deploy on UBOS in minutes.

Strategic Internal Linking

Throughout the article we referenced related UBOS resources to boost topical authority:

Conclusion & Next Steps

You now have a fully functional, Docker‑ready human‑approval dashboard that connects OpenClaw remediation agents with real‑time Moltbook alerts. The core architecture is modular, so you can extend it in several directions:

  • Role‑Based Access Control (RBAC): Integrate UBOS partner program authentication to limit who can approve high‑risk tasks.
  • Analytics Dashboard: Store decisions in a PostgreSQL instance and visualize trends with Chart.js.
  • Multi‑Channel Notifications: Add Slack, Microsoft Teams, or email hooks via Moltbook.
  • Template Marketplace: Publish your dashboard as a reusable UBOS template (see UBOS portfolio examples for inspiration).

By publishing the dashboard on UBOS, you benefit from automatic scaling, built‑in CI/CD, and a marketplace that puts your solution in front of thousands of AI‑focused developers. Start building, share your template, and join the community that’s shaping the future of AI‑agent governance.

For a deeper dive into OpenClaw’s API, refer to the official documentation on GitHub. Happy coding!


Andrii Bidochko

CTO UBOS

Andrii Bidochko is an AI entrepreneur and researcher focused on AI agents, reinforcement learning, and autonomous systems. He writes about the technologies shaping the future of machine intelligence, from frontier models and agent architectures to real-world AI applications.

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.