Web UI for n8n data tables. Node.js proxy for browsing, editing, and managing rows.
1.4K
Web UI for n8n data tables — browse, edit, and manage the rows n8n buffers in its Data Tables, through a small Node.js proxy that talks to n8n exclusively over webhook endpoints.
Part of the n8n AI stack — n8n-table-ui, n8n, Ollama, PocketTTS, SearXNG and ComfyUI.
docker pull thegmpteam/n8n-table-ui:latest
docker run -d \
--name n8n-table-ui \
-p 3458:3458 \
-e N8N_HOST=n8n \
-e N8N_PORT=5678 \
-v /path/to/.data:/app/.data \
thegmpteam/n8n-table-ui:latest
Then open http://localhost:3458/.
On the server stack the proxy joins the shared automation network and reaches n8n by service name (n8n:5678).
Two compose files ship with the source, for two situations.
1. Adding to the stack this repo belongs to — docker-compose.n8n-table-ui.yml
is a drop-in service block that joins the existing automation network and
reaches n8n by service name:
services:
n8n-table-ui:
image: thegmpteam/n8n-table-ui:latest
pull_policy: daily
container_name: n8n-table-ui
restart: unless-stopped
ports:
- "3458:3458"
environment:
- NODE_ENV=production
- PORT=3458
- N8N_HOST=n8n
- N8N_PORT=5678
- N8N_API_KEY=${N8N_API_KEY}
- API_BASE=n8n
- API_PORT=5678
- DATA_DIR=/app/.data
volumes:
- ./data/n8n-table-ui/.data:/app/.data
networks:
- automation
depends_on:
- n8n
networks:
automation:
external: true
name: automation
2. Adding to a different stack — docker-compose.n8n-table-ui.standalone.yml
is self-contained, needs no checkout, and hardcodes nothing. Configure it entirely
by environment variable:
docker compose -f docker-compose.n8n-table-ui.standalone.yml up -d
| Variable | Default | Purpose |
|---|---|---|
N8N_UI_TAG | latest | Image tag to pull |
N8N_UI_NETWORK | n8n-table-ui | Docker network to join |
N8N_UI_NETWORK_EXTERNAL | false | true when joining an existing network |
N8N_UI_BIND | 127.0.0.1 | Host interface to publish on |
N8N_UI_PORT | 3458 | Host port |
N8N_UI_CONTAINER | n8n-table-ui | Container name |
N8N_UI_DATA | ./data/n8n-table-ui/.data | Host path for runtime state |
N8N_HOST | n8n | n8n service name, or a reachable host/IP |
N8N_PORT | 5678 | n8n port |
N8N_API_KEY | (none) | Only if n8n requires API auth |
Shared network (default) — the UI joins the network n8n is already on and resolves it by service name; nothing needs to be published by n8n:
N8N_UI_NETWORK=<n8n-network> N8N_UI_NETWORK_EXTERNAL=true N8N_HOST=n8n \
N8N_UI_BIND=10.0.0.157 \
docker compose -f docker-compose.n8n-table-ui.standalone.yml up -d
Find the network name with:
docker inspect <n8n-container> \
--format '{{range $k,$v := .NetworkSettings.Networks}}{{$k}}{{"\n"}}{{end}}'
Isolated — no shared network; point N8N_HOST at an address the container can
reach and leave the network to this file:
N8N_HOST=10.0.0.157 N8N_PORT=5678 N8N_UI_BIND=10.0.0.157 \
docker compose -f docker-compose.n8n-table-ui.standalone.yml up -d
Verify either mode:
curl -s http://<bind>:<port>/config # proxy env snapshot
curl -s http://<bind>:<port>/version # version / commit / branch
curl -s http://<bind>:<port>/ # serves the UI (HTTP 200)
The default N8N_UI_BIND is 127.0.0.1, so the port is not exposed on the LAN
until you set it.
Browser (port 3458)
|
v
n8n-table-ui proxy (Node.js)
|- GET / -> serves index.html (static, no-store)
|- GET /config -> proxy env snapshot
|- GET /version -> version / commit / branch
|- POST /webhook/yt-get -> n8n:5678/webhook/yt-get
|- POST /webhook/yt-create -> n8n:5678/webhook/yt-create
|- POST /webhook/yt-wright -> n8n:5678/webhook/yt-wright
|- POST /webhook/yt-update -> n8n:5678/webhook/yt-update
|- POST /webhook/yt-remove -> n8n:5678/webhook/yt-remove
|- (unknown routes) -> 404, never arbitrary n8n REST access
Key constraint: the UI never uses n8n's REST API. It only knows the five webhook paths. If the n8n Data Table CRUD webhook workflow is missing, the UI is non-functional.
| Variable | Default | Description |
|---|---|---|
PORT | 3458 | Proxy listen port |
N8N_HOST | n8n | n8n hostname on the Docker network |
N8N_PORT | 5678 | n8n port |
N8N_API_KEY | (none) | Sent as X-N8N-API-KEY. Set only if n8n requires API auth. |
API_BASE | n8n | Upstream host for /api/* and /webhook/* |
API_PORT | 5678 | Upstream port |
DATA_DIR | /app/.data | Writable dir for logs, env override, HTML override, version.json |
| Path | Purpose |
|---|---|
/app/.data | Runtime state: version.json, optional index.html override, env drop-in, logs |
GET /webhook-workflow-template.json for the Setup wizard; import it via n8n → Workflows → Import from File.The Setup tab walks through first-time configuration: (1) verify the proxy can reach n8n, (2) enter existing table IDs and read them back, (3) download the webhook workflow template, (4) run a read/write/update smoke test. It auto-switches to Setup on load when n8n is unreachable or tables are missing.
GET /version.| Tag | Meaning |
|---|---|
latest | Current main build |
beta | Beta branch build for testing |
sha-<commit> | Immutable per-commit build |
Platform: linux/amd64.
Port 3458 is unauthenticated. Origin checks prevent cross-origin browser writes, not malicious LAN clients. Keep it on loopback or a trusted LAN; add authentication before wider exposure.
ISC
Content type
Image
Digest
sha256:c82c58218…
Size
70.4 MB
Last updated
8 days ago
docker pull thegmpteam/n8n-table-ui