Documentation Index
Fetch the complete documentation index at: https://docs.signalrooms.xyz/llms.txt
Use this file to discover all available pages before exploring further.
Content folder structure
Status: Current operator how-to. Run modes referenced here (posting run / activity workflow) map to the template Run Mode toggle in Warmr.app.
This is the short reference for where files belong, how filenames are sorted, what happens to media after publication, and the self-check before launching.
Run modes at a glance
| Mode | Template’s Run Mode | What it does | Needs media files? |
|---|
| Posting run | Upload | Publishes videos or carousels to already-logged-in accounts | Yes |
| Activity workflow | Warmup | Scrolls the feed, likes, searches by keyword, watches results | No |
| Onboarding run | Seeding | TikTok reinstall → fingerprint reset → proxy switch → login → publish | Yes |
The Content Type inside a posting run or onboarding run is picked separately on the template: video or carousel.
| Type | Extensions |
|---|
| Video | .mp4, .mov, .m4v, .avi, .mkv |
| Photo (carousel) | .jpg, .jpeg, .png, .heic |
| Captions (sidecar) | .json next to media |
Any other extensions are silently ignored by the scanner.
Posting run: video
Template fields
- Video folder: absolute path to the folder.
- Order:
Sequential (natural sort by filename) or Random (shuffled).
- Move used files: into a
used/ subfolder (on by default).
- Delete after publishing: takes priority over Move.
Folder layout
videos/
├── clip_1.mp4
├── clip_2.mp4
├── clip_10.mp4 ← natural sort: 1, 2, 10 (not 1, 10, 2)
├── promo.mov
└── used/ ← created automatically after the first successful upload
├── clip_1.mp4
└── clip_2.mp4
What happens after publishing
- Move is on → the file goes into
used/ inside the same folder.
- Delete is on → the file is permanently deleted;
used/ is never created.
- A sidecar
.json (caption) is moved or deleted together with the video.
Posting run: carousel (subfolder mode, recommended)
Pick this when you have “packaged” content, each carousel laid out into its own folder with a defined photo order.
Template fields
- Photo folder: absolute path.
- Each subfolder = one carousel: on.
Folder layout
carousels/
├── 01_summer_post/ ← one carousel
│ ├── 1.jpg ← photo order within carousel: natural sort by filename
│ ├── 2.jpg
│ ├── 3.heic
│ └── content.json ← optional caption for this specific carousel
├── 02_promo/
│ ├── photo_a.png
│ ├── photo_b.png
│ └── description.json
├── 03_lifestyle/
│ ├── img1.png
│ └── img2.jpg
└── used/ ← created automatically
├── 01_summer_post/ ← the entire subfolder moves as a unit
└── 02_promo/
Rules
- The subfolder name
used (any case) is reserved and never scanned. Don’t name your carousels that.
- Photos inside a subfolder are sorted naturally:
1, 2, 10, not 1, 10, 2.
- Subfolders themselves are published in natural-sort order of names.
- TikTok accepts 1 to 35 photos per carousel.
What happens after publishing
The entire subfolder moves into used/ as a unit (or is deleted). Sidecar caption files travel with it.
Posting run: carousel (flat mode)
Pick this when you don’t want to group photos into subfolders, all images sit “loose” in one folder, and you want them sliced into equal-sized carousels.
Template fields
- Photo folder.
- Each subfolder = one carousel: off.
- Photos per carousel: 1 to 35.
Folder layout
photos/
├── img_01.jpg ┐
├── img_02.jpg │ carousel #1 (if Photos per carousel = 5)
├── img_03.jpg │
├── img_04.jpg │
├── img_05.jpg ┘
├── img_06.jpg ┐
├── img_07.jpg │ carousel #2
├── img_08.jpg │
├── img_09.jpg │
├── img_10.jpg ┘
└── used/
├── img_01.jpg
└── ...
Rules
- Photos are sorted naturally by name and chunked into blocks of the configured size.
- Sidecar captions don’t work in flat mode: there’s no unambiguous photo-to-group binding. For per-carousel captions, switch to subfolder mode or use a global caption source (see Captions).
Activity workflows do not upload anything. The template’s video/photo folder fields are ignored when Run Mode = Warmup. See Activity workflows for parameter setup.
Onboarding run: same as posting run
The content folder layout for an onboarding run (Run Mode = Seeding) is identical to a posting run. The onboarding run also reads an accounts file, where each line is one account in one of three formats (auto-detected):
| Format | Pattern |
|---|
| Pipe (recommended) | email|email_pass|username|tiktok_pass[|refresh_token][|client_id] |
| Colon (legacy) | username:password:email[:totp_or_refresh][:refresh_or_client_id] |
| Old colon | email:password[:totp] |
user1@gmail.com|GmailPass123|cooluser1|TikTokPass!
channel@outlook.com|OutlookPass|bestchannel|SecretPass!|1.ARw...refresh_token
Heads up: if any TikTok password contains a : character, use the pipe format only. Colon parsing will break on the password field.
Unlike a posting run, onboarding intentionally publishes the same content to multiple fresh accounts, that’s the point. Publish history is tracked per account.
Multi-device protection: .publish_history.json
Inside every content folder, Warmr writes a hidden file:
videos/.publish_history.json
carousels/.publish_history.json
This file is the cross-device claim ledger. When several iPhones run posting runs against the same folder, it guarantees one source file goes to TikTok at most once per account. Claim TTL is 30 minutes, long enough to cover a normal upload, short enough that a crashed lane releases its claim quickly.
Don’t delete .publish_history.json manually. If you wipe it, already-published files can be re-uploaded by lanes that don’t know they were already used. The file is safe to commit to version control if you want history; it is not safe to edit.
”Folder ready” checklists
For a posting run: video
- All videos in one folder, extensions from the supported list.
- Filenames sorted as you want them (natural sort is used).
- No
used/ subfolder yet, or it’s empty.
- If you need per-file captions, each video has a
<name>.json sidecar next to it.
For a posting run: carousel, subfolder mode
- Each carousel is a separate subfolder.
- Photos inside are numbered/named so natural sort gives the order you want.
- No subfolder is named
used (reserved).
- Template has Each subfolder = one carousel = on.
- Optional:
content.json (or description.json / caption.json) inside each subfolder for per-carousel captions.
For a posting run: carousel, flat mode
- All photos in one folder, sorted by filename.
- Total photo count is a multiple of Photos per carousel: otherwise the tail won’t form a full carousel.
- Captions come from a global source (Text / TXT / JSON), sidecars are not used in flat mode.
For an onboarding run
- Folder structure identical to a posting run.
- Accounts file in pipe format.
- Proxies assigned (Stash / Happ / System). DIRECT is not allowed for onboarding.