Self-hosted 3D design reviews. Review a live 3D model together, see where everyone is pointing, and let local AI turn the conversation into risks, actions and rationale. Explore design variants, track decisions across meetings, and keep every file on your own machine. One-script Docker install. Open source (Apache-2.0).
TypeScript
0
2 commits
updated Sep 29, 2026
Viewpoint Arena is a self-hosted room for reviewing a 3D model together. A small team opens the same model, points at parts, follows each other's view and talks it through; the meeting is transcribed and turned into risk, action and rationale cards on your own hardware.
It runs with Docker on one machine: one install script, no cloud accounts.
Status: 0.1.0 preview. Accounts, variants and backups are new, so expect rough edges. See CHANGELOG.md for what is in it and its known limits.
Follow docs/INSTALL.md: one installer (install.sh),
about 15 minutes. It sets up the app, the live room server, the database and
local meeting capture with Docker Compose.
| Minimum | Comfortable | |
|---|---|---|
| Memory | 16 GB | 32 GB |
| Processor | 4 cores | 8+ cores |
| Graphics card | not needed | an NVIDIA card with 8 GB+ for fast meeting capture |
Tested on Windows 11 with WSL2 and Docker Desktop; Linux works the same way.
qwen2.5:7b by default) turns them into cards:
Viewpoint Arena uses a two-layer configuration system:
viewpoint.config.ts (primary interface) — declares which connector
providers are active (PLM, capture, TURN, database, notifications, model
import) and their non-secret settings (base URLs, model names, feature
flags). See viewpoint.config.example.ts for a template..env (credential store) — holds the secret values that the config
file references by environment-variable name. Copy .env.example as a
starting point; it documents every variable, grouped by connector, with
server-only vs. public labels.The browser never imports the config file directly. It fetches the
non-secret subset at runtime from GET /api/public-config, so a single
built artifact works against any deployment's config.
Hosts without a config file (Vercel, other serverless hosts). The config
file is git-ignored, so a deploy from git does not have it. Put the same
settings in the VIEWPOINT_CONFIG environment variable instead, as JSON:
npm run config:json # prints your viewpoint.config.ts as one line of JSON
Paste the output into VIEWPOINT_CONFIG in the host's environment settings,
next to the secrets it names. It holds no secrets itself (the config only
names the variables that do), and it goes through the same validation as the
file. When both exist, the variable wins and the server logs that once.
GET /api/health reports which one was used (configSource).
Capping what cloud AI capture can spend. With the OpenAI or Anthropic
capture options, every extraction is a paid API call. The app bounds each
single call (transcript size and answer length), and the self-hosted proxy
limits each address to 30 capture requests a minute, but nothing in the app
caps the total. Set that ceiling where it cannot be bypassed: a monthly budget
on the API key's project (OpenAI) or a spend limit on its workspace
(Anthropic). On Vercel, where the self-hosted proxy is absent, add a rate
limit rule for /api/capture/ in the project's Firewall settings as well.
TypeScript
93.5%
Python
4.6%
Shell
1.6%
Self-hosted 3D design reviews. Review a live 3D model together, see where everyone is pointing, and let local AI turn the conversation into risks, actions and rationale. Explore design variants, track decisions across meetings, and keep every file on your own machine. One-script Docker install. Open source (Apache-2.0).
TypeScript
0
2 commits
updated Sep 29, 2026
Viewpoint Arena is a self-hosted room for reviewing a 3D model together. A small team opens the same model, points at parts, follows each other's view and talks it through; the meeting is transcribed and turned into risk, action and rationale cards on your own hardware.
It runs with Docker on one machine: one install script, no cloud accounts.
Status: 0.1.0 preview. Accounts, variants and backups are new, so expect rough edges. See CHANGELOG.md for what is in it and its known limits.
Follow docs/INSTALL.md: one installer (install.sh),
about 15 minutes. It sets up the app, the live room server, the database and
local meeting capture with Docker Compose.
| Minimum | Comfortable | |
|---|---|---|
| Memory | 16 GB | 32 GB |
| Processor | 4 cores | 8+ cores |
| Graphics card | not needed | an NVIDIA card with 8 GB+ for fast meeting capture |
Tested on Windows 11 with WSL2 and Docker Desktop; Linux works the same way.
qwen2.5:7b by default) turns them into cards:
Viewpoint Arena uses a two-layer configuration system:
viewpoint.config.ts (primary interface) — declares which connector
providers are active (PLM, capture, TURN, database, notifications, model
import) and their non-secret settings (base URLs, model names, feature
flags). See viewpoint.config.example.ts for a template..env (credential store) — holds the secret values that the config
file references by environment-variable name. Copy .env.example as a
starting point; it documents every variable, grouped by connector, with
server-only vs. public labels.The browser never imports the config file directly. It fetches the
non-secret subset at runtime from GET /api/public-config, so a single
built artifact works against any deployment's config.
Hosts without a config file (Vercel, other serverless hosts). The config
file is git-ignored, so a deploy from git does not have it. Put the same
settings in the VIEWPOINT_CONFIG environment variable instead, as JSON:
npm run config:json # prints your viewpoint.config.ts as one line of JSON
Paste the output into VIEWPOINT_CONFIG in the host's environment settings,
next to the secrets it names. It holds no secrets itself (the config only
names the variables that do), and it goes through the same validation as the
file. When both exist, the variable wins and the server logs that once.
GET /api/health reports which one was used (configSource).
Capping what cloud AI capture can spend. With the OpenAI or Anthropic
capture options, every extraction is a paid API call. The app bounds each
single call (transcript size and answer length), and the self-hosted proxy
limits each address to 30 capture requests a minute, but nothing in the app
caps the total. Set that ceiling where it cannot be bypassed: a monthly budget
on the API key's project (OpenAI) or a spend limit on its workspace
(Anthropic). On Vercel, where the self-hosted proxy is absent, add a rate
limit rule for /api/capture/ in the project's Firewall settings as well.
TypeScript
93.5%
Python
4.6%
Shell
1.6%