BETA Road Map #350
ash-bluepollution95
started this conversation in
Road Map
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
There's two sets to this "ROAD MAP" thre's the OG beta planning, and the overall roadmap in the readme.
Roadmap
Beta (multi-phase — not a one-month sprint)
Phase 1 — Core stability
Phase 2 — UX polish
Phase 3 — Optimizer & scheduler expansion
Maybe Beta — Under Consideration
Tech Upgrades — Gated on Milestones
Dev-branch installer access — add
--branch dev(or similar) flag toinstall.bat/install.shso beta testers can opt into the dev branch without manual git commands; not needed in alpha but useful once beta testing ramps upNext.js 16 — upgrade when ComfyUI integration work begins, not before; that phase also brings in the team's own dataset tools / metadata viewer (already built in Next 16) plus reference from an older Python edition of the same tool. Batching the upgrade with real new functionality avoids churn.
Post-Beta / Pre-Stable — Future Model Types
Qwen Image LoRA —
networks.lora_qwen_image, base model versionqwen_image; vendored sd-scripts has the VAE autoencoder but no training script yet; needs upstream support before we can wire UIComfyUI inference integration — generate images directly from the trainer UI without a separate WebUI
Embedding merge tool — create and combine TI embeddings via vector arithmetic (port of klimaleksus/embedding-merge concept)
VAE fine-tuning support
Advanced model merging (QuantumMerge and similar techniques)
SD 2.1 model type support
Beta Planning Document
Current Version: Alpha (v0.1.0-dev)
Target: Beta Release
Last Updated: 2026-04-15
Overview
This document tracks planned features, known issues, and upgrade priorities for the Alpha-to-Beta transition. Beta focus is UI improvements + feature upgrades.
1. Tag/Caption System Upgrades
1.1 Tag Viewer with Frequency Counts (NEW FEATURE)
Priority: High
Inspiration: Civitai
TrainingImagesTagViewer(Apache 2.0)Status: Not started
Add a Tag Viewer panel to the dataset page that:
Implementation notes:
flatMapall caption .txt files -> count occurrences with reduce -> sort by frequencyGET /api/dataset/{name}/tag-summarythat reads all .txt files and returns{ tag: string, count: number }[]Files to create/modify:
frontend/app/dataset/[name]/- new tag viewer componentapi/routes/dataset.py- new endpointservices/tagging_service.py- aggregation logic1.2 Bulk Tag Operations (NEW FEATURE)
Priority: High
Inspiration: Civitai
TrainingEditTagsModal+TrainingImagesTagVieweractions menu (Apache 2.0)Status: Not started
Once the Tag Viewer exists, add bulk actions on selected tags:
Implementation notes:
POST /api/dataset/{name}/tags/removeandPOST /api/dataset/{name}/tags/replace1.3 Upgrade Overwrite Mode from Bool to 3-Way
Priority: Medium
Status: Not started
Current:
append_tags: bool(append or overwrite)Target:
overwrite_mode: "ignore" | "append" | "overwrite"Files to modify:
services/models/tagging.py- changeappend_tags: booltooverwrite_mode: Literal["ignore", "append", "overwrite"]frontend/app/dataset/[name]/auto-tag/page.tsx- replace checkbox with segmented controlservices/tagging_service.py- handle new mode in tag processingcustom/tag_images_by_wd14_tagger.py- update CLI args1.4 Per-Image Visual Tag Editor
Priority: Low (Beta+)
Status: Not started
Visual tag editing per image: show tags as badge chips with X to remove, textarea to add new tags. Would require the frontend to read/write individual .txt caption files via API.
2. Checkpoint Training - Audit Results
2.1 Current State
Checkpoint training (full fine-tune) IS implemented in the backend:
TrainingMode.CHECKPOINTexists inservices/models/training.py:142services/trainers/kohya.py:289-303:fine_tune.pysdxl_train.pyflux_train.pysd3_train.pylumina_train.pyflux_train.py(with --model_type chroma)anima_train.pykohya_toml.py:183-184)training.py:81)2.2 Known Issues - Checkpoint Training
Issue CT-1: No checkpoint-specific validation
api/routes/training.py:33-253validate_training_config_extended()Issue CT-2: No UI indication of checkpoint mode limitations
Issue CT-3: Lumina checkpoint training script may not exist
services/trainers/kohya.py:297lumina_train.pybut needs verification that this script exists in sd_scriptsIssue CT-4: Anima missing from checkpoint script map
services/trainers/kohya.py:299script_mapfor CHECKPOINT mode doesn't include Anima. It falls back tofine_tune.py(SD1.5 script) which is the wrong script.anima_train.pyexists but isn't mapped.ModelType.ANIMA: "anima_train.py"to the checkpoint script_mapIssue CT-5: CheckpointTrainingConfig frontend type incomplete
frontend/components/checkpoint/CheckpointTrainingConfig.tsx:19SD15 | SDXL | FLUX | SD3 | LUMINA- missing SD3.5, Chroma, AnimaIssue CT-6: Redundant TOML generation
services/trainers/kohya.py:51-78trainer/runtime_store/then copied toconfig/. Should generate once in final location.Issue CT-7: WebSocket routes exist but are unused
services/websocket.py:19-100Issue CT-8: TODO comment references incomplete Node.js migration
frontend/lib/api.ts:7943. Merging Tool - Audit Results
3.1 Current State
Both LoRA and Checkpoint merging are implemented:
POST /api/utilities/lora/merge- supports SD, SDXL, Flux, SVDPOST /api/utilities/checkpoint/merge- weighted merge with UNet-only optionPOST /api/utilities/lora/resize- SVD-based rank reduction3.2 Known Issues - Merging Tool
Issue MG-1: Alpha parameter silently ignored in LoRA resize
services/lora_service.py:98-101newAlphabutresize_lora.pydoesn't support--new_alpha. Alpha is auto-calculated from SVD rank. User thinks they're controlling alpha but it's ignored.Issue MG-2: Parameter naming inconsistency
services/lora_service.py:298vsservices/lora_service.py:400--save_precisionbut checkpoint merge uses--saving_precision(different Kohya scripts expect different arg names). This is correct behavior but confusing in the codebase.Issue MG-3: No subprocess timeout
services/lora_service.py:320-327, 428-435await process.communicate()has no timeout. A hung merge process blocks the worker indefinitely.asyncio.wait_for(process.communicate(), timeout=3600)with proper cleanupIssue MG-4: No CUDA availability check
services/lora_service.py:312, 420device: "cuda"but no GPU is available, the merge script will fail with an unhelpful error.torch.cuda.is_available()before passing cuda device, return clear errorIssue MG-5: SD3 merge not exposed
trainer/derrian_backend/sd_scripts/tools/merge_sd3_safetensors.pyexists but isn't wired upIssue MG-6: Stdout not logged during merges
services/lora_service.py:320-327Issue MG-7: No merge progress reporting
Issue MG-8: Missing output file existence check
services/lora_service.py:334output_path.exists()check before stat()4. LoRA Training - Audit Results
4.1 Current State
LoRA training pipeline is solid (~99% functional). Audit performed on:
api/routes/training.py)services/training_service.py)services/trainers/kohya.py)services/trainers/kohya_toml.py)services/models/training.py)services/jobs/job_manager.py)frontend/lib/api.ts)Note on enum comparisons:
ModelTypeandLoRATypeboth inherit from(str, Enum), so string comparisons likeconfig.model_type == "Flux"work correctly. Thenormalize_model_typevalidator also handles frontend variants like'SD15'->'SD1.5'cleanly.4.2 Known Issues - LoRA Training
Issue LT-1: wandb_key field exists but is never used
services/models/training.py:168(defined), nowhere referencedTrainingConfig.wandb_keyis defined as a config field but never read bykohya_toml.pyor set as an environment variable inkohya.py. W&B integration silently fails for users who set this.kohya.pyenv setup, addif self.config.wandb_key: env["WANDB_API_KEY"] = self.config.wandb_keybefore launching the subprocess.Issue LT-2: enable_bucket force-enabled, user preference ignored
services/trainers/kohya_toml.py:110dataset["enable_bucket"] = True # Force bucketing enabled- hard-coded, ignoresself.config.enable_bucket. Users can't disable bucketing even if they want to (e.g., for fixed-resolution datasets).dataset["enable_bucket"] = self.config.enable_bucketIssue LT-3: network_train_unet_only added in checkpoint mode
services/trainers/kohya_toml.py:346network_train_unet_onlyis added to args unconditionally in_get_training_arguments(), but it's a LoRA-only parameter. For checkpoint/fine-tune training (fine_tune.py,sdxl_train.py, etc.) this argument is invalid and may cause Kohya to error out or warn.if self.config.training_mode != TrainingMode.CHECKPOINT:like the network args section already does at line 184.Issue LT-4: "Full" LoRA type semantic confusion
services/models/training.py:36,services/trainers/kohya_toml.py:270-272LoRAType.FULL = "Full"is exposed as a LoRA algorithm option (mapped tolycoris.kohyawithalgo=full), but "Full" means native fine-tuning (DreamBooth) which conceptually belongs in checkpoint training mode. Users selectingtraining_mode=lora+lora_type=Fullget an unusual config that may conflict withnetwork_train_unet_only=True.training_mode=checkpoint.Issue LT-5: No LyCORIS algorithm-specific validation
api/routes/training.py:33-253conv_dim/conv_alphaonly apply to LoCon/LoHa,factoronly to LoKR).validate_training_config_extended().Issue LT-6: network_module field is misleading
services/models/training.py:197-199network_moduleis a writable field with default"networks.lora"but its docstring says "derived from lora_type". The TOML generator always overrides it via_get_network_config(). API users who set this field will see it silently ignored.5. Miscellaneous Bug Fixes for Beta
5.0 WandB / Logging UI Missing Entirely
Issue UI-1: WandB and logging fields have no UI in the training form
frontend/components/training/cards/*.tsx(none render these fields)wandb_key(hooks/useTrainingForm.ts:167,lib/validation.ts:138)wandb_run_name(hooks/useTrainingForm.ts:175,lib/validation.ts:371)log_with(tensorboard/wandb backend selector)log_tracker_namelog_tracker_configlog_prefixlogging_dirwandb_keynot being read by backend) hasn't been noticed - nobody can set it in the first place.SavingCard.tsxor a newLoggingCard.tsx):log_with(None / TensorBoard / WandB)logging_dirlog_prefixlog_with === "wandb", conditionally show:wandb_key(with link to https://wandb.ai/authorize)wandb_run_namelog_tracker_name(project name)5.0.5 Dashboard Redesign - Missing Pages and Generic Look
Issue UI-2: Dashboard incomplete and looks AI-generated
frontend/app/dashboard/page.tsxfrontend/components/blocks/navigation/navbar.tsxalready groups routes into proper categories - the dashboard should mirror that organization.Pages currently on dashboard (9):
/models,/files,/dataset,/training,/calculator,/utilities,/settings,/docs,/aboutPages MISSING from dashboard:
/checkpoint-training- distinct from LoRA training/dataset/auto-tag- WD14/BLIP/GIT auto-tagging interface/dataset/tags- tag editor with gallery/dataset-uppy- alternate Uppy-based uploader/huggingface-upload- HF upload page/changelog/models/browse- Civitai downloaderVisual design issues:
text-cyan-400,text-pink-400, etc.) without semantic meaningProposed redesign directions (pick one or combine):
Workflow-grouped layout (matches navbar structure):
Workflow-driven hero section:
Live status dashboard:
Sidebar nav + main content (most app-like):
Recommended: Combine #1 (workflow grouping) with a small version of #3 (active jobs widget at top). This is the lowest effort high-impact change - keeps the existing card pattern but groups them semantically and adds one "alive" element.
Components to use (per
frontend/CLAUDE.md):Card,CardHeader,CardTitle,CardDescription,CardContentfrom shadcnSeparatorbetween sectionsBadgefor status indicators on the active jobs widgettext-primary,text-muted-foreground) instead of arbitrary rainbow5.0.7 Listener/Request Cancellation Console Noise
Issue UI-3: "Listener cancelled" / AbortError messages on page navigation
frontend/lib/api.ts:121-188-pollJobLogs()frontend/components/training/TrainingMonitor.tsx:115-133- polling interval + visibilitychange listenerfrontend/components/DatasetUploader.tsx:231-232, 308-309- upload AbortControllers (10min timeout)frontend/app/models/browse/page.tsx:93-148- in-flight request cancellationfrontend/hooks/useSettings.ts:80-81- storage event listenersetInterval/setTimeoutrecursion) get clearedAbortErrorwindow/documentevent listeners get removedpollJobLogs()function uses astoppedboolean flag instead of AbortController, so the fetch continues to completion before its result is discarded - wasteful but not buggypollJobLogs: If a fetch errors out (network blip) right as the user navigates away, thecatchblock checksstoppedBEFORE deciding to callonError, but there's a tiny race window. IfonErrorfires on an unmounted component, React logs "Can't perform a state update on an unmounted component" - harmless but ugly.DatasetUploader.tsxwon't actually trigger normally, but if the page unmounts mid-upload the AbortError gets logged.Fixes:
Use AbortController in
pollJobLogs()instead of (or in addition to) thestoppedflag:Then in the catch block, ignore
AbortErrorexplicitly:Same pattern for
DatasetUploader.tsx- cancel uploads on unmount via existing AbortControllerTrainingMonitor.tsxpolling - already correct, just verify the cleanup runs before any pending poll resolvesOptional: Add a global fetch wrapper that silently swallows
AbortErrorto prevent any future occurrences from leaking to the consoleUser-reported behavior: "Listener things that cancel" appearing in console on page navigation. Not extension-based, page-based. Doesn't seem to cause UI issues but is concerning noise.
5.0.8 Training Log Polling - Updates Feel Inconsistent
Issue UI-4: Training logs only update "when they feel like it"
frontend/lib/api.ts:840-907-trainingAPI.pollLogs()frontend/components/training/TrainingMonitor.tsx:136-186- log polling effectfrontend/components/training/TrainingMonitor.tsx:99-133- status polling effect (for comparison)api.ts:895(setTimeout(poll, 1000)) - not configurableTrainingMonitor.tsx:102correctly checksdocument.hidden), the log poller inapi.ts:pollLogskeeps polling when the tab is hidden. Browsers will then aggressively throttle backgroundsetTimeoutcalls (up to once per minute in Chrome), so when the user comes back to the tab, logs appear "frozen" until the next throttled poll fires.?since=nextSince- works fine, but if a poll fails partway through, lines can be missed (no retry of failed range)Fixes (in order of impact):
Add visibility-aware polling to
pollLogs:Use fixed-cadence polling instead of sequential: Replace recursive
setTimeoutwithsetInterval, OR keepsetTimeoutbut record poll start time and schedule next from that:This guarantees ~1s cadence even if a poll takes 800ms.
Make poll interval configurable - accept an optional
intervalMsparameter so the training monitor can poll faster (e.g. 500ms) for active jobs and slow down (5s) for queued ones.Backend log flushing: Ensure the Kohya subprocess wrapper in
services/trainers/kohya.pyruns Python with-u(unbuffered) and/or setsPYTHONUNBUFFERED=1in the env. This is the single biggest "why don't I see logs?" cause.Long-term: switch to Server-Sent Events (SSE): A
GET /api/training/logs/{jobId}/streamendpoint that streams new lines as they arrive would eliminate polling entirely. Works through Caddy proxies (unlike WebSockets per CT-7) since SSE is just chunked HTTP. The client side would useEventSourcewith automatic reconnect.Combine UI-4 fix with UI-3 fix: The AbortController refactor in UI-3 should land in the same PR, since both touch
pollLogs.Acceptance criteria:
5.1 HuggingFace Upload - Form State Doesn't Persist
Issue HF-1: HF upload form loses all data on page navigation
frontend/app/huggingface-upload/page.tsx:11-25useStatefor all form fields (token, owner, repo name, repo type, commit message, remote folder, etc.). When the user navigates away from the page and back, all data is lost. Users uploading multiple LoRAs/models in a session have to re-enter the same information repeatedly (token, owner, etc.) - reportedly 20+ times.persistmiddleware (or use localStorage directly), at minimum for:hfToken(consider security: maybe sessionStorage instead of localStorage)ownerrepoTypecommitMessage(default)createPRpreferenceselectedFilesanduploading/uploadResultshould NOT persist (they're per-upload state)6. Feature Priority Matrix (Beta)
Must Have (Alpha -> Beta gate)
Should Have (Beta quality)
Nice to Have (Beta+)
7. EQ VAE / Reflection Padding Support
7.1 Background
EQ VAEs (e.g.
KBlueLeaf/EQ-SDXL-VAE,Anzhc/MS-LC-EQ-D-VR_VAE) require reflection padding on their Conv2d layers instead of the default zero padding. Without it, they produce edge artifacts. The fix is applied post-load by mutatingmodule.padding_mode = "reflect"on every Conv2d with non-zero padding.Reference: kohya-ss/sd-scripts#2189
VAE-EQ-1: SDXL EQ VAE Support
Priority: Nice to Have (Beta+)
Status: Not started
Jelosus2's fork of sd-scripts has a clean 15-line implementation (
library/sdxl_train_util.py):And a
--vae_reflectionCLI arg intrain_network.py.Our vendored backend (
trainer/derrian_backend/sd_scripts/) does NOT have this patch. It only needs to be ported tolibrary/sdxl_train_util.py+ add--vae_reflectionarg.Files to change:
trainer/derrian_backend/sd_scripts/library/sdxl_train_util.py— addvae_with_reflection()+ call inload_target_model()trainer/derrian_backend/sd_scripts/train_network.py— add--vae_reflectionargservices/models/training.py— addvae_reflection: bool = Falseservices/trainers/kohya_toml.py— writevae_reflection = truefor SDXL when setVAE-EQ-2: Anima Qwen-Image VAE Reflection Padding
Priority: Nice to Have (Beta+)
Status: Needs research
The Qwen-Image VAE used by Anima is a different architecture (16-channel, 8x spatial downscale) loaded via
library/qwen_image_autoencoder_kl.py, notsdxl_train_util.py. Whether reflection padding applies and what effect it has on Anima training quality needs verification.Research needed: Check if Circlestone Labs' Anima documentation mentions EQ VAE or reflection padding. Check
qwen_image_autoencoder_kl.pyConv2d layer padding values to see if the patch would even touch anything meaningful.VAE-EQ-3: HakuLatent — Long-Horizon Research Item
Priority: Future / Research only
Status: Track, do not implement yet
Reference: https://github.com/KohakuBlueleaf/HakuLatent (Apache-2.0)
HakuLatent is KohakuBlueleaf's Python framework for training VAEs with EQ (equivariance) regularization — it is the upstream source of the EQ VAEs that VAE-EQ-1 and VAE-EQ-2 are about consuming. It applies rotation/scale/crop/affine transforms during VAE training to produce more geometry-consistent latent spaces.
What it is not: A Kohya SS plugin, a LoRA tool, or anything with a web UI integration surface. It produces better VAEs; our job is using those VAEs correctly (reflection padding).
Plausible future connection: If the project ever adds VAE fine-tuning (training or adapting a VAE on a custom dataset — e.g. improving a domain-specific VAE for a character artist's style), HakuLatent would be the correct library to wrap. This is a research-grade, long-tail feature.
Current status of the library: Active WIP, no stable releases, explicit TODO list with unfinished trainers. Not ready to integrate even if we wanted to.
When to revisit: After VAE-EQ-1 and VAE-EQ-2 land and users start asking "can I train my own EQ VAE here?"
7.2 Session Notes (2026-04-15) — Anima Audit
During an Anima support audit, the following bug was found and fixed:
FIXED:
networks.lora→networks.lora_animabug (services/trainers/kohya_toml.py)_get_network_config()was returningnetworks.lorafor all standard LoRA, including Animanetworks.lora_anima(confirmed by official docs + real training metadata)networks.lorawould train wrong layer sets entirely — silently broken outputModelType.ANIMAcheck in both the LoRA case and the default fallbackAnima support status post-fix: Complete for basic training. All required args (qwen3 path, AE path, per-layer LRs, timestep/flow args, blocks_to_swap) are wired. Default tokenizer configs (
configs/t5_old/,configs/qwen3_06b/) are bundled. Training scripts exist. One minor gap:optimizer_argsUI description says "JSON" but Kohya expects space-separatedkey=valuepairs — relevant for CAME users needingstate_storage_dtype=bfloat16 state_storage_device=cudafor 4070-class GPUs.8. Attribution Requirements
When implementing features inspired by Civitai's codebase, add to
ATTRIBUTIONS.md:9. Notes
Document maintained by: Ktiseos-Nyx-Trainer Project
All reactions