v2.8.13
LatestMay 19, 2026
Overview
- ShadowPhone v2.8.13 Python WS adapter monolith split
- electronpythonlibws_module_adapter.py (110 lines) facade. Imports each handler from ws_modulesname.py, re-exports them under their original run_name names, preserves the full WS_ADAPTED_MODULES dict (50 keys 29 unique handlers 21 aliases like 'ig_post' run_post_feed, 'airplane_mode' run_airplane_toggle, etc.) and the execute_adapted_module dispatcher with its module-id normalization logic intact.
- electronpythonlibws_modules_shared.py all helpers, constants (_ENERGY_CURVE, _VIEW_TYPES, _SCROLL_PATTERNS, _MOOD_), _SessionState, _jitter, _snap_to_feed_post, _is_ig_ad_xml, Element, the WSDeviceAdapter class, _dismiss_ig_popups, _handle_ig_media_permission_popup, _navigate_to_ig_tab, _COMMENT_POOL, _post_comment, _tap_create_button, _tap_next_button, _is_story_ad.
- electronpythonlibws_modulesid.py 29 handler files, each exports 'async def run(device, config) - dict'. Import only what they need from ws_modules_shared.
- electronpythonlibws_modules__init__.py package marker.
- Screenshot saves PNG of the phone screen
- Open Instagram launches IG on that profile
- Force-stop IG kills the IG process (recover from bad state instantly)
- Wake KEYCODE_WAKEUP
- Hotkeys popup cheat sheet of scrcpy keyboard shortcuts (CtrlHBSPRNVFGX)
- Close mirror kill this mirror
- --no-audio scrcpy 2.0 flag, mutes the phone's audio capture so a multi-mirror farm doesn't pump phone speakers through your laptop.
- --turn-screen-off was already set combined with --no-audio the phone is now silent dark while you mirror.
- electronliblocal-modules.js (51 lines) registry only. Imports each handler from electronlibmodulesname.js and assembles LOCAL_MODULE_HANDLERS.
- electronliblocal-modules-shared.js (633 lines) every helper LocalDevice class. adb, shell, sleep, safeUserId, quoteAndroidShell, parseStatsFromXml, queueStatsSnapshot, wizard-detection helpers all now reusable across module files.
- electronlibmodulesairplane_toggle.js, wake_unlock.js, gallery_clean.js, delay.js, random_delay.js, conditional.js, notification.js, profile_switch.js, list_profiles.js, profile_create.js, profile_delete.js, ig_launcher.js, ig_account_switch.js, detect_accounts.js, content_manager.js, airtable_sync.js, gmail_logout.js, ig_logout.js, vpn_connect.js, stats_scraper.js, ig_status_check.js 21 standalone files.
- On app boot, Electron main spawns the Python brain (electronpythonserver.py) as a subprocess bound to 127.0.0.18090. The brain only listens on loopback external traffic cannot reach it.
- A fresh API secret is generated per-app-boot (UUID, in-memory only). The brain reads it via env var the renderer reads it via the local-brain handle. Same auth flow as Railway, just on a shorter wire.
- runModuleWs tries the local brain first. If the brain hasn't started yet (cold first 2-3 seconds of app boot) or never started (Python missing), it falls back to the Railway WS automatically. No user action required.
- Auto-starts in the background after window creation (does not block app launch)
- Auto-stops on app quit (before-quit window-all-closed both hook the kill)
- Logs lifecycle to renderer console 'LocalBrain Ready in 1843ms (bundled-python)' 'WS-Module Using LOCAL brain at ws127.0.0.18090'
- Per-run console line tags 'LOCAL' vs 'RAILWAY' so you can confirm which path fired
- Header Phase 1 of 3 Phase 2 of 3 Phase 3 of 3
- Live label e.g. Phase 1 Profile (new) on 1A121FDF Phase 3 IG signup for zarahahn
- Determinate progress bar (e.g. 23 67)
- Counter 2 3 (current of total)
- Warning Don't close this modal the phone is actively running
- Phase 1 per-slot (Profile X on serialY)
- Phase 2 single saving N accounts folders tick before API insert
- Phase 3 per-row (IG signup for username)
- CSV parser already handles BOM quoted fields with escaped doublequotes
- Device picker already auto-fetches on modal open pre-selects the connected phone
- Template download already covers 28 columns (21 spec 7 schedule defaults)
- Title implied just-CSV-import, but it actually opens the full 3-step wizard
- Subtitle said 0 lines forever because it was reading the stale legacy textarea
- No indication you'd get profile creation account save folder build IG creation in one click
- Renamed to Bulk Account Creation so it matches what actually happens
- Subtitle 21-column CSV profiles accounts folders IG creation
- Line count now tracks csvWizardRows.length and reads 5 accounts ready Click to start
- Phase 1 scan all import rows, dedupe by (device, profile_id), and create every needed GrapheneOS profile up front. Reuses existing profiles where the CSV's SP Profile ID already matches what's on the phone.
- Phase 2 save all account rows to Supabase (with the real profile IDs from Phase 1 patched in) and create the local ContentInstagramusername folders.
- Phase 3 rotate through each row doing profile_switch then account_creation. No more lazy profile-creation interleaved into the IG signup flow the phone runs a single clean cycle per account.
- If a Phase 1 profile_create fails, the affected rows are flagged and skipped in Phase 2 3 (no zombie DB entries pointing at a profile that doesn't exist).
- The old create profile if switch fails fallback in Phase 3 is kept as a safety net for profiles that get deleted between phases.
- Outside Electron (web preview), Phase 1 is skipped Phase 3 surfaces Desktop automation unavailable cleanly.
- Up Next strip is now a single-line collapsible (inline preview of next 3 ETAs, click to expand the full 5-card detail view)
- Removed the duplicate footer status pills (Health Bar already covers those counts)
- Schedules header compacted 2218px title, py-4py-3, badges inline next to title instead of below
- Platform tab bar tightened 28px tile 20px, py-3.5 py-2
- UpcomingCycles 5-column ETA strip showing the next enabled accounts to run, with folder handle device countdown. Running tile is highlighted green with a pulsing dot. Header has live N running M queued pills.
- ScheduleFooterStats 5-pill status footer (completed failed running scheduled content issues) computed from today's runs.
- SystemStrip slim status bar above stats showing live ADB queue errors runs modules accounts counts.
- FleetRibbon horizontal phone strip across the top showing every connected device with battery , current action, animated scan effect when a workflow is running on that phone.
- Plan Usage cards now include 12-point sparkline trend lines next to each big number. Color flips to warning destructive when near or at limit.
- ActivityTape live event marquee at the bottom scrolling ticker pulled from your real activity log.
- SystemStrip slim status bar above stats showing live ADB queue errors runs modules accounts counts. Updates every render.
- FleetRibbon horizontal phone strip across the top showing every connected device with battery , current action (engage idle offline no account), animated scan effect when a workflow is running on that phone, color-coded accent per phone.
- Plan Usage cards now include 12-point sparkline trend lines next to each big number (Devices Accounts Runs Today). Color flips to warning destructive when near or at limit.
- ActivityTape live event marquee at the bottom scrolling ticker pulled from your real activity log with icons per kind (post run error create upload switch). Shows no events yet when idle.
- Overview device profile dropdowns, Plan Usage 3-card (Devices Accounts Runs Today), Mirror primary action, Quick Upload, Schedule preview, Performance, Quick Actions 5-col grid
- Phones connection status strip, dashed-ring empty state with 3-step setup guide
- Schedule header status pills (enabled flagged missing content unassigned), full toolbar restyle (Refresh Validate Delete Folder Add Run Pause Stop Bulk Schedule), Health Bar with mono legend, new warming-day VA-assigned row-status badges per account
- Modules Railway Run Device status pills, search filter chips, favorites group, restyled detail panel
- Workflows free-tier upsell with canonical empty-state pattern
- Scraper, Templater, Analytics, AI Assistant, Tutorial, Guides, Settings, Affiliate, Admin all on the same consistent PageHeading token system
- Workflow scrape Drive-download failure notifications were being dropped due to a 'module-error' vs 'module_error' typo in 7 places now route correctly
- MCP queue's skip while module running guard was always false because isModuleExecutionActive return type was wrong now actually triggers
- Auto-update banner check was always false because UpdateInfo.hasUpdate was missing from the interface
- Schedule preselected-account sidebar was hardcoded closed even when caller passed an account id
- Overview Drive-download silent catches now log so partial imports surface
- 18 type null-guard fixes across overview, utilities, content-tools, video-templater, content-gallery, workflow builder, new-device popup