- Use application(_:open:) instead of NSAppleEventManager for URL scheme handling (SwiftUI lifecycle compatibility) - Add waiting UI during Mastodon OAuth flow with cancel support - Improve error messages for all three services - Rewrite README with full setup instructions and project overview - Clean up .gitignore
96 lines
3 KiB
Markdown
96 lines
3 KiB
Markdown
# qStatus
|
|
|
|
A fast, native macOS menubar app for posting to **Mastodon**, **WordPress**, and **Micro.blog** with a single keyboard shortcut.
|
|
|
|
Built with Swift and SwiftUI. No Electron, no web views, no dependencies.
|
|
|
|
## Features
|
|
|
|
- **Global hotkey** — press `Ctrl+Option+Cmd+T` from anywhere to open the posting window
|
|
- **Multiple accounts** — add accounts from different services and post to one or more at once
|
|
- **Image attachments** — drag-and-drop or browse for images, up to 4 per post
|
|
- **Menubar app** — lives in your menubar, no Dock icon, always ready
|
|
- **Lightweight** — native Swift/SwiftUI, fast startup, minimal memory footprint
|
|
|
|
## Supported Services
|
|
|
|
| Service | Auth Method | Media Upload |
|
|
|---------|------------|--------------|
|
|
| **Mastodon** | OAuth2 (any instance) | up to 4 images |
|
|
| **WordPress** (self-hosted) | Application Passwords | up to 4 images |
|
|
| **Micro.blog** | App Token | up to 4 images |
|
|
|
|
## Requirements
|
|
|
|
- macOS 15 Sequoia or later
|
|
- [XcodeGen](https://github.com/yonaskolb/XcodeGen) (for building from source)
|
|
|
|
## Build from Source
|
|
|
|
```bash
|
|
brew install xcodegen
|
|
git clone https://github.com/pawelorzech/qstatus.git
|
|
cd qstatus
|
|
xcodegen generate
|
|
open qStatus.xcodeproj
|
|
```
|
|
|
|
Then hit `Cmd+R` in Xcode to build and run.
|
|
|
|
## Setting Up Accounts
|
|
|
|
### Mastodon
|
|
|
|
1. Click the menubar icon → **Settings**
|
|
2. Click **+**, select **Mastodon**
|
|
3. Enter your instance URL (e.g. `mastodon.social`)
|
|
4. Authorize qStatus in your browser
|
|
|
|
### WordPress (Self-Hosted)
|
|
|
|
1. In WordPress admin: **Users → Profile → Application Passwords**
|
|
2. Create a new password named "qStatus"
|
|
3. In qStatus Settings, enter your site URL, username, and the application password
|
|
|
|
### Micro.blog
|
|
|
|
1. Go to [micro.blog/account/apps](https://micro.blog/account/apps)
|
|
2. Generate a new app token
|
|
3. Paste it in qStatus Settings
|
|
|
|
## Usage
|
|
|
|
1. Press **Ctrl+Option+Cmd+T** (or click menubar icon → **New Post**)
|
|
2. Select target account(s) using the chips at the top
|
|
3. Type your status
|
|
4. Drag-and-drop images if needed (up to 4)
|
|
5. Press **Cmd+Enter** or click **Post**
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
qStatus/
|
|
├── project.yml # XcodeGen project spec
|
|
├── qStatus/
|
|
│ ├── App/ # App entry point, AppDelegate, state
|
|
│ ├── Models/ # Account model, PostingService protocol
|
|
│ ├── Views/ # SwiftUI views (input panel, settings, menubar)
|
|
│ ├── Windows/ # NSPanel floating window
|
|
│ ├── Services/ # API clients (Mastodon, WordPress, Micro.blog)
|
|
│ ├── Utilities/ # Multipart form data helper
|
|
│ └── Resources/ # Info.plist, entitlements, assets
|
|
```
|
|
|
|
## Tech Stack
|
|
|
|
- **Swift 6** / **SwiftUI** with `@Observable` (macOS 15+)
|
|
- **MenuBarExtra** for menubar presence
|
|
- **NSPanel** for the floating input window
|
|
- **Carbon RegisterEventHotKey** for global keyboard shortcut
|
|
- **Keychain** (native Security framework) for credential storage
|
|
- **URLSession** async/await for all networking
|
|
- Zero third-party dependencies
|
|
|
|
## License
|
|
|
|
MIT
|