sop-hub

sop-hub

Docker app from allornothing's Repository

Overview

Self-hosted clone of Scribe: turn a workflow into a step-by-step visual guide, with AI help from either a local model or a cloud provider. Capture a process two ways -- upload screenshots manually in the editor, or install the included Chrome extension and just click through the workflow; it auto-captures a screenshot and click position for every click and uploads the whole walkthrough as a new guide in one step. From there, AI can describe each screenshot, write the guide's title and summary, rewrite step text for clarity, and answer questions about a guide in a chat panel -- all routed through one provider abstraction so local (Ollama) and cloud (Anthropic Claude, OpenAI, or any OpenAI-compatible endpoint) are interchangeable per request. Finished guides publish to a public read-only share link, or export straight to PDF, HTML, or Markdown with embedded step images. Everything -- Postgres, the API, and the built frontend -- runs in this one container. SET JWT_SECRET before starting (any long random string). AI is optional and defaults to a local Ollama instance you point it at (does not run inside this container); set the Anthropic/OpenAI/custom variables instead if you'd rather use a cloud provider, or skip AI entirely and use SOP-Hub as a plain guide editor. Everything lives under the single /config mount: the embedded Postgres database and all uploaded step screenshots. Back that one directory up and you've backed up the whole app.

SOP-Hub

Build

A self-hosted clone of Scribe: turn a workflow into a step-by-step visual guide, with AI help from either a local model (Ollama) or a cloud provider (Anthropic Claude, OpenAI, or any OpenAI-compatible endpoint). Runs entirely on your own hardware (e.g. Unraid) via a single Docker container.

Features

  • Capture — record a process two ways:
    • Manual: upload screenshots in order and write them up in the editor.
    • Browser extension (extension/): click through the workflow in Chrome and SOP-Hub auto-captures a screenshot + click position for every click, then uploads the whole walkthrough as a new guide in one click.
  • Editor — reorder, retitle, and rewrite steps.
  • AI assistance, local or cloud, picked per-request:
    • Describe a step from its screenshot (vision).
    • Auto-generate a guide title + summary from its steps.
    • Rewrite step text for clarity/tone.
    • Ask-AI chat that answers questions about a specific guide.
  • Publish & share — one click publishes a guide to a public read-only link.
  • Export — PDF, HTML, and Markdown, each self-contained with embedded step images.
  • Multi-tenant — users, workspaces, and workspace membership.

Quick start

docker run -d \
  --name sop-hub \
  -p 8080:8080 \
  -e JWT_SECRET=$(openssl rand -hex 32) \
  -e PUID=99 -e PGID=100 \
  -v /mnt/user/appdata/sop-hub:/config \
  allornothing/sop-hub:latest

Or with compose (docker-compose.yml in this repo wraps the same image):

cp .env.example .env   # set a real JWT_SECRET at minimum
docker compose up -d --build

Open http://localhost:8080. Local AI is the default (AI_DEFAULT_PROVIDER=ollama) — point OLLAMA_BASE_URL at any Ollama instance on your LAN (it does not run inside this container), or set cloud credentials instead — see AI provider setup below.

Architecture

Everything runs in one container, matching the rest of the AoN-Unraid-Apps collection: Postgres (embedded, data lives under /config/postgres), the Node/Express API, and the built React frontend (served statically by Express on the same port). /config is the single folder to back up — it holds the database and all uploaded step screenshots.

The backend never hard-codes an AI provider: backend/src/services/aiProvider.ts exposes generateText / generateVisionCaption, dispatched by an AiProviderName of ollama | anthropic | openai | custom. Every AI route accepts an optional provider field and otherwise falls back to AI_DEFAULT_PROVIDER. Swapping or adding a provider means editing that one file — feature routes never change.

Dockerfile         multi-stage build: frontend -> backend -> single runtime image
entrypoint.sh       boots embedded Postgres (as PUID:PGID), runs migrations, starts the app
backend/            Node.js/TypeScript + Express API, AI provider abstraction, exports
frontend/           React + Vite SPA
extension/          Manifest V3 Chrome extension -- the "capture" side of the product

Using the browser extension

  1. In Chrome, go to chrome://extensions, enable Developer Mode, "Load unpacked", and select the extension/ folder.
  2. Click the SOP-Hub Capture icon, log in with your SOP-Hub account and server URL.
  3. Click "Start recording" and walk through the process in the browser — every click captures a screenshot.
  4. Click "Stop recording" then "Upload to SOP-Hub" — a new guide appears in the app, ready to edit and add AI-generated step descriptions.

AI provider setup

Provider Where it runs Config
Ollama Any Ollama instance you already run (LAN box, another container) OLLAMA_BASE_URL, OLLAMA_MODEL (use a vision model like llava for screenshot captions)
Anthropic Cloud ANTHROPIC_API_KEY, ANTHROPIC_MODEL
OpenAI Cloud OPENAI_API_KEY, OPENAI_MODEL
Custom Cloud or self-hosted, any OpenAI-compatible API CUSTOM_OPENAI_BASE_URL, CUSTOM_OPENAI_API_KEY, CUSTOM_OPENAI_MODEL

