Deploying secure internal apps
This guide is for IT leads, technical owners, and architects approving or shipping internal apps on top of VH3 AI. It complements Building on the layer, which covers the builder patterns. This page is the governance and deployment view: how access works, what to harden, and which tier you actually need.1. What “built on the substrate” means
VH3 AI is one operational model per organisation. Every surface, whether VH3 Connect, a custom portal, a Slack agent, a mobile wrapper, or a coding agent, reads the same intelligence layer: discovery, sentinels, Connie, cases. That means:- No bespoke data layer per app. Your portal and your Slack agent agree on what “a job at Berwyn House” is, because both read the same model.
- Thin apps are appropriate. Internal apps focus on workflow and UX; the substrate handles enrichment, resolution, and synthesis.
- Switching surfaces is cheap. Replacing a UI does not invalidate the operational picture.
2. Access patterns (choose one)
Pick the pattern that matches the surface. Do not mix.
Rule:
api_key is a server credential. It must never appear in a browser, mobile bundle, or anything a customer can inspect.
3. Security model (IT checklist)
The platform ships with the controls below. Your job is to use them correctly.Data scoping and user management
- All API calls are scoped by
company_id. Tenant resolution happens server-side, no API call can cross organisation boundaries. - The platform ships with built-in user management: invite users, assign roles, organise teams, and issue JWTs without building any of that yourself. See Users and teams.
- Dedicated, isolated infrastructure is available on Enterprise plans.
JWTs and sessions
- Login returns a JWT valid for 24 hours. Refresh issues a new 24-hour token.
- Plan a refresh policy: silent refresh during active sessions; re-login at idle thresholds your security team is comfortable with.
- Do not store the JWT in non-HTTP-only storage if you can avoid it. Treat it as a session credential.
Internal IDs and PII
- Internal IDs (
company_id,job_id,contact_id,resource_id) belong on the server. - UI should show names and job references, not internal IDs (Connie follows the same rule, see Connie).
- PII in UI is a product policy decision. Decide once, enforce in the app layer.
BYOK (Connie and agents)
- Conversational AI runs on your model provider key.
- Cost lands on your provider account at your contracted rate. No vendor margin.
- See Pricing and Connie for the BYOK model.
Timeouts
- Discovery completes sub-second. Set tight client timeouts.
- Connie and
/investigateare multi-step. Plan for 20 to 25 seconds, longer on cold caches. - Apps should surface a loading state for synthesis; do not pretend it is instant.
4. Building a custom app: the right architecture
If you are building a dashboard, a partner portal, or any browser-based application on top of VH3 AI, the architecture below is the minimum required before connecting to real customer data. Coding agents will produce working code without this separation — but that code will be insecure.The required split
Your app needs two distinct parts:- Frontend (what runs in the browser): handles display, navigation, and user interaction. Contains no credentials. Makes API calls only to your own backend.
- Backend (a server you control): holds credentials, validates identity, and makes all calls to the VH3 API. The browser never calls VH3 directly.
Authentication flow for a custom app
- User visits your app and is redirected to your login page.
- Your login page posts
emailandpasswordto your backend (not directly to VH3). - Your backend calls
POST https://api.vh3connect.io/api:lBQnyyZL/auth/loginand receives theauthToken. - Your backend sets the
authTokenas anhttpOnlysecure cookie on the response. The browser stores it automatically and sends it on every subsequent request. The token itself is never accessible to JavaScript. - On every protected request from the browser, your backend reads the cookie, calls
GET https://api.vh3connect.io/api:lBQnyyZL/auth/mewith the token to validate it and retrieve the user’scompany_id. - Your backend uses the verified
company_idand theapi_keyfrom its environment variables to call the VH3 API. It returns only the data the frontend needs.
The
company_id that scopes your VH3 API calls must always come from the GET /auth/me response on the server. Never accept it from the browser — a user could send any value in a request body or query parameter.What this looks like in practice (Node.js / Express)
Environment variables and deployment
Store credentials as server-side environment variables only. On Railway, Render, Fly.io, or any similar platform, set these in the service settings — not in any file committed to your repository:NEXT_PUBLIC_VH3_API_KEY or any credential prefixed for browser exposure, that is a mistake — reject it.
CORS
Lock your backend to accept requests only from your frontend’s exact origin:origin: '*' at any point in a user-facing deployment.
5. Typical internal apps
Each pattern reuses the same substrate. The differences are UX and the role mapping in front of it.
6. Users, teams, and cases as governance
Governance on this platform comes from using the user, team, and case model correctly.- Users and roles (Users, User Auth) decide who can sign in and what they can do.
- Teams (Teams) decide what each user sees and owns.
- Cases are the audit surface: status, participants, linked jobs, activity timeline. On Connect tier, cases are first-class.
- A sentinel detects a pattern continuously (near-zero AI cost at detection).
- A case is opened against the team that owns the affected customer or region.
- The team uses discovery for precedents and Connie for a brief.
- Decisions, replies, and follow-ups are logged against the case.
7. Tier and capability map
Choose the access point that matches your UI, permission, and governance needs. A team that already has a strong front-end may start on Core and build its own UI. A team that wants to skip UI work uses Connect. The substrate is the same.
See Pricing for the full feature matrix.
8. Deployment checklist
Before launching an internal app on the layer:- Auth choice is explicit (Connect / JWT custom / server
api_key/ MCP JWT). -
api_keynever appears in client code, browser bundles, or mobile binaries. - JWT refresh policy is implemented; idle and absolute session limits are agreed with security.
- CORS allowlist is restricted to your app origins.
- Client timeouts: short for discovery, 20 to 25 seconds for synthesis.
- Role mapping is configured for the surfaces the app exposes (Core+ if you need bespoke roles).
- Teams are created and linked to the customers, sites, or regions they own.
- Connie answers in commercial or safety contexts route through Agent observability for evidence standards.
- Generative UI components render structured tool outputs from scoped, authenticated API responses only.
- PII and internal ID policy enforced in the app layer; UI shows names and job refs only.
- BYOK key set per environment; cost dashboards monitored on your provider account.
- Case ownership defined for each sentinel that the app surfaces.
Related
Authentication
Full credential surface map: VH3 AI Intelligence, BigChange, JWT.
Users and teams
Roles, invites, team scoping, Core+ permissions.
Building on the layer
Builder patterns for citizen builders, coding agents, and integrations.
MCP setup
Coding-agent and MCP-client access with JWT.
Agent observability
Evidence standards for commercial and safety-critical answers.
Pricing
Tier feature matrix and BYOK economics.