Nothing here yet
-{activeSlot.slotIndex === 0 ? "Read a manga to see it here" : "Pin a manga or keep reading to fill this slot"}
- {#if activeSlot.slotIndex !== 0} - - {/if} - {:else} - - -
-
{heroManga.description}
{/if} - -No chapters to show
- {:else if loadingHeroChapters} - {#each Array(4) as _} -No chapters available
- {:else} - {#each heroChapters as ch (ch.id)} - {@const isCurrent = heroEntry?.chapterId === ch.id} - - {/each} - {#if heroManga} - - {/if} - {/if} -{lastRefresh ? "No new chapters found" : "Check for updates in the library"}
- {/if} -Loading…
- {:else if pickerResults.length === 0} -No results
- {:else} - {#each pickerResults as m (m.id)} - - {/each} - {/if} -Could not reach Suwayomi
-Make sure the server is running, then retry.
- -Order by
- {#each ALL_SORT_MODES as m} - - {/each} - -Content
- {#each ([["unread","Unread"],["started","Started"],["downloaded","Downloaded"],["bookmarked","Bookmarked"]] as const) as [f, label]} - - {/each} - -Status
- {#each ALL_STATUS_FILTERS.filter(s => s !== "ALL") as s} - - {/each} -Search across sources
-- {#if hasMultipleLangs} - {kw_visibleCount} source{kw_visibleCount !== 1 ? "s" : ""} · {kw_selectedLangs.size} language{kw_selectedLangs.size !== 1 ? "s" : ""} - {:else} - {kw_visibleCount} source{kw_visibleCount !== 1 ? "s" : ""} - {/if} -
-No results for "{kw_query.trim()}"
-Try a different spelling or fewer words
-Browse by tag
-Select a status or genre to find matching manga.
-No results
-- {#if tag_searchSources} - Try OR mode or broader tags. - {:else} - Try OR mode, enable Sources, or check your library. - {/if} -
-Browse a source
-Select a source to see its popular titles, or search within it.
-{src_submitted ? `No results for "${src_submitted}"` : "No results"}
-{error}
- -No trackers connected.
-Go to Settings → Tracking to connect AniList, MAL, or others.
-{searchQuery || statusFilter !== "all" ? "No results." : "Nothing tracked yet."}
- {#if searchQuery || statusFilter !== "all"} - - {/if} -Unlink from {r.tracker.name}?
-- {r.title} will be removed from your tracking list. This won't affect your progress on {r.tracker.name} itself. -
-Download
- -No match
- {/if} -{downloadedCount} / {totalCount} downloaded
- - {/if} - {#if continueChapter} - {@const contIdx = sortedChapters.indexOf(continueChapter.chapter)} - {#if contIdx >= 0} -From Ch.{continueChapter.chapter.chapterNumber}
- - - {/if} - {/if} - {#if !showRange} - - {:else} -Mark two manga as the same series so duplicates are merged in search. Click a linked entry again to unlink.
-Loading…
- {:else if linkPickerResults.length === 0} -No results
- {:else} - {#each linkPickerResults as m (m.id)} - {@const isLinked = linkedIds.includes(m.id)} - - {/each} - {/if} -{TABS.find((t) => t.id === tab)?.label}
-Interface Scale
-- {#each [50,60,70,80,90,100,110,125,150,175,200] as v} - - {/each} -
-Server
-Inactivity
-Integrations
- -Animations
- -Language
-Theme
-Page Layout
-Fit & Zoom
-- {#each [50, 75, 100, 125, 150, 200] as v} - - {/each} -
- -Behaviour
- - - {#if !(store.settings.autoNextChapter ?? false)} - - {/if} - -Display
- - -Chapters
-History
-Render Limit
-- {#each [12, 24, 48, 96, 200] as v} - - {/each} -
-Rendering
- -Idle / Splash Screen
- -Interface
- -Session Cache
-Keyboard shortcuts
- -Click a binding to rebind, then press the new key combination.
-Disk Usage
Reading filesystem…
- {:else if storageError} -{storageError}
- {:else if isExternalServer} -Disk usage is unavailable for external servers — filesystem access requires a local connection.
- {:else if multiStorageInfos.length > 0} - {#each multiStorageInfos as info} - {@const limitGb = store.settings.storageLimitGb ?? null} - {@const limitBytes = limitGb !== null ? limitGb * 1024 ** 3 : null} - {@const available = info.manga_bytes + info.free_bytes} - {@const cap = limitBytes !== null ? Math.min(limitBytes, available) : available} - {@const pct = cap > 0 ? Math.min(100, (info.manga_bytes / cap) * 100) : 0} - - {/each} - {:else} -No download path configured.
- {/if} -Downloads Path
- {#if isExternalServer} -- Connected to an external server. The path below is read from the server — changes here will update the server's config directly. Make sure the path is valid on the server's filesystem. -
- {/if} -Storage Limit
-Cache
-{backupError}
- {/if} - - - {#if backupList.length === 0} -No backups yet — create one above.
- {:else} -{validateError}
- {/if} - {#if validateResult} - {#if validateResult.missingSources.length === 0 && validateResult.missingTrackers.length === 0} -✓ All sources and trackers present
- {:else} - {#if validateResult.missingSources.length > 0} -{restoreError}
- {/if} - {#if restoreStatus} -Manage Folders
-Folders are stored as Suwayomi categories. Changes sync across all clients.
- {#if catsError} -{catsError}
- {/if} -Loading folders…
- {:else if store.categories.filter(c => c.id !== 0).length === 0} -No folders yet. Create one above.
- {:else} - {@const displayCats = store.categories - .filter(c => c.id !== 0) - .sort((a, b) => { - const defaultId = store.settings.defaultLibraryCategoryId ?? null; - if (a.id === defaultId) return -1; - if (b.id === defaultId) return 1; - return a.order - b.order; - })} -Connected Trackers
- {#if trackersError} -Loading trackers…
- {:else} -- Browser opened {tracker.name} login — after authorising, copy the full callback URL and paste it below. -
- { if (e.key === "Enter") submitOAuth(); if (e.key === "Escape") cancelOAuth(); }} - use:focusEl - /> -Server Authentication
- - {store.settings.serverAuthMode === "BASIC_AUTH" ? "Basic Auth" : - store.settings.serverAuthMode === "SIMPLE_LOGIN" ? "Simple Login — unsupported" : - store.settings.serverAuthMode === "UI_LOGIN" ? "UI Login — unsupported" : "Disabled"} - -Images are proxied through Tauri when Basic Auth is active, which reduces loading speed.
-App Lock
-SOCKS Proxy
-FlareSolverr
-Content Filter
- -Blocked Genre Tags
-Source Overrides
-- Allow lets a source through even if flagged NSFW. Block always hides it. -
-Loading sources…
- {:else if contentSources.length === 0} -No sources found — check your server connection.
- {:else} -Moku
-A manga reader frontend for Suwayomi / Tachidesk.
-Built with Tauri + Svelte.
-Version
-Releases
- {#if releasesError} -{releasesError}
- {:else if releasesLoading} -Fetching releases…
- {:else if releases.length === 0} -No releases found.
- {:else} -{release.body.trim()}
- Toasts
-Previews
-3D tilt cards — hover to preview
-Runtime
-{displayManga.description}
- {#if displayManga.description.length > 220} - - {/if} -- Mark two manga as the same series so duplicates are merged in search. - Click a linked entry again to unlink. -
-Loading…
- {:else if linkPickerResults.length === 0} -No results
- {:else} - {#each linkPickerResults as m (m.id)} - {@const isLinked = linkedIds.includes(m.id)} - - {/each} - {/if} -Search across sources
++ {#if hasMultipleLangs} + {kw_visibleCount} source{kw_visibleCount !== 1 ? "s" : ""} · {kw_selectedLangs.size} language{kw_selectedLangs.size !== 1 ? "s" : ""} + {:else} + {kw_visibleCount} source{kw_visibleCount !== 1 ? "s" : ""} + {/if} +
+No results for "{kw_query.trim()}"
+Try a different spelling or fewer words
+Browse a source
+Select a source to see its popular titles, or search within it.
+No results
+Try a different search term.
+Browse by tag
+Select a status or genre to find matching manga.
+No results
++ {#if tag_searchSources}Try OR mode or broader tags. + {:else}Try OR mode, enable Sources, or check your library. + {/if} +
+Loading…
+ {:else if results.length === 0} +No results
+ {:else} + {#each results as m (m.id)} + + {/each} + {/if} +Nothing here yet
++ {activeSlot.slotIndex === 0 + ? "Read a manga to see it here" + : "Pin a manga or keep reading to fill this slot"} +
+ {#if activeSlot.slotIndex !== 0} + + {/if} + {:else} + + +
+
{heroManga.description}
+ {/if} + +No chapters to show
+ {:else if loadingHeroChapters} + {#each Array(4) as _} +No chapters available
+ {:else} + {#each heroChapters as ch (ch.id)} + {@const isCurrent = heroEntry?.chapterId === ch.id} + + {/each} + {#if heroManga} + + {/if} + {/if} +{lastRefresh ? "No new chapters found" : "Check for updates in the library"}
+ {/if} +Could not reach Suwayomi
+Make sure the server is running, then retry.
+ +Content
+ {#each CONTENT_FILTERS as [f, label]} + + {/each} + + + +Status
+ {#each ALL_STATUS_FILTERS.filter(s => s !== "ALL") as s} + + {/each} +Order by
+ {#each ALL_SORT_MODES as m} + + {/each} + +Download
+ +No match
+ {/if} +{downloadedCount} / {totalCount} downloaded
+ + {/if} + {#if continueChapter} + {@const contIdx = sortedChapters.indexOf(continueChapter.chapter)} + {#if contIdx >= 0} +From Ch.{continueChapter.chapter.chapterNumber}
+ + + {/if} + {/if} + {#if !showRange} + + {:else} +Mark two manga as the same series so duplicates are merged in search. Click a linked entry again to unlink.
+Loading…
+ {:else if linkPickerResults.length === 0} +No results
+ {:else} + {#each linkPickerResults as m (m.id)} + {@const isLinked = linkedIds.includes(m.id)} + + {/each} + {/if} +{TABS.find(t => t.id === tab)?.label}
+Moku
+Version
+Releases
+{releasesError}
+ {:else if releasesLoading} +Fetching releases…
+ {:else if releases.length === 0} +No releases found.
+ {:else} +{release.body.trim()}
+ Theme
+Content Filter
++ Blocked Genre Tags + +
+Source Overrides
+Loading sources…
+ {:else if contentSources.length === 0} +No sources found — check your server connection.
+ {:else} +Toasts
+Previews
+Runtime
+Manage Folders
+Loading folders…
+ {:else if store.categories.filter(c => c.id !== 0).length === 0} +No folders yet. Create one above.
+ {:else} + {@const displayCats = store.categories + .filter(c => c.id !== 0) + .sort((a, b) => { + const defaultId = store.settings.defaultLibraryCategoryId ?? null; + if (a.id === defaultId) return -1; + if (b.id === defaultId) return 1; + return a.order - b.order; + })} + {#each displayCats as cat, i} +Interface Scale
+Server
+Inactivity
+Integrations
+Animations
+Language
++ Keyboard Shortcuts + +
+Click a binding to rebind, then press the new key combination.
+Display
+Chapters
+History
+Render Limit
+Rendering
+Idle / Splash Screen
+Interface
+Session Cache
+Cache
+Page Layout
+Fit & Zoom
+Behaviour
++ Server Authentication + + {store.settings.serverAuthMode === "BASIC_AUTH" ? "Basic Auth" : + store.settings.serverAuthMode === "SIMPLE_LOGIN" ? "Simple Login — unsupported" : + store.settings.serverAuthMode === "UI_LOGIN" ? "UI Login — unsupported" : "Disabled"} + +
+App Lock
+SOCKS Proxy
+FlareSolverr
++ Disk Usage + +
+Reading filesystem…
+ {:else if storageError} +{storageError}
+ {:else if isExternalServer} +Disk usage is unavailable for external servers — filesystem access requires a local connection.
+ {:else if multiStorageInfos.length > 0} + {#each multiStorageInfos as info} + {@const limitGb = store.settings.storageLimitGb ?? null} + {@const limitBytes = limitGb !== null ? limitGb * 1024 ** 3 : null} + {@const available = info.manga_bytes + info.free_bytes} + {@const cap = limitBytes !== null ? Math.min(limitBytes, available) : available} + {@const pct = cap > 0 ? Math.min(100, (info.manga_bytes / cap) * 100) : 0} +No download path configured.
+ {/if} +Downloads Path
+Storage Limit
+No backups yet — create one above.
+ {:else} + {#each backupList as backup} +Connected Trackers
+Loading trackers…
+ {:else} + {#each trackers as tracker} +Unlink from {r.tracker.name}?
++ {r.title} will be removed from your list. Your progress on {r.tracker.name} is unaffected. +
+