diff --git a/src/app/RootLayout.tsx b/src/app/RootLayout.tsx
index 0d39c32..e9ae06f 100644
--- a/src/app/RootLayout.tsx
+++ b/src/app/RootLayout.tsx
@@ -17,6 +17,7 @@ import { SessionControl } from '@/features/play/SessionControl';
import { HandoutControl } from '@/features/play/HandoutControl';
import { useSessionBroadcaster } from '@/features/play/useSessionBroadcaster';
import { usePlayerConnection } from '@/features/play/usePlayerConnection';
+import { useCloudAutosave } from '@/features/cloud/useCloudAutosave';
import { PlayerSessionBadge } from '@/features/play/PlayerConnection';
import { SessionSidebar } from '@/features/play/SessionSidebar';
import { useSessionStore } from '@/stores/sessionStore';
@@ -87,6 +88,7 @@ export function RootLayout() {
// While the GM is hosting, mirror state to players (inert unless hosting).
useSessionBroadcaster(activeCampaign ?? null);
usePlayerConnection();
+ useCloudAutosave();
// Global Ctrl/Cmd+K opens the command palette.
useEffect(() => {
diff --git a/src/features/characters/CharactersPage.tsx b/src/features/characters/CharactersPage.tsx
index c1249d3..2087028 100644
--- a/src/features/characters/CharactersPage.tsx
+++ b/src/features/characters/CharactersPage.tsx
@@ -6,7 +6,7 @@ import type { Campaign, Character } from '@/lib/schemas';
import { getSystem } from '@/lib/rules';
import { exportCharacter, parseCharacterImport, CharacterImportError } from '@/lib/io/character';
import { pickTextFile } from '@/lib/io/file';
-import { useCharacters } from './hooks';
+import { useCharacters, useAllPcs } from './hooks';
import { Page, PageHeader, EmptyState, RequireCampaign } from '@/components/ui/Page';
import { Button } from '@/components/ui/Button';
import { Avatar, Badge } from '@/components/ui/Codex';
@@ -18,11 +18,11 @@ export function CharactersPage() {
}
function CharactersList({ campaign }: { campaign: Campaign }) {
- const characters = useCharacters(campaign.id);
+ // PCs are campaign-agnostic — show every player character; NPCs stay per-campaign.
+ const pcs = useAllPcs();
+ const npcs = useCharacters(campaign.id).filter((c) => c.kind === 'npc');
const [creating, setCreating] = useState(false);
const [importError, setImportError] = useState
{c.description}
} ))} @@ -250,7 +286,7 @@ export function CreationWizard({ campaign, onClose }: { campaign: Campaign; onCl {selectedClass && selectedClass.subclasses.length > 0 && ( -