The system configuration page (/admin/system-config) lets administrators update the application’s .env file and database-stored branding settings directly from the UI. Every save creates a timestamped backup of the .env file before writing changes.
Changes to the .env file take effect immediately — the config cache is cleared after each successful save. The admin session is re-authenticated automatically to prevent logout.
Application settings
Setting .env keyDescription App name APP_NAMEName displayed in the browser tab and emails. Only letters, numbers, spaces, hyphens, underscores, and dots. App URL APP_URLBase URL of the application (e.g. https://app.example.com). Debug mode APP_DEBUGEnable detailed error output. Set to false in production. Environment APP_ENVlocal, staging, or production.Landing page FRONTEND_LANDING_ENABLEDShow or hide the public marketing landing page. Email verification EMAIL_VERIFICATION_ENABLEDRequire users to verify their email before accessing the dashboard.
Database settings
Setting .env keyHost DB_HOSTPort DB_PORTDatabase DB_DATABASEUsername DB_USERNAMEPassword DB_PASSWORD
Click Test database to verify connectivity. The test calls DB::connection()->getPdo() and returns the database name and driver.
Mail settings
Setting .env keySMTP host MAIL_HOSTSMTP port MAIL_PORTUsername MAIL_USERNAMEPassword MAIL_PASSWORDFrom address MAIL_FROM_ADDRESSFrom name MAIL_FROM_NAME
Click Send test email to send a test message to the currently logged-in admin’s email address using the configured SMTP settings.
Stripe settings
Stripe supports separate test and live key sets. Use PAYMENT_ENVIRONMENT to switch between them.
Setting .env keyTest publishable key STRIPE_TEST_PUBLISHABLE_KEYTest secret key STRIPE_TEST_SECRET_KEYTest webhook secret STRIPE_TEST_WEBHOOK_SECRETLive publishable key STRIPE_LIVE_PUBLISHABLE_KEYLive secret key STRIPE_LIVE_SECRET_KEYLive webhook secret STRIPE_LIVE_WEBHOOK_SECRETPayment environment PAYMENT_ENVIRONMENT (sandbox or live)
API keys are masked in the UI (only the first 4 and last 4 characters are shown). Click Test Stripe to validate the secret key against the Stripe API.
Razorpay settings
Setting .env keyAPI key RAZORPAY_API_KEYSecret key RAZORPAY_SECRET_KEYWebhook secret RAZORPAY_WEBHOOK_SECRETTest mode RAZORPAY_TEST_MODE
If you save API credentials without a webhook secret, the system displays a warning with the webhook URL and step-by-step instructions for creating the webhook in the Razorpay dashboard.
Razorpay webhook setup steps
Enter the webhook URL
Use the URL shown in the warning banner in Sniko system config (typically https://your-domain.com/webhooks/razorpay).
Select events
Enable: subscription.activated, subscription.charged, subscription.cancelled, subscription.paused, subscription.resumed, subscription.completed, subscription.pending, subscription.halted, payment.failed, order.paid.
Copy the webhook secret
After creating the webhook, copy the generated secret and paste it into the Razorpay Webhook Secret field in Sniko, then save again.
ElevenLabs settings
Setting .env keyDescription API key ELEVENLABS_API_KEYMaster ElevenLabs API key. Required for all AI voice operations.
Click Test ElevenLabs to verify the key. A successful test returns the account subscription tier, character count, and character limit.
OpenRouter AI settings
OpenRouter is used for LLM-powered features such as AI-assisted translation generation.
Setting .env keyDefault API key OPENROUTER_API_KEY— Model OPENROUTER_MODELopenrouter/auto
Click Test OpenRouter to fetch the list of available models. A successful test reports how many models are accessible.
KYC settings
KYC (Know Your Customer) is optional and disabled by default.
Setting .env keyDefault Description KYC enabled KYC_ENABLEDfalseEnable the KYC flow for customers. KYC required KYC_REQUIREDfalseRequire KYC before customers can use the platform. Grace period KYC_GRACE_PERIOD_DAYS7Days after registration before KYC is enforced. Reminder days KYC_REMINDER_DAYS3Days before grace period ends to send reminder. Block access KYC_BLOCK_ACCESStrueWhether to block platform access after grace period without KYC.
Logo and branding
Logos are stored in the database via BrandingService and served from storage/app/public/logos/. Upload images as base64 from the UI.
Asset Storage path Notes Light logo /storage/logos/logo-light.{ext}Shown on dark backgrounds Dark logo /storage/logos/logo-dark.{ext}Shown on light backgrounds Favicon /favicon.{ext}Served from public/ directly
Supported formats: JPEG, PNG, SVG. Maximum size: 2 MB.
Dashboard font
The dashboard font is stored in the database via BrandingService under the key dashboard_font. Set a Google Fonts-compatible font name (e.g. Inter, Roboto).
Application monitoring
The MonitoringController exposes several endpoints that power the monitoring dashboard and can be used by external uptime checkers.
Health endpoints
Endpoint Auth Description GET /monitoring/healthPublic (cached 60 s) Overall application health status GET /monitoring/health/detailedAdmin Health + usage statistics + alerts GET /monitoring/pingPublic Uptime check, returns {"status":"ok"} GET /monitoring/db-checkPublic Database connectivity check GET /monitoring/cache-checkPublic Cache read/write check GET /monitoring/usage-statsAuth (cached 5 min) Usage statistics GET /monitoring/alertsAuth System alerts with critical/warning counts POST /monitoring/health-checkAuth Manually trigger a health check, clears cache GET /monitoring/dashboardAuth Combined overview for monitoring dashboards
Health response structure
{
"overall_status" : "healthy" ,
"summary" : {
"health_percentage" : 100
}
}
Alerts
Alerts are returned as an array of objects with a level field (critical or warning). The detailed endpoint returns the latest 10 alerts.
Queue worker
Sniko requires a running queue worker for background jobs (batch calls, webhook processing, etc.).
Supervisor (production)
Local development
[program:sniko-worker]
command =php /var/www/artisan queue:work -- sleep =3 -- tries =3 -- max-time =3600
autostart =true
autorestart =true
user =www-data
This starts the PHP dev server, Vite, and queue:listen concurrently.
Verify the worker is running by calling GET /monitoring/health and checking the response for a healthy queue status.
Cache management
The config cache is automatically cleared whenever a system config section is saved. To manually clear the cache, run:
php artisan config:clear
php artisan cache:clear
Admins with the admin.cache.manage permission can also trigger a cache clear from Admin → Pricing → Cache → Clear cache .
MCP server
The optional MCP (Model Context Protocol) server runs as a separate Node.js process. See the installation guide for full setup. Configuration is managed via mcp-servers/unified/ecosystem.config.cjs.
To check its status:
pm2 status
pm2 logs sniko-mcp