This commit is contained in:
TutorialsGHG
2026-04-12 22:04:59 +02:00
commit 13bf50b01e
10 changed files with 3388 additions and 0 deletions

218
README.md Normal file
View File

@@ -0,0 +1,218 @@
# NotifyPulse — Multi-Profile Block Architecture
NotifyPulse is a Windows notification engine built around **Usecases** and **Blocks**.
Each usecase is an isolated profile with its own folder, enabled blocks, and notification list.
A tray app runs quietly in the background; a local web UI lets you manage everything.
---
## Folder structure
```
NotifyPulse/
├── notifier.py ← Main backend
├── requirements.txt
├── build.bat
├── ui/
│ └── index.html ← Desktop Web UI (usecase manager)
└── pwa/
├── index.html ← Mobile PWA (splash + selector + wallpaper)
├── manifest.json
└── sw.js
```
Config and assets live in `%APPDATA%\Roaming\NotifyPulse\`:
```
NotifyPulse\
├── usecases.json ← All usecase definitions
├── settings.json ← Global settings
├── icon.png ← Tray icon ──────────────────────────────────┐
│ Shown in the Windows system tray. │
│ Recommended: 256×256 px, PNG with │ App Icons
│ transparency. Falls back to a default │
│ coloured circle if missing. │
│ │
├── icon.ico ← Window / taskbar icon (optional) │
│ Used when the app is compiled to .exe. │
│ Recommended: multi-size ICO (16/32/48/256). │
│ If absent, icon.png is used instead. ┘
├── main.png ← PWA splash background ──────────────────────┐
│ Full-screen background shown on the phone │
│ PWA while it loads. Recommended: your │ PWA Assets
│ phone's native resolution (e.g. 1170×2532 │
│ for iPhone 14). JPEG is also accepted. ┘
└── usecases\
├── my_profile_abc123\
│ ├── wallpapers\ ← Desktop wallpapers for this usecase
│ ├── overlay\ ← Overlay images for this usecase
│ └── mobile\ ← Mobile wallpapers for this usecase (pushed via PWA)
└── ...
```
### Placing app icons
| File | Where it shows | Recommended size | Notes |
|------|----------------|-----------------|-------|
| `icon.png` | Windows system tray | 256 × 256 px | PNG, transparent background |
| `icon.ico` | Taskbar / .exe (compiled) | Multi-size ICO | 16, 32, 48, 256 px layers |
| `main.png` | PWA splash screen | Phone native res | JPEG also accepted |
Drop these files into `%APPDATA%\Roaming\NotifyPulse\` and restart the app.
No config change needed — the app picks them up automatically.
---
## Quick start
```bat
pip install -r requirements.txt
python notifier.py
```
Or build an `.exe` (bundles everything, no Python required to run):
```bat
build.bat
```
---
## Blocks
Each usecase can enable any combination of blocks:
| Block | What it does |
|---|---|
| 🔔 Notifications | Random & scheduled Windows toast notifications |
| 🖼️ Wallpaper | Changes desktop wallpaper from usecase's `wallpapers\` folder |
| ✨ Overlay | Fullscreen image overlay from usecase's `overlay\` folder |
| ⏱️ Timer | Enables time-triggered entries (HH:MM syntax) |
| 📱 Mobile Wallpaper | Pushes wallpapers to phone via PWA from usecase's `mobile\` folder |
---
## Creating a Usecase
**Desktop UI** → Usecases → `+ New Usecase`
1. Give it a name and accent color
2. Check the blocks you need
3. Set the min/max notification interval (in minutes)
4. Add notification entries (supports `| %` weights and `| HH:MM` schedules)
5. Click **▶ Activate** to start using it
6. Click **📁 Folder** to open the usecase folder and drop in your images
---
## notifications.txt syntax (per usecase)
```
# Weighted random
Take a break! | 35%
Drink water! | 30%
change.wallpaper | 20%
show.overlay | 15%
show.overlay.10 | 10% ← overlay for 10 seconds
change.wallpaper.mobile ← push to phone PWA
# Scheduled (needs Timer block)
Morning standup | 09:00
End of day | 17:30
```
---
## Settings reference
All settings are saved to `%APPDATA%\Roaming\NotifyPulse\settings.json`
and editable in the desktop UI under the **Settings** tab.
### General
| Setting | Default | Description |
|---|---|---|
| `app_name` | `"NotifyPulse"` | Name shown in the header before any usecase is selected |
| `hotkey` | `"F13"` | Global hotkey to pause / resume |
| `log_max_entries` | `100` | How many log lines to keep in memory |
| `startup_toast` | `true` | Show a toast notification when the app starts |
| `notify_sound` | `true` | Play sound with toast notifications |
| `auto_open_browser` | `true` | Open the web UI automatically on start |
| `minimize_to_tray` | `true` | Closing the window hides to tray instead of quitting |
| `run_on_startup` | `false` | Register NotifyPulse in Windows startup |
| `confirm_delete` | `true` | Show a confirmation dialog before deleting a usecase |
| `entry_display_mode` | `"percent"` | Default display for entry weights: `percent` or `chance` |
### Notifications
| Setting | Default | Description |
|---|---|---|
| `notification_duration` | `5` | How many seconds a toast stays on screen (130) |
### Overlay
| Setting | Default | Description |
|---|---|---|
| `overlay_duration` | `6` | Default overlay display time in seconds |
| `overlay_opacity` | `0.4` | Overlay transparency (0.05 1.0) |
| `overlay_stretch` | `false` | Stretch to fill (`true`) or letterbox-fit (`false`) |
| `overlay_monitor` | `0` | Which monitor: `0` = primary, `-1` = all, `1/2/3` = specific |
### Wallpaper
| Setting | Default | Description |
|---|---|---|
| `wallpaper_fit` | `"fill"` | How the image is scaled: `fill` · `fit` · `stretch` · `center` · `tile` |
### Network / PWA
| Setting | Default | Description |
|---|---|---|
| `web_port` | `5000` | Port for the web UI and PWA |
---
## PWA Splash Screen
Drop a `main.png` (or `.jpg`) into `%APPDATA%\NotifyPulse\` to use it as the
full-screen background when the PWA first loads on your phone.
---
## PWA Usage
1. Start NotifyPulse on your PC
2. On your phone, open: `http://<your-pc-ip>:5000/pwa`
3. **iOS**: Share → Add to Home Screen
4. **Android**: ⋮ → Install App
The PWA shows your splash screen, then a list of usecases to switch between.
Selecting one activates that usecase and shows the wallpaper receiver
if the Mobile Wallpaper block is enabled.
---
## API Reference
| Method | Endpoint | Description |
|---|---|---|
| GET | `/api/usecases` | List all usecases + blocks |
| POST | `/api/usecases` | Create a usecase |
| PUT | `/api/usecases/:id` | Update a usecase |
| DELETE | `/api/usecases/:id` | Delete a usecase |
| POST | `/api/usecases/:id/activate` | Switch active usecase |
| POST | `/api/usecases/:id/open_folder` | Open usecase folder in Explorer |
| GET | `/api/state` | Full app state |
| POST | `/api/pause` | Toggle pause |
| POST | `/api/fire_now` | Fire a random entry immediately |
| GET/POST | `/api/settings` | Read / update global settings |
| GET | `/api/log` | Event log |
| POST | `/api/pwa/ping` | PWA heartbeat |
| GET | `/api/pwa/app_name` | App info + usecase list for PWA |
| GET | `/api/pwa/splash_image` | Serve main.png as base64 |
| GET | `/api/pwa/wallpaper` | Poll for pending mobile wallpaper |
| POST | `/api/pwa/trigger_wallpaper` | Request a new wallpaper push |
| POST | `/api/pwa/activate_usecase` | Activate a usecase from the PWA |