32 Commits

Author SHA1 Message Date
jordanwalster eb858a88cc chore: version bump 2026-04-30 03:44:00 +01:00
jordanwalster 5df3a21a71 feat: bump version to 1.0.0 2026-04-30 01:27:12 +01:00
jordanwalster 307f4f34a5 chore: add web container tip 2026-04-29 02:42:54 +01:00
jordanwalster 123a86e6b8 chore: update issue template 2026-04-27 15:35:09 +01:00
jordanwalster 5111b42f52 fix: incorrect year 2026-04-24 03:40:35 +01:00
jordanwalster 036b595170 fix: missing text 2026-04-24 03:08:10 +01:00
jordanwalster a5fc4a67a3 fix: incorrect version posted 2026-04-24 02:52:30 +01:00
jordanwalster e2ff356cbf chore: version bump 2026-04-24 02:50:03 +01:00
jordanwalster ed8ff1dd66 chore: version bump 2025-05-03 02:12:09 +01:00
jordanwalster ecf6a6fe62 chore: version bump issue templates 2025-05-01 04:25:34 +01:00
jordanwalster c0bb3430bb chore: add v0.1.2 2025-04-29 02:19:30 +01:00
jordanwalster 073803d05a chore: remove github issue template 2025-04-29 01:05:11 +01:00
jordanwalster f99b483bce chore: update messaging for github issues 2025-04-28 15:15:33 +01:00
jordanwalster e0c0ac7c45 chore: re-add github issue template 2025-04-28 15:10:54 +01:00
jordanwalster 2b3083143d revert: add GitHub template
This reverts commit afd65d3bcb.
2025-04-28 15:10:22 +01:00
jordanwalster afd65d3bcb chore: add GitHub template 2025-04-28 15:09:07 +01:00
jordanwalster 120f3f3b67 fix: incorrect title/labels 2025-04-28 13:41:08 +01:00
jordanwalster 59da5d315d chore: move template message to bottom of body 2025-04-28 13:40:26 +01:00
jordanwalster 35321a56b8 chore: add enhancement template 2025-04-28 13:40:04 +01:00
jordanwalster ea7cec2777 chore: add feature request template 2025-04-28 13:00:05 +01:00
jordanwalster a6a4ceceb8 chore: minor revision to bug report 2025-04-28 12:59:54 +01:00
jordanwalster f63779e5d3 chore: update bug labels for report 2025-04-28 12:42:40 +01:00
jordanwalster 14964be220 chore: add bug report template 2025-04-28 12:41:29 +01:00
jordanwalster 9b3813cde0 chore: added missing change in 0.1.0 2025-04-28 02:37:10 +01:00
jordanwalster 5824678ff9 chore: add v0.1.1 2025-04-28 02:32:28 +01:00
jordanwalster 77e48ed460 fix: amend date for 0.1.0 2025-04-28 00:00:04 +01:00
jordanwalster 586671a52a chore: update docker-compose example 2025-04-27 23:49:49 +01:00
jordanwalster ce6bcd2f88 feat: add .env file 2025-04-27 23:47:08 +01:00
jordanwalster a78534b3b4 chore: remove outdated readme 2025-04-27 23:46:52 +01:00
jordanwalster 6827099f44 chore: update example compose file 2025-04-27 23:46:42 +01:00
jordanwalster 76454300f2 feat: version bump 2025-04-27 23:46:29 +01:00
jordanwalster 256b5f209d chore: update changelog for v0.0.9 2025-04-21 13:30:17 +01:00
11 changed files with 484 additions and 45 deletions
+28
View File
@@ -0,0 +1,28 @@
name: Bug Report
about: File a bug report
title: "[Bug] ..."
labels: "Kind/Bug"
body:
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Describe the bug and what the expected behaviour was.
placeholder: A bug happened!
validations:
required: true
- type: dropdown
id: version
attributes:
label: Version
description: What version of Photon are you running? You can find this in the footer of the app.
options:
- 1.0.0
- 0.1.4
validations:
required: true
- type: markdown
attributes:
value: |
This issue was created using the bug report template.
visible: [content]
+1
View File
@@ -0,0 +1 @@
blank_issues_enabled: true
+28
View File
@@ -0,0 +1,28 @@
name: Enhancement Request
about: Suggest a way things could be improved
title: "[Enhancement] ..."
labels: "Kind/Enhancement"
body:
- type: textarea
id: idea
attributes:
label: What is your idea?
description: Describe the feature you would like to see. Attach any screenshots or mockups if you have them.
placeholder: I would like to see...
validations:
required: true
- type: dropdown
id: version
attributes:
label: Version
description: What version of Photon are you running? You can find this in the footer of the app.
options:
- 1.0.0
- 0.1.4
validations:
required: true
- type: markdown
attributes:
value: |
This issue was created using the feature template.
visible: [content]
+28
View File
@@ -0,0 +1,28 @@
name: Feature Request
about: Suggest an idea for this project
title: "[Feature] ..."
labels: "Kind/Feature"
body:
- type: textarea
id: idea
attributes:
label: What is your idea?
description: Describe the feature you would like to see. Attach any screenshots or mockups if you have them.
placeholder: I would like to see...
validations:
required: true
- type: dropdown
id: version
attributes:
label: Version
description: What version of Photon are you running? You can find this in the footer of the app.
options:
- 1.0.0
- 0.1.4
validations:
required: true
- type: markdown
attributes:
value: |
This issue was created using the feature template.
visible: [content]
+116 -27
View File
@@ -1,37 +1,126 @@
# Photon Screenshot Dashboard # Photon Screenshot Dashboard
The PHP Screenshot Management Dashboard ![Photon Logo](/logo.png)
To deploy Photon, use the included `docker-compose-example.yml`. ![Version](https://img.shields.io/badge/version-v1.0.1-success)
![Docker](https://img.shields.io/badge/docker-grey?logo=docker)
Ensure you have a data folder that contains your screenshots. Current supported mimetypes are `JPG`, `PNG`, `GIF` and `MP4`. A modern, self-hosted PHP screenshot and media management dashboard with powerful organization features, sharing capabilities, and a clean web interface.
``` The project consists of three main components:
services:
photon: 1. **Photon Dashboard** (`photon`): Web interface for managing screenshots.
container_name: photon_dashboard 2. **Photon Worker** (`worker`): Background processing and file scanning.
image: git.jrdn.dev/jordanwalster/photon-dashboard:latest 3. **MariaDB Database** (`db`): Stores metadata and application data.
ports:
- 8090:80 Keep up-to-date on new releases by following the [changelog](./changelog.md).
volumes:
- type: bind ## Features
source: ./data
target: /var/www/html/data - **Smart Organization**: Organize screenshots with folders and tags.
bind: - **Advanced Search**: Find images quickly by name or content using OCR.
propagation: rshared - **Easy Sharing**: Built-in public sharing URLs.
environment: - **Media Support**: JPG, PNG, GIF, and MP4 (experimental) file support.
ADMIN_DOMAIN: photon.jrdn.dev - **Bulk Operations**: Select and manage multiple files at once.
SHARE_DOMAIN: ss.example.com - **Sorting Options**: Sort by date, size, or filename.
USER_EMAIL: me@example.com - **Trash Management**: Safe deletion with trash functionality.
- **Background Processing**: Dedicated worker for compression and OCR processing.
- **Database Storage**: MariaDB backend for reliable data persistence.
An external authentication proxy is recommended to protect your dashboard from unwanted eyes.
## Quick Start
1. **Clone the repository**
```bash
git clone <repository-url>
cd photon-dashboard
```
2. **Configure environment**
```bash
cp .env.example .env
# Edit .env with your settings
```
3. **Create data directory**
```bash
mkdir data
# Copy your screenshots to ./data/
```
4. **Deploy with Docker Compose**
```bash
docker-compose -f examples/compose-default.yml up -d
```
5. **Access the dashboard**
- Open http://localhost:8090 in your browser
## Configuration
### Environment Variables
Copy the `.env` file and customize these key settings:
#### Dashboard Settings
- `PHOTON_PORT`: Web interface port (default: 8090)
- `USER_EMAIL`: Admin email address
- `DATA_PATH`: Path to your screenshots folder
#### Worker Settings
- `SCAN_RATE`: File scanning interval in seconds (default: 10)
#### Database Settings
- `MYSQL_DATABASE`: Database name used by Photon (defaults to photon).
- `MYSQL_USER`: Database user used by Photon.
- `MYSQL_PASSWORD`: Database password used by Photon user.
- `MYSQL_ROOT_PASSWORD`: Database root password.
#### Domain Options
- `PHOTON_DOMAIN`: Domain used for dashboard.
- `PHOTON_SHARE_DOMAIN`: Optional subdomain for sharing links.
- `COOKIE_DOMAIN`: Required when adding a subdomain for sharing.
### Deployment Options
#### Standard Deployment
Use `examples/compose-default.yml` for simple deployments:
```bash
docker-compose -f examples/compose-default.yml up -d
``` ```
There are additional environment variables that can be set to enable experimental features (defaults are set to false): #### Traefik Custom Domains
Use `examples/compose-traefik.yml` for reverse proxy setups with custom domains.
## Project Structure
| Environment Variable | Values | Default | Description | ```
| -------------------- |:-----------------:|:-------:| ---------------------------------- | photon-dashboard/
| TAGS_ENABLED | `true` \| `false` | false | Enables the tagging functionality | ├── examples/
| SEARCH_ENABLED | `true` \| `false` | false | Enables screenshot search | │ ├── compose-default.yml # Default example for basic usage.
| PAGE_LIMIT | `int` | 24 | Override the default page limit | │ ├── compose-traefik.yml # Traefik example for custom domain routing.
│ └── .env # Environment configuration
└── changelog.md # Version history
```
You can find the container image history [here](https://git.jrdn.dev/jordanwalster/-/packages/container/photon-dashboard/versions). ## Updates
Container images are available at:
- Dashboard: `git.jrdn.dev/jordanwalster/photon-dashboard:latest`
- Worker: `git.jrdn.dev/jordanwalster/photon-worker:latest`
View version history: [Container Registry](https://git.jrdn.dev/jordanwalster/-/packages/container/photon-dashboard/versions)
### Logs
```bash
# View photon logs
docker logs photon_dashboard
# View worker logs
docker logs photon_worker
# View database logs
docker logs photon_db
```
+174
View File
@@ -2,6 +2,180 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [v1.0.1] - 2026-04-30
### Added
- Clear search function on page type switch.
### Changed
- Image caching now has a time limit and processing is limited to 50 items at a time to prevent resource exhaustion.
- Colours in actions dropdown more muted.
### Fixed
- Missing protocol on copy to clipboard.
- Space handling on next page when using folders.
- Space handling when using search in folders.
- Database doesn't update structure when attempting to make an image private.
- Attempted database update when images don't yet exist in the table.
- Restore & Permanently delete selected buttons not working.
## [v1.0.0] - 2026-04-30
> [!CAUTION]
> The nginx web container has been removed, share links now default to `/share/example.jpg`. To use custom domains please refer to the `examples/compose-traefik.yml` example.
### Added
- Selected images counter.
- Sharing endpoint in photon container.
- Deselect all button.
- Active page indicator for tag pages.
- Context menu for image interactions.
- File metadata inside context menu.
- Context menu for tags in the sidebar (rename and delete actions).
- Sorting for images (date, size and name).
- Selection across multiple pages at a time for better management.
- Sticky pagination bar, prevents moving when item count is lower between pages.
- Ability to make images private, links will only work with a valid session.
- Favicon and logo to footer.
- Better backend reporting for uploads.
- New compose files for updated deployments.
- Ability to move items between folders.
- Animations on hover.
- GitHub button in footer linking to project.
### Changed
- Environment variables `ADMIN_DOMAIN` and `SHARE_DOMAIN` replaced with `PHOTON_DOMAIN` and `PHOTON_SHARE_DOMAIN`.
- Search now acts as a filter on a given page context.
- File names now only available in the context menu.
- Image selection highlights border, shrinks and darkens image.
- Images now have rounded corners to match the design language.
- Compression now limits image dimensions to further decrease storage consumption.
- Backup file name now contains timestamp.
- Simplified backend functions for easier maintainability.
- Upload limits have been raised for mass-uploading.
### Fixed
- Screenshots with special characters in the name cannot be selected by clicking.
- Restoring a file from trash will always go back to root folder regardless of original source.
- Image does not scale correctly when changing column count.
- Assigning tags after first page redirects you to the start.
- Renaming an image results in tags being lost - resulting in orphaned attachments.
- Renaming an image results in thumbnails being regenerated and creating duplicates.
- 'All Screenshots' in sidebar doesn't show subfolder count.
- Going to a folder by link doesn't show it as active in the sidebar
- Image counter for folders doesn't update on upload.
- Uploading an image with the same name as existing will replace it without confirmation.
- Image counters don't update on deletion.
- Newly created tags do not show up in the delete menu until a full-page refresh has occurred.
- Delete tag dropdown doesn't dynamically update if a tag has been deleted.
### Removed
- Autocompletion on rename form for previously entered names.
- Secondary web container.
- Option for two columns.
- Menu button on images.
- URL scheme settings.
- Checkbox on images.
- SQLite to MySQL migration tool.
## [v0.1.4] - 2026-04-24
> [!TIP]
> Web container is being removed in the next update, update your compose files on the next update.
### Added
- Folders for better file management, items in folders can also have tags.
- Ability to untag selected images instead of removing tags one at a time.
### Changed
- Upload destination can now be selected when there are new folders.
### Fixed
- Bug where pagination would display pages that don't exist.
## [v0.1.3] - 2025-05-03
### Added
- Upload button for uploading via web dashboard.
### Changed
- Column dropdown is now a button that switches between options.
- Some old icons have been switched to FontAwesome icons.
- Sidebar remaining open flag is now set by a cookie instead of a session token.
### Fixed
- Page refresh loop when changing column count.
- Scrollbar failing to show after page content changes.
- Bug where images with capitalised file extensions do not appear in the grid.
- Unable to use multi select actions on images with spaces in their names.
### Removed
- `TAGS_ENABLED`, `SEARCH_ENABLED` and `TRASH_ENABLED` environment variables, these are now permanently enabled.
## [v0.1.2] - 2025-04-29
> [!WARNING]
> This introduces a breaking change that requires the latest version of the photon-worker container image.
### Added
- Image compression worker function, decreasing page load times.
## [v0.1.1] - 2025-04-28
### Fixed
- Columns not updating when selected in dropdown.
- Icons missing from context menu on search page.
### Changed
- Version numbers are now taken from container image.
## [v0.1.0] - 2025-04-27
### Fixed
- Sharing URL Scheme set to `https` regardless of setting in environment variables.
- Search not clearing the first two characters after emptying search field.
- Error handing for existing tag names.
- Double click bug on modals.
- Permanently deleting images did not remove from db
- Pagination on tagged pages showed in the corner.
### Changed
- Upgraded to PHP 8.
- Database engine now using MySQL.
- Mandatory setting for admin url removed.
### Added
- Search by image content using OCR via worker container.
- Button for applying actions to multiple images at a time.
- Automatic migration tool for SQLite to MySQL
- Tag not found page for nonexistent tags.
- Custom time zone environment variable.
- Form validation using JS for frontend.
- Messaging for no OCR table.
- Icons on context menu.
### Removed
- Image format being shown in corner.
## [v0.0.9] - 2025-04-21
### Added
- Introduced search functionality.
- Rename tag button.
- Restore all button for trashed images.
### Changed
- Pages no longer use query strings and instead use paths.
- Tags now replace spaces with dashes.
- Search, Tags and Trash now enabled by default.
- File format shown in badge.
- Links are now path based instead of query string based.
### Fixed
- Occasional redirection to a previous page when deleting or restoring images.
- Assign tags field remembers existing tags.
- Allowing removal of tags from an image.
## [v0.0.8] - 2025-01-30 ## [v0.0.8] - 2025-01-30
### Added ### Added
-18
View File
@@ -1,18 +0,0 @@
services:
photon:
container_name: photon_dashboard
image: git.jrdn.dev/jordanwalster/photon-dashboard:latest
ports:
- 8090:80
volumes:
- type: bind
source: ./data
target: /var/www/html/data
bind:
propagation: rshared
environment:
ADMIN_DOMAIN: photon.jrdn.dev
SHARE_DOMAIN: ss.example.com
USER_EMAIL: me@example.com
TAGS_ENABLED: false
SEARCH_ENABLED: false
+21
View File
@@ -0,0 +1,21 @@
### Photon Environment Variables
PHOTON_PORT=8090
USER_EMAIL=photon@jrdn.dev
DATA_PATH=./data
### Domain Options
PHOTON_DOMAIN=photon.local
# Uncomment the below lines if you are using a custom subdomain for link sharing.
# PHOTON_SHARE_DOMAIN=share.photon.local
# COOKIE_DOMAIN=.photon.local
### Photon Worker Environment Variables
SCAN_RATE=10
### Database Environment Variables
MYSQL_HOST=db
MYSQL_DATABASE=photon
MYSQL_USER=photon
MYSQL_PASSWORD=changeme
MYSQL_ROOT_PASSWORD=pleasechangeme
+31
View File
@@ -0,0 +1,31 @@
services:
photon:
container_name: photon_dashboard
image: git.jrdn.dev/jordanwalster/photon-dashboard:latest
volumes:
- ./db:/var/www/html/db # Only required if migrating from SQLite
- type: bind
source: ${DATA_PATH}
target: /var/www/html/data
bind:
propagation: rshared
ports:
- ${PHOTON_PORT:-8090}:80
env_file:
- .env
worker:
container_name: photon_worker
image: git.jrdn.dev/jordanwalster/photon-worker:latest
volumes:
- ${DATA_PATH}:/var/www/html/data
env_file:
- .env
db:
container_name: photon_db
image: mariadb
volumes:
- db:/var/lib/mysql
env_file:
- .env
volumes:
db:
+57
View File
@@ -0,0 +1,57 @@
services:
# Photon services
photon:
container_name: photon_dashboard
image: git.jrdn.dev/jordanwalster/photon-dashboard:latest
volumes:
- ./db:/var/www/html/db # Only required if migrating from SQLite
- type: bind
source: ${DATA_PATH}
target: /var/www/html/data
bind:
propagation: rshared
env_file:
- .env
labels:
# Dashboard configuration
- "traefik.enable=true"
- "traefik.http.routers.photon.rule=Host(`${PHOTON_DOMAIN}`)"
- "traefik.http.routers.photon.service=photon"
- "traefik.http.services.photon.loadbalancer.server.port=80"
# Custom domain for share links
- "traefik.http.routers.photon-share.rule=Host(`${PHOTON_SHARE_DOMAIN}`)"
- "traefik.http.routers.photon-share.service=photon-share"
- "traefik.http.middlewares.photon-share-path.addprefix.prefix=/share"
- "traefik.http.routers.photon-share.middlewares=photon-share-path"
- "traefik.http.services.photon-share.loadbalancer.server.port=80"
worker:
container_name: photon_worker
image: git.jrdn.dev/jordanwalster/photon-worker:latest
volumes:
- ${DATA_PATH}:/var/www/html/data
env_file:
- .env
# Database
db:
container_name: photon_db
image: mariadb
volumes:
- db:/var/lib/mysql
env_file:
- .env
# Reverse proxy
traefik:
container_name: traefik
image: traefik:v3
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
volumes:
db:
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB