Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8adbfc5
Prepare v3.1.0 development cycle
vycdev Jun 1, 2026
aa91eb6
Add settings dialog theme preferences
vycdev Jun 8, 2026
9ce2791
Add ortho/perspective camera toggle to 3D view
Jun 9, 2026
7179d79
Move camera toggle into PreviewActions toolbar with state-aware icon
Jun 9, 2026
07e21f9
Add SEO-friendly docs URLs
vycdev Jun 9, 2026
950d515
Add desktop update settings
vycdev Jun 9, 2026
5732232
Add new screenshot of autopaint 3d mode
vycdev Jun 9, 2026
857588b
Add next-best-color suggestion with blend-aware scoring
Jun 9, 2026
8ce287a
Add extrapolation-based candidate generation to next-best-color
Jun 9, 2026
e234c55
Fix phantom-color bug in extrapolated candidate scoring
Jun 9, 2026
302c501
Fix camera clipping planes not carried over on toggle
Jun 9, 2026
7c59823
Add changelog entry and docs for orthographic camera toggle
Jun 9, 2026
c63c893
Merge branch 'develop' into ortho-camera-toggle
Bjohnson131 Jun 9, 2026
175c463
Merge pull request #32 from Bjohnson131/ortho-camera-toggle
vycdev Jun 10, 2026
069c51a
Add changelog entry and docs for orthographic camera toggle
Bjohnson131 Jun 10, 2026
88e9117
Add next-best-color suggestion feature with blend-aware analysis and …
Bjohnson131 Jun 11, 2026
042ca2c
Merge branch 'develop' into Next-best-color
Bjohnson131 Jun 11, 2026
1120186
Add Flat Paint auto-paint mode
vycdev Jun 11, 2026
08f0e6e
Enforce develop as main PR source
vycdev Jun 11, 2026
6b55485
Add cache duration to README badges
vycdev Jun 11, 2026
e2a3491
Add blend-aware candidate scoring and reset logic for next-best-color…
Bjohnson131 Jun 12, 2026
1c1392e
Refine candidate pool scoring by incorporating weighted contribution …
Bjohnson131 Jun 12, 2026
97e63cd
Remove unused blendHex function and related tests from nextBestColor …
Bjohnson131 Jun 12, 2026
8171bba
Implement camera mode persistence with localStorage
Bjohnson131 Jun 12, 2026
4055ce7
Merge branch 'develop' into 33
Bjohnson131 Jun 12, 2026
0608d72
Persist camera mode selection across page refreshes
Bjohnson131 Jun 14, 2026
0b8a9dd
Merge pull request #36 from Bjohnson131/33
vycdev Jun 15, 2026
1d6ab32
Update changelog and README to clarify next-best-color suggestion heu…
Bjohnson131 Jun 17, 2026
2511c11
Merge pull request #34 from Bjohnson131/Next-best-color
vycdev Jun 18, 2026
d01ba6d
Clarify next-best-color heuristic comments
vycdev Jun 18, 2026
810d171
Update 3.1.0 release manifest notes
vycdev Jun 18, 2026
520898d
Move next-best-color scoring to worker
vycdev Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .github/workflows/enforce-main-source-branch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Enforce main source branch

on:
pull_request:
branches:
- main
types:
- opened
- reopened
- synchronize
- edited
- ready_for_review

permissions: {}

jobs:
require_develop_into_main:
name: Require develop into main
runs-on: ubuntu-latest
steps:
- name: Only allow develop into main
if: ${{ github.head_ref != 'develop' || github.event.pull_request.head.repo.full_name != github.repository }}
run: |
echo "Pull requests into main must come from the develop branch in this repository."
exit 1
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,22 @@

All notable changes to Kromacut are documented in this file.

## v3.1.0 - unreleased

### Added

- **Orthographic camera toggle** - Added a camera toggle button to the 3D preview toolbar that switches between perspective and orthographic projection. The button shows the current mode and preserves the camera position and depth range when toggling. The selected mode persists across page refreshes.
- **Flat Paint mode (experimental)** - Added a Flat Paint option to Auto-paint that builds a uniform, face-down slab: each pixel column's layer order is reversed so the artwork sits flat against the build plate (pre-mirrored for face-down printing) under a transparent carrier layer, the back is filled with the foundation filament so every layer has the full footprint, and 3MF export merges the parts into one object per physical filament for AMS/toolchanger printers. Includes flat-mode print instructions, a performance warning for tall stacks, mutual exclusion with Smooth Meshing, and regression tests covering the layout, meshing, STL compaction, and 3MF grouping.
- **Desktop update settings** - Added desktop-only settings to manually check for updates and control whether update notices run on startup.
- **Next-best-color suggestion** — "Suggest next filament" button in the Auto-paint panel recommends the single filament addition that would most reduce the average color error (ΔE) across the image. The result card shows the suggested hex color, a recommended starting TD, an estimated ΔE improvement, the proportion of image pixels that benefit, and an isolation score. Clicking "Add to filaments" inserts the suggestion directly into the filament list with a `Kromacut-Suggestion-NN` name. This is an inventory-planning heuristic — re-run auto-paint after adding the suggestion to see the actual result.

### Changed

- **Header settings dialog** - Replaced the standalone theme toggle with a centered settings dialog that contains compact System, Dark, and Light theme options plus the current app version.
- **SEO-friendly docs URLs** - Documentation now uses real `/docs/...` URLs with per-page metadata, generated static HTML pages, a sitemap, and robots.txt output.

### Fixed

## v3.0.0 - 2026-06-01

### Added
Expand Down
21 changes: 20 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# Kromacut

