Story changes

All PinPilot updates - fixes, new features and improvements

1.4.20
Changed
  • New logo and app icon. RuStore rejected the previous version: the design copied another service — the icon showed a circle with a letter, like Pinterest. The icon now shows a pilot in a helmet and goggles, with no third-party marks. The same image replaced the site logo and favicon
  • New illustration on the download page and on the first screen of the home page: a full-body pilot
Fixed
  • License protection. The trial can no longer be extended by reinstalling the app: the server remembers the device fingerprint and counts the period from the first launch. A rate-limit bypass via a spoofed header is closed
1.4.19
Fixed
  • App updates install again. The install permission was removed in 1.4.16 because RuStore rejected version 1.4.11 over it. Without that permission Android does not let the app launch the installer: instead of installing, it opened settings, and PinPilot was not in the list because the permission is not declared. If you are on 1.4.16, 1.4.17 or 1.4.18, download the file from the site once, after that updates work as usual
Changed
  • Two builds: one for the site, one for RuStore. The site build installs updates itself in one tap, as before. The RuStore build does not request the install permission: the store treats it as high risk and requires a separate justification, and updates there are handled by the store
1.4.18
Fixed
  • Auto-likes finally work. The previous version had the right way to set a reaction, but the app picked random targets: it took any numeric id from the search page, including user and board ids. Pinterest rejects those. Now ids come from real pin links. Verified on a live account: 3 out of 3 likes set
1.4.17
Fixed
  • Likes work again. Pinterest changed the way a reaction is set: the old endpoint stopped accepting requests, so likes failed entirely. The new endpoint was found by capturing a real request from the web version and is now built into the app. Verified: the reaction counter on the pin changes
1.4.16
Changed
  • Input fields now look the same everywhere — outlined. Previously, settings screens used solid grey boxes while dialogs used outlines. Outlines also highlight the field in red when the value does not fit, which the filled style could not do
1.4.15
Added
  • Like settings on a dedicated screen: the "Like settings" button in the Audience section. Choose whom to like — by keywords or from competitor accounts' pins — and set the pace: likes per day, delay between likes, likes per batch and the break between batches
  • Likes in statistics: the home screen card now has its own "Likes" cell — previously likes only bumped the total counter
  • Dark theme: the app follows your phone's dark mode
Changed
  • The "Auto-likes" switch is back on the home screen, next to auto-posting, follows and unfollows
  • Unified design system: every screen now takes its colours, sizes and fonts from shared settings, so the app's look is edited in one place
Fixed
  • The save button could not be tapped on the likes, follows and unfollows screens — its bottom edge fell under the system gesture bar
  • The "Post settings" screen header scrolled away with the content
  • The back arrow did not work on any screen
  • The "Confirm" and "Add from gallery" buttons broke into two lines
1.4.14
Fixed
  • License server reachable again: since September 1 the pinpilot.ru certificate was issued by a new chain while the app still pinned the old one, so license and trial checks failed. Certificate pins updated
1.4.11
Added
  • Trends — new screen with live Pinterest search data: rising queries by keyword with a 52-week chart, “Trending now” mode, tap copies a key for collection parsing. Country follows the app language
Fixed
  • Input dialogs no longer lose text — scrollable content, buttons above the keyboard, accidental dismiss blocked (collections, feedback)
  • Collection cards — slim progress instead of a pill, “⋮” menu instead of adjacent edit/delete buttons
  • AI buttons in streams — real robot icon on all 5 generate buttons, header duplicates removed
Changed
  • Security: secret-free logs, pinpilot.ru pinning, plaintext-free sessions, APK signature check, buyers get signed release APK only
  • Version: 1.4.10 → 1.4.11 (code 44)
1.4.10
Fixed
  • Unfollow ignored mutual-follow — Pinterest removed is_following_me from following list; 1.4.7 fix defaulted “no field = non-mutual” → unfollowed everyone. Now per-candidate profile check via UserResource (explicitly_following_me): mutual → skip, confirmed non-mutual → unfollow, check failed → don’t unfollow with warning. Conservative: better not unfollow than accidentally remove a follower
  • Unified toolbars — Help icon instead of “?”, language button shows code (RU/EN/ES/PT), grouped settings headers, toggles in single column, stats card 3+2 with ellipsis, plurals for posts/streams on RU/EN/ES/PT, native language names (Русский, English, Español, Português (Brasil))
Changed
  • Version: 1.4.9 → 1.4.10 (code 43)
