diff --git a/.claude/settings.json##os.Linux b/.claude/settings.json##os.Linux
index ad747a9..f392fde 100644
--- a/.claude/settings.json##os.Linux
+++ b/.claude/settings.json##os.Linux
@@ -57,5 +57,6 @@
"excludedCommands": [
"docker"
]
- }
+ },
+ "skipDangerousModePermissionPrompt": true
}
diff --git a/.codex/AGENTS.md b/.codex/AGENTS.md
index 4b03e63..e81e433 100644
--- a/.codex/AGENTS.md
+++ b/.codex/AGENTS.md
@@ -107,3 +107,69 @@ Do:
Avoid: purple-on-white clichés, generic component grids, predictable layouts.
+
+## Output Context
+
+
+
+- Return exactly the sections requested, in the requested order.
+- If the prompt defines a preamble, analysis block, or working section, do not treat it as extra output.
+- Apply length limits only to the section they are intended for.
+- If a format is required (JSON, Markdown, SQL, XML), output only that format.
+
+
+## Verbosity Controls
+
+
+
+- Prefer concise, information-dense writing.
+- Avoid repeating the user's request.
+- Keep progress updates brief.
+- Do not shorten the answer so aggressively that required evidence, reasoning, or completion checks are omitted.
+
+
+## Default Follow Through Policy
+
+
+
+- If the user’s intent is clear and the next step is reversible and low-risk, proceed without asking.
+- Ask permission only if the next step is:
+ (a) irreversible,
+ (b) has external side effects (for example sending, purchasing, deleting, or writing to production), or
+ (c) requires missing sensitive information or a choice that would materially change the outcome.
+- If proceeding, briefly state what you did and what remains optional.
+
+
+## Parallel Tool Calling
+
+
+
+- When multiple retrieval or lookup steps are independent, prefer parallel tool calls to reduce wall-clock time.
+- Do not parallelize steps that have prerequisite dependencies or where one result determines the next action.
+- After parallel retrieval, pause to synthesize the results before making more calls.
+- Prefer selective parallelism: parallelize independent evidence gathering, not speculative or redundant tool use.
+
+
+## Force Completion on Long-Running Tasks
+
+
+
+- Treat the task as incomplete until all requested items are covered or explicitly marked [blocked].
+- Keep an internal checklist of required deliverables.
+- For lists, batches, or paginated results:
+ - determine expected scope when possible,
+ - track processed items or pages,
+ - confirm coverage before finalizing.
+- If any item is blocked by missing data, mark it [blocked] and state exactly what is missing.
+
+
+## Verification Loop
+
+
+Before finalizing:
+
+- Check correctness: does the output satisfy every requirement?
+- Check grounding: are factual claims backed by the provided context or tool outputs?
+- Check formatting: does the output match the requested schema or style?
+- Check safety and irreversibility: if the next step has external side effects, ask permission first.
+
diff --git a/.codex/config.toml##os.Linux b/.codex/config.toml##os.Linux
index cf4d723..7261a4f 100644
--- a/.codex/config.toml##os.Linux
+++ b/.codex/config.toml##os.Linux
@@ -1,5 +1,5 @@
-model = "gpt-5.3-codex"
-model_reasoning_effort = "medium"
+model = "gpt-5.4"
+model_reasoning_effort = "high"
personality = "pragmatic"
tool_output_token_limit = 25000
# Leave room for native compaction near the 272–273k context window.
@@ -14,6 +14,7 @@ apply_patch_freeform = true
web_request = true
skills = true
shell_snapshot = true
+multi_agent = true
[projects."/home/sudacode/projects"]
trust_level = "trusted"
@@ -38,3 +39,44 @@ trust_level = "trusted"
[projects."/home/sudacode/.config/opencode/commands"]
trust_level = "trusted"
+
+[projects."/home/sudacode/packages"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/S/anime"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/videos/obs"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/.config/ghostty"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/apps/codex-port"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/.config/GameSentenceMiner"]
+trust_level = "trusted"
+
+[projects."/truenas/jellyfin/anime/My-Teen-Romantic-Comedy-SNAFU/Season-1"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/projects/lua/mpv-youtube-queue"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/projects/japanese/subminer-docs"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/projects/japanese/manabitan"]
+trust_level = "trusted"
+
+[projects."/home/sudacode/projects/japanese/subminer-yomitan"]
+trust_level = "trusted"
+
+[mcp_servers.backlog]
+command = "backlog"
+args = ["mcp", "start"]
+
+[mcp_servers.playwright]
+args = ["@playwright/mcp@latest"]
+command = "npx"
diff --git a/.config/SubMiner/config.jsonc##os.Linux b/.config/SubMiner/config.jsonc##os.Linux
index 41dd1e1..ca5794b 100644
--- a/.config/SubMiner/config.jsonc##os.Linux
+++ b/.config/SubMiner/config.jsonc##os.Linux
@@ -1,5 +1,21 @@
{
- "keybindings": [],
+ "keybindings": [
+ {
+ "key": "KeyR",
+ "command": ["add", "sub-pos", -5],
+ },
+ {
+ "key": "Shift+KeyR",
+ "command": ["add", "sub-pos", 5],
+ },
+ {
+ "key": "KeyJ",
+ "command": ["cycle", "sub"],
+ },
+ { "key": "BracketRight", "command": ["add", "sub-delay", 0.1] },
+ { "key": "BracketLeft", "command": ["add", "sub-delay", -0.1] },
+ { "key": "Backslash", "command": ["set_property", "sub-delay", 0] },
+ ],
"shortcuts": {
"copySubtitle": "CommandOrControl+C",
"copySubtitleMultiple": "CommandOrControl+Shift+C",
@@ -16,8 +32,8 @@
"toggleInvisibleOverlayGlobal": "Alt+Shift+I",
},
"auto_start_overlay": false,
- "bind_visible_overlay_to_mpv_sub_visibility": false,
"texthooker": {
+ "launchAtStartup": true,
"openBrowser": false,
},
"websocket": {
@@ -29,6 +45,12 @@
"url": "http://127.0.0.1:8765",
"deck": "Minecraft",
"pollingRate": 500,
+ "proxy": {
+ "enabled": true,
+ "host": "127.0.0.1",
+ "port": 8766,
+ "upstreamUrl": "http://127.0.0.1:8765",
+ },
"fields": {
"audio": "ExpressionAudio",
"image": "Picture",
@@ -36,7 +58,7 @@
"miscInfo": "MiscInfo",
"translation": "SelectionText",
},
- "openRouter": {
+ "ai": {
"enabled": true,
"alwaysUseAiTranslation": true,
"apiKey": "",
@@ -64,13 +86,14 @@
"highlightWord": true,
"notificationType": "system",
"showNotificationOnUpdate": true,
- "autoUpdateNewCards": false,
+ "autoUpdateNewCards": true,
},
"nPlusOne": {
"decks": ["Minecraft", "Kaishi 1.5k"],
"highlightEnabled": true,
"refreshMinutes": 60,
"matchMode": "headword",
+ "minSentenceWords": 3,
},
"metadata": {
"pattern": "[SubMiner] %f (%t)",
@@ -78,14 +101,13 @@
"isLapis": {
"enabled": true,
"sentenceCardModel": "Lapis Morph",
- "sentenceCardSentenceField": "Sentence",
- "sentenceCardAudioField": "SentenceAudio",
},
"isKiku": {
"enabled": true,
"fieldGrouping": "manual",
- "deleteDuplicateInAuto": true,
+ "deleteDuplicateInAuto": false,
},
+ "tags": ["SubMiner"],
},
"secondarySub": {
"autoLoadSecondarySub": true,
@@ -96,15 +118,28 @@
"alass_path": null,
"ffsubsync_path": null,
"ffmpeg_path": null,
+ "replace": true,
},
"subtitleStyle": {
- "fontFamily": "M PLUS 1 Medium",
+ "fontFamily": "M PLUS 1 Medium, Source Han Sans JP, Noto Sans CJK JP",
"fontSize": 35,
"fontColor": "#cad3f5",
- "fontWeight": "normal",
+ "fontWeight": 600,
+ "lineHeight": 1.35,
+ "letterSpacing": "-0.01em",
+ "wordSpacing": 0,
+ "fontKerning": "normal",
+ "textRendering": "geometricPrecision",
+ "textShadow": "0 3px 10px rgba(0,0,0,0.69)",
"fontStyle": "normal",
"backgroundColor": "rgb(30, 32, 48, 0.88)",
+ "backdropFilter": "blur(6px)",
+ "hoverTokenColor": "#f4dbd6",
+ "hoverBackground": "rgba(54, 58, 79, 0.84)",
+ "preserveLineBreaks": false,
+ "autoPauseVideoOnHover": true,
"secondary": {
+ "fontFamily": "Manrope, Inter",
"fontSize": 24,
"fontColor": "#cad3f5",
"backgroundColor": "transparent",
@@ -114,9 +149,20 @@
"sourcePath": "",
"topX": 10000,
"mode": "single",
+ "matchMode": "headword",
"singleColor": "#f5a97f",
"bandedColors": ["#ed8796", "#f5a97f", "#f9e2af", "#a6e3a1", "#8aadf4"],
},
+ "enableJlpt": true,
+ "jlptColors": {
+ "N1": "#ed8796",
+ "N2": "#f5a97f",
+ "N3": "#f9e2af",
+ "N4": "#a6e3a1",
+ "N5": "#8aadf4",
+ },
+ "nPlusOneColor": "#c6a0f6",
+ "knownWordColor": "#a6da95",
},
"jimaku": {
"apiKeyCommand": "cat ~/.jimaku-api-key",
@@ -124,16 +170,20 @@
"languagePreference": "ja",
"maxEntryResults": 10,
},
- "invisibleOverlay": {
- "startupVisibility": "platform-default",
- },
"youtubeSubgen": {
"mode": "automatic",
"whisperBin": "/usr/bin/whisper-cli",
"whisperModel": "~/models/whisper.cpp/ggml-small.bin",
},
"anilist": {
- "accessToken": "cat ~/.anilist-token.txt",
+ "characterDictionary": {
+ "enabled": true,
+ "collapsibleSections": {
+ "description": false,
+ "characterInformation": false,
+ "voicedBy": false,
+ },
+ },
},
"immersionTracking": {
"enabled": true,
@@ -143,8 +193,6 @@
"enabled": true,
"serverUrl": "http://pve-main:8096",
"username": "sudacode",
- "accessToken": "",
- "userId": "",
"deviceId": "subminer",
"clientName": "SubMiner",
"clientVersion": "0.1.0",
@@ -159,4 +207,27 @@
"pullPictures": true,
"iconCacheDir": "~/S/japanese/subminer-jellyfin-icons",
},
+ "logging": {
+ "level": "debug",
+ },
+ "discordPresence": {
+ "enabled": true,
+ "detailsTemplate": "Mining and crafting (Anki cards)",
+ "stateTemplate": "Idle",
+ "largeImageKey": "subminer-logo",
+ "largeImageText": "SubMiner",
+ "smallImageKey": "study",
+ "smallImageText": "Sentence Mining",
+ "buttonLabel": "",
+ "buttonUrl": "",
+ "updateIntervalMs": 15000,
+ "debounceMs": 750,
+ },
+ "startupWarmups": {
+ "lowPowerMode": false,
+ "mecab": true,
+ "yomitanExtension": true,
+ "subtitleDictionaries": true,
+ "jellyfinRemoteSession": false,
+ },
}
diff --git a/.config/ghostty/config##Default b/.config/ghostty/config##Default
index f03a07a..551c4b0 100644
--- a/.config/ghostty/config##Default
+++ b/.config/ghostty/config##Default
@@ -5,6 +5,9 @@ font-feature = +calt
font-feature = +liga
font-feature = +dlig
theme = Catppuccin Macchiato
+# Catppuccin Macchiato uses muted ANSI white by default; bump for clearer TUIs.
+palette = 7=#cad3f5
+palette = 15=#f4dbd6
cursor-style = block
background-opacity = 1.0
window-colorspace = srgb
diff --git a/.config/ghostty/config##os.Darwin b/.config/ghostty/config##os.Darwin
index a188dd1..fced6d2 100644
--- a/.config/ghostty/config##os.Darwin
+++ b/.config/ghostty/config##os.Darwin
@@ -5,6 +5,9 @@ font-feature = +calt
font-feature = +liga
font-feature = +dlig
theme = catppuccin-macchiato
+# Catppuccin Macchiato uses muted ANSI white by default; bump for clearer TUIs.
+palette = 7=#cad3f5
+palette = 15=#f4dbd6
cursor-style = block
window-padding-x = 10
window-padding-y = 10
diff --git a/.config/hypr/keybindings.conf b/.config/hypr/keybindings.conf
index 0fc3531..0cd1d32 100644
--- a/.config/hypr/keybindings.conf
+++ b/.config/hypr/keybindings.conf
@@ -112,10 +112,11 @@ bind = SUPER, m, exec, ~/.local/bin/mpv-add.sh
bind = SUPER SHIFT, s, exec, slurp | grim -g - - | wl-copy
bind = ,code:107, exec, ~/.local/bin/screenshot
+bind = SHIFT ,code:107, exec, grim -g "$(hyprctl activewindow -j | jq -r '.at[0],.at[1],.size[0],.size[1]' | tr '\n' ' ' | awk '{print $1","$2" "$3"x"$4}')" - | wl-copy
bind = SUPER,code:107, exec, flameshot screen
bind = SUPER, o, exec, ~/.local/bin/ocr.sh
bind = $mainMod, o, exec, ~/.local/bin/rofi-open tab
-bind = $mainMod SHIFT, o, exec, ~/.local/bin/rofi-open window
+# bind = $mainMod SHIFT, o, exec, ~/.local/bin/rofi-open window
# change wallpaper
bind = $mainMod CTRL, n, exec, ~/.local/bin/change-wallpaper
@@ -156,3 +157,8 @@ bind = ALT, g, exec, /opt/mpv-yomitan/mpv-yomitan.AppImage --toggle
# F5
bind = ,code:71, exec, ~/projects/scripts/whisper_record_transcribe.py --mode toggle --output type
+
+
+# SubMiner
+bind = ALT SHIFT, O, pass, class:^(SubMiner)$
+bind = ALT SHIFT, I, pass, class:^(SubMiner)$
diff --git a/.config/mpv/mpv.conf##default b/.config/mpv/mpv.conf##default
index 94e758e..219fa75 100644
--- a/.config/mpv/mpv.conf##default
+++ b/.config/mpv/mpv.conf##default
@@ -10,7 +10,8 @@ dither=fruit # Lighter dithering aimed at 8-bit or FRC panels
ontop=yes
border=no
no-border
-autofit=50% # Start at half of the screen to avoid oversized windows on UHD displays
+# autofit=50% # Start at half of the screen to avoid oversized windows on UHD displays
+geometry=1920x1080
osc=no
blend-subtitles=video # Keeps subtitles composited into the video plane
opengl-early-flush=no # Delay buffer flushes to reduce micro-stutter on some GPUs
@@ -29,8 +30,8 @@ sub-pos=95
# --- Audio chain ---
volume=75
-ao=pipewire,pulse
-audio-spdif=ac3,dts-hd,truehd
+ao=pipewire
+# audio-spdif=ac3,dts-hd,truehd
audio-stream-silence=yes # Keep the device primed to avoid startup pops
audio-wait-open=0.1 # Shorten audio device warm-up for snappier playback
@@ -112,11 +113,11 @@ demuxer-readahead-secs=30
# no, fatal, warn, info, v, debug, trace
msg-level=subs2srs,animecards,mpvacious=error
-msg-level=mpv-yomitan=warn
+msg-level=subminer=warn
[anime]
profile-desc="Anime upscaling with ArtCNN"
-glsl-shaders="~~/shaders/ArtCNN_C4F32.glsl"
+glsl-shaders="~~/shaders/ArtCNN_C4F32_DS.glsl"
scale=ewa_lanczossharp
dither=error-diffusion
deband=yes # Crucial for anime gradients
@@ -189,3 +190,4 @@ sub-italic=no
sub-ass-override=strip
sub-line-spacing=0.3
sub-hinting=light
+demuxer-mkv-subtitle-preroll=yes
diff --git a/.config/mpv/script-opts/modernz.conf b/.config/mpv/script-opts/modernz.conf
index 639ca40..e8c5a62 100644
--- a/.config/mpv/script-opts/modernz.conf
+++ b/.config/mpv/script-opts/modernz.conf
@@ -204,11 +204,12 @@ time_color=#CAD3F5
# color of the chapter title next to timestamp (below seekbar)
chapter_title_color=#A5ADCB
# color of the side buttons (audio, subtitles, playlist, etc.)
-side_buttons_color=#A5ADCB
+# mauve-dominant accent setup
+side_buttons_color=#C6A0F6
# color of the middle buttons (skip, jump, chapter, etc.)
-middle_buttons_color=#A5ADCB
+middle_buttons_color=#C6A0F6
# color of the play/pause button
-playpause_color=#A5ADCB
+playpause_color=#C6A0F6
# color of the element when held down (pressed)
held_element_color=#939AB7
# color of a hovered button when hover_effect includes "color"
@@ -264,6 +265,10 @@ nibbles_top=yes
nibbles_bottom=yes
# chapter nibble style. "triangle", "bar" or "single-bar"
nibbles_style=triangle
+# color of chapter nibbles on the seekbar
+nibble_color=#C6A0F6
+# color of the current chapter nibble on the seekbar
+nibble_current_color=#B7BDF8
# automatically set keyframes for the seekbar based on video length
automatickeyframemode=yes
diff --git a/.config/mpv/scripts/mpv-youtube-queue.lua b/.config/mpv/scripts/mpv-youtube-queue.lua
deleted file mode 120000
index 9544a52..0000000
--- a/.config/mpv/scripts/mpv-youtube-queue.lua
+++ /dev/null
@@ -1 +0,0 @@
-../../mpv-modules/mpv-youtube-queue/mpv-youtube-queue.lua
\ No newline at end of file
diff --git a/.config/nvim/lua/plugins/image.lua b/.config/nvim/lua/plugins/image.lua
index da16caa..88941c5 100644
--- a/.config/nvim/lua/plugins/image.lua
+++ b/.config/nvim/lua/plugins/image.lua
@@ -6,7 +6,7 @@ return {
processor = "magick_cli", -- or "magick_cli"
integrations = {
markdown = {
- enabled = true,
+ enabled = false,
clear_in_insert_mode = true,
download_remote_images = true,
only_render_image_at_cursor = false,
@@ -22,16 +22,16 @@ return {
filetypes = { "typst" },
},
html = {
- enabled = false,
+ enabled = true,
},
css = {
- enabled = false,
+ enabled = true,
},
},
- max_width = nil,
- max_height = nil,
+ max_width = 960,
+ max_height = 540,
max_width_window_percentage = nil,
- max_height_window_percentage = 50,
+ max_height_window_percentage = nil,
window_overlap_clear_enabled = false, -- toggles images when windows are overlapped
window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs", "snacks_notif", "scrollview", "scrollview_sign" },
editor_only_render_when_focused = false, -- auto show/hide images when the editor gains/looses focus
diff --git a/.config/opencode/commands/implement-backlog-task.md b/.config/opencode/commands/implement-backlog-task.md
index f753c6b..9082476 100644
--- a/.config/opencode/commands/implement-backlog-task.md
+++ b/.config/opencode/commands/implement-backlog-task.md
@@ -1,7 +1,7 @@
---
description: Implement a task from Backlog.md end-to-end
agent: build
-model: openai/gpt-5.3-codex
+model: openai/gpt-5.4
---
If there is a backlog folder and/or `Backlog.md` is set up in the repository
diff --git a/.config/opencode/opencode.json b/.config/opencode/opencode.json
index e52f9a5..25c41f3 100644
--- a/.config/opencode/opencode.json
+++ b/.config/opencode/opencode.json
@@ -16,6 +16,19 @@
"google": {
"name": "Google",
"models": {
+ "antigravity-gemini-3.1-pro-high": {
+ "name": "Gemini 3.1 Pro Preview (Antigravity)",
+ "thinking": true,
+ "attachment": true,
+ "limit": {
+ "context": 1048576,
+ "output": 65535
+ },
+ "modalities": {
+ "input": ["text", "image", "pdf"],
+ "output": ["text"]
+ }
+ },
"antigravity-gemini-3-pro-high": {
"name": "Gemini 3 Pro High (Antigravity)",
"thinking": true,
@@ -57,7 +70,6 @@
}
}
},
- "theme": "catppuccin-macchiato",
"share": "manual",
"formatter": {
"prettier": {
@@ -65,6 +77,9 @@
},
"ruff": {
"disabled": false
+ },
+ "uv": {
+ "disabled": false
}
},
"instructions": [
@@ -98,9 +113,10 @@
"git *": "allow",
"pnpm *": "allow",
"rm *": "deny",
- "grep *": "allow",
+ "grep*": "allow",
"wc *": "allow",
- "date *": "allow"
+ "date *": "allow",
+ "printenv AGENT_ID AGENT_ALIAS HEARTBEAT_MINUTES": "allow"
},
"external_directory": {
"*": "ask",
diff --git a/.config/yt-dlp/plugins/yt-dlp-hianime b/.config/yt-dlp/plugins/yt-dlp-hianime
new file mode 160000
index 0000000..085069f
--- /dev/null
+++ b/.config/yt-dlp/plugins/yt-dlp-hianime
@@ -0,0 +1 @@
+Subproject commit 085069fd88a3c1c3a38e4b08ca00d2af0885d9a2
diff --git a/.gitmodules b/.gitmodules
index 8385783..4f37c2c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -28,3 +28,6 @@
[submodule ".config/mpv-modules/ani-skip"]
path = .config/mpv-modules/ani-skip
url = https://github.com/synacktraa/ani-skip.git
+[submodule ".config/yt-dlp/plugins/yt-dlp-hianime"]
+ path = .config/yt-dlp/plugins/yt-dlp-hianime
+ url = git@github.com:pratikpatel8982/yt-dlp-hianime.git