[![Patreon](https://img.shields.io/badge/Patreon-Support-orange?logo=patreon&logoColor=white)](https://www.patreon.com/cw/vycdev) [![Discord](https://img.shields.io/badge/Discord-Join%20Chat-5865F2?logo=discord&logoColor=white)](https://discord.gg/nU63sFMcnX) [![YouTube](https://img.shields.io/badge/YouTube-@vycdev-red?logo=youtube&logoColor=white)](https://www.youtube.com/@vycdev) [![Release](https://img.shields.io/github/v/release/vycdev/kromacut)](https://github.com/vycdev/Kromacut/releases/latest) [![Repo size](https://img.shields.io/github/repo-size/vycdev/kromacut)](https://github.com/vycdev/Kromacut) [![Total downloads](https://img.shields.io/github/downloads/vycdev/Kromacut/total?label=total%20downloads)](https://github.com/vycdev/Kromacut/releases) [![Latest downloads](https://img.shields.io/github/downloads/vycdev/Kromacut/latest/total)](https://github.com/vycdev/Kromacut/releases/latest)
[![Patreon](https://img.shields.io/badge/Patreon-Support-orange?logo=patreon&logoColor=white)](https://www.patreon.com/cw/vycdev) [![Discord](https://img.shields.io/badge/Discord-Join%20Chat-5865F2?logo=discord&logoColor=white)](https://discord.gg/nU63sFMcnX) [![YouTube](https://img.shields.io/badge/YouTube-@vycdev-red?logo=youtube&logoColor=white)](https://www.youtube.com/@vycdev) [![Release](https://img.shields.io/github/v/release/vycdev/kromacut?cacheSeconds=3600)](https://github.com/vycdev/Kromacut/releases/latest) [![Repo size](https://img.shields.io/github/repo-size/vycdev/kromacut?cacheSeconds=3600)](https://github.com/vycdev/Kromacut) [![Total downloads](https://img.shields.io/github/downloads/vycdev/Kromacut/total?label=total%20downloads&cacheSeconds=3600)](https://github.com/vycdev/Kromacut/releases) [![Latest downloads](https://img.shields.io/github/downloads/vycdev/Kromacut/latest/total?cacheSeconds=3600)](https://github.com/vycdev/Kromacut/releases/latest)

Open-source HueForge-style tool for converting images into stacked, color-layered 3D prints.

Expand Down Expand Up @@ -176,6 +176,7 @@ Region weighting is most useful when filament budget is limited and you want the
| **Enhanced color matching** | Optimizes filament ordering for best color reproduction rather than simple luminance sorting. Uses advanced algorithms (exhaustive, simulated annealing, genetic) automatically selected based on filament count. Scoring considers weighted DeltaE accuracy, height spread, layer count, and transition waste. |
| **Allow repeated filament swaps** | (Requires Enhanced color matching) Allows a filament to appear more than once in the stack. This creates intermediate blended colors — for example, a thin white layer over red produces pink. The algorithm greedily inserts up to 4 extra swaps, each at the position that best improves the score. |
| **Height dithering** | (Requires Enhanced color matching) Applies block-aware Floyd-Steinberg error diffusion to the quantized height map. Instead of sharp stair-steps between layer heights, dithering produces a stippled gradient that simulates intermediate heights, resulting in smoother tonal transitions in the print. Edge pixels between different heights are protected from dithering to avoid staircase artifacts. |
| **Flat Paint (flat face-down print)** | Builds a uniform-thickness slab printed image-side down instead of a stepped relief. Each pixel column's layer order is reversed so the artwork sits against the build plate (already mirrored — don't mirror in the slicer) under a transparent carrier layer, and the back is filled with the foundation filament so every layer has the full footprint. The result has a smooth, glass-flat face — great for bookmarks and coasters. Requires a multi-material printer (AMS/toolchanger); export as 3MF, which contains one object per filament plus the clear carrier object. Flat Paint and Smooth Meshing toggle each other off because flat prints always use the full-footprint slab layout. |
| **Dither line width** | (Requires Height dithering) Controls the minimum dot size for the dither pattern in mm. This should roughly match your printer's line/nozzle width so dither dots are actually printable. Default: `0.42 mm`. |
| **Optimizer algorithm** | Choose which optimization algorithm to use: Auto (recommended), Exhaustive, Simulated Annealing, or Genetic. Auto selects the best algorithm based on search space size. |
| **Optimizer seed** | Set a random seed for reproducible optimizer results. Leave blank for random behavior. Useful for testing and comparing configurations. |
Expand Down Expand Up @@ -203,6 +204,24 @@ When auto-paint is active and filaments are defined, the UI displays a **Transit
- A **compressed** badge on zones that have been reduced below their ideal thickness due to a Max Height constraint.
- Total model height and total number of physical layers.

### Next-best-color suggestion

After running auto-paint, a **Suggest next filament** button appears at the bottom of the panel. Click it to run a blend-aware analysis that finds the single filament addition that would most reduce the average color error (ΔE) across the image.

The result card shows:

| Field | Description |
|---|---|
| **Hex** | Suggested filament color. |
| **Est. ΔE** | Estimated reduction in blend-aware average ΔE if this filament is added. A rough relative estimate — not a calibration confidence rating. |
| **TD** | Recommended starting Transmission Distance, borrowed from the nearest existing filament by color distance. Adjust after printing a test patch. |
| **Captures** | Percentage of image pixels whose blend-aware color error would improve with this filament. |
| **Isolation** | How far this color sits from existing filaments in perceptual color space (0–1). Higher means it fills a more distinct gap; lower means it overlaps territory already covered by blending. |

Click **Add to filaments** to insert the suggestion directly into the filament list (named `Kromacut-Suggestion-01`, `02`, etc.). You can then re-run auto-paint with the expanded set and repeat as many times as needed.

**How it works (heuristic):** The algorithm estimates how well the current filament set covers the image's color range by checking each image color against each filament and Beer-Lambert blend curve. It identifies underserved colors (those with the largest estimated error) and generates candidates from those colors plus extrapolated positions — colors that, when optically blended with an existing filament, would be closer to the underserved target. The winner is the candidate whose addition most reduces weighted-average estimated error across all image pixels. This is an inventory-planning heuristic: the improvement numbers are relative estimates, not predictions of a specific auto-paint result.

### Quick start

1. Load an image into Kromacut.
Expand Down
Binary file added content/autopaint-3d-mode.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="shortcut icon" href="/favicon.ico" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#ffffff" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="application-name" content="Kromacut" />
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"name": "kromacut",
"private": true,
"version": "3.0.0",
"version": "3.1.0",
"license": "AGPL-3.0-only",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"build": "tsc -b && vite build && node scripts/generate-docs-seo-pages.mjs",
"test": "node --no-warnings --experimental-strip-types tests/run-tests.ts",
"test:e2e": "playwright test --grep @smoke",
"test:e2e:matrix": "playwright test --grep @matrix",
Expand Down
4 changes: 2 additions & 2 deletions public/version.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "3.0.0",
"version": "3.1.0",
"download_url": "https://github.com/vycdev/Kromacut/releases/latest",
"release_notes": "Major release with AGPL licensing, in-app docs, image resize, smooth meshing improvements, and export fixes"
"release_notes": "Kromacut 3.1.0 adds orthographic preview mode, experimental Flat Paint, desktop update settings, and next-best-color filament suggestions."
}
Loading