{"id":19771413,"url":"https://github.com/tina4stack/tina4-php","last_synced_at":"2026-04-25T03:27:44.814Z","repository":{"id":45521717,"uuid":"177258204","full_name":"tina4stack/tina4-php","owner":"tina4stack","description":"Tina4 PHP composer repository","archived":false,"fork":false,"pushed_at":"2026-04-20T17:30:12.000Z","size":45536,"stargazers_count":27,"open_issues_count":0,"forks_count":19,"subscribers_count":1,"default_branch":"v3","last_synced_at":"2026-04-20T18:46:52.665Z","etag":null,"topics":["annotations","composer","database","firebird","framework","mysql","openapi","orm","orm-objects","php","sqlite","swagger","tina4-php"],"latest_commit_sha":null,"homepage":"https://tina4.com","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tina4stack.png","metadata":{"files":{"readme":"readme.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2019-03-23T07:27:34.000Z","updated_at":"2026-04-20T17:30:13.000Z","dependencies_parsed_at":"2023-02-05T23:45:39.877Z","dependency_job_id":"4637ad36-c3f1-4fd4-b896-690dd553b0f4","html_url":"https://github.com/tina4stack/tina4-php","commit_stats":{"total_commits":885,"total_committers":13,"mean_commits":68.07692307692308,"dds":"0.14802259887005653","last_synced_commit":"783cb0d83dd900e01121d67153b92dc5bfd35488"},"previous_names":[],"tags_count":573,"template":false,"template_full_name":null,"purl":"pkg:github/tina4stack/tina4-php","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tina4stack%2Ftina4-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tina4stack%2Ftina4-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tina4stack%2Ftina4-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tina4stack%2Ftina4-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tina4stack","download_url":"https://codeload.github.com/tina4stack/tina4-php/tar.gz/refs/heads/v3","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tina4stack%2Ftina4-php/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32248756,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T03:17:44.950Z","status":"ssl_error","status_checked_at":"2026-04-25T03:16:45.208Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["annotations","composer","database","firebird","framework","mysql","openapi","orm","orm-objects","php","sqlite","swagger","tina4-php"],"created_at":"2024-11-12T05:01:37.501Z","updated_at":"2026-04-25T03:27:39.805Z","avatar_url":"https://github.com/tina4stack.png","language":"PHP","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://tina4.com/logo.svg\" alt=\"Tina4\" width=\"200\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eTina4 PHP\u003c/h1\u003e\n\u003ch3 align=\"center\"\u003eThe Intelligent Native Application 4ramework\u003c/h3\u003e\n\n\u003cp align=\"center\"\u003e\n  55 built-in features. Zero dependencies. One require, everything works.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://packagist.org/packages/tina4stack/tina4php\"\u003e\u003cimg src=\"https://img.shields.io/packagist/v/tina4stack/tina4php?color=7b1fa2\u0026label=Packagist\" alt=\"Packagist\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/tests-2%2C073%20passing-brightgreen\" alt=\"Tests\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/features-55-blue\" alt=\"Features\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/dependencies-0-brightgreen\" alt=\"Zero Deps\"\u003e\n  \u003ca href=\"https://tina4.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/docs-tina4.com-7b1fa2\" alt=\"Docs\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://tina4.com\"\u003eDocumentation\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#whats-built-in-55-features\"\u003eFeatures\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#cli-reference\"\u003eCLI Reference\u003c/a\u003e \u0026bull;\n  \u003ca href=\"https://tina4.com\"\u003etina4.com\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Quick Start\n\n```bash\n# Install the Tina4 CLI (one-time, cross-language)\ncargo install tina4    # or download a binary from https://github.com/tina4stack/tina4/releases\n\n# Create a project\ntina4 init php ./my-app\n\n# Run it\ncd my-app \u0026\u0026 tina4 serve\n```\n\nOpen http://localhost:7145 -- your app is running.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWithout the Tina4 CLI\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\n# 1. Install\ncomposer require tina4stack/tina4php\n\n# 2. Entry point\necho '\u003c?php require \"vendor/autoload.php\"; (new Tina4\\App())-\u003erun();' \u003e index.php\n\n# 3. .env\necho 'TINA4_DEBUG=true' \u003e .env\n\n# 4. Run (no file watching in this mode)\ncomposer start\n```\n\nOpen http://localhost:7145\n\n\u003c/details\u003e\n\n---\n\n## What's Built In (55 Features)\n\nEvery feature is built from scratch -- no bloated vendor trees, no third-party runtime dependencies in core.\n\n| Category | Features |\n|----------|----------|\n| **Core HTTP** (7) | Router with path params (`{id:int}`, `{p:path}`), Server, Request/Response, Middleware pipeline, Static file serving, CORS |\n| **Database** (6) | SQLite, PostgreSQL, MySQL, MSSQL, Firebird -- unified adapter, connection pooling, query cache, transactions, race-safe ID generation, SQL dialect translation |\n| **ORM** (7) | Active Record with typed fields, relationships (`has_one`/`has_many`/`belongs_to`), soft delete, QueryBuilder + MongoDB support, Auto-CRUD generator, migrations with rollback |\n| **Auth \u0026 Security** (5) | JWT (HS256/RS256), password hashing (PBKDF2-SHA256), API key validation, rate limiting, CSRF form tokens |\n| **Templating** (3) | Frond engine (Twig/Jinja2-compatible, pre-compiled 2.8x faster), SCSS auto-compilation, built-in CSS (~24 KB) |\n| **API \u0026 Integration** (5) | HTTP client (zero-dep), GraphQL with ORM auto-schema + GraphiQL IDE, WSDL/SOAP with auto WSDL, WebSocket (RFC 6455) + Redis backplane, MCP server (24 dev tools) |\n| **Background** (3) | Job queue (File/RabbitMQ/Kafka/MongoDB) with priority, delay, retry, dead letters -- service runner -- event system (on/emit/once/off) |\n| **Data \u0026 Storage** (4) | Session (File/Redis/Valkey/MongoDB/DB), response cache (LRU, TTL), seeder + 50+ fake data generators, messenger (SMTP/IMAP) |\n| **Developer Tools** (7) | Dev dashboard (11 tabs), dev toolbar, error overlay (Catppuccin Mocha), dev mailbox, hot reload + CSS hot-reload, code metrics (complexity, coupling, maintainability), AI context installer (7 tools) |\n| **Utilities** (7) | DI container (transient + singleton), HtmlElement builder, inline testing (`@tests` decorator), i18n (6 languages), Swagger/OpenAPI auto-generation, CLI scaffolding (`generate model/route/migration/middleware`), structured logging |\n\n**2,073 tests. Zero dependencies. Full parity across Python, PHP, Ruby, and Node.js.**\n\nFor full documentation visit **[tina4.com](https://tina4.com)**.\n\n---\n\n## Features\n\n### Routing\n\n```php\nuse Tina4\\Router;\nuse Tina4\\Request;\nuse Tina4\\Response;\n\nRouter::get(\"/api/items\", function (Request $request, Response $response) {\n    return $response([\"items\" =\u003e []], HTTP_OK);\n});\n\nRouter::post(\"/api/webhook\", function (Request $request, Response $response) {\n    return $response([\"ok\" =\u003e true], HTTP_OK);\n})-\u003enoAuth();\n```\n\nPath parameters: `{id}`, `{name}`, `{slug}`. Middleware chaining with `-\u003emiddleware([...])`. Chain `-\u003esecure()` to protect GET routes, `-\u003enoAuth()` to make routes public.\n\n### ORM\n\n```php\nclass User extends \\Tina4\\ORM\n{\n    public $tableName = \"users\";\n    public $primaryKey = \"id\";\n    public $softDelete = true;\n\n    public $id;\n    public $name;\n    public $email;\n\n    public $hasMany = [[\"Order\" =\u003e \"userId\"]];\n    public $hasOne = [[\"Profile\" =\u003e \"userId\"]];\n    public $belongsTo = [[\"Customer\" =\u003e \"customerId\"]];\n}\n\n$user = new User($request);\n$user-\u003esave();\n$user-\u003eload(\"email = 'alice@example.com'\");\n$user-\u003edelete();\n\n$users = (new User())-\u003eselect(\"*\", 100)-\u003easArray();\n```\n\n### Database\n\nUnified interface via `Database::create()`:\n\n```php\nuse Tina4\\Database\\Database;\n\n$db = Database::create('sqlite:///app.db');\n$db = Database::create('postgres://localhost:5432/mydb', username: 'user', password: 'pass');\n$db = Database::create('mysql://localhost:3306/mydb', username: 'root', password: 'secret');\n$db = Database::create('mssql://localhost:1433/mydb', username: 'sa', password: 'pass');\n$db = Database::create('firebird://localhost:3050/path/to/db.fdb', username: 'SYSDBA', password: 'masterkey');\n\n$result = $db-\u003efetch(\"SELECT * FROM users WHERE age \u003e ?\", [18]);\n```\n\n### JWT Authentication\n\n```php\n$token = \\Tina4\\Auth::getToken([\"user_id\" =\u003e 42], \"your-secret\");\n$payload = \\Tina4\\Auth::validToken($token, \"your-secret\");\n$claims = \\Tina4\\Auth::getPayload($token);\n```\n\nPOST/PUT/PATCH/DELETE routes require `Authorization: Bearer \u003ctoken\u003e` by default.\n\n### Sessions\n\n```php\n// File, Redis, Valkey, MongoDB, or database-backed sessions\n$_SESSION[\"user_id\"] = 42;\n$userId = $_SESSION[\"user_id\"];\n```\n\nConfigure via `.env`:\n\n```bash\nTINA4_SESSION_HANDLER=redis\nTINA4_SESSION_PATH=redis://localhost:6379\n```\n\n### Queues\n\n```php\nuse Tina4\\Queue;\n\n$queue = new Queue();\n$queue-\u003epush(\"email.send\", [\"to\" =\u003e \"alice@example.com\", \"subject\" =\u003e \"Welcome\"]);\n$queue-\u003epush(\"report.generate\", [\"id\" =\u003e 42], priority: 10, delay: 60);\n\n// Process jobs\n$queue-\u003eprocess(\"email.send\", function ($job) {\n    sendEmail($job[\"to\"], $job[\"subject\"]);\n});\n```\n\nBackends: File (default), RabbitMQ, Kafka, MongoDB. Supports priority, delay, retry, and dead letters.\n\n### GraphQL\n\n```php\n// Auto-schema from ORM models -- no configuration needed\n// GET  /graphql  -\u003e GraphiQL IDE\n// POST /graphql  -\u003e Execute queries\n\n// Query:  { users { id, name, email } }\n// Mutation support via ORM save/delete\n```\n\n### WebSocket\n\n```php\nuse Tina4\\WebSocket;\n\n$ws = new WebSocket('0.0.0.0', 8080);\n\n$ws-\u003eon('message', function ($connection, $message) {\n    $connection-\u003esend(\"Echo: \" . $message);\n});\n\n$ws-\u003eon('open', function ($connection) {\n    $connection-\u003esend(\"Welcome!\");\n});\n\n$ws-\u003estart();\n```\n\nSupports RFC 6455, per-path routing, connection manager, broadcast, and Redis backplane for horizontal scaling.\n\n### Swagger / OpenAPI\n\nAuto-generated at `/swagger`:\n\n```php\n/**\n * @description Get all users\n * @tags Users\n */\nRouter::get(\"/api/users\", function (Request $request, Response $response) {\n    return $response((new User())-\u003eselect(\"*\", 100)-\u003easArray(), HTTP_OK);\n});\n```\n\n### Event System\n\n```php\nuse Tina4\\Events;\n\nEvents::on(\"user.created\", function ($user) {\n    sendWelcomeEmail($user);\n}, priority: 10);\n\nEvents::once(\"app.boot\", function () {\n    warmCaches();\n});\n\nEvents::emit(\"user.created\", $userData);\nEvents::off(\"user.created\");\n```\n\n### WSDL / SOAP\n\n```php\n// Auto WSDL generation from annotated service classes\n// Endpoint: /wsdl\n```\n\n### REST Client\n\n```php\n$api = new \\Tina4\\Api(\"https://api.example.com\", \"Bearer xyz\");\n$result = $api-\u003esendRequest(\"/users/42\");\n$result = $api-\u003esendRequest(\"/users\", \"POST\", [\"name\" =\u003e \"Alice\"]);\n```\n\n### Seeder \u0026 Fake Data\n\n```php\nuse Tina4\\FakeData;\n\n$fake = new FakeData();\n$fake-\u003ename();        // \"Alice Johnson\"\n$fake-\u003eemail();       // \"alice.johnson@example.com\"\n$fake-\u003ephone();       // \"+1-555-0123\"\n$fake-\u003eaddress();     // \"123 Main St, Springfield\"\n$fake-\u003eparagraph();   // Lorem ipsum...\n```\n\n50+ generators for names, emails, addresses, dates, numbers, text, and more.\n\n### Messenger (SMTP/IMAP)\n\n```php\nuse Tina4\\Messenger;\n\n$messenger = new Messenger();\n$messenger-\u003esendEmail(\n    \"recipient@example.com\",\n    \"Subject Line\",\n    \"\u003ch1\u003eHello\u003c/h1\u003e\u003cp\u003eMessage body\u003c/p\u003e\"\n);\n```\n\nConfigure via `.env`:\n\n```bash\nSMTP_HOST=smtp.example.com\nSMTP_PORT=587\nSMTP_USERNAME=user@example.com\nSMTP_PASSWORD=secret\n```\n\n### Template Engine (Frond)\n\nTwig-compatible with pre-compilation for 2.8x faster rendering:\n\n```twig\n{% extends \"base.twig\" %}\n{% block content %}\n\u003ch1\u003e{{ title | upper }}\u003c/h1\u003e\n{% for item in items %}\n    \u003cp\u003e{{ item.name }} -- {{ item.price | number_format(2) }}\u003c/p\u003e\n{% endfor %}\n{% include \"partials/sidebar.twig\" %}\n{% endblock %}\n```\n\n### DI Container\n\n```php\n$container = new \\Tina4\\Container();\n$container-\u003esingleton('db', fn() =\u003e Database::create(getenv('DB_URL')));\n$container-\u003eregister('mailer', fn() =\u003e new MailService());\n\n$db = $container-\u003eget('db');       // same instance every time\n$mailer = $container-\u003eget('mailer'); // new instance each time\n```\n\n### Inline Testing\n\n```php\n/**\n * @tests\n *   assert (1,1) === 2, \"1 + 1 = 2\"\n *   assert is_integer(1,1) === true, \"This should be an integer\"\n */\nfunction add($a, $b) {\n    return $a + $b;\n}\n```\n\n### i18n (Localization)\n\nJSON translation files with placeholder interpolation. Supports 6 languages out of the box.\n\n```php\nuse Tina4\\I18n;\n\n$i18n = new I18n('en');\necho $i18n-\u003etranslate(\"welcome.message\", [\"name\" =\u003e \"Alice\"]);\n```\n\n### HtmlElement Builder\n\n```php\nextract(\\Tina4\\HtmlElement::helpers());\necho $_div([\"class\" =\u003e \"card\"],\n    $_h2(\"Title\"),\n    $_p(\"Content\")\n);\n```\n\n---\n\n## Dev Mode\n\nSet `TINA4_DEBUG=true` in `.env` to enable:\n\n- **Dev dashboard** (`/__dev/`) -- admin UI with route inspection, query runner, queue management, WebSocket monitor, dev mailbox, and more\n- **Dev toolbar** -- fixed bar showing HTTP method, matched route, request ID, and PHP version\n- **Error overlay** -- syntax-highlighted stack traces with Catppuccin Mocha theme\n- **Hot reload** -- the `tina4` Rust CLI watches `src/`, `migrations/`, `.env` and POSTs `/__dev/api/reload`; PHP broadcasts to the browser via WebSocket (`/__dev_reload`) with a polling fallback on `GET /__dev/api/mtime`. SCSS changes swap the stylesheet without a full reload\n- **Template debug** -- `{{ dump(variable) }}` available, no caching\n\n---\n\n## CLI Reference\n\n```bash\nbin/tina4php serve [--port P] [--host H]     # Start dev server (default: 0.0.0.0:7145)\nbin/tina4php migrate                         # Run pending migrations\nbin/tina4php migrate:create \"description\"    # Create a migration file\nbin/tina4php generate model \u003cname\u003e           # Generate ORM model scaffold\nbin/tina4php generate route \u003cname\u003e           # Generate route scaffold\nbin/tina4php generate migration \u003cdesc\u003e       # Generate migration file\nbin/tina4php generate middleware \u003cname\u003e       # Generate middleware scaffold\nbin/tina4php seed                            # Run database seeders\nbin/tina4php ai [--all]                      # Install AI context files\n```\n\nOr via Composer:\n\n```bash\ncomposer start                               # Start dev server\ncomposer start --production                  # Start with OPcache + production config\ncomposer test                                # Run test suite\ncomposer tina4 migrate                       # Run migrations\ncomposer tina4 generate model User           # Scaffold a model\n```\n\n---\n\n## Performance\n\nBenchmarked with `wrk` — 5,000 requests, 50 concurrent, median of 3 runs:\n\n| Framework | JSON req/s | Deps | Features |\n|-----------|-----------|------|----------|\n| **Tina4 PHP** | **29,293** | 0 | 55 |\n| Slim | 5,714 | 10+ | ~6 |\n| Laravel | 445 | 50+ | ~25 |\n\nTina4 PHP is **5× faster than Slim and 65× faster than Laravel** — with zero dependencies and 55 features built in.\n\n**Across all 4 Tina4 implementations:**\n\n| | Python | PHP | Ruby | Node.js |\n|---|--------|-----|------|---------|\n| **JSON req/s** | 6,508 | 29,293 | 10,243 | 84,771 |\n| **Dependencies** | 0 | 0 | 0 | 0 |\n| **Features** | 55 | 55 | 55 | 55 |\n\n---\n\n## Cross-Framework Parity\n\nTina4 ships the same 55 features across four languages with full test parity:\n\n| Language | Package | Tests (v3.11.12) |\n|----------|---------|------------------|\n| **Python** | `pip install tina4-python` | 2,281 |\n| **PHP** | `composer require tina4stack/tina4php` | 2,073 |\n| **Ruby** | `gem install tina4` | 2,508 |\n| **Node.js** | `npm install @tina4/core` | 2,897 |\n\nSame routing, same ORM, same templates, same CLI, same dev tools. Learn one, deploy in any.\n\n---\n\n## Environment\n\nKey `.env` variables:\n\n```bash\n# Core\nTINA4_DEBUG=true                        # Enable debug mode\nDATABASE_PATH=app.db                    # SQLite database path (or use DATABASE_URL)\nDATABASE_URL=postgres://localhost/mydb  # Connection URL for any database\nSECRET=your-jwt-secret                  # JWT signing secret\nTINA4_LOCALE=en                         # Localization language\n\n# Database\nTINA4_DB_CACHE=true                     # Enable query caching (4x speedup)\nTINA4_AUTOCOMMIT=false                  # Auto-commit control (default: off)\n\n# Sessions\nTINA4_SESSION_HANDLER=file              # file, redis, valkey, mongodb, database\nTINA4_SESSION_PATH=redis://localhost    # Session backend URL\nTINA4_SESSION_SAMESITE=Lax             # SameSite cookie attribute\n\n# Cache\nTINA4_CACHE_TTL=60                      # Response cache TTL in seconds\nTINA4_CACHE_MAX_ENTRIES=1000            # Max cached responses\n\n# WebSocket\nTINA4_WS_BACKPLANE=redis               # WebSocket scaling backplane\nTINA4_WS_BACKPLANE_URL=redis://localhost # Backplane connection URL\n\n# Swagger\nSWAGGER_TITLE=My API                    # Swagger page title\nSWAGGER_DESCRIPTION=API docs            # Swagger description\n\n# SMTP\nSMTP_HOST=smtp.example.com             # Mail server\nSMTP_PORT=587                           # Mail port\nSMTP_USERNAME=user@example.com         # Mail username\nSMTP_PASSWORD=secret                    # Mail password\n```\n\n---\n\n## Zero-Dependency Philosophy\n\nTina4 PHP is built from the ground up with no third-party runtime dependencies in core. The framework requires only PHP 8.2+ with `openssl` and `json` extensions. Database drivers are optional and installed separately. This keeps the full deployment under 8 MB and minimizes your project's carbon footprint.\n\n---\n\n## Demo Store\n\nA complete e-commerce app lives in `example/`. It demonstrates every framework feature through a real-world use case.\n\n```bash\ncd example\nbash setup.sh          # macOS/Linux\n# or: setup.bat        # Windows\nphp index.php\n```\n\nOpen http://localhost:7145\n\n| Role | Email | Password |\n|------|-------|----------|\n| Admin | admin@tina4store.com | admin123 |\n| Customer | alice@example.com | customer123 |\n\nSee [`example/README.md`](example/README.md) for full details.\n\n---\n\n## Documentation\n\nFull guides, API reference, and examples at **[tina4.com](https://tina4.com)**.\n\n## License\n\nMIT (c) 2007-2026 Tina4 Stack\nhttps://opensource.org/licenses/MIT\n\n---\n\n\u003cp align=\"center\"\u003e\u003cb\u003eTina4 — The Intelligent Native Application 4ramework\u003c/b\u003e\u003cbr\u003eSimple. Fast. Human. \u0026middot; Built for AI. Built for you.\u003c/p\u003e\n\n---\n\n## Our Sponsors\n\n**Sponsored with :blue_heart: by Code Infinity**\n\n[\u003cimg src=\"https://codeinfinity.co.za/wp-content/uploads/2025/09/c8e-logo-github.png\" alt=\"Code Infinity\" width=\"100\"\u003e](https://codeinfinity.co.za/about-open-source-policy?utm_source=github\u0026utm_medium=website\u0026utm_campaign=opensource_campaign\u0026utm_id=opensource)\n\n*Supporting open source communities \u003cspan style=\"color: #1DC7DE;\"\u003e*\u003c/span\u003e Innovate \u003cspan style=\"color: #1DC7DE;\"\u003e*\u003c/span\u003e Code \u003cspan style=\"color: #1DC7DE;\"\u003e*\u003c/span\u003e Empower*\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftina4stack%2Ftina4-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftina4stack%2Ftina4-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftina4stack%2Ftina4-php/lists"}