Skip to content

Environment Variables

Tina4 is configured through environment variables, read from .env at the project root. Every variable has a sensible default — most projects set three or four values and leave the rest alone.

This chapter lists every variable the PHP framework reads, grouped by subsystem. Start with the minimum-config examples at the end, then come back here when you need to tune something specific.


Core Server

VariableDefaultDescription
HOST0.0.0.0Bind address. 0.0.0.0 listens on every interface. 127.0.0.1 restricts to localhost.
PORT7146HTTP server port. The Rust CLI prefers TINA4_PORT but falls back to PORT.
TINA4_PORT(inherits PORT)Explicit Tina4-specific port override. Takes precedence over PORT when both are set.
TINA4_WS_PORT(inherits port)Separate port for the WebSocket server. Leave unset to share the HTTP port.
HOST_NAMElocalhost:7146Fully-qualified host used in generated absolute URLs (Swagger, OAuth redirects, emails).
TINA4_DEBUGfalseMaster debug toggle. Enables Swagger UI, dev dashboard, live reload, template dump filter, error overlay. Never set to true in production.
TINA4_DEBUG_LEVELERRORMinimum message level shown when TINA4_DEBUG=true. Options: DEBUG, INFO, WARNING, ERROR, ALL.
TINA4_NO_BROWSERfalseStops tina4 serve from opening your browser on every restart. Recommended during active development.
TINA4_NO_RELOADfalseDisables the dev hot-reload signal from the Rust CLI. Use when you want a stable server for debugging.
TINA4_SUPPRESSfalseHides the Tina4 startup banner. Useful in CI and systemd units where stdout is ingested.
TINA4_VERSION(framework)Override the version string reported by /__dev/api/system. Mostly for testing.
TINA4_CLI_SERVE(none)Set internally by the Rust CLI to signal managed mode. Do not set manually.
TINA4_INCLUDE_LOCATIONSsrc/routes,src/orm,src/appComma-separated directories auto-included at boot.

Secrets and Authentication

VariableDefaultDescription
SECRET(empty)JWT signing secret. Must be long, random, and unique per environment. Never commit.
JWT_ALGORITHMHS256JWT signing algorithm. Supports HS256, HS384, HS512.
TINA4_TOKEN_LIMIT60JWT token lifetime in minutes.
TINA4_API_KEY(empty)Static API key used by Auth::validateApiKey() as a fallback to JWT.

Database

VariableDefaultDescription
DATABASE_URLsqlite:///data/app.dbConnection URL. Scheme selects the driver: sqlite, postgres, mysql, mssql, sqlserver, firebird.
DATABASE_USERNAME(empty)Overrides the username embedded in DATABASE_URL.
DATABASE_PASSWORD(empty)Overrides the password embedded in DATABASE_URL.
DB_URL(empty)Legacy alias for DATABASE_URL. Prefer DATABASE_URL in new projects.
TINA4_AUTOCOMMITfalseAuto-commit after every write. Default is off — call commit() explicitly.
TINA4_DB_CACHEfalseEnables in-memory query-result caching for read queries.
TINA4_DB_CACHE_TTL60Query cache TTL in seconds when TINA4_DB_CACHE=true.
TINA4_MIGRATION_ID(timestamp)Override the migration ID used when recording applied migrations.

CORS

VariableDefaultDescription
TINA4_CORS_ORIGINS*Comma-separated allowed origins. Lock down to real domains in production.
TINA4_CORS_METHODSGET,POST,PUT,PATCH,DELETE,OPTIONSAllowed request methods.
TINA4_CORS_HEADERSContent-Type,Authorization,X-Requested-WithAllowed request headers.
TINA4_CORS_CREDENTIALSfalseSend Access-Control-Allow-Credentials: true. Required for cross-origin cookies.
TINA4_CORS_MAX_AGE600Preflight cache lifetime in seconds.

Security Headers

VariableDefaultDescription
TINA4_CSPdefault-src 'self'Content-Security-Policy header.
TINA4_CSRFtrueCSRF token validation on POST/PUT/PATCH/DELETE. Requires _csrf in the body or X-CSRF-Token header.
TINA4_HSTS(empty/off)Strict-Transport-Security max-age in seconds. Set 31536000 in production with HTTPS.
TINA4_FRAME_OPTIONSDENYX-Frame-Options header. Set SAMEORIGIN if you embed your own app in an iframe.
TINA4_REFERRER_POLICYstrict-origin-when-cross-originReferrer-Policy header.
TINA4_PERMISSIONS_POLICY(empty)Permissions-Policy header. Example: geolocation=(), microphone=().

