A native macOS app to craft, organize, and send push notifications to the iOS Simulator.
Testing push notifications on the iOS Simulator normally means hand-editing JSON files and running xcrun simctl push from the terminal. iOS Simulator Push Notifier gives you a visual editor, folder-based organization, and one-click delivery — so you can focus on building your app instead of wrestling with payloads.
Build complete Apple Push Notification payloads without touching JSON. Edit the alert title, subtitle, body, badge, sound, category, thread ID, content-available, mutable-content, and arbitrary custom data fields — all from a clean form UI. A live JSON preview keeps you in sync.
Group notifications into folders just like Apple Notes. Create, rename, reorder, and delete folders. Move all notifications from one folder to another in a single action. An All Notifications view shows everything at a glance.
Booted simulators are detected automatically and refresh every 5 seconds. Installed apps are discovered via simctl listapps, so you can pick the target bundle identifier from a dropdown instead of typing it by hand.
Hit Run (or ⌘↩) to push the current notification to the selected simulator instantly.
- Import — Open
.apns/.jsonfiles via the file picker or drag-and-drop them onto a folder. - Export — Download any notification as a portable
.apnsfile.
Send a notification once after a delay, or set up a recurring cron schedule. Active schedules survive app restarts and show a status banner in the editor.
| Action | Shortcut |
|---|---|
| New Notification | ⌘N |
| New Folder | ⌘⇧N |
| Delete | ⌘⌫ |
| Run Notification | ⌘↩ |
| Schedule | ⌘⇧S |
Ships with a dark theme that respects the native macOS look and feel.
- macOS with Xcode installed (for
xcrun simctl) - At least one booted iOS Simulator
Download the latest release from the Releases page.
This app is not code-signed or notarized by Apple. macOS will block it from opening by default. To allow it:
- Try to open the app — macOS will show a warning and refuse.
- Go to System Settings → Privacy & Security.
- Scroll down to the Security section — you'll see a message about the blocked app.
- Click Open Anyway and confirm.
You only need to do this once.
| Layer | Technology |
|---|---|
| Shell | Electron 39 |
| Build | electron-vite |
| Renderer | React 19 + TypeScript 5.9 |
| Styling | Tailwind CSS 4 + shadcn/ui |
| Database | SQLite via better-sqlite3 |
| Scheduling | node-cron |
| Simulator | xcrun simctl push (Xcode CLI) |
- Node.js 20+
# Clone the repo
git clone https://github.com/gogson/ios-simulator-push-notifier.git
cd ios-simulator-push-notifier
# Install dependencies
npm install
# Launch in development mode
npm run dev# Build a macOS .zip (universal: x64 + arm64)
npm run build:macThe output will be in the dist/ directory.
Releases are automated via GitHub Actions. Push a version tag to trigger a build:
git tag v1.0.0
git push origin v1.0.0A macOS .zip artifact will be uploaded to the GitHub Release automatically.
src/
├── main/ # Electron main process
│ ├── index.ts # App lifecycle, window, menu
│ ├── db.ts # SQLite schema & CRUD
│ ├── simulator.ts # xcrun simctl wrapper
│ ├── scheduler.ts # Cron job management
│ └── ipc-handlers.ts # IPC bridge registration
├── preload/ # Context bridge
│ ├── index.ts # API exposed to renderer
│ └── index.d.ts # TypeScript declarations
└── renderer/ # React frontend
└── src/
├── App.tsx # 3-panel layout + drag & drop
├── components/ # FolderList, NotificationList, NotificationForm, ScheduleDialog
├── hooks/ # useData (folders, notifications, simulators, schedules)
└── lib/ # APNS payload builder, utils
MIT
