Documentation · v1.0.0

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.

No telemetry · No cloud · Encrypted at rest · Electron 41 · SQLite · ADB

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.

App ──adb──► Android ──open app──► compose & post

Installation

macOS

Download Postizy-1.0.0-arm64.dmg Open → drag to Applications xattr -cr /Applications/postizy.xyz # if Gatekeeper blocks Postizy

Windows

Postizy-1.0.0-x64.exe Install → run Allow USB debugging driver prompt

Linux

chmod +x Postizy-1.0.0.AppImage ./Postizy-1.0.0.AppImage # needs adb in PATH

Quick start — 3 minutes

1. Enable Developer Options on Android → USB debugging ON 2. Connect via USB → adb devices should show device 3. Open Postizy → Devices → Add → should appear "healthy" 4. Install TikTok/IG/YT/FB on phone and log in 5. Accounts → New → assign device 6. Dashboard → New Post → drag media → caption → schedule 7. Queue watches every 30s and dispatches

Devices · ADB Guide

We bundle adb binary in build/bin/adb. You can also use system adb.

ConnectionCommandNotes
USBadb devicesTrust prompt on phone
WiFiadb tcpip 5555 && adb connect 192.168.1.12Same network, static IP recommended
Healthadb shell getpropRuns 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.

accounts table: id, platform, label, token_encrypted, device_id Multiple accounts → assign different devices or share pool

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

Post: { id, platforms[], mediaFiles[], caption, scheduleAt, status } Queue: polling 30s → due? → first healthy device → uploader Failure → mark failed → re-queue after retry delay (transactional)

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.

PhaseActionsDuration
1 · BrowseScroll FYP/Explore/Feed, watch to completionDays 1-7
2 · +Likes+ like, bookmark, story view, search nicheDays 8-14
3 · +Follow+ follow suggested, short comments, join groups, subscribeDays 15-21
4 · FullFull mix, posting unlockedDay 22+

Action log stored in warmup_actions_log with success flag, device_id, duration.

Gesture Engine

GestureRandomization
Scrollvariable speed, random pauses, direction changes
Tapjitter ±3-8px, hold 80-180ms
Swipecurved paths, varying velocity
Typing80-250ms inter-key, occasional typo + backspace
Idlethink-time 1-8s, mid-session pause 10-60s
Timinghuman 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.

video slideshows draft → post via device

Instagram

Feed, Reels, Stories - no 24h Graph API container. Warmup: Explore likes, Reels watch full, story replies, comment niche.

feed reels story no Page required

YouTube

Upload via app: title, description, thumbnail, visibility (public/unlisted). Warmup: search niche, watch full-length, like, subscribe, comment.

shorts video

Facebook

Post to page/timeline, attach media. Warmup: feed scroll, react, join groups in niche, comment, share.

page group timeline

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.

credentials: AES encrypted column token_encrypted logs: file only, no network backup: copy sqlite file

SQLite Schema (excerpt)

CREATE TABLE posts (id TEXT PK, title TEXT, caption TEXT, schedule_at TEXT, status TEXT); CREATE TABLE post_platforms (post_id FK, platform TEXT, account_id FK, platform_status TEXT); CREATE TABLE devices (id PK, name, platform, connection_type, ip, status); CREATE TABLE accounts_warmup (account_id PK, is_active, start_date, current_phase, daily_actions_target); CREATE TABLE warmup_actions_log (id PK, account_id FK, action_type, platform, duration_sec, success, device_id, created_at);

Architecture

Electron Shell (UI) ├─ React 19 + Vite + Tailwind 4 (monochrome) ├─ Zustand store └─ IPC bridge Main Process (Node) ├─ Queue Manager (node-cron 30s poll) ├─ Device Bridge (adb, uiautomator, scrcpy) ├─ Warmup Engine (phases, trackers, routines/tiktok.ts, instagram.ts…) └─ Uploaders (youtube.ts, instagram.ts, tiktok.ts, facebook.ts) SQLite: better-sqlite3 / sql.js

Troubleshooting

IssueFix
adb not foundSet ADB path in Settings or add to PATH, use bundled build/bin/adb
Device offlineToggle USB debugging, revoke authorizations, re-plug
App not installedInstall target app on device and log in before posting
Tap fails after UI updateUpdate selector patcher in electron/device/automation/
Warmup flaggedReduce daily_actions_target, increase phase duration, avoid posting during warmup
Queue stuckCheck device health, logs in ~/Library/Logs/Postizy
Ready to post from real devices?
v1.0.0 · Local-first · No telemetry
Back to home
© 2026 Postizy · Terms · PrivacyBlack / #000 · Monochrome only