{"id":27427247,"url":"https://github.com/xoops/xmf","last_synced_at":"2026-04-07T06:02:27.503Z","repository":{"id":9799622,"uuid":"11778001","full_name":"XOOPS/xmf","owner":"XOOPS","description":"XOOPS Module Framework","archived":false,"fork":false,"pushed_at":"2026-04-06T23:12:42.000Z","size":11432,"stargazers_count":7,"open_issues_count":10,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-04-07T01:09:35.381Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/XOOPS.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2013-07-30T23:34:29.000Z","updated_at":"2026-04-06T23:12:43.000Z","dependencies_parsed_at":"2025-04-14T13:00:21.303Z","dependency_job_id":null,"html_url":"https://github.com/XOOPS/xmf","commit_stats":null,"previous_names":[],"tags_count":57,"template":false,"template_full_name":null,"purl":"pkg:github/XOOPS/xmf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XOOPS%2Fxmf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XOOPS%2Fxmf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XOOPS%2Fxmf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XOOPS%2Fxmf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/XOOPS","download_url":"https://codeload.github.com/XOOPS/xmf/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XOOPS%2Fxmf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31501903,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":[],"created_at":"2025-04-14T12:49:40.827Z","updated_at":"2026-04-07T06:02:27.495Z","avatar_url":"https://github.com/XOOPS.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cbr /\u003e\n  \u003cimg src=\"https://xoops.org/images/logoXoopsPhp81.png\" alt=\"XOOPS\" height=\"60\" /\u003e\n  \u003cbr /\u003e\n  XMF \u0026mdash; XOOPS Module Framework\n  \u003cbr /\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eThe toolkit that makes XOOPS module development faster, safer, and more consistent.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/XOOPS/xmf/actions\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/XOOPS/xmf/ci.yml?branch=master\u0026label=CI\u0026logo=github\" alt=\"CI Status\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://scrutinizer-ci.com/g/XOOPS/xmf/\"\u003e\u003cimg src=\"https://img.shields.io/scrutinizer/quality/g/XOOPS/xmf/master?logo=scrutinizer\" alt=\"Scrutinizer\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://packagist.org/packages/xoops/xmf\"\u003e\u003cimg src=\"https://img.shields.io/packagist/v/xoops/xmf?label=stable\u0026logo=packagist\" alt=\"Packagist Version\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://packagist.org/packages/xoops/xmf\"\u003e\u003cimg src=\"https://img.shields.io/packagist/dt/xoops/xmf?logo=packagist\u0026color=blue\" alt=\"Downloads\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://packagist.org/packages/xoops/xmf\"\u003e\u003cimg src=\"https://img.shields.io/packagist/php-v/xoops/xmf?logo=php\" alt=\"PHP Version\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.gnu.org/licenses/gpl-2.0.html\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-GPL--2.0--or--later-blue\" alt=\"License\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Why XMF?\n\nBuilding XOOPS modules means solving the same problems over and over: filtering input, managing sessions, handling permissions, generating meta tags, working with databases. **XMF gives you battle-tested solutions for all of them** so you can focus on what makes your module unique.\n\n| | What you get | Why it matters |\n|---|---|---|\n| **Input \u0026 Security** | Request handling, input filtering, IP address validation | Stop writing your own sanitization \u0026mdash; use proven, audited code |\n| **Database** | Schema migrations, table management, bulk loading | Evolve your database safely across module versions |\n| **Authentication** | JWT tokens, key management, secure storage | Add token-based auth without pulling in heavyweight packages |\n| **Module Helpers** | Admin panels, permissions, sessions, caching | Common module tasks reduced to one-liners |\n| **Content Tools** | Meta tag generation, SEO titles, YAML config, search summaries | Improve SEO and content handling with zero effort |\n| **Identifiers** | ULID and UUID generation | Generate unique, sortable identifiers out of the box |\n| **Developer Tools** | Debugging (Kint), YAML import/export, assertions | Debug and inspect with a single call |\n\n## Quick Start\n\n```bash\ncomposer require xoops/xmf\n```\n\n```php\nuse Xmf\\Request;\nuse Xmf\\FilterInput;\nuse Xmf\\Metagen;\n\n// Safe input handling\n$id = Request::getInt('id', 0, 'GET');\n$name = Request::getString('name', '', 'POST');\n\n// Generate SEO-friendly meta tags\nMetagen::generateMetaTags($title, $body);\n\n// Generate a ULID\n$ulid = \\Xmf\\Ulid::generate();\n```\n\n## Components\n\n```\nxmf/src/\n  |\n  |-- Request.php          HTTP request handling \u0026 input retrieval\n  |-- FilterInput.php      Input sanitization \u0026 XSS prevention\n  |-- IPAddress.php        IPv4/IPv6 validation \u0026 subnet checks\n  |-- ProxyCheck.php       Proxy detection for real client IPs\n  |\n  |-- Database/\n  |     |-- Tables.php     Schema definition \u0026 ALTER operations\n  |     |-- Migrate.php    Module schema migrations\n  |     +-- TableLoad.php  Bulk data import\n  |\n  |-- Jwt/\n  |     |-- JsonWebToken   Create \u0026 decode signed JWT tokens\n  |     |-- TokenFactory   Convenient token builder\n  |     +-- TokenReader    Token verification \u0026 claim extraction\n  |\n  |-- Key/\n  |     |-- Basic.php      Key pair generation\n  |     |-- FileStorage    Persistent key storage (filesystem)\n  |     +-- ArrayStorage   In-memory key storage (testing)\n  |\n  |-- Module/\n  |     |-- Admin.php      Admin panel rendering \u0026 config display\n  |     +-- Helper/\n  |           |-- Permission   Group permission management\n  |           |-- Session      Secure session read/write\n  |           |-- Cache        Module-scoped caching\n  |           +-- GenericHelper  Common helper utilities\n  |\n  |-- Metagen.php          Meta keywords, descriptions \u0026 SEO titles\n  |-- Highlighter.php      Search term highlighting\n  |-- StopWords.php        Keyword filtering (multi-language)\n  |\n  |-- Ulid.php             ULID generation (monotonic \u0026 standard)\n  |-- Uuid.php             UUID v4 generation\n  |-- Random.php           Cryptographically secure random bytes\n  |\n  |-- Yaml.php             YAML read/write with PHP-wrapped security\n  |-- Language.php         Safe language file loading\n  |-- Debug.php            Kint-powered variable inspection\n  +-- Assert.php           Runtime assertion helpers\n```\n\n## Requirements\n\n| Requirement | Version |\n|---|---|\n| PHP | 8.2+ |\n| XOOPS | 2.5.x or 2.6.x |\n| Composer | Required |\n\n### Key Dependencies\n\n- [`firebase/php-jwt`](https://github.com/firebase/php-jwt) \u0026mdash; JWT encoding/decoding\n- [`symfony/yaml`](https://github.com/symfony/yaml) \u0026mdash; YAML parsing\n- [`kint-php/kint`](https://github.com/kint-php/kint) \u0026mdash; Debug output\n- [`webmozart/assert`](https://github.com/webmozarts/assert) \u0026mdash; Assertion library\n\n## Installation\n\n**Via Composer (recommended):**\n\n```bash\ncomposer require xoops/xmf\n```\n\n**As part of XOOPS:**\n\nXMF is included in XOOPS 2.5.8+ as a core library. No separate installation needed.\n\n## Development\n\n```bash\n# Install dependencies\ncomposer install\n\n# Run tests\ncomposer test\n\n# Static analysis\ncomposer analyse\n\n# Code style check\ncomposer lint\n\n# Auto-fix code style\ncomposer fix\n\n# Run all CI checks\ncomposer ci\n\n# Regenerate PHPStan baseline\ncomposer baseline\n```\n\n## Contributing\n\nContributions are welcome! Please see our [Contributing Guide](.github/CONTRIBUTING.md) for details.\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/my-feature`)\n3. Make your changes and add tests\n4. Run `composer ci` to verify\n5. Submit a Pull Request\n\n## Links\n\n- [XOOPS Project](https://xoops.org)\n- [XMF on Packagist](https://packagist.org/packages/xoops/xmf)\n- [XMF on GitHub](https://github.com/XOOPS/xmf)\n- [Issue Tracker](https://github.com/XOOPS/xmf/issues)\n- [Changelog](CHANGELOG.md)\n\n## License\n\nXMF is licensed under the [GPL-2.0-or-later](docs/license.md).\n\n## Acknowledgments\n\n\u003ca href=\"https://www.jetbrains.com/community/opensource/\"\u003e\n  \u003cimg src=\"https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg\" alt=\"JetBrains Logo\" width=\"120\" /\u003e\n\u003c/a\u003e\n\nThank you to [JetBrains](https://www.jetbrains.com/community/opensource/) for supporting open-source development by providing free IDE licenses to this project.\n\n---\n\n\u003cp align=\"center\"\u003e\n  Made with ❤️ by the \u003ca href=\"https://github.com/XOOPS\"\u003eXOOPS Project\u003c/a\u003e community\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxoops%2Fxmf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxoops%2Fxmf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxoops%2Fxmf/lists"}