1.4.9
Changed
  • Local AI model — spintax generation for title, description and hashtags now works offline on the device. The user decides whether to download the model (~400 MB), “Local AI model” button on the main screen. Stream settings cards “Title”, “Description” and “Hashtags” now have “Topic” fields + “Generate” buttons
  • Cloud AI providers removed — Groq, Gemini, proxy-VPN, key registration. APK is lighter, code is simpler, no proxy needed for spintax
  • Help on the main screen and stream settings updated for the local model (RU+EN)
  • AI buttons in collections hidden — vision filter and image variant generation removed from UI
  • Version: 1.4.8 → 1.4.9 (code 42)
1.4.8
Fixed
  • Calculation vs posting — “Apply to streams” wrote the whole collection remainder into the stream limit instead of the distributed share (a stream showed 1003). Now writes the shares from the calculation
  • Daily remainder split — the remainder was divided equally across all enabled streams, including streams with zero ready posts (a stream with 825 ready got ~33 of 100). Now split proportionally to ready posts, empty streams are skipped
  • Duplicate log entries — account loading fired twice at startup, every entry doubled. Redundant calls removed, the journal drops consecutive repeats
  • Account isolation — the ready count fell back to another account’s collection with the same id. Fallback removed, one rule everywhere: a collection belongs to the stream’s account
Changed
  • Calculation label: “Daily limit”
  • Version: 1.4.7 → 1.4.8 (code 41)
1.4.7
Fixed
  • Purchase failed — CryptoBot webhook extracted payload.payload as UUID, but it is JSON {"order_id":"..."} — SELECT WHERE id=JSON never found order, all crypto payments stayed pending. Now parses JSON
  • Unfollow skipped everyone — when mutual fields missing, treated everyone as mutual (isFollowingMe=true) and with “only non-mutual” unfollowed 0. Now defaults to false
  • Purchase form: SecurityError guard for Safari private mode, email/nick validation, correct 429 and network handling, button restore
Changed
  • YooKassa: detailed webhook logging, server email/nick validation
  • Version: 1.4.6 → 1.4.7 (code 40)
1.4.6
Changed
  • Technical release: updated changelog date
1.4.5
Corrected
  • Duplicates in auto-posting — removed auto-reset of used on zero ready in calculation (it returned already published pins). Now only per-stream diagnostics is shown
1.4.4
Corrected
  • Trial: “last day” banner lingered after expiration and full access returned — now `daysLeft <=0` is treated as expired regardless of flag, empty `started_at` is not saved, re-check added in `onResume`
1.4.3
Corrected
  • “No posts” diagnostics: when ready is zero on “Calculate”, per-stream details are now shown (sources, total/unused per collection, exists for gallery) with hints
1.4.2
Corrected
  • Unfollow of mutuals: getFollowing missed the mutual flag and treated everyone as non-mutual — now users without an explicit field are considered mutual and skipped
  • Posting “no posts” and lost images on errors: failures now roll back the reservation (markAsUnusedBatch), stuck collections are auto-recovered on calculation
Added
  • English language (phase A): created res/values-en/strings.xml (123 strings), automatic switch by system locale
1.4.1
Added
  • Own release signing (PinPilot certificate): the app is now signed with the project's release key instead of the debug certificate — correct auto-update and better Google Play Protect reputation
  • Play Protect install-block help screen: before installation a dialog with instructions is shown ("More details" → "Install anyway", or disable scanning in Google Play → Profile → Play Protect → gear icon)
Corrected
  • Update check on the server returned 500: a BOM in update_config.json broke JSON parsing; reading switched to utf-8-sig
1.4.0
Added
  • Automation continues to work even if you minimize the application or lock the screen - a notification with a stop button appears in the status bar
  • Видео-платформы: Search videos by keyword - you can create a collection of videos by specifying a topic instead of a link
  • Видео-платформы: collection creation dialog with keyword field and hints
Corrected
  • Fixed a rare error when launching the application without an Internet connection
  • Fixed duplication of autoposting threads - threads no longer double when re-entering settings
  • Statistics are now linked to the account - when changing the profile, only the numbers for the current account are shown
Changed
  • Automation continues to work even if you minimize the application or lock the screen - a notification with a stop button appears in the status bar
1.3.20
Corrected
  • Duplicate pins during auto-posting: in createPin, before the main request, a v3 cascade of four requests was executed. Two of them returned silent HTTP 200 with HTML - Pinterest created a pin, but the application did not recognize success and created a second pin. Now there is exactly one request for each pin: PinResource for images, StoryPinResource for videos, WebView fallback only if all APIs fail
