Checking status…
⇧ Update available

# Setup

Your device and everything needed to run Spark Control.

Running checks…

# Dashboard

Device status and today's capture totals.

##
Device

- iPhone connected
- WebDriverAgent
- iproxy 8100
- Tool idle

Building WebDriverAgent…

##
Today

–
ads found today
–
codes captured today

# Ad Finder

Scrolls the feed and captures sponsored ads. Runs on the connected iPhone.

##
Run controls

iPhone / WebDriverAgent aren't up.
Target ads Max videos (0 = default)
Save to panel Uploads found ads and screenshots to Supabase. AI detection Uses vision to catch ads OCR misses. Costs a fraction of a cent per check. Niche ads only Skips ads outside the target niche. Leave off to log everything.
0
ads found
0
videos scanned
00:00
elapsed
Scanning…
status

##
Last run

##
Live output

Output appears here when a run starts.

##
Screen

Preview off
Frames only appear while a tool is running.

# Spark Codes

Grab a Spark code from the phone, and review previously captured ones.

##
Grab a code

spark_code_grabber.py not found in your spark-phone folder — drop the script in there and this panel will work without restarting.
iPhone / WebDriverAgent aren't up.
Requires ad permissions enabled on the account: TikTok → Settings and privacy → Creator tools → Ad settings.
Duration
Wait for post (s) (0 = off) Note
Find my newest post Opens the Profile tab and picks the most recent post. Turn off if the post is already on screen. Save to panel Stores the code in Supabase so it appears in the table below.

Debug screen — dumps what the phone's screen reader sees, for fixing the flow when TikTok changes its layout.

⚡ Captured code

##
Live output

Output appears here when a grab starts.

##
Screen

Preview off
Frames only appear while a tool is running.

##
Previously captured

Code | Days | Captured | Note | Used
--- | --- | --- | --- | ---

No codes captured yet. Grab one above and it'll appear here.

# Poster

Posts images from a folder to TikTok, one at a time, on the connected iPhone. Loose images post singly; a subfolder posts as one carousel.

spark_poster.py not found in your spark-phone folder — drop the script in there and this tab will work without restarting.

##
Source folder

No folder chosen
0 to post

##
Run controls

iPhone / WebDriverAgent aren't up.
How many
Spark code duration (if grabbing)
Caption
Caption text

Each item uses its own sidecar: `photo.txt`/`.json` next to a loose image, or `caption.txt` inside a carousel folder. The caption above is the fallback when an item has no sidecar.

Publish for real OFF stops at the Post screen for review. ON actually posts publicly to your account. Grab Spark code after posting After each confirmed publish, authorizes the new post and reads its Spark code.
Publishing is ON. This run will post publicly to your TikTok account.

##
Live output

Output appears here when a run starts.

##
Screen

Preview off
Frames only appear while a tool is running.

##
Recent posts

When | Item | Caption | Spark code | Status
--- | --- | --- | --- | ---

No posts yet. A run logs each item here.

# Flows

The whole pipeline in one place — what's in each stage, and the next step to move it along. Nothing here runs the chain end to end; every stage is started deliberately.

iPhone / WebDriverAgent aren't up.

##
Shoot briefs

##
Live output

Output appears here when a stage runs.

# Logs

Live tool output and the finder's debug logs.

auto-scroll
0 lines

# Ads Found

Ads the finder flagged, newest first. Click a thumbnail to view the slides.

suspicious only

|  | Handle | Marker | Likes | Susp. | Niche | Reason | Found
--- | --- | --- | --- | --- | --- | --- | --- | ---

No ads yet.

# Settings

Pacing for the ad finder (the spark_config row). Changes apply within a few videos while the finder runs — no restart needed.

##
App paths

Where the tools and your phone live. Editable here or from the iPhone row in Setup.

spark-phone folder WebDriverAgent folder iPhone UDID

##
Updates

Current version —. New builds install automatically from the releases bucket; the Mac must have internet to fetch them.

# References

Example screenshots that teach the AI what your target ads look like. Ideal ads sharpen what it catches; non-compliant examples teach it what to flag. The finder uses at most 5 per set.

Drop a screenshot here, or
Add to
0 of 5 used
No examples yet. Drop in a screenshot of an ad you want caught.

# Proxy

Saved proxy nodes, and a Stash (Clash) config generator to AirDrop to the phone.

##
Proxies

| Name | Type | Address |
--- | --- | --- | --- | ---

No proxies yet — add one to get started.

##
Stash subscription

Import this URL into Stash as a subscription. The proxy list updates automatically when Stash refreshes.

Routing
Server
checking…
Import URL
LAN IP (auto-detected — override if it picks the wrong interface)

Note: the Mac must be running and on the same wifi for Stash to refresh the subscription — otherwise Stash keeps its last-fetched copy.

##
Save to file (fallback)

For when the Mac isn't on the same network — write the config once and AirDrop it to the phone.

Save to

# Signing

WebDriverAgent must be code-signed to run on the iPhone. A free Apple account's signing expires every 7 days; a paid developer account lasts a year. Re-sign here before it lapses.

##
WebDriverAgent signing

Checking…

##
Actions

Building WebDriverAgent…

##
Photo importer

A tiny dev-signed helper (com.petere.sparkimporter) that drops images into the camera roll via PhotoKit, so the poster can post them. Signed with the same team as WebDriverAgent.

Status checking…
Building & installing SparkImporter…

Installed. On the phone, open Spark Importer once and tap Allow so it can add to Photos.

After a fresh signing the iPhone won't trust the new developer certificate until you approve it once:

1. On the iPhone, open Settings
2. Go to General → VPN & Device Management
3. Tap the developer profile (your Apple ID / team)
4. Tap Trust, then confirm

Only needed when the certificate changes — typically the first build after a new signing.

## Add Proxy

Quick import host:port:user:pass · host:port · socks5://user:pass@host:port Name
Type
Host Port
Username (optional) Password (optional)