Back to Download

Changelog

Every update, improvement, and fix shipped to ShadowPhone Desktop.

v2.8.13

Latest
May 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

v2.8.12

May 19, 2026

Overview

  • ShadowPhone v2.8.12 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

v2.8.11

May 19, 2026

Overview

  • ShadowPhone v2.8.11 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

v2.8.10

May 19, 2026

Overview

  • ShadowPhone v2.8.10 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

v2.8.9

May 19, 2026

Overview

  • ShadowPhone v2.8.9 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

v2.8.8

May 19, 2026

Overview

  • ShadowPhone v2.8.8 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

v2.8.7

May 19, 2026

Overview

  • ShadowPhone v2.8.7 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

v2.8.6

May 19, 2026

Overview

  • ShadowPhone v2.8.6 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

v2.8.5

May 19, 2026

Overview

  • ShadowPhone v2.8.5 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

v2.8.4

May 19, 2026

Overview

  • ShadowPhone v2.8.4 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

v2.8.3

May 19, 2026

Overview

  • ShadowPhone v2.8.3 Scrcpy power-ups floating toolbar auto-tile
  • 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

v2.8.2

May 19, 2026

Overview

  • ShadowPhone v2.8.2 Scrcpy mirrors show your custom device name
  • 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

v2.8.0

Major
May 19, 2026

Overview

  • ShadowPhone v2.8.0 Local module execution (no Railway round-trip)
  • 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

v2.7.9

May 19, 2026

Overview

  • ShadowPhone v2.7.9 Live phase progress manual form parity
  • 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

v2.7.8

May 19, 2026

Overview

  • ShadowPhone v2.7.8 Bulk wizard UX hardening
  • 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

v2.7.5

May 19, 2026

Overview

  • ShadowPhone v2.7.5 Bulk Account Creation tile 3-phase pipeline
  • 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

v2.7.4

May 19, 2026

Overview

  • ShadowPhone v2.7.4 3-phase bulk account creation
  • 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

v2.7.3

May 19, 2026

Overview

  • ShadowPhone v2.7.3 Schedule UX fixes
  • 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

v2.7.2

May 19, 2026

Overview

  • ShadowPhone v2.7.2 Shadow Design Schedule v2
  • 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

v2.7.0

Major
May 19, 2026

Overview

  • ShadowPhone v2.7.0 Shadow Design Revamp
  • 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

v2.6.0

Major
May 17, 2026

Overview

  • ShadowPhone v2.6.0
  • New global background-tasks registry tracks every in-flight action with its label, device, progress, status, and live logs.
  • Floating tray pill in the bottom-right of the dashboard shows the total running count. Click to expand a panel listing every active task with its progress bar, mini logs, and a per-task Cancel button.
  • New Run in background button on the Utilities modal closes the modal without aborting progress keeps flowing into the tray. Stop still aborts cleanly.
  • Module Launcher and Modules Hub single-module runs flow through the same store, so you can navigate away mid-run and still see status.
  • Modules Hub fleet runs register a task per device, so a 10-phone fleet appears as 10 separate rows you can monitor or cancel individually.
  • Device rename pencil actually works now (window.prompt was disabled in Electron renderer replaced with inline edit-in-place input).
  • Create Profile bulk creation is opt-in via a dedicated toggle.
  • Create Account gains a profile picker that auto-switches the device to the chosen profile (with setup-wizard completion) before starting.
  • Profile rename Settings-UI fallback handles freshly-created GrapheneOS profiles by completing their setup wizard first.

v2.5.30

May 17, 2026

Overview

  • ShadowPhone v2.5.30

v2.5.29

May 17, 2026

Overview

  • ShadowPhone v2.5.29

v2.5.28

May 17, 2026

Overview

  • ShadowPhone v2.5.28

v2.5.27

May 17, 2026

Overview

  • ShadowPhone v2.5.27

v2.5.26

May 17, 2026