Changed
  • Version: 1.3.19 → 1.3.20 (code 29)
1.3.19
Corrected
  • The limit of posts per day is now respected: previously, when delegating intervals, the total limit was applied to one pass of the cycle, and not to the day - threads posted again every cycle. Now the limit is calculated over a sliding window of 24 hours: remainder = limit minus posts for the last 24 hours, divided by the number of enabled threads. If the balance is exhausted, the cycle is skipped
Changed
  • Database: version 21 -> 22, new post_log table with timestamps of each post for sliding window, old entries are deleted automatically
  • Version: 1.3.18 → 1.3.19 (code 28)
1.3.18
Added
  • Global setting of posting in “Auto-posting streams”: a total limit of posts per day (up to 250) for all streams instead of manually entering a limit in each
  • “Ready for posting” counter - how many posts are actually prepared in the included streams (gallery files + unused images and video collections)
  • “Calculate” button - automatically distributes the limit among threads and boards, shows the interval between posts and invites you to start automation
  • Switch “Delegate intervals to application” - the application itself sets the limit and intervals according to the global limit, and the interval and limit fields in the flow settings are blocked
Changed
  • The automator takes delegation into account: when the setting is enabled, the global limit is divided equally into the enabled threads, the interval is calculated automatically according to the schedule window
  • Version: 1.3.17 → 1.3.18 (code 27)
Corrected
  • Deleted collections are no longer returned: the automatic creation of the “videotext” test collection every time the application is launched has been removed
  • Unsubscribe from mutuals: when unsubscribing only non-reciprocals is enabled, the sign of reciprocity is taken first from the list of subscriptions, and the repeated check against the profile is conservative - if the profile does not provide the reciprocity field, the subscriber does not unsubscribe
1.3.17
Added
  • Statistics are tied to the account (Room database): each account keeps its own statistics, without any additions from others
  • Detailed statistics layout: tapping on the “Statistics” card opens a breakdown by day (posts/likes/subscriptions/unsubscribes/errors) and by boards
Changed
  • Unfollowing of non-reciprocals: reciprocity is checked through the candidate’s profile - mutual subscribers no longer unsubscribe
  • Version: 1.3.16 → 1.3.17 (code 26)
1.3.16
Corrected
  • Duplicate pins during automation: previously, for one material, the application tried a cascade of ~8 options for creating a pin (v3 ×4, ApiPinResource, Pin, ApiCResource, PinResource, StoryPinResource, WebView).If one option “quietly” created a pin (HTTP 200 without recognized data), the next one created a double - the risk of being banned for spam. Now only PinResource is used for images, only StoryPinResource is used for videos, and any successful reply is considered a created Pin and stops immediately. One post = exactly one pin
  • Boards were saved without an ID: if the list of boards was not fresh when saving the settings, the board was recorded with a bare name without the id:name pair → Pintelrest responded “Board not found.”Names are now mapped to existing board IDs when saving
Changed
  • Version: 1.3.15 → 1.3.16 (code 25)
1.3.15
Corrected
  • Night automation pause when the Internet is lost: added a network check before each cycle - if there is no connection (for example, airplane mode is turned on), the application waits 5 minutes with a clear status instead of silently hanging for hours, and continues working when the Internet returns
  • Animation of statistics numbers is slowed down - smooth recalculation 1.2–3.2 sec (was 0.5–1.6 sec)
Changed
  • Version: 1.3.14 → 1.3.15 (code 24)
1.3.14
Corrected
  • Statistics no longer “jump down”: races during increments (synchronization), migration of legacy files to the maximum and conflicts of old files have been eliminated - the counters are steadily growing
  • Statistics are tied to the username: a single SharedPreferences key instead of separate files per account - numbers are not lost when changing accounts
  • Pause after a broken image: if a post fails, the thread waits 20 seconds and moves on to the next image instead of a full 45-60 minute delay
Changed
  • Version: 1.3.13 → 1.3.14 (code 23)
1.3.13
Corrected
  • Pause after a broken image: if the post fails (damaged image, error loading or creating a pin), the thread no longer waits for a full delay of 45–60 minutes - pause 20 seconds and move on to the next image.A full delay is set only after a successful post
  • Freezing background work: the process is no longer put to sleep by the system (Doze) in the middle of the cycle - WakeLock has been added
Added
  • Request permission to run in the background when starting automation (exception from battery optimization) - protection against hard power saving on itel and other devices
Changed
  • Version: 1.3.12 → 1.3.13 (code 22)
