···66666767 <div>
6868 <label className="block text-sm font-medium text-gray-700 mb-2">
6969+ External Collections (Optional)
7070+ </label>
7171+ <textarea
7272+ id="external_collections"
7373+ name="external_collections"
7474+ rows={4}
7575+ className="block w-full border border-gray-300 rounded-md px-3 py-2"
7676+ placeholder="Add external collections not in your slice lexicons:
7777+7878+app.bsky.feed.post
7979+app.bsky.actor.profile
8080+com.atproto.repo.strongRef"
8181+ />
8282+ <p className="text-xs text-gray-500 mt-1">
8383+ These collections will be synced even if they're not defined in your slice lexicons
8484+ </p>
8585+ </div>
8686+8787+ <div>
8888+ <label className="block text-sm font-medium text-gray-700 mb-2">
6989 Specific Repositories (Optional)
7090 </label>
7191 <textarea
···117137 </h3>
118138 <ul className="text-blue-700 space-y-1 text-sm">
119139 <li>
120120- • Collections from your slice lexicons are automatically loaded
140140+ • Collections from your slice lexicons are automatically loaded above
121141 </li>
122142 <li>
123123- • You can add popular collections like{" "}
124124- <code>app.bsky.feed.post</code>
143143+ • Use External Collections to sync popular collections like{" "}
144144+ <code>app.bsky.feed.post</code> that aren't in your lexicons
125145 </li>
146146+ <li>• External collections bypass lexicon validation</li>
126147 <li>• Large syncs may take several minutes to complete</li>
127148 <li>• Leave repositories empty to sync from all available users</li>
128149 <li>• Use the Records tab to browse synced data</li>
+13-2
frontend/src/routes/slices.tsx
···691691 try {
692692 const formData = await req.formData();
693693 const collectionsText = formData.get("collections") as string;
694694+ const externalCollectionsText = formData.get("external_collections") as string;
694695 const reposText = formData.get("repos") as string;
695696696697 // Parse collections from textarea (newline or comma separated)
···702703 });
703704 }
704705705705- if (collections.length === 0) {
706706+ // Parse external collections from textarea (newline or comma separated)
707707+ const externalCollections: string[] = [];
708708+ if (externalCollectionsText) {
709709+ externalCollectionsText.split(/[\n,]/).forEach((item) => {
710710+ const trimmed = item.trim();
711711+ if (trimmed) externalCollections.push(trimmed);
712712+ });
713713+ }
714714+715715+ if (collections.length === 0 && externalCollections.length === 0) {
706716 const html = render(
707717 <SyncResult
708718 success={false}
709709- error="Please specify at least one collection to sync"
719719+ error="Please specify at least one collection (regular or external) to sync"
710720 />
711721 );
712722 return new Response(html, {
···729739 const sliceClient = getSliceClient(context, sliceId);
730740 const syncJobResponse = await sliceClient.social.slices.slice.startSync({
731741 collections,
742742+ externalCollections: externalCollections.length > 0 ? externalCollections : undefined,
732743 repos: repos.length > 0 ? repos : undefined,
733744 });
734745