Post from real devices.
Not APIs.
Postizy is a local-first desktop scheduler that posts via physical Android devices using ADB + UIAutomator. No OAuth, no Graph API, no whitelists. All data stays in encrypted SQLite on your machine.
Introduction
Instagram requires a Facebook Page + 24h container. TikTok Content Posting API is gated behind manual whitelist and 6 req/min. YouTube/Facebook APIs need OAuth flows and rate limits. Postizy skips all of it: it opens the official apps on your own phones and taps through the upload flow like a human.
Why device automation?
Single path for all 4 platforms. Avoids approval gates, avoids token expiry, behaves exactly like user.
Installation
macOS
Windows
Linux
Quick start — 3 minutes
Devices · ADB Guide
We bundle adb binary in build/bin/adb. You can also use system adb.
| Connection | Command | Notes |
|---|---|---|
| USB | adb devices | Trust prompt on phone |
| WiFi | adb tcpip 5555 && adb connect 192.168.1.12 | Same network, static IP recommended |
| Health | adb shell getprop | Runs every 60s, auto-reconnect |
Tip: Use original USB cable, disable battery optimization for target apps, keep screen on while posting. Devices lock during warmup to avoid conflict.
Accounts
Credentials stored in encrypted SQLite. No tokens — you log into apps on device directly. One account per platform supported, multiple accounts per platform allowed.
Post Composer
Drag-and-drop media, per-platform caption, schedule picker, bulk CSV import.
- Media types: video, image, carousel
- Title + caption + hashtags per platform
- Cover select for TikTok/Reels
- Schedule at ISO 8601, cron polls every 30s
- Status: draft | scheduled | uploading | posted | failed
Queue & Scheduling
Bulk upload via CSV: file_path, caption, schedule_at, platforms
Warmup Engine
New accounts mimic human behavior before posting to avoid spam flags. 4 phases, conservative defaults, cooldown 60 min after post.
| Phase | Actions | Duration |
|---|---|---|
| 1 · Browse | Scroll FYP/Explore/Feed, watch to completion | Days 1-7 |
| 2 · +Likes | + like, bookmark, story view, search niche | Days 8-14 |
| 3 · +Follow | + follow suggested, short comments, join groups, subscribe | Days 15-21 |
| 4 · Full | Full mix, posting unlocked | Day 22+ |
Action log stored in warmup_actions_log with success flag, device_id, duration.
Gesture Engine
| Gesture | Randomization |
|---|---|
| Scroll | variable speed, random pauses, direction changes |
| Tap | jitter ±3-8px, hold 80-180ms |
| Swipe | curved paths, varying velocity |
| Typing | 80-250ms inter-key, occasional typo + backspace |
| Idle | think-time 1-8s, mid-session pause 10-60s |
| Timing | human hours clustering, day-of-week variance, no 3AM spikes |
TikTok
Video upload: select video, caption, hashtags, cover, comments toggle. Warmup: FYP scroll, watch-to-completion, like, follow, comment, save.
Feed, Reels, Stories - no 24h Graph API container. Warmup: Explore likes, Reels watch full, story replies, comment niche.
YouTube
Upload via app: title, description, thumbnail, visibility (public/unlisted). Warmup: search niche, watch full-length, like, subscribe, comment.
Post to page/timeline, attach media. Warmup: feed scroll, react, join groups in niche, comment, share.
Data & Security
All data in ~/Library/Application Support/Postizy/db.sqlite (macOS) or %APPDATA%/Postizy (Win). Encrypted at rest, no cloud sync, no telemetry, file-based logs only.
SQLite Schema (excerpt)
Architecture
Troubleshooting
| Issue | Fix |
|---|---|
| adb not found | Set ADB path in Settings or add to PATH, use bundled build/bin/adb |
| Device offline | Toggle USB debugging, revoke authorizations, re-plug |
| App not installed | Install target app on device and log in before posting |
| Tap fails after UI update | Update selector patcher in electron/device/automation/ |
| Warmup flagged | Reduce daily_actions_target, increase phase duration, avoid posting during warmup |
| Queue stuck | Check device health, logs in ~/Library/Logs/Postizy |