Skip to content

Commit 514e384

Browse files
committed
docs: update app settings & multitask & data-management & JIT-Less diagnose, add containers and external data guide
1 parent 6e40dbc commit 514e384

8 files changed

Lines changed: 241 additions & 98 deletions

File tree

docs/guides/app-settings.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ sidebar_position: 3
55

66
# App Settings
77

8-
Open app settings by long-pressing an app card in LiveContainer and tapping `Settings`.
8+
Open app settings by holding an app card in LiveContainer and tapping `Settings`.
99

1010
This page documents current options in the app settings UI and clarifies differences from older docs.
1111

@@ -100,6 +100,7 @@ These are per-app compatibility toggles and should be changed one at a time when
100100

101101
## Related
102102

103+
- [Multiple Containers and External Data Folder](./containers-and-external-data.md)
103104
- [JIT Support](./jit-support.md)
104105
- [Tweaks](./tweaks.md)
105106
- [Multiple Instances](./multiple-livecontainers.md)
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
---
2+
title: Multiple Containers and External Data Folder
3+
sidebar_position: 4
4+
---
5+
6+
# Multiple Containers and External Data Folder
7+
8+
By using multiple containers within a single application, you can maintain entirely separate, isolated data sets and bind external folders directly as container storage. This functionality allows you to manage multiple accounts simultaneously without the friction of repeated logins and provides the flexibility to start with a fresh application state while keeping all your existing data intact.
9+
10+
## Open container settings
11+
12+
1. Hold an app card in LiveContainer.
13+
2. Tap `Settings`.
14+
3. Go to the `Container` section.
15+
16+
## Create multiple containers for one app
17+
18+
### Create a new local container
19+
20+
1. Tap `New Data Folder`.
21+
2. Enter a display name.
22+
3. Confirm to create.
23+
24+
The container is then added to this app.
25+
26+
### Switch container when launching
27+
28+
When an app has multiple containers:
29+
30+
1. Hold the app card.
31+
2. Use the `Containers` picker in the context menu.
32+
3. Select the container you want.
33+
34+
### Set default container
35+
36+
1. Open a container entry in app settings.
37+
2. Tap `Set Default Container`.
38+
39+
This is the container the app uses by default when you tap `Run`.
40+
41+
## Add an external data folder
42+
43+
1. In app settings, tap `Select External Storage`.
44+
2. Pick a folder in the system file picker.
45+
3. LiveContainer creates a bookmark and binds this folder as a container.
46+
47+
:::note
48+
Most apps do not support containers on external storage and are very likely to crash.
49+
50+
If this external folder later becomes unavailable, this container can become partially unavailable until access is restored.
51+
:::
52+
53+
## Container operations
54+
55+
Open a container detail page to manage it.
56+
57+
- `Container Name`: only changes the name shown in LiveContainer UI. It does not rename the actual container folder.
58+
- `Container Folder Name`: shows the real folder identifier for this container. Use this value to confirm exact paths or troubleshoot data location. This field is read-only in app settings.
59+
- `Isolate App Group`: routes app-group container paths for the guest app to this container's isolated location instead of the shared app-group path. This helps reduce cross-container data mixing for app-group-based data.
60+
- `Spoof Identifier For Vendor`: generates and stores a persistent spoofed `identifierForVendor` for this container. This helps separate app identity state between containers for apps that rely on `identifierForVendor`.
61+
- `Set Default Container`: makes this container the default one used when you tap `Run`.
62+
- `Open Data Folder`: opens this container's data folder for manual file import, export, or inspection.
63+
- `Unbind`: removes this container from the app's container list, but keeps container files on disk.
64+
- `Delete Data`: removes files inside this container but keeps the container entry and `LCContainerInfo.plist`.
65+
- `Clean Keychain`: removes keychain data associated with this container.
66+
- `Remove Container`: removes the container entry and deletes the container folder.
67+
68+
## Limits and behavior
69+
70+
- Maximum containers per app: `128` (limited by keychain group pool).
71+
- If a container is currently in use by a running LiveContainer instance, destructive operations are blocked.
72+
- Shared/private app conversion may move data paths. Re-check container selection after conversion.
73+
74+
## Related
75+
76+
- [App Settings](./app-settings.md)
77+
- [Data Management](./data-management.md)
78+
- [Multiple LiveContainers](./multiple-livecontainers.md)

