InnovareAI's B2B demand content operating system, the marketing and content counterpart to SAM.
VERA learns each client from their website, channels, documents, and performance data, then turns that knowledge into platform-native content, approvals, publishing, measurement, and learning loops.
Production: https://vera.innovareai.com
- Onboards each client as a scoped project with its own brain, channels, roles, and provider keys.
- Learns from website pages, SEO structure, product pages, blog content, documents, LinkedIn, Instagram, YouTube, Medium, Quora, Reddit, Facebook, and X where available.
- Drafts B2B top-of-funnel content for company, founder, expert, and campaign voices.
- Reviews content with platform-native previews, scheduling, approval states, and stakeholder routes.
- Publishes or hands off through client-scoped connections only.
- Measures comments, shares, saves, clicks, qualified traffic, buyer questions, objections, meeting requests, and SAM handoff signals.
- Feeds results back into the next brief, model recommendation, channel plan, and reusable skills.
- React 19, Vite, TypeScript, Tailwind 4.
- Self-hosted Supabase on Hetzner for database, Edge Functions, auth, storage, and cron-style workers.
- Netlify for the static frontend.
- Sentry for optional browser crash reporting.
Do not put LLM, image, video, publishing, scraping, OAuth, or third-party API secrets in browser variables.
Browser-exposed variables must be limited to VITE_* values that are safe to ship publicly. Provider keys are handled in one of two ways:
- Client-owned keys are stored encrypted in
client_api_keysand scoped to that client project. - InnovareAI platform keys live only in the self-hosted Supabase environment and require explicit operator entitlements plus an approved platform project.
Client media generation must not fall back to InnovareAI FAL, OpenAI, or OpenRouter keys by default. Video is storyboard-first and requires a client FAL key unless the request is from an entitled InnovareAI operator inside an approved platform media project.
git clone git@github.com:InnovareAI/vera.git
cd vera
cp .env.example .env.local
npm install
npm run devLocal app URL: http://localhost:5173
Minimum browser variables:
| var | required | notes |
|---|---|---|
VITE_SUPABASE_URL |
yes | https://supabase-content-eu.innovareai.com |
VITE_SUPABASE_ANON_KEY |
yes | Public anon key, protected by RLS and Edge Function authorization |
VITE_SENTRY_DSN |
no | Optional browser crash reporting |
VITE_RELEASE |
no | Optional commit SHA or version label |
Server-only variables are documented in .env.example. They belong on the Hetzner Supabase host at /srv/supabase-content/.env, not in Netlify browser env vars.
Netlify deploys production from main. To build locally:
npm run build
npm run previewThe production frontend points to the self-hosted Supabase content stack at:
https://supabase-content-eu.innovareai.com/functions/v1/<function-name>
Browser calls use the user session or anon key where allowed. Server-to-server function calls use service-role credentials only inside the Edge Function runtime or server environment.
Edge Functions are deployed to the live self-hosted content stack with:
scripts/deploy-function.sh --shared vera-chat vera-orchestratorThe script resolves supabase-content-eu.innovareai.com, targets the resolved live IP by default, and refuses a non-live host unless ALLOW_NON_LIVE_HOST=true is set explicitly.
The current execution plan lives in docs/VERA_BUILD_PLAN.md.
The current UX redesign contract lives in docs/VERA_UX_REDESIGN_BRIEF.md.
The working UX blueprint lives in docs/UX_BLUEPRINT.md.
- Theme:
src/lib/theme.tsx, persisted undervera-theme. - Org context:
src/lib/orgContext.tsx, active workspace and membership state. - Project context:
src/lib/projectContext.tsx, active client project and project switching. - Right rail:
src/lib/rightRailContext.tsx, shared preview and artifact panel. - Error handling:
src/components/ErrorBoundary.tsx, page and route boundaries. - Client AI policy:
src/pages/ClientKeys.tsx, per-client provider keys, budget caps, model defaults, and usage views. - Model economics:
src/lib/modelEconomics.ts, shared frontend labels, options, premium flags, and planning estimates.
npm run build
npm run lint
deno check supabase/functions/<function>/index.tsUse focused Deno checks for touched Edge Functions. Some lint debt may exist outside the edited surface, so do not treat an unrelated lint failure as proof that the changed code is broken.
Before onboarding another client workspace, changing provider key policy, or shipping publishing changes, run the production-safe saleability suite:
npm run verify:saleabilityIt verifies chat auth, client media key isolation, project-scoped Unipile publishing, shared research profile scope, publish locking, idempotent posted marking, content_posts schema, audience scoping, and retired platform config access.