Garlic-Hub is a comprehensive Digital Signage Management solution that handles core CMS tasks alongside device management. From single-screen setups to distributed networks, it provides centralized control with flexibility for various signage environments.
To see garlic-hub it in action, use the live demo at:
https://garlic-hub.com
login: admin
password: Demo1234!
The environment is regularly deleted and rebuilt.
Feature Freeze: Currently Working on:
- fixing errors and testing
Garlic-Hub is being developed in three phases, each delivering a distinct edition:
| Edition | Target Environment | Key Features | Status |
|---|---|---|---|
| Edge (Phase 1) | Single-device or small deployments | Basic media management, SMIL playlist creation, lightweight architecture | β Released Public |
| Core (Phase 2) | Mid-sized networks, NAS | Limited device management, enhanced content creation | π Planned |
| Enterprise (Phase 3) | Large-scale networks | SaaS/on-premise, role-based permissions, advanced analytics | π Planned |
Each edition builds upon previous features, ensuring a smooth upgrade path as Garlic-Hub evolves into a comprehensive, SMIL-based digital signage solution.
| Section | Status | description |
|---|---|---|
| Core Framework | β | Database, migrations, logging, routing, middleware and error handling with SLIM 4 |
| Initial admin user | β | Set initial admin user after installation |
| User management | β | Basic user management |
| Authentication | β | Session-based login with remember-me functionality and basic OAuth2 token authorization |
| Media Management | β | Hierarchical content organization with multi-source uploads (local, external links, screencasts, camera, stock platforms with API-key) |
| SMIL Playlists | β | Playlist management and export in industry-standard SMIL format |
| Push support | β | Push playlist to a local player |
| Multi-Zone Content | β | Graphic display zone editor |
| Conditional Play | β | Define datetime conditions for media playback |
| Trigger | β | Trigger to play media or nested playlists by priority based on Accesskeys, Touch/Click, Datetime, and Network |
| Multi-Zone Content | β | Graphic display zone editor |
| Local Player Support | β | Integration with one local media player |
| Internationalization | β | Locale-specific configurations and adaptable UI (English, Spanish, French, Russian, Greek, German) |
- Online documentation
- Device management for remote configuration and monitoring
- Real-time reporting and system health monitoring
- Image templating engine
- Raspberry Pi Player / CMS Bundle
- Scalable deployment options
- PHP 8.4 with strict types enabled
- SLIM 4 Framework
- Phpstan Level 8 with 0 errors
- PHPUnit 12 with 99 % test coverage
- Vanilla JavaScript and external libraries
- Composer libraries
- Coding Standards
- Installation
- Exceptions
- DI-Container
- CLI.phpβCommand Line Interface
- Api/Oauth2 - API and Oauth2
- User- Administration
- Connect Media Player
Contributions are highly encouraged. As the project is in early development, please note that code, features, and documentation are subject to change as we evolve toward a production-ready state.
Garlic-Hub is open-source software licensed under the Affero GPL v3.0 License.
Below is a quick reference to the most relevant files and folders in this repository to help you navigate the codebase.
- Caddyfile β Web server configuration used in containerized deployments.
- Dockerfile β Builds the application image used by Docker.
- docker-compose.yaml β Local development stack (app + services) orchestration.
- entrypoint.sh β Container entrypoint script used by the Docker image.
- dev-install.sh β Developer helper script to bootstrap the environment.
- getloc.sh β Utility to manage/update translation locales.
- preCommit.sh β Local Git pre-commit helper (linters, tests, etc.).
- LICENSE β Project license (AGPL-3.0).
- README.md β This file.
- composer.json / composer.lock β PHP dependencies definition and lock file.
- phpunit.xml β PHPUnit configuration.
- phpstan.neon β PHPStan static analysis configuration.
Directories
- bin/ β CLI entry points and scripts used by the application.
- config/ β Service definitions and configuration for modules and framework glue
- Example: config/services/player.php registers Player services, controllers, repositories, and helpers in the DI container.
- docs/ β Project documentation, guides, and assets (e.g., screenshots, GIFs).
- migrations/ β Database migration files to evolve schema over time.
- misc/ β Miscellaneous assets (e.g., generated badges, reports).
- public/ β Public web root served by the web server (index.php, assets, JS/CSS).
- src/ β Application source code organized by Framework and Modules namespaces
- Modules/Users β User management helpers and repositories
- Helper/Settings/{Builder,Facade,Parameters,Validator}.php β User settings assembly, access, parameter definitions, and validation.
- Repositories/Core β Persistent storage for user-centric aggregates (e.g., Stats, Contacts).
- Repositories/Edge β Storage access for Edge edition user data (Acl, Main, Tokens).
- Modules/Player β Player-related controllers, services, index creation, and repositories
- Helper/Datatable β Builder, Parameters, Preparer, and Controller facade for datatable UIs.
- IndexCreation β Builders to assemble Player index files, template selector, UA handling.
- Services β Application services including PlayerService, PlayerIndexService, AclValidator.
- Repositories β Persistence layer (PlayerRepository, PlayerTokenRepository, PlayerIndexRepository).
- Controller β HTTP controllers like PlayerIndexController, PlayerPlaylistController.
- Framework β Reusable framework components (routing, DI, utils, translator, etc.).
- Modules/Users β User management helpers and repositories
- templates/ β Server-side templates rendered by the Template Engine.
- tests/ β PHPUnit tests (unit/integration) covering framework and modules.
- translations/ β i18n message catalogs.
- var/ β Runtime cache, logs, and other generated artifacts.
- vendor/ β Composer-installed dependencies.