Web-based Digital Signage System
Project description
MacroSignage
A web-based digital signage system built with Flask and Bootstrap.
MacroSignage lets you manage and display digital signage content through a modern browser-based interface. It uses Bootstrap v5.3.8 for responsive styling and Animate.css for smooth transitions.
Note: This project is in Pre-Alpha (v0.2.1). APIs and features are subject to change.
Features
Current
- Flask application factory pattern (
create_app) - Bootstrap v5.3.8 CSS and JavaScript integration (vendored)
- Bootstrap theme overrides with light and dark mode support via CSS custom properties
- Animate.css for UI transitions (vendored)
- Jinja2 template inheritance (base + page templates)
- Admin dashboard with display management CRUD
- Media library CRUD for images, text, video, HTML, and YouTube media
- Many-to-many media assignment between displays and media assets
- Schedule CRUD with active windows, weekday rules, display targets, and media playlists
- SQLite-backed display persistence with Flask-SQLAlchemy
- CSRF protection for admin state-changing forms
- WSGI-ready entry point for production deployment
- Installable via PyPI (
pip install MacroSignage)
Planned
- User authentication and session management (Flask-Login)
- Database migrations (Flask-Migrate)
- Form handling with CSRF protection (Flask-WTF)
- Admin dashboard for managing signage content
- Schedule playback execution
- Media upload and content rotation
- REST API for programmatic control
- Real-time display updates via WebSocket or SSE
Tech Stack
| Layer | Technology | Version |
|---|---|---|
| Backend | Flask | >= 3.1.3 |
| Auth | Flask-Login | >= 0.6.3 |
| Forms | Flask-WTF | >= 1.3.0 |
| ORM | Flask-SQLAlchemy | >= 3.1.1 |
| WSGI | Waitress | >= 3.0.2 |
| Frontend | Bootstrap | 5.3.8 |
| Animation | Animate.css | 4.1.1 |
| Theme | Bootstrap CSS variables | -- |
| Language | Python | >= 3.10 |
| Packaging | setuptools + uv | -- |
Prerequisites
- Python 3.10 or higher (3.10, 3.11, 3.12, or 3.13)
- uv (recommended) -- a fast Python package manager. Install uv
- Alternatively, pip >= 21.0 works for basic installation
- Git (for development from source)
Installation
From PyPI
pip install MacroSignage
From Source
# Clone the repository
git clone https://github.com/BaezFJ/MacroSignage.git
cd MacroSignage
# Create virtual environment and install with uv
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv sync --all-groups
# Or with pip
python -m venv .venv
source .venv/bin/activate
pip install -e .
pip install build twine
Quick Start
-
Run the development server:
# Using the MacroSignage CLI macrosignage dev # Or using the WSGI entry point python wsgi.py
-
Open your browser and navigate to
http://127.0.0.1:5000
Production Deployment
For production, use the packaged Waitress-backed command:
macrosignage prod --host 0.0.0.0 --port 8080
Project Structure
MacroSignage/
├── src/
│ └── macrosignage/ # Main application package
│ ├── __init__.py # App factory (create_app)
│ ├── static/
│ │ ├── css/
│ │ │ └── theme.css # Bootstrap theme overrides
│ │ ├── js/ # Application JavaScript
│ │ └── vendor/ # Vendored frontend libraries
│ │ ├── bootstrap/ # Bootstrap v5.3.8
│ │ └── animate/ # Animate.css v4.1.1
│ └── templates/
│ ├── base.html # Base template (shared layout)
│ └── pages/
│ └── index.html # Home page
├── wsgi.py # WSGI entry point
├── pyproject.toml # Project metadata and dependencies
├── uv.lock # Dependency lock file
├── LICENSE # MIT License
└── .gitignore
Development
Running in Development Mode
macrosignage dev
The development command enables Flask debug mode by default.
Building for Distribution
python -m build
This creates source and wheel distributions in dist/.
Publishing to PyPI
twine upload dist/*
Adding Dependencies
# Add a runtime dependency
uv add <package-name>
# Add a dev dependency
uv add --group dev <package-name>
Contributing
Contributions are welcome! MacroSignage is in early development and there are many areas where help is needed.
How to Contribute
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature-name - Make your changes and ensure the app runs without errors
- Commit with a descriptive message
- Push to your fork and open a Pull Request
Guidelines
- Follow PEP 8 for Python code style
- Use the Flask application factory pattern when adding new functionality
- Keep vendored frontend libraries in
src/macrosignage/static/vendor/ - Place new templates under appropriate subdirectories in
templates/ - Use CSS custom properties from
theme.cssfor consistent theming - Write descriptive commit messages
Documentation
Expanded documentation is available in docs/index.md.
Areas Looking for Contributions
- User authentication system
- Database models and migrations
- Admin dashboard UI
- Test coverage expansion
- CI/CD pipeline (GitHub Actions)
- Documentation improvements
Roadmap
v0.2.0 -- Foundation
- Application configuration system (python-dotenv integration)
- Database setup with Flask-SQLAlchemy
- User model and authentication with Flask-Login
- Form infrastructure with Flask-WTF
- Basic test suite with pytest
v0.3.0 -- Core Features
- Admin dashboard layout
- Content/media management (upload, organize, delete)
- Display/screen registration and management
- Content-to-display assignment
v0.4.0 -- Scheduling and Playback
- Content scheduling (time-based rotation)
- Signage display player view (fullscreen, auto-rotation)
- Playlist management
v0.5.0 -- Polish and Scale
- REST API
- Real-time updates (WebSocket or SSE)
- Multi-user role support (admin, editor, viewer)
- CI/CD pipeline with GitHub Actions
- Comprehensive documentation
v1.0.0 -- Stable Release
- Production-hardened and fully tested
- Complete documentation
- Deployment guides (Docker, systemd, cloud)
License
This project is licensed under the MIT License. See the LICENSE file for details.
Copyright (c) 2022 Javier Baez
Author
Javier Baez
- Email: baezdevs@gmail.com
- GitHub: @BaezFJ
Project Links: GitHub Repository | PyPI Package | Issue Tracker
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file macrosignage-0.2.1.tar.gz.
File metadata
- Download URL: macrosignage-0.2.1.tar.gz
- Upload date:
- Size: 2.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
450d5d0537d69bf50cedbbcc36104757ae2a3932706aa8c379cdd70205d9c119
|
|
| MD5 |
c65e5722ad65e3037271c47e63598177
|
|
| BLAKE2b-256 |
3dbf8988e0e85cf5e5eded0895aaf245822a4939f88c84f25e6b11602b621e62
|
Provenance
The following attestation bundles were made for macrosignage-0.2.1.tar.gz:
Publisher:
publish-pypi.yml on BaezFJ/MacroSignage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
macrosignage-0.2.1.tar.gz -
Subject digest:
450d5d0537d69bf50cedbbcc36104757ae2a3932706aa8c379cdd70205d9c119 - Sigstore transparency entry: 1448630102
- Sigstore integration time:
-
Permalink:
BaezFJ/MacroSignage@3417b8c7edec588658f1c185bcd4369d96e3820e -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/BaezFJ
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@3417b8c7edec588658f1c185bcd4369d96e3820e -
Trigger Event:
push
-
Statement type:
File details
Details for the file macrosignage-0.2.1-py3-none-any.whl.
File metadata
- Download URL: macrosignage-0.2.1-py3-none-any.whl
- Upload date:
- Size: 2.7 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c5816922f9b226066e21c5563e71baa7b5fcf757e70a44d7d4601612bd337c8
|
|
| MD5 |
e804d6df77513ca2d02342314b525f3f
|
|
| BLAKE2b-256 |
99f45c790568336608494c7087bc7f81ced9d164d8ef8d85fa65b2f2a4fcc5a7
|
Provenance
The following attestation bundles were made for macrosignage-0.2.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on BaezFJ/MacroSignage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
macrosignage-0.2.1-py3-none-any.whl -
Subject digest:
9c5816922f9b226066e21c5563e71baa7b5fcf757e70a44d7d4601612bd337c8 - Sigstore transparency entry: 1448630196
- Sigstore integration time:
-
Permalink:
BaezFJ/MacroSignage@3417b8c7edec588658f1c185bcd4369d96e3820e -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/BaezFJ
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@3417b8c7edec588658f1c185bcd4369d96e3820e -
Trigger Event:
push
-
Statement type: