threepp
A cross-platform C++20 3D library with Python bindings and the high-level API of three.js.
A multilingual CMS for Laravel. Open source, with a page tree, runtime fields and a translated admin.
Developer toolsPHP · BladeGitHub @LynxCMSOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The multilingual CMS that AI can build and run safely, for Laravel.
Taken from the repository README
Loading the full README.
Read the full 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.