Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ec244e47f2 | |||
| 78fe83c3dc | |||
| af92f6ee6f | |||
| 4392f19827 | |||
| 24cf7ef881 | |||
| 880891c6bd | |||
| 30e018d583 | |||
| eb858a88cc |
@@ -2,15 +2,19 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
A modern, self-hosted PHP screenshot and media management dashboard with powerful organization features, sharing capabilities, and a clean web interface.
|
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:
|
The project consists of three main components:
|
||||||
|
|
||||||
1. **Photon Dashboard** (`photon`): Web interface for managing screenshots.
|
1. **Photon Dashboard** (`photon`): Web interface for managing screenshots.
|
||||||
2. **Photon Worker** (`worker`): Background processing and file scanning.
|
2. **Photon Worker** (`worker`): Background processes (OCR and thumbnail generation).
|
||||||
3. **MariaDB Database** (`db`): Stores metadata and application data.
|
3. **MariaDB Database** (`db`): Stores metadata and application data.
|
||||||
|
|
||||||
Keep up-to-date on new releases by following the [changelog](./changelog.md).
|
Keep up-to-date on new releases by following the [changelog](./changelog.md).
|
||||||
@@ -59,29 +63,6 @@ An external authentication proxy is recommended to protect your dashboard from u
|
|||||||
|
|
||||||
## Configuration
|
## 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
|
### Deployment Options
|
||||||
|
|
||||||
#### Standard Deployment
|
#### Standard Deployment
|
||||||
@@ -91,7 +72,7 @@ docker-compose -f examples/compose-default.yml up -d
|
|||||||
```
|
```
|
||||||
|
|
||||||
#### Traefik – Custom Domains
|
#### Traefik – Custom Domains
|
||||||
Use `examples/compose-traefik.yml` for reverse proxy setups with custom domains.
|
Use `examples/compose-traefik.yml` for reverse proxy setups, authentication and custom domains.
|
||||||
|
|
||||||
## Project Structure
|
## Project Structure
|
||||||
|
|
||||||
@@ -100,7 +81,7 @@ photon-dashboard/
|
|||||||
├── examples/
|
├── examples/
|
||||||
│ ├── compose-default.yml # Default example for basic usage.
|
│ ├── compose-default.yml # Default example for basic usage.
|
||||||
│ ├── compose-traefik.yml # Traefik example for custom domain routing.
|
│ ├── compose-traefik.yml # Traefik example for custom domain routing.
|
||||||
│ └── .env # Environment configuration
|
│ └── .env.example # Environment configuration
|
||||||
│
|
│
|
||||||
└── changelog.md # Version history
|
└── changelog.md # Version history
|
||||||
```
|
```
|
||||||
@@ -108,8 +89,8 @@ photon-dashboard/
|
|||||||
## Updates
|
## Updates
|
||||||
|
|
||||||
Container images are available at:
|
Container images are available at:
|
||||||
- Dashboard: `git.jrdn.dev/jordanwalster/photon-dashboard:latest`
|
- Dashboard: `git.jrdn.dev/photon/photon-dashboard:latest`
|
||||||
- Worker: `git.jrdn.dev/jordanwalster/photon-worker:latest`
|
- Worker: `git.jrdn.dev/photon/photon-worker:latest`
|
||||||
|
|
||||||
View version history: [Container Registry](https://git.jrdn.dev/jordanwalster/-/packages/container/photon-dashboard/versions)
|
View version history: [Container Registry](https://git.jrdn.dev/jordanwalster/-/packages/container/photon-dashboard/versions)
|
||||||
|
|
||||||
|
|||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
# Photon Dashboard - QA Testing Matrix
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
This document outlines the test plan for the Photon Dashboard application to ensure all features are working as expected.
|
||||||
|
|
||||||
|
| Feature | Test Case | Expected Result |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| **Image Upload** | Upload a single JPG image. | Image appears in the main gallery. |
|
||||||
|
| | Upload multiple images (JPG, PNG, GIF) at once. | All images appear in the main gallery. |
|
||||||
|
| | Upload an image into a specific folder. | Image appears inside the selected folder. |
|
||||||
|
| | Attempt to upload an unsupported file type (e.g., .txt). | An error message is displayed, and the file is not uploaded. |
|
||||||
|
| **Image Deletion** | Send a single image to the trash. | Image is removed from the main gallery and appears in the Trash view. |
|
||||||
|
| | Send multiple selected images to the trash. | All selected images are moved to the Trash view. |
|
||||||
|
| | Permanently delete an image from the trash. | Image is permanently removed and cannot be restored. |
|
||||||
|
| | Permanently delete multiple images from the trash. | All selected images are permanently removed. |
|
||||||
|
| | Empty the entire trash. | All images in the trash are permanently deleted. |
|
||||||
|
| **Image Restoration** | Restore a single image from the trash. | Image is moved back to its original location in the gallery. |
|
||||||
|
| | Restore multiple selected images from the trash. | All selected images are moved back to their original locations. |
|
||||||
|
| | Restore all images from the trash. | All images are moved back to their original locations. |
|
||||||
|
| **Image Renaming** | Rename an image with a valid name. | The image's name is updated in the gallery and on the filesystem. |
|
||||||
|
| | Attempt to rename an image with special characters or an empty name. | An error is shown, and the name is not changed. |
|
||||||
|
| **Image Privacy** | Make a single image private. | The image is marked as private and is only visible when the 'Private' filter is active. |
|
||||||
|
| | Make multiple selected images private. | All selected images are marked as private. |
|
||||||
|
| | Make a private image public. | The image is no longer marked as private. |
|
||||||
|
| **Tagging** | Create a new tag. | The new tag appears in the tags sidebar. |
|
||||||
|
| | Assign a single tag to an image. | The tag is associated with the image. Filtering by this tag shows the image. |
|
||||||
|
| | Assign multiple tags to an image. | All selected tags are associated with the image. |
|
||||||
|
| | Assign a tag to multiple selected images. | The tag is associated with all selected images. |
|
||||||
|
| | Remove a tag from an image. | The tag is no longer associated with the image. |
|
||||||
|
| | Delete a tag. | The tag is removed from the system and from all images it was assigned to. |
|
||||||
|
| **Folder Management** | Create a new folder. | The new folder appears in the folders sidebar. |
|
||||||
|
| | Rename a folder. | The folder's name is updated in the sidebar and on the filesystem. |
|
||||||
|
| | Move images to a folder. | The selected images are moved into the target folder. |
|
||||||
|
| | Delete a folder. | The folder is removed. An appropriate prompt should handle what happens to the images inside. |
|
||||||
|
| **Image Download** | Download a single image. | The original, full-resolution image is downloaded. |
|
||||||
|
| | Download multiple selected images. | A ZIP file containing the selected images is created and downloaded. |
|
||||||
|
| | Download a folder as a ZIP file. | A ZIP file containing all images in the folder is downloaded. |
|
||||||
|
| **Background Tasks** | Verify image caching. | Thumbnails are generated and stored in `data/.cache/`. Subsequent loads are faster. |
|
||||||
|
| | Verify update check. | The application correctly checks for new versions on startup. |
|
||||||
|
| **UI & Layout** | Toggle sidebar visibility (Folders/Tags). | The corresponding sidebar section expands or collapses. The state is saved in cookies. |
|
||||||
|
| | Change number of columns. | The gallery grid updates to show the selected number of columns. The state is saved in cookies. |
|
||||||
|
| | Responsive Design - Mobile View | The layout adapts to a small screen, and all functionality is accessible. |
|
||||||
|
| | Responsive Design - Tablet View | The layout adapts to a medium screen. |
|
||||||
|
|
||||||
@@ -2,6 +2,103 @@
|
|||||||
|
|
||||||
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.1.2] - 2026-07-31
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Apple Touch Icon for bookmarked pages.
|
||||||
|
- Private image thumbnail when sent into social chats.
|
||||||
|
- Additional format for thumbnail extraction to support format `YYYY-MM-DD_HH-MM-SS`.
|
||||||
|
- Support for creating API keys.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- MP4 files unplayable from share URL.
|
||||||
|
- Trash multiple selected files failing on folders with spaces.
|
||||||
|
|
||||||
|
## [v1.1.1] - 2026-05-04
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Crowded button layout when selecting items on mobile.
|
||||||
|
- Alignment of grid when display is between 1200px - 992px.
|
||||||
|
- Generating thumbnails task showing as hanging despite succeeding.
|
||||||
|
|
||||||
|
## [v1.1.0] - 2026-05-04
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Mobile-first UI with two offcanvas sidebars for page navigation and quick actions.
|
||||||
|
- Context menu on long-press for images.
|
||||||
|
- Breakdown for storage in sidebar.
|
||||||
|
- Ability to scroll sidebar if content starts to overflow.
|
||||||
|
- Custom scroll bars.
|
||||||
|
- Redirection to 'All Screenshots' from a deleted folder or tag when currently using that page.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Disabled cache on shared links to prevent newly private links from being cached on client systems.
|
||||||
|
- Delete tag/folder context menu buttons no longer trigger modal.
|
||||||
|
- Sidebar folder icons (both parent and child).
|
||||||
|
- Grid layout on mobile shows two in a row instead of a single image.
|
||||||
|
- Extended cache period on thumbnails to ensure rapid page loads.
|
||||||
|
- Made text in sidebar bold.
|
||||||
|
- Default page limit set to 24 (Override with `PAGE_LIMIT`).
|
||||||
|
- Headers are sticky to keep controls visible when scrolling.
|
||||||
|
- Disabled text selection on pagination bar.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- File timestamps updating after moving folders or renaming.
|
||||||
|
- Trash icon not appearing when folder empty.
|
||||||
|
- Scrolling twice if window height was not tall enough to fit all elements.
|
||||||
|
|
||||||
|
## [v1.0.3] - 2026-05-02
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Private Sidebar button for easier viewing of images set to private.
|
||||||
|
- Make private button to multi-select actions.
|
||||||
|
- Download button to multi-select actions.
|
||||||
|
- Hold shift to select.
|
||||||
|
- Select all (on page) button.
|
||||||
|
- New version available message in footer.
|
||||||
|
- Generate thumbnail endpoint.
|
||||||
|
- Feedback button to footer.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Updated icon library to latest.
|
||||||
|
- Upgraded to PHP 8.5.
|
||||||
|
- Icon for active tags now shows a tag (due to icon library updates).
|
||||||
|
- Moved changelog link into version number.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Bug where images with capitalised extensions could not be trashed by using "Empty trash" button.
|
||||||
|
|
||||||
|
## [v1.0.2] - 2026-05-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Counter when force generating thumbnails.
|
||||||
|
- Context menu for folders in the sidebar (rename and delete actions).
|
||||||
|
- Confirm permanently delete popups.
|
||||||
|
- Restore database backup tool to recover OCR and tags.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Database export includes numeric array indices as column names, corrupting the backup.
|
||||||
|
- OCR results not showing within folder context.
|
||||||
|
- OCR results not showing for images in folders from within a tag context.
|
||||||
|
|
||||||
|
## [v1.0.1] - 2026-04-30
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Clear search function on page type switch.
|
||||||
|
- Remove tags and Move Folder options to Actions dropdown when searching.
|
||||||
|
|
||||||
|
### 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
|
## [v1.0.0] - 2026-04-30
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ PHOTON_DOMAIN=photon.local
|
|||||||
# PHOTON_SHARE_DOMAIN=share.photon.local
|
# PHOTON_SHARE_DOMAIN=share.photon.local
|
||||||
# COOKIE_DOMAIN=.photon.local
|
# COOKIE_DOMAIN=.photon.local
|
||||||
|
|
||||||
|
### Basic Auth Credentials (for Traefik) Use htpasswd to generate the password hash.
|
||||||
|
BASIC_AUTH_USER=admin
|
||||||
|
BASIC_AUTH_PASSWORD='$apr1$LbKLWjeg$i69pFbEbwQ61CtsjWGq/D0'
|
||||||
|
|
||||||
### Photon Worker Environment Variables
|
### Photon Worker Environment Variables
|
||||||
SCAN_RATE=10
|
SCAN_RATE=10
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ services:
|
|||||||
- "traefik.http.routers.photon.rule=Host(`${PHOTON_DOMAIN}`)"
|
- "traefik.http.routers.photon.rule=Host(`${PHOTON_DOMAIN}`)"
|
||||||
- "traefik.http.routers.photon.service=photon"
|
- "traefik.http.routers.photon.service=photon"
|
||||||
- "traefik.http.services.photon.loadbalancer.server.port=80"
|
- "traefik.http.services.photon.loadbalancer.server.port=80"
|
||||||
|
# Basic auth for dashboard (Replace this with your own credentials).
|
||||||
|
- "traefik.http.middlewares.photon-basic-auth.basicauth.users=${BASIC_AUTH_USER}:${BASIC_AUTH_PASSWORD}"
|
||||||
|
- "traefik.http.routers.photon.middlewares=photon-basic-auth"
|
||||||
|
|
||||||
# Custom domain for share links
|
# Custom domain for share links
|
||||||
- "traefik.http.routers.photon-share.rule=Host(`${PHOTON_SHARE_DOMAIN}`)"
|
- "traefik.http.routers.photon-share.rule=Host(`${PHOTON_SHARE_DOMAIN}`)"
|
||||||
|
|||||||
Reference in New Issue
Block a user