Rate Limiting

VariableDefaultDescription
TINA4_RATE_LIMIT100Maximum requests per window per IP. Set 0 to disable.
TINA4_RATE_WINDOW60Rate-limit window in seconds.

Sessions

VariableDefaultDescription
TINA4_SESSION_BACKENDfileStorage backend. Options: file, redis, valkey, mongo, database.
TINA4_SESSION_HANDLER(inherits _BACKEND)Alternate handler class name. Overrides TINA4_SESSION_BACKEND.
TINA4_SESSION_TTL3600Session expiry in seconds.
TINA4_SESSION_SAMESITELaxSameSite cookie attribute. Options: Strict, Lax, None.
TINA4_SESSION_PATHdata/sessionsFilesystem path for the file backend.

Redis/Valkey session backend

VariableDefaultDescription
TINA4_SESSION_REDIS_HOSTlocalhostRedis host.
TINA4_SESSION_REDIS_PORT6379Redis port.
TINA4_SESSION_REDIS_PASSWORD(none)Redis auth password.
TINA4_SESSION_REDIS_DB0Redis database number.
TINA4_SESSION_REDIS_URL(none)Full redis:// URL. Overrides the individual fields when set.
TINA4_SESSION_VALKEY_HOSTlocalhostValkey host.
TINA4_SESSION_VALKEY_PORT6379Valkey port.
TINA4_SESSION_VALKEY_PASSWORD(none)Valkey auth password.
TINA4_SESSION_VALKEY_DB0Valkey database number.

MongoDB session backend

VariableDefaultDescription
TINA4_SESSION_MONGO_URLmongodb://localhost:27017MongoDB connection string.
TINA4_SESSION_MONGO_DBtina4MongoDB database name.

Cache

VariableDefaultDescription
TINA4_CACHE_BACKENDmemoryResponse cache backend. Options: memory, file, redis.
TINA4_CACHE_DIRdata/cacheCache directory for the file backend.
TINA4_CACHE_TTL60Default cache TTL in seconds.
TINA4_CACHE_MAX_ENTRIES1000Maximum cache entries. Oldest entries evicted first.
TINA4_CACHE_URL(none)Connection URL for remote cache backends (Redis, Memcached).

Queues

VariableDefaultDescription
TINA4_QUEUE_BACKENDfileQueue backend. Options: file, kafka, rabbitmq, mongo, database.
TINA4_QUEUE_PATHdata/queueFilesystem path for the file backend.
TINA4_QUEUE_URL(none)Connection URL for remote backends.

Kafka queue backend

VariableDefaultDescription
TINA4_KAFKA_BROKERSlocalhost:9092Comma-separated broker list.
TINA4_KAFKA_GROUP_IDtina4_consumer_groupKafka consumer group ID.

RabbitMQ queue backend

VariableDefaultDescription
TINA4_RABBITMQ_HOSTlocalhostRabbitMQ host.
TINA4_RABBITMQ_PORT5672RabbitMQ port.
TINA4_RABBITMQ_USERNAMEguestRabbitMQ username.
TINA4_RABBITMQ_PASSWORDguestRabbitMQ password.
TINA4_RABBITMQ_VHOST/RabbitMQ virtual host.

MongoDB queue backend

VariableDefaultDescription
TINA4_MONGO_URI(none)Full MongoDB connection string. Overrides host/port when set.
TINA4_MONGO_HOSTlocalhostMongoDB host.
TINA4_MONGO_PORT27017MongoDB port.
TINA4_MONGO_USERNAME(none)MongoDB username.
TINA4_MONGO_PASSWORD(none)MongoDB password.
TINA4_MONGO_DBtina4MongoDB database name.
TINA4_MONGO_COLLECTIONtina4_queueMongoDB collection name for jobs.

WebSocket Backplane

VariableDefaultDescription
TINA4_WS_BACKPLANE(none)Backplane type. Set redis for multi-instance broadcasts.
TINA4_WS_BACKPLANE_URLredis://localhost:6379Connection URL for the backplane.

Email

VariableDefaultDescription
TINA4_MAIL_HOST(none)SMTP server hostname.
TINA4_MAIL_PORT587SMTP server port.
TINA4_MAIL_USERNAME(none)SMTP authentication username.
TINA4_MAIL_PASSWORD(none)SMTP authentication password.
TINA4_MAIL_FROM(none)Default sender email address.
TINA4_MAIL_FROM_NAME(none)Default sender display name.
TINA4_MAIL_ENCRYPTIONtlsConnection encryption. Options: tls, ssl, none.
TINA4_MAIL_IMAP_HOST(none)IMAP server for inbound mail.
TINA4_MAIL_IMAP_PORT993IMAP server port.
TINA4_MAILBOX_DIRdata/mailboxDev mailbox directory. All outbound mail lands here when TINA4_DEBUG=true.

SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD are also accepted as aliases for the TINA4_MAIL_* equivalents. New projects should use the TINA4_MAIL_* names.


Logging

VariableDefaultDescription
TINA4_LOG_LEVELERRORMinimum log level written to files. Options: ALL, DEBUG, INFO, WARNING, ERROR.
TINA4_LOG_DEBUG0Numeric flag for debug-level messages. Used internally by Debug::message().
TINA4_LOG_INFO1Numeric flag for info-level messages.
TINA4_LOG_ERROR3Numeric flag for error-level messages.
TINA4_LOG_MAX_SIZE10485760Per-file log size limit in bytes (10 MB). Rotated when exceeded.
TINA4_LOG_KEEP5Number of rotated log files to retain.

Uploads

VariableDefaultDescription
TINA4_MAX_UPLOAD_SIZE10485760Maximum multipart upload size in bytes (10 MB).

Localisation

VariableDefaultDescription
TINA4_LOCALEenDefault locale for I18n.
TINA4_LOCALE_DIRsrc/localeDirectory containing locale JSON files.

Services (background tasks)

VariableDefaultDescription
TINA4_SERVICE_DIRsrc/servicesDirectory scanned for service classes.
TINA4_SERVICE_SLEEP1Default tick interval (seconds) when a service does not specify one.

AI and MCP Tooling

VariableDefaultDescription
TINA4_MCP_REMOTE(none)URL of a remote MCP server to proxy through.
TINA4_NO_AI_PORTfalseDisables the MCP port listener in dev mode.
TINA4_OVERRIDE_CLIENT(none)Forces a specific AI client ID in /__dev/api/ai. Used for testing.

HTTP Status Constants

For use in route handlers instead of raw integers:

php
return $response->json($data, \Tina4\HTTP_CREATED);
return $response("<error/>", \Tina4\HTTP_BAD_REQUEST, \Tina4\APPLICATION_XML);

See Chapter 3: Request and Response for the full table.


Log-Level Constants

Passed to Debug::message() to tag severity:

ConstantDescription
TINA4_LOG_DEBUGVerbose developer messages.
TINA4_LOG_INFONormal operational messages.
TINA4_LOG_WARNINGNon-fatal anomalies.
TINA4_LOG_ERRORRecoverable errors.
TINA4_LOG_CRITICALFatal or security-relevant events.
php
\Tina4\Debug::message("User " . $id . " missed the cache", TINA4_LOG_INFO);

Minimal .env for Development

bash
TINA4_DEBUG=true
TINA4_DEBUG_LEVEL=DEBUG
TINA4_NO_BROWSER=true

That is it. Debug mode lights up the Swagger UI, the dev dashboard, detailed error pages, and live reload. Keeping the browser flag on stops a new tab opening every time you save a file.


Minimal .env for Production

bash
SECRET=your-long-random-secret-here
DATABASE_URL=postgresql://user:password@db-host:5432/myapp
TINA4_CORS_ORIGINS=https://myapp.com,https://www.myapp.com
TINA4_HSTS=31536000
TINA4_MAIL_HOST=smtp.example.com
TINA4_MAIL_PORT=587
TINA4_MAIL_USERNAME=noreply@myapp.com
TINA4_MAIL_PASSWORD=your-smtp-password
TINA4_MAIL_FROM=noreply@myapp.com

No TINA4_DEBUG. It defaults to false, which is what you want in production. Set a real secret, a real database, locked-down CORS origins, HSTS, and SMTP credentials if you send email. Everything else has a production-appropriate default.

Sponsored with 🩵 by Code InfinityCode Infinity