尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證The multilingual CMS that AI can build and run safely, for Laravel.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A multilingual CMS for Laravel that people and AI agents can build and run safely.
[!WARNING] Lynx is not ready for production. It is under active development and has not had a release yet. APIs, database tables, configuration and package names will change, sometimes without a migration path, and the structure of this repository may change too (packages may move into their own repositories). Try it, read it and open issues, but do not build a site you depend on with it yet.
Lynx brings ProcessWire's page tree, runtime fields and selector API to Laravel 13, as a standalone site in a new app or added to one you already have, with languages as a core concept and every change going through validated actions that people, Artisan, MCP clients and AI agents share.
pt-BR, then pt, then the default), and templates know which is which./courses/delivery-8 and /pt/cursos/navegando-entrega-8. Renamed or moved pages keep redirecting from their old addresses.template=course, price<300, title%=Delivery, sort=-title, limit=10 finds pages by the values visitors see, in the current language.laravel/ai agent are generated from the action registry. The agent plans first and applies only what you approve.$lynx = lynx();
// Languages are added at runtime
$lynx->languages->update('default', ['name' => 'English', 'locale' => 'en']);
$lynx->languages->add('pt', 'Português', locale: 'pt-PT', fallback: 'default');
// Fields and templates
$lynx->fields->add('body', 'textarea', translatable: true, settings: ['format' => 'html']);
$lynx->fields->add('price', 'integer');
$lynx->templates->add('course', fields: [['name' => 'title', 'required' => true], 'body', 'price']);
// Pages
$page = $lynx->pages->new('course', '/courses/');
$page->name = 'delivery-8';
$page->title = 'Navigating Project Delivery';
$page->body = '<p>Only in English for now.</p>';
$page->price = 249;
$page->setLanguageName('pt', 'navegando-entrega-8');
$page->setLanguageValue('pt', 'title', 'Navegando pela Entrega de Projetos');
$page->save();
// Reading, with fallback per field
$lynx->language('pt', function () use ($page) {
echo $page->title; // Navegando pela Entrega de Projetos
echo $page->body; // the English body, as a fallback
echo $page->body->isFallback(); // true
echo $page->url; // /pt/cursos/navegando-entrega-8
});
// Selectors
$lynx->pages->find('template=course, price<300, sort=-title, limit=10');
// Every write can be previewed
$lynx->pages->delete('/courses/', dryRun: true)->changes->summary();
A page on template course renders resources/views/templates/course.blade.php:
<html lang="{{ lynx()->languages->current()->appLocale() }}">
<head>@hreflang($page)</head>
<body>
<x-lynx-menu name="top" />
<h1>@field($page->title)</h1> {{-- marks a fallback with its lang --}}
@field($page->body)
<p>{{ $page->category?->title }}</p> {{-- a single page reference, or null --}}
</body>
</html>
This repository is a monorepo: every package lives in packages/, and changes are made here. Each package is also copied to its own read-only repository (LynxCMS/core, LynxCMS/admin...) on every push, ready for Packagist.
| Package | What it adds |
|---|---|
lynxcms/core | Languages, fields, templates, pages, selectors, actions, routing and Blade helpers. |
lynxcms/contracts | Interfaces and data objects that modules depend on. |
lynxcms/admin | The Livewire admin: page tree, editor, drafts and revisions, schema screens, languages, roles, users and sign in. |
lynxcms/menus | Multilingual menus stored as pages, the menu editor and <x-lynx-menu>. |
lynxcms/media | Images and files on pages, with sizes made on demand. |
lynxcms/forms | Forms defined in code, rendered with Livewire, with submissions in the admin. |
lynxcms/seo | Meta and social tags, canonical links, JSON-LD and robots.txt. |
lynxcms/sitemap | XML sitemaps for every language. |
lynxcms/page-password | Password protected pages and branches. |
lynxcms/cache | Page cache, islands and fragment cache. |
lynxcms/static-site | Exports the whole site as static files, to host without PHP. |
lynxcms/mcp | An MCP server generated from the actions. |
lynxcms/ai | The built in agent and the translation provider, on the Laravel AI SDK. |
Requirements: PHP 8.5, Laravel 13, and PostgreSQL (recommended) or SQLite.
The workbench holds a small multilingual course site with the admin and demo users.
git clone https://github.com/LynxCMS/lynxcms.git && cd lynxcms
composer install
npm --prefix packages/admin ci && composer assets # the admin's CSS and JS, built locally
composer build # creates the demo data (and wipes it when run again)
composer serve # the site, and the admin at /lynx/pages
Opening the admin signs you in as the demo superuser. /demo/sign-in/editor and /demo/sign-in/courses show what other roles see, and every demo password is password.
composer require lynxcms/core lynxcms/admin lynxcms/media lynxcms/menus
php artisan migrate
php artisan lynx:install # asks for your superuser's name, email and password
Add the other packages you need from the table above. The installation guide covers the first superuser, the scheduler, shared hosting and developing against a local clone of this repository.
The documentation is at lynxcms.org/cms/docs. Its Markdown lives in docs/; the site is built with VitePress and served by Cloudflare, deployed from main.
To work on the documentation, run npm --prefix docs ci once, then npm --prefix docs run dev for a live preview. npm --prefix docs run build checks every link, as CI does.
The design decisions are recorded as ADRs in documentation/ADRs.md, and AGENTS.md describes the architecture and the rules for contributors, people and coding agents alike.
composer test # SQLite, in parallel
composer test:pgsql # PostgreSQL, a database per test process
composer test:all # SQLite, PostgreSQL and a table prefix, as CI runs them
composer check # Pint, Rector and PHPStan at level max
composer assets # build the admin's CSS and JS (run npm --prefix packages/admin ci once first)
Every change comes with tests, and every action is tested for its happy path, a validation failure, a rollback and a dry run. Read AGENTS.md before opening a pull request.
Lynx is in active development. Feedback and issues are welcome. Expect breaking changes until 1.0, and expect larger pull requests to need a discussion first while the design settles.
Lynx is open source under the MIT license.