1.3.12
Corrected
  • Subscription limit: 401 is now interpreted as rate-limit - the subscription cycle is interrupted immediately instead of a fallback on WebView and dozens of errors in the logs
  • Conservative defaults: maxFollowsPerDay = 15 (was 50), delay between subscriptions 60-180 seconds (was 30-90) - reduced risk of blocking during long-term work
  • SessionManager fallback: maxFollows = 15 (was 20)
Changed
  • Version: 1.3.11 → 1.3.12 (code 21)
1.3.11
Corrected
  • Duplicate accounts: account is now identified by stable Pinterest user id (DB migration 17→18) - login no longer creates a copy, even if nickname extraction failed and returned display name instead of real nickname (Soulexpert / breathefree0177)
  • Single active account: when logging into another account, the old one no longer remains active - streams, collections and settings of the previous account are no longer displayed in the new one
  • Session auto-refresh: Authorized cookies are no longer overwritten by the guest session when updating cookies - eliminated massive 401 errors after 25 minutes of auto-refresh
  • Reliable nickname extraction: API request tries ru.pinterest.com if csrftoken is not in www cookies;all failures are logged
Changed
  • Version: 1.3.10 → 1.3.11 (code 20)
1.3.10
Corrected
  • Pinterest subscription limit: when the anti-bot limit is triggered (HTTP 429), the subscription cycle stops with one warning instead of dozens of errors - the statistics are no longer clogged
  • Error statistics: rate-limit subscription errors no longer increase the Errors counter in the main window
Changed
  • Version: 1.3.9 → 1.3.10 (code 19)
1.3.9
Corrected
  • Duplicate accounts when logging in again: logging in via “Change account” no longer creates a new empty account if the login register is different (pinpilot1 / PinPilot) - the account is searched by login and session cookie, all its streams and collections are saved
  • Priority of authorized cookies: when auto-renewing a session, the guest cookie no longer overwrites the authorized one - a session with the login sign (__Secure-s_a) is selected
  • Posting Pins: Pin creation works again via PinResource/create/ after logging in again
Changed
  • Version: 1.3.8 → 1.3.9 (code 18)
1.3.8
Corrected
  • The "Used" badge now appears green in highlight mode - was invisible on a dark background
  • Follow via WebView on 401: If the API returns 401, follow via WebView as a fallback
  • WebView follow: Handler is used instead of view.postDelayed for headless WebView - postDelayed method does not work without attached window
Added
  • Automatic deletion of used images when the deleteUsedImages setting is enabled - files are deleted after publication
Changed
  • Version: 1.3.7 → 1.3.8 (code 17)
1.3.7
Corrected
  • Видео-платформы: the “Parse more” button on the collection details screen now works - it downloads additional videos by keyword
  • Видео-платформы: the “Parse” button in the list of collections is no longer hidden - you can start parsing again
  • Parsing from the list of collections: for video collections, VideoParser is launched instead of ImageParser
  • TikTok conversation signature: removed “Videos are downloaded to the device” - videos are saved as links
Added
  • Reloading videos: you can re-parse video files for the same keyword without creating a new collection
Changed
  • Version: 1.3.6 → 1.3.7 (code 16)
1.3.6
Added
  • Session auto-renewal: every 25 minutes the application quietly updates cookies via WebView - the session no longer expires after an hour
  • Recovery after session failure: if automation detects a loss of authorization, it first tries to update cookies, rather than stopping immediately
Corrected
  • CSRF token: now the real csrftoken is taken from cookies instead of a random string - the API stopped responding with 403 to some requests
Changed
  • Version: 1.3.5 → 1.3.6 (code 15)
1.3.5
Corrected
  • Board parsing: resolveBoardNames no longer removes boards if the names do not match the API - just a warning
  • Board sorting: new boards are now at the top of the list when selected (sorted by ID, not reversed)
  • Streams without boards: If a stream has no boards selected, the board from the general account settings is used
  • resolveBoardNames: added saving name->id from API response - previously the array of boards remained empty
  • Cycle of searching through username in resolveBoardNames: fixed continue to break when boards do not match
Changed
  • resolveBoardNames uses the real Pinterest username instead of the account name in the application
  • Version: 1.3.4 → 1.3.5 (code 14)
1.3.4
Added
  • Parsing images via SearchResource API - more reliable and more images than HTML regular ones
  • Edit and delete icons on collection cards - long tap is no longer the only way
  • The name of the board in the stream card - “Board: Travel” is immediately visible without opening