AI_DEFAULT_PROVIDER picks the default; each user's browser can locally override it per-session from the app's Settings page (stored in localStorage, sent as provider on each AI request — no keys ever touch the browser).

Configuration reference

Variable Default Notes
JWT_SECRET (required) Any long random string — signs auth tokens
PUID / PGID 99 / 100 Unraid's nobody/users — owns everything under /config
TZ Etc/UTC Timezone for timestamps
POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DB sophub / sophub / sophub Embedded DB credentials, never exposed outside the container
AI_DEFAULT_PROVIDER ollama ollama | anthropic | openai | custom
OLLAMA_BASE_URL / OLLAMA_MODEL http://ollama:11434 / llava Point at your own Ollama instance
ANTHROPIC_API_KEY / ANTHROPIC_MODEL Cloud AI
OPENAI_API_KEY / OPENAI_MODEL Cloud AI
CUSTOM_OPENAI_BASE_URL / CUSTOM_OPENAI_API_KEY / CUSTOM_OPENAI_MODEL Any OpenAI-compatible endpoint

Development (without Docker)

# backend -- needs a Postgres reachable at DATABASE_URL
cd backend && npm install
npm run migrate
npm run dev                      # http://localhost:4000

# frontend -- point it at the backend above
cd frontend && npm install
VITE_API_BASE_URL=http://localhost:4000 npm run dev   # http://localhost:5173

Data model

See backend/src/db/schema.sqlusers, workspaces, workspace_members, guides, steps, guide_chat_messages.

Known limitations / next steps

  • Step drag-and-drop reordering is up/down buttons, not drag handles yet.
  • No image-blur/redaction tool in the editor yet (the schema has a steps.redacted flag ready for it).
  • The extension does not yet auto-suggest step titles from the DOM element clicked — it relies on the AI "Describe screenshot" action in the editor instead.
  • No role-based permissions beyond workspace membership (all members can edit all guides).

License

MIT — see LICENSE.

Install sop-hub on Unraid in a few clicks.

Find sop-hub in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for sop-hub Review the template variables and paths Click Install

Requirements

Internet access is optional -- only needed if you point it at a cloud AI provider. Everything else, including local AI via your own Ollama instance, works fully offline/on-LAN.

Download Statistics

45
Total Downloads

Related apps

Details

Repository
allornothing/sop-hub:latest
Last Updated2026-09-03
First Seen2026-09-03

Runtime arguments

Web UI
http://[IP]:[PORT:8080]/
Network
bridge
Shell
sh
Privileged
false

Template configuration

WebUI PortPorttcp

Web UI / API port

Target
8080
Default
8080
Value
8080
AppdataPathrw

Embedded Postgres database and all uploaded step screenshots -- the only folder you need to back up

Target
/config
Default
/mnt/user/appdata/sop-hub
Value
/mnt/user/appdata/sop-hub
PUIDVariable

Unraid's nobody user -- keeps appdata editable from the host

Default
99
Value
99
PGIDVariable

Unraid's users group

Default
100
Value
100
TZVariable

Timezone for dates shown in the app

Default
Etc/UTC
Value
Etc/UTC
JWT SecretVariable

Required. Any long random string -- used to sign auth tokens. Generate one with: openssl rand -hex 32

Target
JWT_SECRET
AI ProviderVariable

ollama (local) | anthropic | openai | custom -- which AI backend features use by default

Target
AI_DEFAULT_PROVIDER
Default
ollama
Value
ollama
Ollama Base URLVariable

Only used when AI Provider = ollama. Point at your own Ollama instance -- it does not run inside this container.

Target
OLLAMA_BASE_URL
Default
http://ollama:11434
Value
http://ollama:11434
Ollama ModelVariable

Use a vision-capable model (e.g. llava) so screenshot-description AI works

Target
OLLAMA_MODEL
Default
llava
Value
llava
Anthropic API KeyVariable

Only used when AI Provider = anthropic

Target
ANTHROPIC_API_KEY
Anthropic ModelVariable
Target
ANTHROPIC_MODEL
Default
claude-sonnet-5
Value
claude-sonnet-5
OpenAI API KeyVariable

Only used when AI Provider = openai

Target
OPENAI_API_KEY
OpenAI ModelVariable
Target
OPENAI_MODEL
Default
gpt-4o-mini
Value
gpt-4o-mini
Custom OpenAI-compatible Base URLVariable

Only used when AI Provider = custom -- any OpenAI-compatible API (LM Studio, vLLM, OpenRouter, etc.)

Target
CUSTOM_OPENAI_BASE_URL
Custom OpenAI-compatible API KeyVariable
Target
CUSTOM_OPENAI_API_KEY
Custom OpenAI-compatible ModelVariable
Target
CUSTOM_OPENAI_MODEL
Postgres UserVariable

Embedded database user -- not exposed outside the container

Target
POSTGRES_USER
Default
sophub
Value
sophub
Postgres PasswordVariable

Embedded database password -- not exposed outside the container

Target
POSTGRES_PASSWORD
Default
sophub
Value
sophub
Postgres DatabaseVariable
Target
POSTGRES_DB
Default
sophub
Value
sophub