This comprehensive guide covers installation and configuration for both Voralis Web (Next.js) and Voralis App (Expo React Native).
Before starting, ensure you have:
# If using Git
git clone <your-repository-url>
cd voralis-web
# Or extract the downloaded ZIP file# Using npm
npm install
# Or using yarn
yarn install# Create .env.local file
touch .env.local
# Or on Windows
type nul > .env.localCreate a .env.local file in the root directory of voralis-web with all the following variables.
# ============================================
# DATABASE CONFIGURATION (REQUIRED)
# ============================================
NEON_DATABASE_URL=postgresql://username:password@host:port/database
DATABASE_URL=postgresql://username:password@host:port/database
# ============================================
# LICENSE VERIFICATION (REQUIRED)
# ============================================
# Brain Server URL (provided by your vendor/developer)
NEXT_PUBLIC_BRAIN_SERVER_URL=https://your-brain-server.vercel.app
# License Key (provided by your vendor/developer)
NEXT_PUBLIC_LICENSE_KEY=your-license-key-here
# ============================================
# AI SERVICES (REQUIRED)
# ============================================
# Grok (xAI) - Primary AI Chat
GROK_API_KEY=your-grok-api-key
GROK4_API_KEY=your-grok-api-key
GROK4_BASE_URL=https://api.x.ai/v1
# OpenAI - For DALL-E and GPT models
OPENAI_API_KEY=sk-your-openai-api-key
# Google Gemini
GEMINI_API_KEY=your-gemini-api-key
# DeepSeek (Optional)
DEEPSEEK_API_KEY=your-deepseek-api-key
# Anthropic Claude (Optional)
ANTHROPIC_API_KEY=your-anthropic-api-key
# ============================================
# VIDEO GENERATION & WORKERS (REQUIRED for Video Ads)
# ============================================
HEYGEN_API_KEY=your-heygen-api-key
RESEND_API_KEY=your-resend-api-key
# Redis (for Job Queue)
UPSTASH_REDIS_REST_URL=https://your-redis-url.upstash.io
UPSTASH_REDIS_REST_TOKEN=your-redis-token
# Firebase (for Push Notifications)
FIREBASE_API_KEY=your-api-key
FIREBASE_AUTH_DOMAIN=your-app.firebaseapp.com
FIREBASE_PROJECT_ID=your-project-id
FIREBASE_STORAGE_BUCKET=your-app.appspot.com
FIREBASE_MESSAGING_SENDER_ID=123456789
FIREBASE_APP_ID=1:123456:web:abcdef
FIREBASE_CLIENT_EMAIL=firebase-adminsdk-xxx@your-project.iam.gserviceaccount.com
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
..."
# ============================================
# FAL API KEY (REQUIRED)
# ============================================
FAL_API_KEY=your-fal-api-key
# ============================================
# TEXT-TO-SPEECH (REQUIRED)
# ============================================
ELEVENLABS_API_KEY=your-elevenlabs-api-key
# ============================================
# OTHER SERVICES (OPTIONAL)
# ============================================
SERPAPI_KEY=your-serpapi-api-key
TAVILY_API_KEY=your-tavily-api-key
WEATHER_API_KEY=your-weather-api-key
# ============================================
# PAYMENT PROVIDERS (OPTIONAL - Choose one or more)
# ============================================
# Stripe
STRIPE_SECRET_KEY=sk_live_your-stripe-secret-key
STRIPE_PUBLISHABLE_KEY=pk_live_your-stripe-publishable-key
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_your-stripe-publishable-key
STRIPE_WEBHOOK_SECRET=whsec_your-webhook-secret
# PayPal
PAYPAL_CLIENT_ID=your-paypal-client-id
PAYPAL_CLIENT_SECRET=your-paypal-client-secret
PAYPAL_MODE=sandbox
NEXT_PUBLIC_PAYPAL_CLIENT_ID=your-paypal-client-id
# Paystack
PAYSTACK_SECRET_KEY=sk_live_your-paystack-secret-key
PAYSTACK_PUBLIC_KEY=pk_live_your-paystack-public-key
NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY=pk_live_your-paystack-public-key
# Adyen
ADYEN_API_KEY=your-adyen-api-key
ADYEN_MERCHANT_ACCOUNT=your-merchant-account
ADYEN_CLIENT_KEY=your-adyen-client-key
NEXT_PUBLIC_ADYEN_CLIENT_KEY=your-adyen-client-key
# Airwallex
AIRWALLEX_API_KEY=your-airwallex-api-key
AIRWALLEX_CLIENT_ID=your-airwallex-client-id
AIRWALLEX_WEBHOOK_SECRET=your-airwallex-webhook-secret
# ============================================
# STORAGE SERVICES (REQUIRED - Choose one)
# ============================================
# Cloudflare R2 (Recommended)
R2_ACCOUNT_ID=your-r2-account-id
R2_ACCESS_KEY_ID=your-r2-access-key-id
R2_SECRET_ACCESS_KEY=your-r2-secret-access-key
R2_BUCKET_NAME=your-bucket-name
R2_PUBLIC_URL_PREFIX=https://pub-xxx.r2.dev
# ============================================
# EMAIL SERVICE (REQUIRED)
# ============================================
# SendGrid (Bulk emails Recommended)
SENDGRID_API_KEY=SG.your-sendgrid-api-key
SENDGRID_FROM_EMAIL=noreply@yourdomain.com
# AWS SES (Bulk emails Alternative)
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=your_aws_key
AWS_SECRET_ACCESS_KEY=your_aws_secret
# Nodemailer (for transactional emails)
NODEMAILER_HOST=smtp.hostinger.com
NODEMAILER_PORT=587
NODEMAILER_SECURE=false # or true for port 465
NODEMAILER_USER=support@byourdomain.com
NODEMAILER_PASS=password
# Mailtrap (Alternative)
MAILTRAP_USER="api"
MAILTRAP_PASS= # api token key
MAILTRAP_API_KEY= #api token key
MAILTRAP_USE_SANDBOX=true # true/false toggle
MAILTRAP_INBOX_ID=123456 # Only needed for sandbox 2682584
# Or Nodemailer (Alternative)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password
# ============================================
# SECURITY (REQUIRED)
# ============================================
# JWT Secret (Generate with: openssl rand -base64 32)
JWT_SECRET=your-jwt-secret-key
# Admin Secret (Generate with: openssl rand -base64 32)
ADMIN_SECRET_KEY=your-admin-secret-key
# reCAPTCHA (Optional)
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=your-recaptcha-site-key
RECAPTCHA_SECRET_KEY=your-recaptcha-secret-key
# ============================================
# MUSIC GENERATION (OPTIONAL)
# ============================================
# Suno AI
SUNO_API_KEY=your-suno-api-key
# Base URL
NEXT_PUBLIC_BASE_URL=http://localhost:3000
# Environment
NODE_ENV=developmentpostgresql://username:password@ep-xxx.us-east-2.aws.neon.tech/neondb?sslmode=require3. Copy this entire string
NEON_DATABASE_URL=postgresql://username:password@ep-xxx.us-east-2.aws.neon.tech/neondb?sslmode=require
DATABASE_URL=postgresql://username:password@ep-xxx.us-east-2.aws.neon.tech/neondb?sslmode=requirevoralis-web/database/database-schema.sqlThe license verification is handled automatically by the system. You only need to configure the license key provided by your vendor/developer.
Your license key will be provided by:
Add your license key to .env.local:
# License Key (provided by your vendor/developer)
NEXT_PUBLIC_LICENSE_KEY=your-license-key-here
# Brain Server URL (provided by your vendor/developer)
NEXT_PUBLIC_BRAIN_SERVER_URL=https://your-brain-server.vercel.appnpm run devhttp://localhost:3000Note: The license key format varies by provider:
8392af4b-1a2c-4d5e-9f0a-1234567890ab)XXXX-XXXX-XXXX-XXXX)GROK_API_KEY=xai-your-api-key-here
GROK4_API_KEY=xai-your-api-key-here
GROK4_BASE_URL=https://api.x.ai/v1sk-)OPENAI_API_KEY=sk-your-openai-api-key-hereGEMINI_API_KEY=your-gemini-api-key-hereELEVENLABS_API_KEY=your-elevenlabs-api-key-hereFAL_KEY=your-fal-key-hereHEYGEN_API_KEY=your-heygen-api-keypk_)sk_)https://your-domain.com/api/payments/stripe/webhookcheckout.session.completedcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_succeededinvoice.payment_failedwhsec_)STRIPE_SECRET_KEY=sk_live_your-stripe-secret-key
STRIPE_PUBLISHABLE_KEY=pk_live_your-stripe-publishable-key
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_your-stripe-publishable-key
STRIPE_WEBHOOK_SECRET=whsec_your-webhook-secretPAYPAL_CLIENT_ID=your-paypal-client-id
PAYPAL_CLIENT_SECRET=your-paypal-client-secret
PAYPAL_MODE=live # or 'sandbox' for testing
NEXT_PUBLIC_PAYPAL_CLIENT_ID=your-paypal-client-idpk_)sk_)PAYSTACK_SECRET_KEY=sk_live_your-paystack-secret-key
PAYSTACK_PUBLIC_KEY=pk_live_your-paystack-public-key
NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY=pk_live_your-paystack-public-keyADYEN_API_KEY=your-adyen-api-key
ADYEN_MERCHANT_ACCOUNT=your-merchant-account
ADYEN_CLIENT_KEY=your-adyen-client-key
NEXT_PUBLIC_ADYEN_CLIENT_KEY=your-adyen-client-keyhttps://your-domain.com/api/payments/airwallex/webhookAIRWALLEX_API_KEY=your-airwallex-api-key
AIRWALLEX_CLIENT_ID=your-airwallex-client-id
AIRWALLEX_WEBHOOK_SECRET=your-airwallex-webhook-secretvoralis-media)https://pub-xxx.r2.dev)R2_ACCOUNT_ID=your-cloudflare-account-id
R2_ACCESS_KEY_ID=your-r2-access-key-id
R2_SECRET_ACCESS_KEY=your-r2-secret-access-key
R2_BUCKET_NAME=your-bucket-name
R2_PUBLIC_URL_PREFIX=https://pub-xxx.r2.devConfigure at least one email service for sending transactional emails, notifications, and bulk emails. You can use multiple services for different purposes.
yourdomain.com)re_)RESEND_API_KEY=re_your_resend_api_keySG.)SENDGRID_FROM_EMAILSENDGRID_API_KEY=SG.your-sendgrid-api-key
SENDGRID_FROM_EMAIL=noreply@yourdomain.comus-east-1)voralis-ses-userAWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=your_aws_access_key_id
AWS_SECRET_ACCESS_KEY=your_aws_secret_access_keyNote: AWS SES starts in sandbox mode. You can only send to verified email addresses until you request production access.
# Mailtrap Configuration
MAILTRAP_USER="api"
MAILTRAP_PASS=your-api-token-key
MAILTRAP_API_KEY=your-api-token-key
MAILTRAP_USE_SANDBOX=true # true for testing, false for production
MAILTRAP_INBOX_ID=123456 # Only needed for sandbox modeSandbox vs Production:
MAILTRAP_USE_SANDBOX=true): Emails are caught by Mailtrap, not delivered to real recipients. Perfect for testing.MAILTRAP_USE_SANDBOX=false): Emails are actually delivered. Requires verified sending domain.Nodemailer allows you to send emails using any SMTP server. This is useful for custom email hosting or using your existing email provider.
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-16-char-app-passwordNODEMAILER_HOST=smtp.hostinger.com
NODEMAILER_PORT=587
NODEMAILER_SECURE=false # true for port 465, false for 587
NODEMAILER_USER=support@yourdomain.com
NODEMAILER_PASS=your-email-passwordYou can use any SMTP server. Common providers:
smtp.office365.com (Port 587)smtp.mail.yahoo.com (Port 587)smtp.zoho.com (Port 587)Port Information:
NODEMAILER_SECURE=false)NODEMAILER_SECURE=true)💡 Pro Tip: You can configure multiple email services and use different ones for different purposes:
The Content Templates System allows users to generate content using 72+ pre-built templates across 8 categories (Blog, Email, Social Media, etc.) using OpenAI or Grok.
Run the following SQL files in your NeonDB SQL Editor to create the necessary tables:
voralis-web/migrations/create_content_templates.sqlvoralis-web/migrations/insert_remaining_templates.sqlEnsure these variables are in your .env.local:
# AI Service (Choose one or both)
OPENAI_API_KEY=sk-your-key
GROK_API_KEY=xai-your-key
# Optional: Use Grok for content generation
USE_GROK_FOR_CONTENT=falseAutomatically convert product URLs (Amazon, Shopify, etc.) into video ads using HeyGen avatars and AI script generation.
This feature requires a background worker to process long-running video generation tasks. In development, run:
npm run workerProduction: Deploy scripts/worker.ts as a separate worker service (e.g., on Render or Heroku) to ensure continuous processing.
The worker uses Upstash Redis (or any Redis instance). Ensure UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN are set.
# HeyGen (Video Generation)
HEYGEN_API_KEY=your-heygen-api-key
# Notifications
RESEND_API_KEY=re_your_resend_key
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY... (with proper escaping)"
FIREBASE_PROJECT_ID=your-project-id
FIREBASE_CLIENT_EMAIL=your-client-email
# Storage (Video Hosting)
R2_ACCOUNT_ID=...
R2_ACCESS_KEY_ID=...
R2_SECRET_ACCESS_KEY=...
R2_BUCKET_NAME=...Create multi-slide presentations from a simple topic description using OpenAI.
This feature primarily uses the standard OpenAI configuration. No additional specialized keys are required beyond what is listed in the AI Services section.
# Required for presentation generation
OPENAI_API_KEY=sk-your-openai-keyEnsure you have run the main database schema migration (database-schema.sql), which includes the presentations and presentation_slides tables.
# Generate JWT Secret
openssl rand -base64 32
# Generate Admin Secret
openssl rand -base64 32Add to .env.local:
JWT_SECRET=your-generated-jwt-secret
ADMIN_SECRET_KEY=your-generated-admin-secret# Development
NEXT_PUBLIC_BASE_URL=http://localhost:3000
# Production (update after deployment)
NEXT_PUBLIC_BASE_URL=https://your-domain.com# Brain Server URL (provided by your vendor/developer)
NEXT_PUBLIC_BRAIN_SERVER_URL=https://your-brain-server.vercel.app
# License Key (provided by your vendor/developer)
NEXT_PUBLIC_LICENSE_KEY=your-license-key-here# Start development server
npm run dev
# Or
yarn devVisit http://localhost:3000 and check:
Error: Database not configured - missing NEON_DATABASE_URL
Solution:
NEON_DATABASE_URL is set correctlyError: License verification failed
Solution:
NEXT_PUBLIC_BRAIN_SERVER_URL is correct (contact your vendor/developer)NEXT_PUBLIC_LICENSE_KEY is correctError: API key not configured
Solution:
.env.local (not .env)npm install -g expo-clinpm install -g eas-cliKey files and folders:
package.json – scripts and dependenciesapp.json – Expo app configuration (name, icons, bundle IDs, etc.)eas.json – EAS build profiles (development/production/app1/app2)App.tsx – main app entrysrc/ – app source (screens, components, services, contexts, etc.)From the voralis-app directory:
cd voralis-app
npm install
# or
yarn installExpo uses EXPO_PUBLIC_ prefix for variables that should be available on the client.
.env (or .env.local)In voralis-app/:
touch .envExample content:
# License
EXPO_PUBLIC_LICENSE_KEY=your-mobile-license-key-here
# Brain Server URL (provided by your vendor/developer)
EXPO_PUBLIC_BRAIN_SERVER_URL=https://your-brain-server.vercel.app
# API base URLs (for calling voralis-web backend)
EXPO_PUBLIC_API_BASE_URL=https://www.voralisai.com
EXPO_PUBLIC_API_URL=https://www.voralisai.com
Note: For EAS builds, you typically configure env vars via EAS secrets or eas.json profiles, not by committing .env to git.
EXPO_PUBLIC_LICENSE_KEY - Used in HomeScreen.tsx, LoginScreen.tsx, RegisterScreen.tsx, ChatScreen.tsx to pass a default license key to useLicense.EXPO_PUBLIC_BRAIN_SERVER_URL - Used in src/services/licenseVerification.ts for license verification.EXPO_PUBLIC_API_URL - Used in src/api/speech-to-text.ts as base URL for speech-to-text API.From voralis-app/:
npm start
# or
expo startYou will see a QR code and options for Android, iOS, and Web.
With an emulator:
npm run android
# or
expo run:androidWith a physical device:
expo start).With Simulator:
npm run ios
# or
expo run:iosWith physical device:
Requires Apple developer account and proper provisioning via Xcode / EAS.
npm run webFile: voralis-app/app.json
{
"expo": {
"name": "Voralis AI",
"slug": "voralis-ai",
"version": "1.0.0",
"description": "Advanced AI-powered assistant...",
"userInterfaceStyle": "automatic",
"sdkVersion": "54.0.0",
...
}
}"icon": "./assets/logo.png",
"splash": {
"image": "./assets/logo.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
}To customize branding:
./assets/logo.png, ic_launcher.png, and adaptive-icon.png with your assets.backgroundColor to match your theme."platforms": ["ios", "android", "web"]"extra": {
"googleClientId": "your-google-client-id",
"eas": {
"projectId": "20acf715-d397-4002-ab97-233acd09fea4"
},
"apiUrl": "https://www.voralisai.com"
}You can access extra via expo-constants in code if needed.
"ios": {
"icon": "./assets/ic_launcher.png",
"bundleIdentifier": "com.yourcompany.yourapp"
}Change bundleIdentifier to your own reverse-DNS string before App Store submission.
"android": {
"package": "com.yourcompany.yourapp",
"permissions": [
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.INTERNET",
...
]
}Change package to your own (must be unique on Play Store). Adjust permissions if you add/remove features.
File: voralis-app/eas.json
This file defines multiple build profiles:
app1-development, app2-development – internal dev builds for two app variants.app1-production, app2-production – production builds per variant.development, preview, release, production – generic profiles.{
"build": {
"app1-development": {
"developmentClient": true,
"environment": "development",
"distribution": "internal",
"android": {
"buildType": "apk",
"gradleCommand": ":app:assembleDebug"
},
"ios": {
"buildConfiguration": "Debug",
"image": "latest"
},
"env": {
"NODE_ENV": "development",
"APP": "app1"
}
},
...
}
}From voralis-app/:
# App 1 production build (Android)
npx eas build --platform android --profile app1-production
# App 1 production build (iOS)
npx eas build --platform ios --profile app1-production
# Generic production build
npx eas build --platform android --profile productionThe APP env var is used by scripts/set-project-id.js to swap project IDs or configs between variants.
You can add additional env keys under each profile:
"env": {
"NODE_ENV": "production",
"EXPO_PUBLIC_API_BASE_URL": "https://api.yourdomain.com",
}These are injected at build time on EAS.
If you eject or use expo run:android, Android native project is under android/.
Key files:
android/app/build.gradle – app-level Gradle configandroid/app/src/main/AndroidManifest.xml – permissions and intentsandroid/app/src/main/res/ – icons, adaptive icons, splash imagesMost configuration can be handled via app.json + EAS, but for advanced changes (custom permissions, deep links) you may need to edit these files.
If you run expo run:ios or build with EAS, the iOS project lives under ios/.
Key files:
ios/VoralisAI/Info.plist – app metadata, permissions (camera, microphone, photo library)ios/VoralisAI/AppDelegate.swift – app entryios/VoralisAI/Images.xcassets/ – icons, splash imagesios/VoralisAI.entitlements – capabilities (Push, iCloud, etc.)You generally:
app.json for bundle ID and display name.The mobile app uses the same unified licensing system as the web:
EXPO_PUBLIC_LICENSE_KEY (or per-user key) is used.License Setup Wizard equivalent exists on web; in mobile, screens like HomeScreen, LoginScreen, RegisterScreen, and ChatScreen check isLicensed and block access until license is valid.As an integrator:
voralis-app or download and install dependencies..env with:app.json:eas.json profiles and env vars.npm start and test on device/emulator.eas build for production Android/iOS binaries.For additional help:
This installation guide is part of the Voralis project. All rights reserved.
Last Updated: January 2026
Version: 1.0.0