docs/guides/data-management.md

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,53 @@ sidebar_position: 4
99
Some actions are destructive. Back up important app/container data first.
1010
:::
1111

12-
## Available tools
12+
## Clean unused data folders
1313

14-
- clean unused data folders
15-
- clean keychain
16-
- move App Group folder between private and shared locations
17-
- move dangling shared folders out
18-
- clear icon cache
14+
:::note
15+
This action is shown in the primary LiveContainer only.
16+
:::
17+
18+
Deletes local data folders that are no longer referenced by any app container.
19+
20+
## Move App Group folder
21+
22+
:::note
23+
This action is shown in the primary LiveContainer only.
24+
:::
1925

20-
## Recommended usage
26+
- `Move AppGroup from private to shared`
27+
- `Move AppGroup from shared to private`
28+
29+
These two actions move App Group files between private and shared locations. They are blocked if the destination side is not empty.
30+
31+
## Move dangling shared folders
32+
33+
:::note
34+
This action is shown in the primary LiveContainer only.
35+
:::
2136

22-
### Clean unused data folders
37+
Moves unreferenced shared resources back to private locations:
2338

24-
Use after deleting apps/containers to remove orphaned folders and reclaim space.
39+
- shared data folders not used by shared apps
40+
- shared tweak folders not used by shared apps (except `TweakLoader.dylib`)
2541

26-
### Clean keychain
42+
Useful after migration/reinstall interruptions.
2743

28-
Use only when credential/keychain state is corrupted and other fixes failed.
44+
## Clean keychain
2945

30-
### App Group migration actions
46+
Deletes keychain items (`GenericPassword`, `InternetPassword`, `Certificate`, `Key`, `Identity`) from current keychain scope.
47+
Use carefully because this is broad and can sign you out of apps.
3148

32-
Use when shared/private storage state is mismatched due to install/path changes.
49+
## Clear icon cache
3350

34-
### Move dangling shared folders
51+
Clears app icon cache for currently loaded app list.
3552

36-
Use when shared resources remain in wrong place after migration, reinstall, or interrupted operations.
53+
## Path tools
3754

38-
## Safe procedure
55+
Use these tools when you need to inspect files manually or provide exact paths for debugging.
3956

40-
1. Export logs.
41-
2. Back up critical data.
42-
3. Run one operation.
43-
4. Relaunch and verify.
44-
5. Repeat only if required.
57+
- `Copy ... Path`: copies the full path for `App Group Container`, `Container`, or `LiveContainer Bundle` to clipboard.
58+
- `Open in Filza`: appears only when Filza is installed, and opens the selected location directly in Filza.
4559

4660
## Related
4761

Lines changed: 69 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,91 @@
11
---
2-
title: JIT-Less Diagnostics
2+
title: JIT-Less
33
sidebar_position: 9
44
---
55

6-
# About JIT-Less Diagnose Page
6+
# JIT-Less
77

