DBDelve
Dive deep into your data. A fast, native, multi-engine database client written in Rust. Free and open source, no telemetry.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The multilingual CMS that AI can build and run safely, for Laravel.
翻訳待ち
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
This is the beginning of the README. Read the rest at the original. Read the full README ↗