Changed
  • Select boards: only names are displayed, no numeric ID
  • Selecting a collection in a stream: only the name, without the keyword in parentheses
  • Default values: min.delay 45 min, max.60 min, max.50 posts
  • New boards at the top of the selection list
  • Version: 1.3.3 → 1.3.4 (code 13)
Corrected
  • Account isolation: collections are no longer mixed between different accounts
1.3.3
Corrected
  • The “Stop” button now works - automation flags are sent directly through the Intent, without a race with the database
  • The application no longer crashes when auto-recovering automation with the toggle switches turned off
Changed
  • Version: 1.3.2 → 1.3.3 (code 12)
1.3.2
Corrected
  • Authorization: the green “Authorized” sign no longer appears on the login page - the application waits for a real login, even if there are old cookies
  • Search for authors for auto-following: rewritten to the Pinterest API - now finds 48+ authors per launch instead of 0
  • Subscription to found authors: API follow confirmed working (code 200 success)
Changed
  • Version: 1.3.1 → 1.3.2
1.2.1
Corrected
  • Fixed a rare error when launching the application without an Internet connection
1.2
Added
  • URL posting: creating a collection using a link to a page - the parser retrieves all images (img src, og:image, twitter:image)
  • Preview by URL: images in the collection are downloaded via Coil directly from the source site, without taking up device memory
  • Direct links: when autoposting, the image URL is used instead of multipart loading - saving traffic and time
  • Smart type detection: URL collections display the source address, the “Parse more” button for additional loading, the “Add from gallery” button is hidden
1.1.5
Added
  • Feedback form with the “Subject” field - when sent, an email client opens with pre-filled data and an attached log file
  • Logging automation errors to a file - all errors are written to pinflow_log.txt for analysis
Changed
  • Sending reviews via email client to support@pinpilot.ru (instead of sending to the server)
  • Automation errors are now saved to a log file - they are not lost when the application is restarted
1.1.4
Corrected
  • Deleting used images - when this setting is enabled, both the file and the record from the database are deleted (no more empty cells)
  • The board selection dialog no longer pops up automatically when entering settings
  • A clip on the boards field opens a selection from those already loaded
  • Logging createPin errors to debug stuck requests
  • Cookie banner is hidden by default, appears only on the first visit
  • Mobile burger menu: cross when opening, white button text
Added
  • "Select All" button in collections - selects all images at once
  • Single-column overview - images fill the entire width of the screen while maintaining proportions
  • “Reject” button in the cookie banner (FZ-152)
  • "Buy" button inside the mobile menu
  • Changelog page to track updates
Changed
  • Deleted demo.mp4 (6 MB) - not used
  • The admin password has been strengthened
  • API keys moved to .env (chmod 600)
  • Rate limiting 30 req/min on payment endpoints
  • bcrypt for partner passwords
  • Logo: png (876KB) → WebP (79KB)
  • OG image 1200×630, canonical on partner page
  • gzip is enabled in nginx
1.1.3
Corrected
  • ProGuard R8: removed `-repackageclasses a`, added `-keep` rules
  • Video pins: StoryPinResource/create/ with full story_pin JSON
  • Boards: auto-fix board IDs on startup
  • Affiliate dashboard: fixed bug with closing the database
Changed
  • Referral codes of partners in lower case
  • Minimum payout: 2,000 ₽
  • APK v1.1.3 (code 5) uploaded to the server
1.1.2
Corrected
  • getFollowing: HTML scraping → API UserFollowingResource/get/
  • unfollowUser: break after the first successful request - loop 9x faster
  • Parallel instance: guard against two instances
  • canvas Aspect Ratio: locale bug (comma and dot)
1.1.1
Corrected
  • The daily unfollow limit (maxUnfollowsPerDay) now actually works
  • Statistics card: counters do not go out of bounds at 4+ digits
Added
  • Tips on image requirements when creating a collection
1.1
Added
  • Auto-follow and unfollow via Pinterest's internal API
  • Subscribe to competitors' subscribers
  • Batch unsubscribe with custom interval
  • Video collections
  • Custom application icons
  • Yandex Metrica + Google Analytics
  • Payment via YooKassa (cards, SBP, SberPay)
  • sitemap.xml, robots.txt
Changed
  • The application has been renamed PinPilot
  • Room DB: version 6 → 10
  • Payment: Prodamus → YooKassa
1.0
Added
  • First release: auto-posting, likes, content parsing
  • Spintax for titles and descriptions
  • Image collections (parsing + gallery)
  • Board management
  • Authorization via cookies in WebView
  • License system with payment via CryptoBot