Project in Development • Perfect for Experimenting

Build Your Own Admin Tools

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.

Everything You Need to Build Quickly

The basics are ready: builder, security, authentication. You only add what you need.

Integrated Security

CSRF protection, SQL injection, XSS already implemented. JWT authentication for APIs.

Modular System

Add or remove features easily. Each module is autonomous and can be managed independently.

Code Under Control

Minimal external dependencies. Few well-controlled elements for a fast and functional system.

TableBuilder & FormBuilder

Generate lists, forms, search and validation from a single model definition.

A framework that's simple to learn and use

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);
    }
}

This Is All the Code You Need

In this example you create a module that manages a table complete with:

  • Database table created and updated automatically
  • Paginated lists with sorting and integrated search
  • Forms for insert/edit with validation
  • Complete CRUD operations
  • Access control and security

Milk Admin is a project in development

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?

Personal Archive

  • Book library with notes and ratings
  • Movie collection with reviews
  • Personalized recipe book
  • Vinyl or CD catalog

Management Tools

  • Password manager on your server
  • Personal expense manager
  • Habit tracker
  • Workout log with custom metrics

Knowledge Base

  • Personal wiki like Notion
  • Code snippet library
  • Document archive with search
  • Organized research notes


Please provide your name.
Please provide a valid email address.
Please provide a message.

Articles

EAV: a Fascinating… and Dangerous Anti-Pattern

EAV: a Fascinating… and Dangerous Anti-Pattern

Why the Entity-Attribute-Value model still attracts developers — and why it can become a serious problem

⭐ Help the Project Grow

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 GitHub

It's free, takes 2 seconds, and makes a huge difference