{"id":50795284,"url":"https://github.com/maskalix/pressline","last_synced_at":"2026-06-12T14:01:31.458Z","repository":{"id":356763092,"uuid":"1149112989","full_name":"maskalix/pressline","owner":"maskalix","description":"PressLine CMS","archived":false,"fork":false,"pushed_at":"2026-05-24T17:46:55.000Z","size":356,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-24T19:18:21.498Z","etag":null,"topics":["administration","blog","cms","news","php"],"latest_commit_sha":null,"homepage":"https://pressline.app","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/maskalix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2026-02-03T18:29:11.000Z","updated_at":"2026-05-24T19:08:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/maskalix/pressline","commit_stats":null,"previous_names":["maskalix/pressline"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/maskalix/pressline","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maskalix%2Fpressline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maskalix%2Fpressline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maskalix%2Fpressline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maskalix%2Fpressline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maskalix","download_url":"https://codeload.github.com/maskalix/pressline/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maskalix%2Fpressline/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34247461,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["administration","blog","cms","news","php"],"created_at":"2026-06-12T14:01:09.678Z","updated_at":"2026-06-12T14:01:31.451Z","avatar_url":"https://github.com/maskalix.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://typestor.lnln.eu//brand/pressline/image/pressline.png\" alt=\"PressLine\" width=\"120\" /\u003e\n\n# PressLine\n\nA small CMS with a real plugin SDK.\nPHP 8 and MySQL 8. Under 5 MB on disk. No JavaScript framework.\n\n[pressline.app](https://pressline.app) ·\n[live demo](https://admin.pressline.app) ·\n[marketplace](https://marketplace.pressline.app) ·\n[docs](https://pressline.app/docs.php)\n\n\u003c/div\u003e\n\n---\n\n## What it is\n\nPressLine is a self-hosted CMS for people who think WordPress is too big and Ghost is too clever. Articles, media, users, plugins, a marketplace. Nothing else.\n\n- PHP 8, MySQL 8, MIT licensed.\n- Hooks and filters in the style of WordPress (`add_action`, `add_filter`).\n- A fluent plugin SDK (`PL_Plugin::register(...)`).\n- A built-in marketplace client with sha256-verified installs.\n- Light, dark, and AMOLED themes.\n- CSRF tokens, prepared statements, bcrypt hashes, role-based access.\n\n## Install\n\n```bash\ngit clone https://github.com/maskalix/PressLine.git\ncd PressLine\n\ncp pl-config.example.php pl-config.php\n$EDITOR pl-config.php          # or export PL_DB_HOST / PL_DB_USER / PL_DB_PASS / PL_DB_NAME\n\n# Open /instalace/ in your browser, then change the default password.\nchown -R www-data:www-data plugins\n```\n\nDefault login: `pressline / pressline`. Change it immediately.\n\nRequirements: PHP 8.0+ with `gd`, `curl`, `zip`, `mysqli`, `mbstring`. MySQL 8.0+ or MariaDB 10.5+. HTTPS for the marketplace client.\n\n## Plugin SDK\n\nA plugin is a folder in `/plugins/\u003cid\u003e/` with a `plugin.json` and an entry script.\n\n```php\n\u003c?php\nPL_Plugin::register('hello-world')\n    -\u003eonArticleSave(function ($article, $id, $action) {\n        error_log(\"Article #$id saved: \" . ($article['name'] ?? '?'));\n    })\n    -\u003eaddAdminMenuItem('Hello', './plugins/hello-world/page.php', 'ic:round-waving-hand', 2)\n    -\u003eaddDashboardCard(function () {\n        echo '\u003csection class=\"dashboard-block\"\u003e\u003ch2\u003eHello!\u003c/h2\u003e\u003c/section\u003e';\n    });\n```\n\nEvery entity (`article`, `category`, `media`, `user`, `preference`, `role`, `webset`) fires `beforeSave`, `afterSave`, `beforeInsert`, `afterInsert`, `beforeUpdate`, `afterUpdate`, `beforeDelete`, `afterDelete`. Specials: `media.afterUpload`, `user.afterLogin`, `article.content`, `admin.menu`, `admin.dashboardCards`, `editor.toolbarButtons`.\n\nMigrations live in `\u003cplugin\u003e/migrations/*.sql` and run on first activation.\n\n## Marketplace\n\nOpen **Rozšíření → Marketplace** in the admin. Plugins come from [marketplace.pressline.app](https://marketplace.pressline.app), are downloaded with a sha256 check, extracted atomically, and have their migrations run on install. You can self-host the registry by changing `marketplace_url` in settings.\n\n## Project layout\n\n```\n*.php           Top-level admin pages\najax/           XHR endpoints (CSRF-verified)\nincludes/       Bootstrap, hooks, plugin loader, marketplace, fetcher/setter\nplugins/        Drop-in plugin folders\nres/            CSS and JS\nmedia/          User uploads (gitignored)\nversion.php     Single source of truth for $version\n```\n\n## Security\n\nCSRF token on every POST. Prepared statements everywhere. Bcrypt password hashes. MIME and extension whitelists on uploads. The plugin extractor refuses paths with `..`, leading `/`, or `.git/`. Hard 5 MB compressed / 25 MB extracted limits on plugin packages.\n\n## Contributing\n\nRun `php -l` on changed files. Test on a clean install. Add a `migrations/*.sql` if you touch the schema. Bump `version.php` (semver).\n\n## Licence\n\n[MIT](LICENSE) © 2025–present PressLine contributors.\n\nPressLine is built by [LNLN.eu](https://lnln.eu).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n## Česky\n\nMalý český CMS s opravdovým plugin SDK. PHP 8, MySQL 8. Pod 5 MB. Bez JavaScriptového frameworku.\n\n[pressline.app](https://pressline.app) ·\n[živá ukázka](https://admin.pressline.app) ·\n[marketplace](https://marketplace.pressline.app) ·\n[dokumentace](https://pressline.app/docs.php)\n\n\u003c/div\u003e\n\n### Co to je\n\nSelf-hostovaný CMS pro lidi, kterým je WordPress velký a Ghost moc chytrý. Články, média, uživatelé, pluginy, marketplace. Nic jiného. MIT licence. Hooky a filtry, plugin SDK, vestavěný marketplace. Light, dark a AMOLED téma. CSRF, prepared statements, bcrypt, role.\n\n### Instalace\n\n```bash\ngit clone https://github.com/maskalix/PressLine.git\ncd PressLine\ncp pl-config.example.php pl-config.php\n$EDITOR pl-config.php\n# Otevři /instalace/ v prohlížeči a hned změň heslo.\nchown -R www-data:www-data plugins\n```\n\nVýchozí přihlášení: `pressline / pressline`. Hned po instalaci změň.\n\n### Plugin\n\n```php\n\u003c?php\nPL_Plugin::register('ahoj-svete')\n    -\u003eonArticleSave(function ($article, $id, $action) {\n        error_log(\"Článek #$id uložen: \" . ($article['name'] ?? '?'));\n    })\n    -\u003eaddAdminMenuItem('Ahoj', './plugins/ahoj-svete/page.php', 'ic:round-waving-hand', 2);\n```\n\nObnov `/rozsireni.php` a klikni na **Aktivovat**.\n\n### Licence\n\n[MIT](LICENSE) © 2025–současnost přispěvatelé PressLine. Vyrobeno v [LNLN.eu](https://lnln.eu).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaskalix%2Fpressline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaskalix%2Fpressline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaskalix%2Fpressline/lists"}