Overview
ZinklyApp is the Flutter timeline app (Android, iPhone and web) for your own Zinkly website: feed, stories, reels, Watch, chat and calls, live, groups, Pages, blogs, channels, marketplace and memberships, plus Manage Page and Manage Group tools. It ships with no domain, keys or branding of ours: you set your own with one command.
New in 1.3: Manage Page (orders, bookings, shop, reviews, analytics, posts, customers, broadcasts, promotion) and Manage Group in the app, chat folders, end-to-end encryption, the website's post privacy and Android-style text selection. See the changelog.
Purchase & support
Buy ZinklyApp
The full Flutter source (Android + iPhone + web), the rebrand and doctor tools, updates and this documentation.
Support & custom work
Questions, installation help, or features made for your site: open a request on the Zinkly support page.
Your Zinkly website
ZinklyApp needs the Zinkly Social backend (1.3.1+, Update 1.4 recommended).
Your downloads (new versions and updates) are in Zinkly Shop: sign in with Login with Zinkly and open My Downloads (desktop: your profile icon, top right) or Library (mobile: footer menu).
How it works
The app has no data of its own: posts, chats, stories, pages and groups live on your website. One build works with one site (set by rebrand.py); the site confirms the app on every start.
Features
Timeline
Feed with filters (Everything, Recent, Followers, Popular, Discover, country, post type), rich text, polls, photo layouts, link previews, reposts with their media, Recommend, edit history.
Stories
Story Studio: drawing, filters, fonts, stickers, quiz, questions, sliders, countdowns, "Add yours", Close Friends, drafts, subtitles, insights, Discover stories, hidden photos.
Reels & Watch
Full-screen reels, gallery reels, scheduling, paid / members-only reels, Watch with playlists, Series (Zinkly 1.4).
Chat
Messenger-style chats, groups, albums, voice notes, GIFs, folders (Direct, Groups, Channels, Unread, Muted), archive, hidden chats, message requests, "Seen" avatars.
End-to-end encryption
Encrypted chats and calls are marked with a lock and open in the secure chat; encryption devices and keys from Settings › Security.
Calls
Audio and video calls with LiveKit, group calls, screen sharing, calls that ring like a phone call on Android (even when the app is closed).
Live
Go live with camera or voice, Subscribers only and Paid lives, donations, supporters, saved lives.
Manage Page
Dashboard, analytics, orders, bookings and staff, reviews, shop & catalog, posts & scheduling, customers, broadcasts, links with QR codes, coupons, promotions, admins, rules, reports.
Manage Group
Join requests, members, roles, pending posts, reports, blocked words and rules, bans, AI admin alerts, features & permissions, moderation log, ownership.
Blogs, Channels, Discussions
Read and write blogs, forum channels with moderation, community discussion tab with a rich editor.
Earn
VIP plans (yearly, codes, gifts), Creator Memberships, paid content, wallet and coins, Recommend & Earn and Earnings (Zinkly 1.4).
8 languages
English, Greek, German, French, Italian, Russian, Portuguese (Brazil) and Spanish (Mexico), switchable on the sign-in screen.
Installation
What you need
- A website running Zinkly Social 1.3.1 or newer (Zinkly Update 1.4 recommended: Manage Page / Manage Group in the app and the 1.4 features).
- Flutter 3.29+ (Dart 3.7+), Android Studio with the Android SDK, and Python 3. For iPhone: a Mac with Xcode and an Apple developer account.
- Your own domain, app name, Android id, icon (1024×1024 PNG) and splash image.
Install in 6 steps
- UnzipUnzip Fresh Installation/ZinklyApp-1.3 and open a terminal in that folder.
- Make it yours with one commandThe app ships with the placeholder site
https://yourdomain.com, the name "ZinklyApp" and the example idcom.example.zinkly_app; it connects to nothing until you set yours.python3 tools/rebrand.py --server-url https://social.example.com --name "My Social" \ --android-id com.mycompany.social --icon my_icon.png --splash my_splash.pngOption What it sets --server-urlYour Zinkly website (https://..., no /api/v1) in lib/config/app_config.dart. The app works with this site only; people using it can't change it.--nameThe name under the app icon (Android, iPhone, web). Inside the app your AdminCP site name is shown. --android-idAndroid applicationId and Kotlin package. It can't change after your first Google Play upload. --ios-idiPhone bundle id (default: the Android id with _turned into-).--schemeSign-in return link (default zinklyapp); must match AdminCP › Applications › Mobile app scheme.--extra-hostsOther domains of your site whose links open inside the app. --icon/--splashYour icon and splash; launcher icons and splash screens are generated. --dry-runShows what would change, changes nothing. - Prepare your websiteSee Website setup:
APP_URL, AdminCP › Applications and Android App Links. - Push notifications (recommended)Follow Push notifications, then copy env/dev.json.example to env/prod.json.
- Check and run
tools/doctor.py checks the site address, app ids, sign-in link, signing key and Firebase values, and asks your site whether it accepts the app.python3 tools/doctor.py flutter pub get flutter run - PublishSee Build & release.
Website setup
| Where | What |
|---|---|
.env | APP_URL must be exactly the address you gave --server-url. |
| AdminCP › Applications | Switch ZinklyApp on (switch it off to stop the app at once) and check the Mobile app scheme (zinklyapp or your --scheme). |
.env (App Links) | ANDROID_APP_PACKAGE = your Android id and ANDROID_APP_SHA256 = your signing certificate(s) (comma separated; add the Google Play App Signing key too). Your site then serves /.well-known/assetlinks.json and links to it open in the app. Run php artisan config:cache if your site caches its config. |
| AdminCP › Feature switches | Everything you switch off disappears from the app too (polls, anonymous posts, calls, stories, reels, groups, blogs, channels, Messages Plus...). |
| Zinkly Update 1.4 | Adds the app API for Manage Page (selling + growth) and Manage Group, and the 1.4 features. Install it from AdminCP › System › Updates. |
Your site's sign-in, sign-up, password, e-mail and system pages always open in the phone's browser; every other link to your site opens the matching app screen (or the page inside the app, already signed in).
Updating to 1.3
The download has an Update folder for every supported version: Update 1.2 to 1.3 (24 new + 97 changed files) and Update 1.2.1 to 1.3 (21 new + 82 changed files). Each has a step-by-step How to update ... .txt and a Changed files.txt. No file was removed in 1.3.
Before you start
- Update your websiteZinkly Social 1.3.1 or newer; install Zinkly Update 1.4 (AdminCP › System › Updates) so Manage Page and Manage Group work inside the app.
- Back upCopy your whole app folder.
- Note your rebrand optionsSite address, name, Android id, scheme, icon, splash. The Android id must stay the same: Google Play only accepts updates with the same id and upload key.
Way A · Fresh 1.3 (recommended, ~10 minutes)
For apps whose code you did not change.
- Unzip Fresh Installation/ZinklyApp-1.3 into a new folder.
- Copy your private files into it: android/key.properties + your .jks, env/prod.json, your icon / splash, google-services.json / GoogleService-Info.plist.
- Run tools/rebrand.py with exactly the same options as before.
- Raise the number after
+in pubspec.yaml (e.g.1.3.0+130). python3 tools/doctor.py,flutter pub get,flutter build appbundle --release --dart-define-from-file=env/prod.json.
Way B · Copy the changed files
For apps whose code you changed yourself.
- Copy everything inside files over your app folder and replace when asked. lib/config/app_config.dart is never included, so your site address stays.
- Re-add your own changes to replaced files (compare with your backup, e.g. WinMerge or Meld).
- Run tools/rebrand.py again with the same options (required: the update brings the default name, id and scheme in AndroidManifest.xml, build.gradle.kts, Info.plist, constants.dart, web/manifest.json...; it also moves MainActivity.kt into your package).
- Raise the build number, then
flutter clean,flutter pub get,python3 tools/doctor.pyand build.
What to replace (overview)
| Area | Files in the update |
|---|---|
| New screens | lib/screens/hub/page_selling_screens.dart (Manage Page), lib/screens/groups/group_admin_screens.dart (Manage Group), lib/widgets/people_picker_sheet.dart, lib/widgets/status_bar_shield.dart |
| New services | lib/services/page_selling_service.dart, page_growth_service.dart, group_admin_service.dart, read_memory.dart |
| Changed app code | chats (folders, menu, encryption), create post (privacy, text selection), post card (reposts), call screen, header, settings, links and translations under lib/ |
| Assets | new launcher icon art in assets/branding/ (your own icon comes back with rebrand.py --icon) |
| Never replaced | lib/config/app_config.dart, your keys, env/prod.json, Firebase files |
The exact list is in Changed files.txt inside each update folder.
Push notifications (Firebase)
Without Firebase the app works, but only notifies while it is open.
- Create a Firebase projectand add an Android app (your Android id) and an iOS app (your iOS id).
- Put the files in placeandroid/app/google-services.json and ios/Runner/GoogleService-Info.plist.
- Public valuesCopy env/dev.json.example to env/prod.json and fill in the four
FIREBASE_*values. - WebsiteAdd the Firebase server key / service account in AdminCP (push settings) and keep "Push notifications" switched on in Feature switches.
Details: FIREBASE_SETUP.md in the download.
Build & release
Signing
keytool -genkey -v -keystore android/app/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
Copy android/key.properties.example to android/key.properties and fill it in. Never share or commit it.
Build
flutter build appbundle --release --dart-define-from-file=env/prod.json # Google Play
flutter build apk --release --dart-define-from-file=env/prod.json # a test APK
flutter build ipa --dart-define-from-file=env/prod.json # iPhone (on a Mac)
Every store upload needs a higher number after + in pubspec.yaml (version: 1.3.0+130). Upload build/app/outputs/bundle/release/app-release.aab to the Google Play Console.
AdminCP control
ZinklyApp is a thin client: the name, logo and almost every feature follow your website.
| In AdminCP | In the app |
|---|---|
| Site name / logo | Header wordmark, sign-in screens, website pages inside the app |
| Applications | App on / off (switching off stops the app at once), mobile app scheme |
| Feature switches | Polls, anonymous posts, hashtags, trending, groups, calls, messaging, stories, reels, blogs, channels, discussions, scheduled posts / reels / stories / messages, page intros, push notifications, Messages Plus (folders, spaces, channels), Directory, Partners, Creator Plus |
| Sidebar & menus | The bottom bar (members can still arrange their own) |
| Text limits | Post, comment and message counters per VIP package (Zinkly 1.4) |
| Livestreams / LiveKit | Go Live, calls, screen sharing |
| VIP, Monetization, Wallet | VIP plans, memberships, paid content, coins |
| EchoAI / ZinklyAI | AI assistant tile and its modes |
Flutter details
Code map
| Folder | What is inside |
|---|---|
| lib/config/ | app_config.dart: your site address (set by rebrand.py) |
| lib/core/ | API client, constants, theme, app links (every website link mapped to a screen), browser hand-off, permissions |
| lib/providers/ | Auth, app config (AdminCP switches, text limits), language |
| lib/services/ | One service per area (timeline, chat, calls, live, stories, pages, groups...): all API calls |
| lib/models/ | Post, user, conversation, story, reel, community... |
| lib/screens/ | admin, auth, blogs, channels, chat, courses, gallery, groups, home, hub, jobs, live, marketplace, memberships, misc, monetization, notifications, profile, reels, requests, settings, stories, wallet, watch |
| lib/widgets/ | Post card, comments, rich text, stories bar, motion helpers, site tools... |
| lib/l10n/ | English keys + Greek, German, French, Italian, Russian, Portuguese (Brazil), Spanish (Mexico) |
| tools/ | rebrand.py (make it yours) and doctor.py (check everything) |
Main packages
provider · http · web_socket_channel (realtime) · livekit_client + flutter_webrtc (calls, live) · flutter_callkit_incoming (ringing calls) · firebase_messaging (push) · video_player · record + audioplayers (voice) · flutter_quill (rich editor) · webview_flutter (website pages) · app_links (Android App Links) · flutter_secure_storage (tokens) · image_picker / file_picker · geolocator · google_fonts
How it talks to your site
- REST API under
https://YOUR-SITE/api/v1, JSON, OAuth / Passport tokens (refreshed automatically), headersX-Zinkly-App, platform and version on every request. - Live updates over your site's Reverb / Pusher WebSocket (messages, typing, reads, reactions, calls, notifications).
GET /app-configon every start: name, logo, feature switches, text limits, bottom bar, sign-in methods.- Pages without an app screen open inside the app, signed in, via a one-time web session link (your own domain only).
API reference
Base URL: https://YOUR-SITE/api/v1. JSON in and out; send Accept: application/json and the Authorization: Bearer <token> header. ZinklyApp uses 479 endpoints, grouped below ({…} marks an id or name). Manage Page and Manage Group endpoints come with Zinkly Update 1.4 and run the website's own permission checks.
Sign-in & app setup7 endpoints
GET/app-config |
POST/auth/forgot-password |
POST/auth/login |
GET/auth/providers |
POST/auth/register |
POST/auth/reset-password |
POST/auth/social/exchange |
Feed, posts & comments76 endpoints
GET/albums |
POST/albums |
DELETE/albums/{…} |
GET/albums/{…} |
POST/albums/{…}/media |
DELETE/albums/{…}/media/{…} |
GET/blocked-users |
POST/bug-reports |
DELETE/comments/{…} |
PATCH/comments/{…} |
POST/comments/{…}/${like ? |
POST/comments/{…}/report |
GET/gifs/search |
GET/location/search |
POST/marketplace |
GET/marketplace-create-info |
GET/mentions/search |
POST/polls/{…}/unvote |
POST/polls/{…}/vote |
GET/post-backgrounds |
GET/post-reach |
DELETE/posts/{…} |
GET/posts/{…} |
PATCH/posts/{…} |
GET/posts/{…}/comments |
POST/posts/{…}/comments |
POST/posts/{…}/comments-lock |
POST/posts/{…}/like |
POST/posts/{…}/pin |
POST/posts/{…}/reach/{…} |
DELETE/posts/{…}/recommend |
POST/posts/{…}/recommend |
POST/posts/{…}/report |
GET/posts/{…}/revisions |
DELETE/posts/{…}/save |
POST/posts/{…}/save |
POST/posts/{…}/send |
POST/posts/{…}/share |
POST/posts/{…}/typing |
POST/posts/{…}/view |
POST/recommend-intro/seen |
GET/report-categories |
GET/saved |
GET/saved/collections |
GET/settings/privacy |
PATCH/settings/privacy |
GET/settings/sessions |
DELETE/settings/sessions/{…} |
DELETE/settings/tokens/{…} |
GET/share-targets |
POST/stories/{…}/share |
POST/stories/{…}/share-chat |
GET/timeline |
GET/user |
PATCH/user |
POST/user/avatar |
DELETE/user/cover |
POST/user/cover |
DELETE/user/status |
GET/user/status |
POST/user/status |
GET/users/search |
GET/users/suggestions |
GET/users/{…} |
DELETE/users/{…}/block |
POST/users/{…}/block |
POST/users/{…}/follow |
GET/users/{…}/followers |
GET/users/{…}/following |
GET/users/{…}/mutual |
POST/users/{…}/poke |
GET/users/{…}/posts |
POST/users/{…}/report |
POST/users/{…}/unfollow |
GET/vip/packages |
GET/wallet |
Reels & Watch16 endpoints
POST/posts |
GET/reels |
POST/reels |
GET/reels/composer |
POST/reels/{…}/like |
GET/watch |
GET/watch/options |
GET/watch/playlists |
POST/watch/playlists |
DELETE/watch/playlists/{…} |
GET/watch/playlists/{…} |
PATCH/watch/playlists/{…} |
POST/watch/playlists/{…}/videos/{…} |
GET/watch/trending |
GET/watch/{…}/access |
POST/watch/{…}/access |
Stories & highlights36 endpoints
GET/discover/stories |
GET/highlights/sources |
DELETE/highlights/{…} |
GET/highlights/{…} |
GET/music/search |
GET/settings/close-friends |
POST/settings/close-friends |
DELETE/settings/close-friends/{…} |
POST/settings/stories-discover |
GET/settings/story-hidden |
POST/settings/story-hidden |
DELETE/settings/story-hidden/{…} |
GET/stickers/search |
GET/stories |
GET/stories/chains/{…} |
GET/stories/stickers |
DELETE/stories/{…} |
GET/stories/{…} |
POST/stories/{…}/boost |
POST/stories/{…}/click |
POST/stories/{…}/event |
GET/stories/{…}/insight |
PUT/stories/{…}/labels |
POST/stories/{…}/poll |
POST/stories/{…}/react |
POST/stories/{…}/remind |
POST/stories/{…}/reply |
POST/stories/{…}/respond |
GET/stories/{…}/responses |
POST/stories/{…}/reveal |
PUT/stories/{…}/subtitles |
POST/stories/{…}/subtitles/generate |
POST/stories/{…}/view |
GET/stories/{…}/viewers |
GET/story-insights |
GET/users/{…}/highlights |
Chat & calls41 endpoints
POST/calls/{…}/accept |
POST/calls/{…}/decline |
POST/calls/{…}/end |
GET/conversations |
POST/conversations |
GET/conversations/archived |
DELETE/conversations/{…} |
GET/conversations/{…} |
PATCH/conversations/{…} |
POST/conversations/{…}/accept |
POST/conversations/{…}/archive |
POST/conversations/{…}/ban/{…} |
POST/conversations/{…}/call |
POST/conversations/{…}/call/kick/{…} |
POST/conversations/{…}/call/mute/{…}?kind={…} |
POST/conversations/{…}/call/token |
POST/conversations/{…}/members |
DELETE/conversations/{…}/members/{…} |
GET/conversations/{…}/messages |
POST/conversations/{…}/messages |
GET/conversations/{…}/messages/search |
POST/conversations/{…}/mute |
POST/conversations/{…}/nickname/{…} |
POST/conversations/{…}/pin |
POST/conversations/{…}/read |
POST/conversations/{…}/reject |
POST/conversations/{…}/role/{…} |
POST/conversations/{…}/theme |
POST/conversations/{…}/typing |
GET/gifs/search |
POST/groups |
DELETE/messages/{…} |
PATCH/messages/{…} |
GET/messages/{…}/history |
POST/messages/{…}/pin |
DELETE/messages/{…}/reaction |
POST/messages/{…}/reaction |
POST/online-status/heartbeat |
PATCH/online-status/manual |
GET/online-status/{…} |
GET/user |
Live28 endpoints
GET/lives |
GET/lives/categories |
GET/lives/recordings |
POST/lives/recordings/preference |
DELETE/lives/recordings/{…} |
GET/lives/recordings/{…}/links |
POST/lives/recordings/{…}/retry |
POST/lives/rtc |
GET/lives/storage |
DELETE/lives/{…} |
GET/lives/{…} |
GET/lives/{…}/chat |
POST/lives/{…}/chat |
POST/lives/{…}/donate |
GET/lives/{…}/donation-options |
POST/lives/{…}/end |
POST/lives/{…}/mod/ban |
DELETE/lives/{…}/mod/{…} |
POST/lives/{…}/mod/{…} |
POST/lives/{…}/react |
GET/lives/{…}/recording |
POST/lives/{…}/recording/keep |
POST/lives/{…}/report |
POST/lives/{…}/rtc/go-live |
POST/lives/{…}/rtc/publish |
GET/lives/{…}/rtc/stats |
POST/lives/{…}/rtc/watch |
GET/lives/{…}/supporters |
Communities & discussions19 endpoints
GET/communities |
POST/communities |
GET/communities/categories |
DELETE/communities/{…} |
GET/communities/{…} |
GET/communities/{…}/announcements |
POST/communities/{…}/announcements |
DELETE/communities/{…}/announcements/{…} |
POST/communities/{…}/join |
POST/communities/{…}/leave |
POST/communities/{…}/manage |
GET/communities/{…}/members |
POST/communities/{…}/members/{…}/approve |
POST/communities/{…}/members/{…}/reject |
GET/communities/{…}/posts |
POST/communities/{…}/questions |
DELETE/communities/{…}/questions/{…} |
GET/settings/notifications/discussions |
PATCH/settings/notifications/discussions |
Manage Group tools (Zinkly 1.4)24 endpoints
GET/communities/{slug}/admin/alerts |
POST/communities/{slug}/admin/alerts |
POST/communities/{slug}/admin/alerts/{…}/resolve |
GET/communities/{slug}/admin/banned |
POST/communities/{slug}/admin/banned |
POST/communities/{slug}/admin/banned/{…}/unban |
POST/communities/{slug}/admin/features |
GET/communities/{slug}/admin/log |
POST/communities/{slug}/admin/members/{…}/role |
GET/communities/{slug}/admin/moderation |
POST/communities/{slug}/admin/moderation |
GET/communities/{slug}/admin/pending-posts |
POST/communities/{slug}/admin/pending-posts/{…}/approve |
POST/communities/{slug}/admin/pending-posts/{…}/reject |
POST/communities/{slug}/admin/permissions |
GET/communities/{slug}/admin/reports |
POST/communities/{slug}/admin/reports/{…}/dismiss |
POST/communities/{slug}/admin/reports/{…}/escalate |
GET/communities/{slug}/admin/roles |
POST/communities/{slug}/admin/roles |
POST/communities/{slug}/admin/rules |
POST/communities/{slug}/admin/rules/{…}/delete |
POST/communities/{slug}/admin/toggle-publish |
POST/communities/{slug}/admin/transfer |
Pages & hub48 endpoints
GET/events |
GET/events/categories |
DELETE/events/{…} |
GET/events/{…} |
POST/events/{…}/rsvp |
GET/pages |
POST/pages |
GET/pages/categories |
GET/pages/managed |
GET/pages/{…} |
GET/pages/{…}/inbox |
GET/pages/{…}/inbox/{…} |
POST/pages/{…}/inbox/{…}/reply |
GET/pages/{…}/manage |
GET/pages/{…}/manage/admins |
POST/pages/{…}/manage/admins |
DELETE/pages/{…}/manage/admins/{…} |
PUT/pages/{…}/manage/admins/{…} |
POST/pages/{…}/manage/delete-confirm |
POST/pages/{…}/manage/delete-request |
POST/pages/{…}/manage/general |
GET/pages/{…}/manage/log |
PUT/pages/{…}/manage/messaging |
PUT/pages/{…}/manage/moderation |
GET/pages/{…}/manage/pending-posts |
POST/pages/{…}/manage/pending-posts/{…}/approve |
POST/pages/{…}/manage/pending-posts/{…}/reject |
PUT/pages/{…}/manage/permissions |
GET/pages/{…}/manage/reports |
POST/pages/{…}/manage/reports/{…}/dismiss |
POST/pages/{…}/manage/reports/{…}/escalate |
GET/pages/{…}/manage/rules |
POST/pages/{…}/manage/rules |
DELETE/pages/{…}/manage/rules/{…} |
PUT/pages/{…}/manage/rules/{…} |
POST/pages/{…}/message |
GET/pages/{…}/posts |
GET/reels/limits |
GET/services |
POST/services |
GET/services/categories |
GET/services/{…} |
POST/wallet/add-money/{…} |
GET/wallet/overview |
POST/wallet/send |
GET/wallet/transactions |
GET/wallet/withdrawals |
POST/wallet/withdrawals |
Manage Page: selling & growth (Zinkly 1.4)36 endpoints
GET/pages/{username}/biz/analytics |
GET/pages/{username}/biz/bookings |
POST/pages/{username}/biz/bookings/settings |
POST/pages/{username}/biz/bookings/{…}/status |
GET/pages/{username}/biz/broadcasts |
POST/pages/{username}/biz/broadcasts |
POST/pages/{username}/biz/broadcasts/{…}/delete |
GET/pages/{username}/biz/catalog |
POST/pages/{username}/biz/catalog/collections |
POST/pages/{username}/biz/catalog/collections/{…}/delete |
POST/pages/{username}/biz/catalog/products |
POST/pages/{username}/biz/catalog/products/{…}/delete |
GET/pages/{username}/biz/customers |
GET/pages/{username}/biz/customers/{…} |
POST/pages/{username}/biz/customers/{…} |
POST/pages/{username}/biz/customers/{…}/delete |
GET/pages/{username}/biz/orders |
POST/pages/{username}/biz/orders/{…}/status |
GET/pages/{username}/biz/posts |
POST/pages/{username}/biz/posts |
POST/pages/{username}/biz/posts/{…}/approve |
POST/pages/{username}/biz/posts/{…}/delete |
POST/pages/{username}/biz/posts/{…}/reject |
GET/pages/{username}/biz/promotion |
POST/pages/{username}/biz/promotion/coupons |
POST/pages/{username}/biz/promotion/coupons/{…}/delete |
POST/pages/{username}/biz/promotion/links |
POST/pages/{username}/biz/promotion/links/{…}/delete |
GET/pages/{username}/biz/promotion/links/{…}/qr |
POST/pages/{username}/biz/promotion/promotions |
POST/pages/{username}/biz/promotion/promotions/{…}/delete |
GET/pages/{username}/biz/reviews |
POST/pages/{username}/biz/reviews/{…}/reply |
POST/pages/{username}/biz/reviews/{…}/visibility |
POST/pages/{username}/biz/staff |
POST/pages/{username}/biz/staff/{…}/delete |
Blogs & Channels25 endpoints
GET/blogs |
DELETE/blogs/comments/{…} |
PATCH/blogs/comments/{…} |
GET/blogs/mine |
POST/blogs/report |
DELETE/blogs/{…} |
GET/blogs/{…} |
POST/blogs/{…}/comments |
POST/blogs/{…}/like |
POST/blogs/{…}/unpublish |
GET/channels |
POST/channels/categories/{…}/unlock |
GET/channels/forums/{…} |
POST/channels/forums/{…}/topics |
DELETE/channels/posts/{…} |
POST/channels/posts/{…}/edit |
POST/channels/posts/{…}/hide-me |
POST/channels/posts/{…}/mod |
POST/channels/posts/{…}/react |
POST/channels/posts/{…}/report |
POST/channels/posts/{…}/roles |
POST/channels/posts/{…}/warn |
GET/channels/topics/{…} |
POST/channels/topics/{…}/mod |
POST/channels/topics/{…}/reply |
Marketplace, memberships & VIP33 endpoints
GET/marketplace |
GET/marketplace/categories |
DELETE/marketplace/comments/{…} |
GET/marketplace/favorites |
GET/marketplace/mine |
GET/marketplace/purchases |
GET/marketplace/seller-stats |
GET/marketplace/{…} |
POST/marketplace/{…}/buy-with-coins |
POST/marketplace/{…}/claim |
POST/marketplace/{…}/comments |
POST/marketplace/{…}/contact-seller |
GET/marketplace/{…}/details |
POST/marketplace/{…}/favorite |
POST/marketplace/{…}/paypal/create |
POST/marketplace/{…}/ratings |
GET/memberships |
GET/memberships/creators/{…} |
GET/memberships/limits |
POST/memberships/limits |
POST/memberships/payments/{…}/confirm |
POST/memberships/plans/{…}/quote |
GET/memberships/status |
DELETE/monetization{…} |
GET/monetization{…} |
POST/monetization{…} |
GET/seller/application |
POST/seller/application |
GET/vip/packages |
POST/vip/{…}/bank-transfer |
POST/vip/{…}/claim-free |
POST/vip/{…}/quote |
POST/vip/{…}/{…}/create |
Notifications & settings35 endpoints
POST/conversations/{…}/scheduled-messages |
GET/linked-accounts |
POST/linked-accounts |
POST/linked-accounts/code |
DELETE/linked-accounts/{…} |
DELETE/notifications |
GET/notifications |
POST/notifications/read-all |
POST/notifications/seen |
DELETE/notifications/{…} |
POST/notifications/{…}/read |
GET/scheduled-posts |
DELETE/scheduled-posts/{…} |
PATCH/scheduled-posts/{…} |
POST/scheduled-posts/{…}/publish-now |
POST/settings/account/delete-confirm |
POST/settings/account/delete-request |
GET/settings/connected-apps |
DELETE/settings/connected-apps/{…} |
GET/settings/data-export |
GET/settings/notifications |
PATCH/settings/notifications |
GET/settings/payout |
PATCH/settings/payout |
GET/settings/privacy |
PATCH/settings/privacy |
GET/settings/privacy-extras |
PATCH/settings/privacy-extras |
GET/settings/security |
PATCH/settings/security |
POST/settings/two-factor/disable |
POST/settings/two-factor/enable |
POST/settings/two-factor/recovery-codes |
POST/settings/two-factor/setup |
POST/web-session |
Help, requests & extras55 endpoints
GET/achievements |
POST/achievements/{…}/feature |
POST/admin/impersonate/{…} |
POST/admin/stop-impersonating |
POST/admin/web-session |
GET/client-area |
GET/courses/form-info |
DELETE/courses/{…} |
GET/courses/{…}/edit |
DELETE/courses/{…}/lessons/{…} |
POST/courses/{…}/lessons/{…}/move |
GET/developer/apps |
POST/developer/apps |
DELETE/developer/apps/{…} |
POST/developer/apps/{…} |
POST/developer/apps/{…}/secret |
GET/developer/docs |
GET/feature-requests |
POST/feature-requests |
GET/feature-requests/roadmap |
GET/feature-requests/updates |
DELETE/feature-requests/{…} |
GET/feature-requests/{…} |
POST/feature-requests/{…} |
POST/feature-requests/{…}/close |
POST/feature-requests/{…}/comments |
DELETE/feature-requests/{…}/comments/{…} |
POST/feature-requests/{…}/follow |
POST/feature-requests/{…}/pin |
POST/feature-requests/{…}/reopen |
POST/feature-requests/{…}/status |
POST/feature-requests/{…}/vote |
DELETE/jobs/${_job![ |
GET/jobs/form-info |
GET/jobs/{…}/edit |
GET/legal-pages/{…} |
GET/settings/cookies |
PUT/settings/cookies |
GET/settings/moderation |
POST/settings/moderation/{…}/appeal |
GET/settings/support |
PATCH/settings/support |
GET/support/categories |
GET/support/products |
GET/support/tickets |
POST/support/tickets |
GET/support/tickets/{…} |
POST/support/tickets/{…}/reply |
GET/users/{…}/achievements |
DELETE/users/{…}/mute |
POST/users/{…}/mute |
DELETE/users/{…}/restrict |
POST/users/{…}/restrict |
POST/zinklyai/ask |
GET/zinklyai/config |
Errors
| Code | Meaning |
|---|---|
| 401 | Not signed in or the token expired (the app refreshes it automatically) |
| 403 | Not allowed (e.g. your role on the Page or group), or the app is switched off in AdminCP |
| 404 | Not found, or the feature is switched off / not installed on this site |
| 422 | Invalid input; message and errors say what to fix |
| 429 | Too many requests, try again in a minute |
Troubleshooting
| Symptom | Fix |
|---|---|
| "This app is not set up yet" | Run tools/rebrand.py --server-url https://your-site; the placeholder yourdomain.com is never contacted. |
| "This app isn't set up for this site" | APP_URL in your site's .env must equal the app's site address, and ZinklyApp must be on in AdminCP › Applications. |
| Google / Discord sign-in does nothing | The scheme must match AdminCP › Applications › Mobile app scheme, and the OAuth client must allow <scheme>://oauth/callback. |
| Links open the browser instead of the app | Set ANDROID_APP_PACKAGE / ANDROID_APP_SHA256 (both signing keys) on your site and check /.well-known/assetlinks.json. |
| Manage Page / Group shows "Open on the website" | Install Zinkly Update 1.4 on your site. |
| No push notifications | Firebase files + env/prod.json, push on in AdminCP; build with --dart-define-from-file=env/prod.json. |
| Play: "Version code already used" | Raise the number after + in pubspec.yaml. |
| Build fails on MainActivity after an update | Run tools/rebrand.py again (it moves the file into your package), then flutter clean. |
Start with python3 tools/doctor.py: it finds most setup mistakes. Website errors are in storage/logs/laravel.log.
Changelog
v1.3
Latest 30 October 2026Manage your Pages and groups inside the app, chat folders and end-to-end encryption, the website's post privacy, Android-style text selection, reposts with their media and a cleaner look.
- AddedManage Page in the app: Dashboard, Analytics, Orders, Bookings (staff, booking settings), Reviews, Shop & catalog (products, services, collections, photos, variants), Posts & scheduling (drafts, approval), Customers, Broadcasts and Promotion (tracked links with QR codes, coupons, promotions). Needs Zinkly Update 1.4 on your site; older sites get an "Open on the website" button.
- AddedManage Group in the app: Roles, Pending posts, Reports, Moderation & rules, Banned members, Admin alerts, Features & permissions, Moderation log and Ownership (transfer, deactivate). Needs Zinkly Update 1.4.
- AddedChats: a folder bar (All, Direct, Groups, Channels, Unread, Muted, + your own folders) with arrows, and a menu with Message Requests, Archived Conversations, Hidden chats, Chat settings and Delete All Chats.
- AddedEnd-to-end encryption: encrypted chats show a lock and "Encrypted message"; their messages and calls open in the secure chat (your site's encryption, on the device). Chat info shows whether encryption is on; Settings > Security links to the encryption devices and keys. Calls show "End-to-end encrypted call" or "Encrypted connection".
- AddedPost privacy like the website: Public, Followers, Anonymous, Private and Custom (choose who must not see it).
- AddedZinkly 1.4 features when your site has them: Discover stories, hidden-photo stickers, Series, Recommend & Earn, Earnings, Directory, chat settings and hidden chats, text limits per VIP package, "Edited by Admin".
- ImprovedThe header shows your site's name (AdminCP) as the wordmark; new launcher icon art (replace it with yours with tools/rebrand.py --icon).
- ImprovedCreate post on Android: the phone's own text selection (long press, handles, Cut / Copy / Paste / Select all), a style bar under the text for bold, italic, underline, strikethrough, lists, spoilers and links; scrolling keeps the selection, a tap elsewhere clears it.
- ImprovedReposts show what was shared (photos, video, reel, GIF, link, a repost of a repost).
- ImprovedThe phone's status bar no longer covers posts while you scroll Home, Watch and Marketplace.
- Fixed"Seen" no longer turns back into "Sent" in the chat list.
- FixedWebsite pages opened from a web build go to your real site.
Backend: Works with Zinkly Social 1.3.1. Zinkly Update 1.4 adds the app API for Manage Page and Manage Group.
v1.2.1
Update 25 October 2026Sign-in fixes: Google, Discord and "Login via ..." work again, sign-in from your other sites stays in the browser, website pages open inside the app, acting as a Page shows the Page everywhere in comments, a language switch on the sign-in screens and an easier Create post.
- FixedGoogle, Discord and "Login via ..." did nothing after signing in: the sign-in now comes back to the app and logs you in (MainActivity no longer has android:taskAffinity, which kept the result away from the app).
- FixedCancelling a sign-in now says so instead of looking like nothing happened.
- Fixed"Login via ..." from another site of yours (a shop, a forum...) on a phone opened the app and showed "That page cannot be opened this way": your site's sign-in pages now stay in the browser, so people sign in there and go straight back to that site.
- FixedEchoAI, Manage Page / Manage Group, Page business tools, templates, hashtag pages and other website pages showed "That page cannot be opened this way": they open inside the app, signed in (needs website update 1.3.2; on older sites they still open inside the app, but may ask to sign in once).
- FixedActing as a Page, the comment box showed your own picture and name: it now shows the Page and "Comment as ..." (posts, reels, Watch and community discussions).
- FixedYou could see your own "... is typing a comment".
- ImprovedChoose your language right on the sign-in and sign-up screens: a language button at the top opens every language in its own name (and "Use device language").
- ImprovedCreate post: a tap anywhere outside the text clears a selection (phones kept it before); the "Select words to style them" tip has an X and stays closed once closed.
- ImprovedWebsite pages inside the app use your site's name and clearer messages when a page can't load.
- ImprovedLinks to your site's sign-in, sign-up, password, e-mail and system pages always open in the phone's browser: Android 15+ never sends them to the app (AndroidManifest.xml), older Android passes them on (lib/core/browser_handoff.dart; both lists must stay the same, a test checks it).
- Improvedtools/rebrand.py: after copying update files, running it again moves the new MainActivity.kt into your own package folder.
- SecurityTyping as a Page shows the Page, never the person behind it; on sites without update 1.3.2 the app sends no typing signal as a Page at all.
- SecuritySigning in to your other sites with this account (OAuth) always happens in the browser.
Backend: Works with Zinkly Social 1.3.1; update 1.3.2 adds the signed-in web pages and "typing as a Page".
v1.2.0
Update 24 October 2026A new look with smooth animations, Blogs, Channels and community discussions, interactive stories, gallery reels, Subscribers only and Paid lives, group chats with albums, calls that ring, rich comments and six new languages.
- AddedNew design: Facebook-style layout in your brand colours, with new sign-in and sign-up screens, a Home composer card, tall story cards, a new profile and new chats. Lists and posts fade in, buttons respond to touch, and everything respects the phone's "reduce motion" setting.
- AddedBlogs: browse, search and sort; read posts with comments; write and edit posts with a cover, category, summary and formatting; send them for review where your site requires it; report posts.
- AddedChannels: forums with topics and replies, pinned and locked topics, moderation (approval, warnings, hiding, AI Moderator) and password-protected categories.
- AddedCommunity Discussion tab: forum topics inside a community with a rich text editor, search, sort, tags, follow topics, quote and reply, report, and moderator tools (pin, lock, hide, move, mark as important). Community pages get Posts, Discussion, Announcements, Members and About tabs.
- AddedStories: drawing, filters, fonts and text styles, animated stickers, and interactive stickers (quiz, question box, emoji slider, countdown with "Remind me", "Add yours" chains). Also Close Friends stories (green ring), drafts kept on the device (up to 10), per-story replies / reactions / sharing switches, subtitles (automatic or .srt, with styles), an "AI-generated" label, story insights, trim / speed / volume for videos, and long videos split into up to 10 parts.
- AddedReels: several photos and videos in one reel (up to your AdminCP limit), scheduling, "Everyone except", and earning from reels (members only, pay to watch, early access, previews).
- AddedLive: Subscribers only and Paid lives, voice-only lives, a cover for the live list, and a Go Live page laid out like the website.
- AddedChat: create group chats, photo and video albums (Classic, Columns or Frame), search inside a conversation, shared media, archive, Unread / Groups / Requests filters, friends online now, "People you may know", record a video, send GIFs from your phone, and an emoji panel with categories and GIF search.
- AddedCalls: incoming calls ring like a phone call on Android, even when the app is closed (lock screen answer and decline, missed-call notice with Call back), and screen sharing with or without its sound.
- AddedComments with a photo, video, GIF, emoji or voice recording (posts, reels, Watch, Marketplace, feature requests and discussions).
- AddedHome feed filters: Everything, Recent Updates, Followers Only, Popular and Discover, plus country and post type.
- AddedWeather card in the Menu: today and tomorrow, rain, wind, sunrise and sunset, your city or this device's location, animated scenes.
- AddedStatus message with an emoji and "Clear after".
- AddedReady-made avatars and covers, and templates when you create a Page or a community.
- AddedBoost and Promote your own posts (with "Boosted" / "Promoted" labels).
- AddedVIP: yearly plans, discount codes, VIP as a gift, and the animated VIP avatar ring.
- AddedNotifications: All / Unread / Mentions tabs, mark all as read, clear all, and the comment or reply text in the notification.
- AddedText styling: select words to make them bold, italic, underlined, struck through, a list, a spoiler or a link.
- AddedManage Page, Manage Group and the Business Page tools open from the app, already signed in.
- AddedSix new languages: German, French, Italian, Russian, Portuguese (Brazil) and Spanish (Mexico), next to English and Greek.
- ChangedThe bottom bar follows AdminCP > Sidebar & menus (members can still arrange their own), with a Messages tab and its live unread count; notifications open from the bell in the header.
- ChangedPosts are rounded cards on phones too, and the stories bar uses tall cards instead of circles.
- ChangedGo Live opens the camera page, like the website; OBS / RTMP is a broadcast type there when your site offers it.
- ChangedOpening the notifications marks them read; the new ones stay highlighted while the list is open.
- ChangedWhen EchoAI is switched on in AdminCP it takes the place of ZinklyAI in the Menu.
- ChangedThe chat "+" menu lists Camera, Record video, Photo & Video Library, Document, Location and Schedule message; GIFs moved to the emoji panel.
- ChangedThe profile uses a Facebook-style top: full-width cover, big photo, name, counts and bio, then the buttons.
- ChangedNeeds Zinkly Social 1.3.1 or newer.
- ImprovedVideos in posts: tap the middle to pause or play, double-tap left or right to go 5 seconds back or forward, a progress bar, sound on / off, and full screen (swipe down or Minimize to return to the same spot).
- ImprovedEvery link to your site (posts, profiles, notifications, shares) opens the matching screen in the app, and Android App Links open them from other apps too.
- ImprovedThe app hides whatever your AdminCP switches off (polls, anonymous posts, calls, voice notes, story stickers, comment locks, boost / promote and more).
- ImprovedChats: search bar, filter chips, typing bubble, "Seen" avatar, a button back to the newest message, messages that slide in, tap a bubble for its time, and sender names in group chats.
- ImprovedChat details: big photo with Search, Mute, Nickname and Colour buttons.
- ImprovedCreate post: "What are you doing?" with 11 activities and suggestions, and one card for schedule, spoiler and anonymous.
- ImprovedReels: gallery reels swipe with dots and "2 / 5", photos stay 5 seconds in Auto Mode, Download saves the item you are looking at.
- ImprovedPost text looks exactly like on the website (bold, lists, links, strikethrough, line breaks).
- ImprovedMonetization and memberships screens: cards are spaced out.
- FixedPosts could show raw asterisks or run their lines together.
- FixedLong post headers ("x months ago · edited" and labels) no longer overflow on narrow phones.
- FixedA comment's photo or video no longer disappears when someone reacts to it.
- FixedThe Messages unread count is right everywhere, without opening the chats first.
- FixedGIFs picked from the phone stay animated.
- FixedThe chat box keeps line breaks, blank lines and lists.
- FixedGo Live is hidden when the site has no live video set up (it used to open an error).
- FixedA video no longer pauses when it opens full screen.
- FixedHidden Marketplace products no longer count in a seller's listings, and the Selling tab refreshes when you come back to the app.
- FixedThe red notifications badge clears as soon as you open the list.
- FixedA missed call is never notified twice.
- FixedSign-up says what is missing instead of greying out the button.
- RemovedThe small emoji keyboard (replaced by the emoji panel with categories and GIFs).
- RemovedThe round stories bar (replaced by story cards).
- RemovedThe fixed Home / Reels / Market / Alerts / Menu bottom bar (now set from your AdminCP).
- SecurityPages of your own site that have no app screen open inside the app, already signed in; this is only done for your own domain.
- SecurityStory drafts stay on the device, per account, and nothing is uploaded until you share the story.
- SecurityNobody is told when you add them to, or remove them from, your Close Friends.
- SecurityNotifications quote comments, replies and mentions, never private messages.
- SecurityActing as a Page, the badge counts the Page inbox only, never your private chats.
- SecurityWith push notifications off in AdminCP the app never asks for notification permission or registers the device.
- SecurityThe weather card needs no API key and uses this device's location only when you choose it.
- SecurityComment uploads are checked in the app (photos only where only photos are allowed, videos up to 50 MB); your server checks them again.
Backend: Needs Zinkly Social 1.3.1 or newer (Blogs, Channels and Discussion APIs, story stickers, gallery reels, Subscribers only and Paid lives).
v1.1.0
Update 16 October 2026### New * Photo layouts: posts with 2+ photos show as Classic, Columns or Frame; pick one, reorder and set a featured photo while posting, or change it later by editing the post. * Edit history: tap "· edited" to see earlier versions of a post, including privacy changes. * Go Live studio: title and settings before you start, donations from viewers, top and latest supporters, and the choice to keep your live after it ends. * Saved lives: watch, download or delete your recordings (Privacy > Live recordings), with storage info. * Live chat shows donations, photos and replies. * Post in communities (with a note when the group needs approval), post as your Page from its screen, and on Pages that accept visitor posts. * Polls in posts: vote, see live results, undo your vote. * Live: go live with your camera or voice only, watch the website's live streams inside the app, floating reactions shared with the website, real viewer count, report a stream. * ZinklyAI in All Shortcuts, with write, reply, analyse image, create / edit image and search modes (within the limits set in AdminCP). * Message requests: Accept or Decline. * Recommend: a star on public posts and reels shares them with your followers ("Name recommended this", with "+N more" when several people you follow did), with a one-time explanation the first time. * Share sheet: copy link, save, WhatsApp / Facebook / X / Telegram, and Send to people in chat. * Themed like animations (picked per post by your backend; set them up in AdminCP > Like animations). * Stories bar redesign (the story itself as the circle, with the author's avatar) and a video cover picker. * Story replies in chat show the story they answer, or "Story expired". * Reels open full screen without the bottom bar; new messages and notifications appear as a small pop-up you can hold, swipe away (stays unread) or tap to open. * Feeds load automatically while you scroll (no more "Load more"), ending with a "You've hit the wall" card.
- ImprovedThe app works with one site only, set when you build it (no server field for people using the app); the site must confirm the app on every start (APP_URL + AdminCP > Applications).
- ImprovedLong chats load older messages as you scroll up, and keep them when new ones arrive.
- Improved"Posting is turned off" notes are centred where the composer would be, on profiles, Pages and communities.
- ImprovedActivity posts read on one line: "Name – Updated its cover photo".
- ImprovedCommunities and Pages sit right under Achievements in All Shortcuts.
- ImprovedPost action bar: Like / Comment / Share on the left, Recommend / Repost / Views on the right.
- ImprovedStory reactions show instantly on every device; reactions to your messages and stories notify you.
- ImprovedProfile buttons are easier to tap on phones.
- FixedA reaction on a chat message no longer hides its time.
- FixedWebsite reactions could show the wrong way in the app.
- Fixed"Login as user" (admin impersonation) no longer touches the member's linked accounts or devices.
- FixedLive: the Go live button and website streams work with a LiveKit-only backend (no OBS server needed).
- FixedA message you send is no longer shown twice for a moment.
- FixedOnline / idle / do-not-disturb status is the same in chats and on profiles, and never sticks after someone leaves.
Backend: Needs Zinkly Social 1.2 or newer (post edit history, saved-live links, post polls, ZinklyAI 2, visitor posts on Pages and the built-in Live endpoints).