Milk Admin is a PHP admin panels for building real backoffice tools. It focuses on explicit control, relational CRUD flows, and maintainable architectures — without SaaS dependencies or framework lock-in.
The basics are ready: builder, security, authentication. You only add what you need.
CSRF protection, SQL injection, XSS already implemented. JWT authentication for APIs.
Add or remove features easily. Each module is autonomous and can be managed independently.
Minimal external dependencies. Few well-controlled elements for a fast and functional system.
Generate lists, forms, search and validation from a single model definition.
Right after installation you already have login, user management and access logs. Each user can manage their own profile and change password.
The system is structured in modules. In each module you're free to write what you want, but if you follow Milk Admin's conventions, you can manage tables and forms in just a few lines of code.
class PostsModel extends AbstractModel { protected function configure($rule): void { $rule->table('#__posts') ->id() ->title()->index() ->text('content')->formType('editor') ->created_at()->hideFromEdit() ->datetime('updated_at')->hideFromEdit()->saveValue(date('Y-m-d H:i:s')); } }
class PostsModule extends AbstractModule { protected function configure($rule): void { $rule->page('posts') ->title('Posts') ->menu('Posts', '', 'bi bi-file-earmark-post-fill', 10) ->access('registered') ->version(251101); } }
class PostsController extends AbstractController { #[RequestAction('home')] public function postsList() { $response = ['page' => $this->page, 'title' => $this->title, 'link_action_edit' => 'edit', 'table_id' => 'idTablePosts']; $response['html'] = TableBuilder::create($this->model, 'idTablePosts') ->setDefaultActions() ->render(); Response::render(__DIR__ . '/Views/list_page.php', $response); } #[RequestAction('edit')] public function postEdit() { $response = ['page' => $this->page, 'title' => $this->title]; $response['form'] = FormBuilder::create($this->model, $this->page) ->getForm(); Response::render(__DIR__ . '/Views/edit_page.php', $response); } }
In this example you create a module that manages a table complete with:
The goal is to create a mature tool for professional admin interfaces. But we're not there yet. That's why I'm asking you: would you like to try building something for yourself and give me feedback?
Why the Entity-Attribute-Value model still attracts developers — and why it can become a serious problem
If Milk Admin seems interesting to you — even if you haven't tried it yet — give it a star on GitHub. It helps the project get noticed and motivates me to continue development.
Star on GitHubIt's free, takes 2 seconds, and makes a huge difference