Overview

  • ShadowPhone v2.5.26
  • If you set a custom Device name on the phone itself (Android Settings About phone Device name Pixel 6a 2), the desktop reads it automatically and shows it everywhere. Zero configuration required.
  • Click the new pencil icon next to any device in the Device Profile dropdown to set a custom desktop-side nickname (Front Phone, Bedroom Pixel, whatever). Stored locally by USB serial survives unplug, replug, app restart, and reboots.
  • Display priority desktop nickname Android device name model fallback.
  • The Accounts section dropdowns (Add Account, Edit Account) now show the friendly name too. Picking a different device in the dropdown was already fetching that device's own profiles correctly it just looked broken because every option said Pixel 6a. Now it's obvious which is which.
  • Renaming a device pushes a live update so every dropdown reflects the new name immediately, no waiting for the next poll.

v2.5.25

May 17, 2026

Overview

  • ShadowPhone v2.5.25

v2.5.22

May 12, 2026

Overview

  • ShadowPhone v2.5.22

v2.5.20

May 9, 2026

Overview

  • ShadowPhone v2.5.20

v2.5.19

May 9, 2026

Overview

  • ShadowPhone v2.5.19

v2.5.18

May 9, 2026

Overview

  • ShadowPhone v2.5.18

v2.5.17

May 9, 2026

Overview

  • ShadowPhone v2.5.17

v2.5.16

May 9, 2026

Overview

  • ShadowPhone v2.5.16

v2.5.15

May 9, 2026

Overview

  • ShadowPhone v2.5.15

v2.5.14

May 5, 2026

Overview

  • ShadowPhone v2.5.14

v2.5.13

May 4, 2026

Overview

  • ShadowPhone v2.5.13

v2.5.12

May 4, 2026

Overview

  • ShadowPhone v2.5.12

v2.5.11

May 4, 2026

Overview

  • ShadowPhone v2.5.11

v2.5.10

May 4, 2026

Overview

  • ShadowPhone v2.5.10

v2.5.9

May 3, 2026

Overview

  • ShadowPhone v2.5.9

v2.5.8

May 3, 2026

Overview

  • ShadowPhone v2.5.8

v2.5.7

May 3, 2026

Overview

  • ShadowPhone v2.5.7

v2.4.0

Major
May 2, 2026

Whats New in v240

    Local Module Execution

    • 20 modules now run directly on your computer no server relay needed
    • Airplane toggle, profile switch, gallery clean, delays, IG launcher, VPN connect, stats scraper, and more
    • Modules work offline when Railway is unreachable
    • Up to 10x faster for utility modules

    Passive Analytics

    • Stats captured automatically when viewing IG profiles
    • Followerfollowingposts data syncs to analytics dashboard
    • Zero forensic footprint screen data deleted immediately

    Quick Upload

    • New button in Overview tab pick a folder, push content to phone instantly

    Account Auto-Sync

    • Accounts detected and linked automatically when phone connects

    Security

    • API secrets rotated, hardcoded credentials removed
    • Screen dumps deleted immediately after reading

    Bug Fixes

    • Cascade repost shares to feed (was story)
    • Airplane toggle cycles correctly (ON - OFF)
    • Profile switch does airplane ON - switch - OFF
    • Stats scraper matches friends label
    • Profile 0 shows Owner not null
    • VPN navigates to Profiles tab first

    Setup & Onboarding

    • Phone prep steps for new users (GrapheneOS, Developer Options, USB debugging)
    • Setup guide skippable for AI-only users
    • Reddit content folder auto-created

    v2.3.0

    Major
    April 30, 2026

    Overview

    • ShadowPhone v2.3.0

    v2.2.1

    April 29, 2026

    Overview

    • ShadowPhone v2.2.1

    v2.2.0

    Major
    April 29, 2026

    Overview

    • ShadowPhone v2.2.0

    v2.1.5

    April 29, 2026

    Overview

    • ShadowPhone v2.1.5

    v2.1.4

    April 27, 2026

    Overview

    • ShadowPhone v2.1.4

    v2.1.3

    April 27, 2026

    Overview

    • ShadowPhone v2.1.3

    v2.1.2

    April 27, 2026

    Overview

    • ShadowPhone v2.1.2

    Want the latest version?

    Download ShadowPhone