sop-hub

sop-hub

Docker app from allornothing's Repository

Overview

Self-hosted step-by-step visual guide builder, 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

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; redact sensitive parts of a screenshot by drawing boxes over them before publishing.
  • 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.
  • Folders — group guides within a workspace; a guide belongs to at most one folder (or none, shown as "Unfiled").

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.sql — users, workspaces, workspace_members, folders, guides, steps, guide_chat_messages.

Known limitations / next steps

  • Step drag-and-drop reordering is up/down buttons, not drag handles yet.
  • Redaction is a black box only (no blur), applied destructively to the stored screenshot with no undo once applied.
  • Folders are a single flat level per workspace — no nested subfolders.
  • 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.

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

971
Total Downloads

Related apps

Details

Repository
allornothing/sop-hub:latest
Last Updated2026-09-07
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