8-
<img width="300" alt="JIT-Less Diagnose Page" src="/img/jit-less-diagnose/1.png" />
8+
If you are using the bundled SideStore build, complete the setup in [LiveContainer + SideStore: Setup after Installing](/docs/installation/lc_sidestore#setup-after-installing) first.
9+
If you are using standalone LiveContainer, follow [Standalone LiveContainer: JIT-Less mode setup](/docs/installation/standalone#jit-less-mode-without-jit-recommended).
10+
11+
## JIT-Less actions in Settings
12+
13+
Open `Settings` in LiveContainer and find the `JIT-Less` section.
914

10-
:::note
11-
This page exists in LiveContainer 3.1.51+
12-
:::
15+
- `Import Certificate`: Import a `.p12` certificate file and password manually from Files.
16+
- `Import Certificate from SideStore`: Ask your store app to export certificate data to LiveContainer.
17+
- `Refresh Certificate from SideStore`: Re-import certificate data from your store and overwrite the current one.
18+
- `Remove Certificate`: Remove imported certificate data/password from LiveContainer.
19+
- `JIT-Less Diagnose`: Open the diagnosis page to verify entitlement access and certificate state.
20+
21+
On the bundled SideStore build, this refresh can read the certificate directly from the built-in SideStore after confirmation.
22+
Use `Refresh Certificate from AltStore/SideStore` after you reinstall, re-login, or refresh your store environment, especially if certificate-related checks become stale or fail.
23+
24+
<img width="300" alt="JIT-Less Diagnose Page" src="/img/jit-less-diagnose/1.png" />
1325

14-
If you successfully setup JIT-Less mode, your JIT-Less Mode Diagnose should look like the screenshot above. The most important indicator is "Certificate Last Up Date". This field should change if you reopens your store. If not, follow the following instructions to diagnose your setup.
26+
If you successfully setup JIT-Less mode, your **JIT-Less Mode Diagnose** should look like the screenshot above. The most important indicator is "Certificate Last Update Date". This field should change if you reopens your store. If not, follow the following instructions to diagnose your setup.
1527

1628
## App Group ID, App Group Accessible, Store
1729

18-
The "App Group ID" field should end with the exact same 10 characters as the "Bundle Identifier". "App Group Accessible" should be "Yes" and "Store" should correctly show your store.
19-
20-
> For example, if your Bundle Identifier is `com.kdt.livecontainer.A1B2C3D4E5` ,then your app group id should be `group.com.SideStore.SideStore.A1B2C3D4E5` if you use SideStore, or `group.com.rileytestut.AltStore.A1B2C3D4E5` if you use AltStore.
21-
22-
If it only say `group.com.SideStore.SideStore` or `Unknown`, then there's something wrong with your SideStore setup. Please check:
23-
24-
- SideStore is installed through AltServer
25-
- LiveContainer is installed directly through SideStore/AltStore
26-
- Don't try to install LiveContainer through AltStore PAL
27-
- Account used to install SideStore and LiveContainer matches. This can be checked by going to iOS settings -> General -> VPN & Device Management -> (your account name). Check if both LiveContainer and SideStore are under the same account.
28-
29-
:::note
30-
> "Entitlement File" exists in 3.2.51+
31-
:::
32-
33-
If you meet the above 4 criteria but App Group is still not accessible, tap "Entitlement File" and check the entitlement extracted form LiveContainer's main executable. A correct entitlement may look like this:
34-
35-
```xml
36-
<?xml version="1.0" encoding="UTF-8"?>
37-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
38-
<plist version="1.0">
39-
<dict>
40-
<key>application-identifier</key>
41-
<string>A1B2C3D4E5.com.kdt.livecontainer.A1B2C3D4E5</string>
42-
<key>com.apple.developer.team-identifier</key>
43-
<string>A1B2C3D4E5</string>
44-
<key>com.apple.security.application-groups</key>
45-
<array>
46-
<string>group.com.rileytestut.AltStore.A1B2C3D4E5</string> <--- Important!
47-
<string>group.com.SideStore.SideStore.A1B2C3D4E5</string> <--- Important!
48-
</array>
49-
<key>get-task-allow</key>
50-
<true/>
51-
<key>keychain-access-groups</key>
52-
<array>
53-
<string>A1B2C3D4E5.com.kdt.livecontainer.shared</string>
54-
<string>A1B2C3D4E5.com.kdt.livecontainer.shared.1</string>
55-
<string>A1B2C3D4E5.com.kdt.livecontainer.shared.2</string>
56-
</array>
57-
</dict>
58-
</plist>
59-
60-
```
30+
- `App Group ID`: The identifier of the detected App Group.
31+
**Expected**: not `Unknown`.
32+
- `App Group Accessible`: Indicates if LiveContainer can read/write to the shared container path.
33+
**Expected**: `Yes`.
34+
- `Store`: The detected installation source (`AltStore`, `SideStore`, `ADP`, or `Unknown`).
35+
**Expected**: matches your real install source and is normally not `Unknown`.
36+
37+
If the App Group is inaccessible, resolve this issue before checking certificate details.
38+
39+
## Entitlement File
40+
41+
Tap `Entitlement File` to inspect the parsing results of the main executable's entitlements.
42+
43+
This view verifies:
44+
45+
- `Bundle Identifier`: Compares app bundle identifier with value derived from `application-identifier`.
46+
**Expected**: marked correct.
47+
- `Team ID`: Value from `com.apple.developer.team-identifier`.
48+
**Expected**: valid Team ID, not `Unknown`.
49+
- `get-task-allow`: Whether debug entitlement exists.
50+
**Expected**: `Yes`.
51+
- `com.apple.security.application-groups Correct`: Checks whether app-groups list is non-empty.
52+
**Expected**: `Yes`.
53+
- `keychain-access-groups Correct`: Checks whether LiveContainer keychain groups (`.shared` and indexed groups) are complete.
54+
**Expected**: `Yes`.
6155

6256
The most important part is `com.apple.security.application-groups`, which determines whether LiveContainer can access SideStore's app group.
6357
This item should exist and its content should look like `group.com.rileytestut.AltStore.A1B2C3D4E5` and `group.com.SideStore.SideStore.A1B2C3D4E5`. If this item is missing or it looks like `group.com.SideStore.SideStore.A1B2C3D4E5.A1B2C3D4E5`, then this is an bug of SideStore, not LiveContainer. The only thing you can do is to remove both LiveContainer and SideStore, and then install them again and check if this issue is solved.
6458

6559
It is reported that if LiveContainer's entitlement is incorrect, you can't activate/deactivate apps in SideStore. **Please do not submit issues about incorrect entitlement as it is not a LiveContainer issue.**
6660

67-
## Patch Detected
61+
## Certificate details
62+
63+
This section displays the status of the signing certificate used for JIT-less mode.
6864

69-
:::note
70-
Make sure App Group ID, App Group Accessible and Store are correct before proceeding.
71-
:::
65+
- `Certificate Last Up Date`: The timestamp of the last certificate refresh/import.
66+
**Expected**: a real timestamp, not `Unknown`.
67+
- `Certificate Team ID`: The Team ID extracted from the certificate.
68+
**Expected**: Your Apple Developer Team ID, not `Unknown`.
69+
- `Expected Team ID`: Team ID read from LiveContainer entitlement, used for mismatch detection.
70+
This row appears only when mismatch is detected.
71+
- `Certificate Status`: `Valid`, `Revoked`, or `Unknown`.
72+
**Expected**: `Valid`.
73+
- `Certificate Validate Until`: The expiration date of the certificate.
74+
**Expected**: a real timestamp while certificate is valid.
75+
- `Certificate Data Found`: whether imported certificate data exists.
76+
**Expected**: `Yes`.
77+
- `Certificate Password Found`: whether imported certificate password exists.
78+
**Expected**: `Yes` in normal certificate export/import flows.
7279

73-
It should say "Yes". If not, close your store from the app switcher, reopen it and refresh this diagnose page.
74-
If still not, patch your store again.
80+
## Test JIT-Less Mode
7581

76-
## Certificate Data / Password Found, Certificate Last Up Date
82+
The `Test JIT-Less Mode` button performs a functional validation rather than a static check.
7783

78-
:::note
79-
Make sure 1 & 2 are correct before proceeding.
80-
:::
84+
When tapped, LiveContainer will:
85+
1. Create a temporary test app bundle.
86+
2. Sign it using the current certificate and password.
87+
3. Verify code-sign validity of the signed test dylib (`TestJITLess.dylib`).
8188

82-
If you patched your store correctly, Certificate Data / Password Found should turn to "Yes" if you refresh the diagnose page, and "Certificate Last Up Date" should show the time when you last opens your store.
89+
The button requires `Certificate Data Found = Yes` to start. If password/config is still invalid, signing fails in this step.
8390

84-
If Certificate Data / Password Found are "Yes", but "Certificate Last Up Date" is unknown, but apps are working correctly, you might have just updated from version prior to 3.1.51, patch your store again and this field should display correctly.
91+
If this test fails, JIT-less launch will likely fail.

docs/guides/jit-support.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Use this order to avoid false failures:
1919

2020
## Enable JIT for an app
2121

22-
1. Long-press app -> `Settings` -> enable `Launch with JIT`.
22+
1. Hold app -> `Settings` -> enable `Launch with JIT`.
2323
2. Configure one enabler below.
2424
3. Launch app. LiveContainer enters a waiting state until JIT is attached.
2525
4. If your enabler is manual, trigger JIT while waiting prompt is still open.

0 commit comments

Comments
 (0)