summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-22 15:58:40 +0300
committerPaul Buetow <paul@buetow.org>2026-04-22 15:58:40 +0300
commit0ccc8073852895996ed70c4b2a86c460e3a3ddae (patch)
treef89e1b1bf20e551c1cce0ca745c5d29a247737d9
parent664c7d300c4a9326e5aebbd84a20cee5af829a0b (diff)
Remove weak comic style presets
-rw-r--r--README.md2
-rw-r--r--cmd/comicforge/cli.go4
-rw-r--r--config.yaml.example14
-rw-r--r--internal/comic/artist.go8
-rw-r--r--internal/comic/comic_test.go4
-rw-r--r--internal/comic/localization.go2
-rw-r--r--internal/comic/runner.go4
-rw-r--r--internal/comic/types.go48
-rw-r--r--internal/config/config.go24
-rw-r--r--internal/config/config_test.go10
-rw-r--r--internal/image/styles.go2
11 files changed, 18 insertions, 104 deletions
diff --git a/README.md b/README.md
index da21d90..f03b894 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ ComicForge turns a vocabulary file into a generated comic package. It uses Gemin
## What It Does
-ComicForge reads a vocabulary list, generates a story from those words, renders comic pages, and saves supporting files alongside the comic. By default it uses Gemini for text, image, and text-to-speech generation. When no explicit style is provided, it randomly chooses between photorealistic, classic comic, rubber-hose cartoon, 90s action, manga, cyberpunk, golden-age superhero, horror, and watercolor storybook style families.
+ComicForge reads a vocabulary list, generates a story from those words, renders comic pages, and saves supporting files alongside the comic. By default it uses Gemini for text, image, and text-to-speech generation. When no explicit style is provided, it randomly chooses between photorealistic, classic comic, rubber-hose cartoon, 90s action, manga, horror, and watercolor storybook style families.
It also supports a manual prompt mode for generating a single image directly from a prompt, without the vocabulary/story pipeline.
diff --git a/cmd/comicforge/cli.go b/cmd/comicforge/cli.go
index 168395b..d3141bf 100644
--- a/cmd/comicforge/cli.go
+++ b/cmd/comicforge/cli.go
@@ -168,8 +168,6 @@ func runCommand(ctx context.Context, cmd *cobra.Command, deps commandDeps, flags
CartoonStyles: cfg.Styles.Cartoon,
Action90sStyles: cfg.Styles.Action90s,
MangaStyles: cfg.Styles.Manga,
- CyberpunkStyles: cfg.Styles.Cyberpunk,
- GoldenAgeStyles: cfg.Styles.GoldenAge,
HorrorStyles: cfg.Styles.Horror,
WatercolorStyles: cfg.Styles.Watercolor,
Theme: flags.theme,
@@ -224,8 +222,6 @@ func runPromptCommand(ctx context.Context, cmd *cobra.Command, deps commandDeps,
CartoonStyles: cfg.Styles.Cartoon,
Action90sStyles: cfg.Styles.Action90s,
MangaStyles: cfg.Styles.Manga,
- CyberpunkStyles: cfg.Styles.Cyberpunk,
- GoldenAgeStyles: cfg.Styles.GoldenAge,
HorrorStyles: cfg.Styles.Horror,
WatercolorStyles: cfg.Styles.Watercolor,
Theme: flags.theme,
diff --git a/config.yaml.example b/config.yaml.example
index 42ea975..5f10714 100644
--- a/config.yaml.example
+++ b/config.yaml.example
@@ -57,20 +57,14 @@ styles:
- 1990s superhero comic splash-page style like a bold caped hero punching a masked villain in a city, huge muscles, spandex costumes, explosions, halftone print texture
- classic 90s action superhero cover style, oversized yellow masthead energy, caped spandex hero, armored villain, city skyline, speech balloons, Ben-Day dots
manga:
- - authentic black-and-white shonen manga page style, screentone shading, manga speed lines, large expressive eyes, sharp angular hair, impact bursts, minimal western color
- - high-energy manga action style, monochrome ink, dense screentones, exaggerated emotional close-ups, chibi reaction inset, diagonal panel rhythm
- cyberpunk:
- - cyberpunk neon comic style, rain-slick streets, glowing signage, chrome technology
- - tech-noir cyberpunk comic style, dense futuristic cityscapes, holograms, saturated neon rim lighting
- golden_age:
- - golden age superhero comic style, clean heroic poses, bright primary colors, optimistic mid-century adventure energy
- - vintage golden age comic book style, bold flat colors, classic hero staging, retro print texture
+ - true monochrome Japanese shonen manga page, black ink only with grey screentone, no western color rendering, large expressive anime eyes, sharp spiky hair silhouettes, sweat drops, impact bursts, speed-line backgrounds, exaggerated emotion close-ups, dynamic diagonal manga panel language
+ - authentic serialized manga action art, crisp black linework, dense screentone gradients, white paper highlights, hand-drawn Japanese comic energy, chibi reaction inset, dramatic sound-effect shapes, cinematic close-ups, no painterly western comic coloring
horror:
- vintage horror comic style, eerie shadows, gothic atmosphere, unsettling monsters
- creepy supernatural horror comic style, fog, haunted architecture, heavy inks
watercolor:
- - watercolor storybook comic style, soft washes, gentle ink outlines, luminous paper texture
- - delicate watercolor children's adventure style, airy backgrounds, pastel palette, soft brush edges
+ - pure transparent watercolor storybook comic style, visible cold-press paper grain, watery pigment blooms, uneven wash edges, granulation, soft bleeding colors, pale layered washes, loose pencil underdrawing, no digital airbrush, no oil-paint texture, no glossy comic coloring
+ - hand-painted watercolor children's adventure style, translucent pastel washes, wet-on-wet skies, dry-brush texture, white paper highlights, delicate ink-and-pencil outlines, puddled pigment edges, airy negative space, gentle low-contrast rendering
narration:
voices:
diff --git a/internal/comic/artist.go b/internal/comic/artist.go
index 5aeccac..f58b56f 100644
--- a/internal/comic/artist.go
+++ b/internal/comic/artist.go
@@ -25,8 +25,6 @@ type ArtistConfig struct {
CartoonStyles []string
Action90sStyles []string
MangaStyles []string
- CyberpunkStyles []string
- GoldenAgeStyles []string
HorrorStyles []string
WatercolorStyles []string
Theme string
@@ -55,8 +53,6 @@ type Artist struct {
cartoonStyles []string
action90sStyles []string
mangaStyles []string
- cyberpunkStyles []string
- goldenAgeStyles []string
horrorStyles []string
watercolorStyles []string
theme string
@@ -110,8 +106,6 @@ func NewArtist(cfg *ArtistConfig) *Artist {
a.cartoonStyles = append([]string(nil), cfg.CartoonStyles...)
a.action90sStyles = append([]string(nil), cfg.Action90sStyles...)
a.mangaStyles = append([]string(nil), cfg.MangaStyles...)
- a.cyberpunkStyles = append([]string(nil), cfg.CyberpunkStyles...)
- a.goldenAgeStyles = append([]string(nil), cfg.GoldenAgeStyles...)
a.horrorStyles = append([]string(nil), cfg.HorrorStyles...)
a.watercolorStyles = append([]string(nil), cfg.WatercolorStyles...)
a.theme = cfg.Theme
@@ -158,8 +152,6 @@ func (a *Artist) DrawComicPages(ctx context.Context, storyText, bible, titleSlug
a.cartoonStyles,
a.action90sStyles,
a.mangaStyles,
- a.cyberpunkStyles,
- a.goldenAgeStyles,
a.horrorStyles,
a.watercolorStyles,
a.styleMode,
diff --git a/internal/comic/comic_test.go b/internal/comic/comic_test.go
index 336de78..5e5058d 100644
--- a/internal/comic/comic_test.go
+++ b/internal/comic/comic_test.go
@@ -838,8 +838,6 @@ func TestDrawComicPagesUsesConfiguredStylePools(t *testing.T) {
{name: "cartoon", styleMode: styleModeCartoon, wantStyle: "cartoon-ink"},
{name: "action90s", styleMode: styleModeAction90s, wantStyle: "action-ink"},
{name: "manga", styleMode: styleModeManga, wantStyle: "manga-ink"},
- {name: "cyberpunk", styleMode: styleModeCyberpunk, wantStyle: "cyberpunk-ink"},
- {name: "goldenAge", styleMode: styleModeGoldenAge, wantStyle: "golden-age-ink"},
{name: "horror", styleMode: styleModeHorror, wantStyle: "horror-ink"},
{name: "watercolor", styleMode: styleModeWatercolor, wantStyle: "watercolor-ink"},
}
@@ -857,8 +855,6 @@ func TestDrawComicPagesUsesConfiguredStylePools(t *testing.T) {
CartoonStyles: []string{"cartoon-ink"},
Action90sStyles: []string{"action-ink"},
MangaStyles: []string{"manga-ink"},
- CyberpunkStyles: []string{"cyberpunk-ink"},
- GoldenAgeStyles: []string{"golden-age-ink"},
HorrorStyles: []string{"horror-ink"},
WatercolorStyles: []string{"watercolor-ink"},
Language: "English",
diff --git a/internal/comic/localization.go b/internal/comic/localization.go
index 941e741..c3116fc 100644
--- a/internal/comic/localization.go
+++ b/internal/comic/localization.go
@@ -58,8 +58,6 @@ func localizedStylePrompt(style, language, script string) string {
return "детска книжка с ярки, приветливи илюстрации и дебели контури"
case "painterly oil-on-canvas comic with loose brushwork and vivid impressionist colors":
return "живописен комикс с маслени щрихи и ярки импресионистични цветове"
- case "cyberpunk neon art with glowing outlines, dark backgrounds, and electric accent colors":
- return "киберпънк неонова визия с светещи контури, тъмни фонове и електрически акцентни цветове"
case "ultra-realistic DSLR photography, cinematic 35mm lens, natural lighting, hyper-detailed textures":
return "ултрареалистична фотография с кинематографичен 35 мм обектив, естествено осветление и силно детайлни текстури"
case "cinematic still photography, golden-hour lighting, shallow depth of field, photojournalism quality":
diff --git a/internal/comic/runner.go b/internal/comic/runner.go
index 500350c..f3be5d9 100644
--- a/internal/comic/runner.go
+++ b/internal/comic/runner.go
@@ -44,8 +44,6 @@ type RunnerConfig struct {
CartoonStyles []string
Action90sStyles []string
MangaStyles []string
- CyberpunkStyles []string
- GoldenAgeStyles []string
HorrorStyles []string
WatercolorStyles []string
AspectRatio string
@@ -102,8 +100,6 @@ func NewRunner(cfg *RunnerConfig) *Runner {
CartoonStyles: cfg.CartoonStyles,
Action90sStyles: cfg.Action90sStyles,
MangaStyles: cfg.MangaStyles,
- CyberpunkStyles: cfg.CyberpunkStyles,
- GoldenAgeStyles: cfg.GoldenAgeStyles,
HorrorStyles: cfg.HorrorStyles,
WatercolorStyles: cfg.WatercolorStyles,
Theme: cfg.Theme,
diff --git a/internal/comic/types.go b/internal/comic/types.go
index 5a3a111..0ef3999 100644
--- a/internal/comic/types.go
+++ b/internal/comic/types.go
@@ -95,21 +95,9 @@ var (
}
defaultMangaStyles = []string{
- "authentic black-and-white shonen manga page style, right-to-left manga energy, screentone shading, manga speed lines, large expressive eyes, sharp angular hair, sweat drops, impact bursts, Japanese comic panel language, minimal western color",
- "high-energy manga action style, monochrome ink, dense screentones, exaggerated emotional close-ups, chibi reaction inset where appropriate, motion blur lines, diagonal panel rhythm, dramatic sound-effect shapes",
- "modern manga fantasy comic style, elegant anime-inspired character designs, big eyes, spiky hair silhouettes, black ink linework, grey screentone gradients, explosive action frames, cinematic close-ups",
- }
-
- defaultCyberpunkStyles = []string{
- "cyberpunk neon comic style, rain-slick streets, glowing signage, chrome technology, high contrast shadows, electric cyan and magenta accents",
- "tech-noir cyberpunk comic style, dense futuristic cityscapes, holograms, cybernetic details, saturated neon rim lighting",
- "futuristic cyberpunk action comic style, laser-lit alleys, augmented heroes, digital glitches, saturated night colors, sharp ink silhouettes",
- }
-
- defaultGoldenAgeStyles = []string{
- "golden age superhero comic style, clean heroic poses, bright primary colors, simple confident linework, optimistic mid-century adventure energy",
- "vintage golden age comic book style, bold flat colors, classic caped hero staging, simple dramatic compositions, retro print texture",
- "1940s superhero serial comic style, square-jawed heroes, clear action, hand-lettered poster energy, bright optimistic palette",
+ "true monochrome Japanese shonen manga page, black ink only with grey screentone, no western color rendering, large expressive anime eyes, sharp spiky hair silhouettes, sweat drops, impact bursts, speed-line backgrounds, exaggerated emotion close-ups, dynamic diagonal manga panel language",
+ "authentic serialized manga action art, crisp black linework, dense screentone gradients, white paper highlights, hand-drawn Japanese comic energy, chibi reaction inset where appropriate, dramatic sound-effect shapes, cinematic close-ups, no painterly western comic coloring",
+ "modern black-and-white manga fantasy style, anime character proportions, big eyes, angular hair, thin-to-thick ink strokes, patterned screentones, motion streaks, expressive face acting, explosive action frames, minimal color accents only if unavoidable",
}
defaultHorrorStyles = []string{
@@ -119,9 +107,9 @@ var (
}
defaultWatercolorStyles = []string{
- "watercolor storybook comic style, soft washes, gentle ink outlines, luminous paper texture, warm hand-painted colors, whimsical atmosphere",
- "delicate watercolor children's adventure style, airy backgrounds, expressive simple characters, pastel palette, soft brush edges",
- "storybook watercolor fantasy comic style, transparent layered color, soft paper grain, tender expressions, dreamy illustrated settings",
+ "pure transparent watercolor storybook comic style, visible cold-press paper grain, watery pigment blooms, uneven wash edges, granulation, soft bleeding colors, pale layered washes, loose pencil underdrawing, no digital airbrush, no oil-paint texture, no glossy comic coloring",
+ "hand-painted watercolor children's adventure style, translucent pastel washes, wet-on-wet skies, dry-brush texture, white paper highlights, delicate ink-and-pencil outlines, puddled pigment edges, airy negative space, gentle low-contrast rendering",
+ "storybook watercolor fantasy comic style, washed paper texture, transparent layered color, soft backruns and blossoms, feathered brush edges, muted handmade palette, tender expressions, dreamy illustrated settings, visibly painted on paper",
}
realisticStyles = defaultRealisticStyles
@@ -129,8 +117,6 @@ var (
cartoonStyles = defaultCartoonStyles
action90sStyles = defaultAction90sStyles
mangaStyles = defaultMangaStyles
- cyberpunkStyles = defaultCyberpunkStyles
- goldenAgeStyles = defaultGoldenAgeStyles
horrorStyles = defaultHorrorStyles
watercolorStyles = defaultWatercolorStyles
@@ -149,8 +135,6 @@ const (
styleModeCartoon = "cartoon"
styleModeAction90s = "action_90s"
styleModeManga = "manga"
- styleModeCyberpunk = "cyberpunk"
- styleModeGoldenAge = "golden_age"
styleModeHorror = "horror"
styleModeWatercolor = "watercolor"
)
@@ -214,8 +198,6 @@ func pickStyleMode(forcedUltra *bool) string {
styleModeCartoon,
styleModeAction90s,
styleModeManga,
- styleModeCyberpunk,
- styleModeGoldenAge,
styleModeHorror,
styleModeWatercolor,
}
@@ -228,8 +210,6 @@ func pickStyle(
cartoonStyles,
action90sStyles,
mangaStyles,
- cyberpunkStyles,
- goldenAgeStyles,
horrorStyles,
watercolorStyles []string,
mode string,
@@ -267,22 +247,6 @@ func pickStyle(
return ""
}
return mangaStyles[rand.IntN(len(mangaStyles))]
- case styleModeCyberpunk:
- if len(cyberpunkStyles) == 0 {
- cyberpunkStyles = defaultCyberpunkStyles
- }
- if len(cyberpunkStyles) == 0 {
- return ""
- }
- return cyberpunkStyles[rand.IntN(len(cyberpunkStyles))]
- case styleModeGoldenAge:
- if len(goldenAgeStyles) == 0 {
- goldenAgeStyles = defaultGoldenAgeStyles
- }
- if len(goldenAgeStyles) == 0 {
- return ""
- }
- return goldenAgeStyles[rand.IntN(len(goldenAgeStyles))]
case styleModeHorror:
if len(horrorStyles) == 0 {
horrorStyles = defaultHorrorStyles
diff --git a/internal/config/config.go b/internal/config/config.go
index d7e7d49..9286be3 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -100,8 +100,6 @@ type StyleConfig struct {
Cartoon []string `mapstructure:"cartoon" yaml:"cartoon"`
Action90s []string `mapstructure:"action_90s" yaml:"action_90s"`
Manga []string `mapstructure:"manga" yaml:"manga"`
- Cyberpunk []string `mapstructure:"cyberpunk" yaml:"cyberpunk"`
- GoldenAge []string `mapstructure:"golden_age" yaml:"golden_age"`
Horror []string `mapstructure:"horror" yaml:"horror"`
Watercolor []string `mapstructure:"watercolor" yaml:"watercolor"`
}
@@ -160,32 +158,24 @@ func DefaultConfig() *Config {
"cinematic realism with natural light",
},
Cartoon: []string{
- "very cartoonish 1930s rubber-hose animation comic style, pie-cut eyes, white gloves, noodle arms, squash-and-stretch bodies, round heads, huge expressions, flat candy colors, simple gag staging, no realism",
- "vintage theatrical funny-animal cartoon comic style, beaks and round snouts, white gloves, oversized shoes, elastic limbs, cheerful slapstick poses, bold clean outlines, bright flat backgrounds, no realistic anatomy",
+ "extremely cartoonish 1930s rubber-hose funny-animal comic style, original mouse-and-duck-era mascot energy, pie-cut eyes, button noses or beaks, white gloves, oversized shoes, noodle arms, squash-and-stretch bodies, round heads, huge expressions, flat candy colors, simple gag staging, absolutely no realism",
+ "vintage theatrical funny-animal cartoon comic style, redesign people as original anthropomorphic mascot characters with beaks or round snouts, pie-cut eyes, white gloves, oversized shoes, elastic limbs, cheerful slapstick poses, bold clean outlines, bright flat backgrounds, no realistic anatomy",
},
Action90s: []string{
"1990s superhero comic splash-page style like a bold caped hero punching a masked villain in a city, huge muscles, spandex costumes, flowing cape, explosive impact burst, speed lines, smoke, rubble, halftone print texture, heavy black inks, saturated primary colors",
"classic 90s action superhero cover style, oversized yellow masthead energy, caped spandex hero, armored villain, clenched fists, dramatic foreshortening, city skyline, explosions, speech balloons, thick ink outlines, Ben-Day dots",
},
Manga: []string{
- "authentic black-and-white shonen manga page style, right-to-left manga energy, screentone shading, manga speed lines, large expressive eyes, sharp angular hair, sweat drops, impact bursts, Japanese comic panel language, minimal western color",
- "high-energy manga action style, monochrome ink, dense screentones, exaggerated emotional close-ups, chibi reaction inset where appropriate, motion blur lines, diagonal panel rhythm, dramatic sound-effect shapes",
- },
- Cyberpunk: []string{
- "cyberpunk neon comic style, rain-slick streets, glowing signage, chrome technology, high contrast shadows, electric cyan and magenta accents",
- "tech-noir cyberpunk comic style, dense futuristic cityscapes, holograms, cybernetic details, saturated neon rim lighting",
- },
- GoldenAge: []string{
- "golden age superhero comic style, clean heroic poses, bright primary colors, simple confident linework, optimistic mid-century adventure energy",
- "vintage golden age comic book style, bold flat colors, classic caped hero staging, simple dramatic compositions, retro print texture",
+ "true monochrome Japanese shonen manga page, black ink only with grey screentone, no western color rendering, large expressive anime eyes, sharp spiky hair silhouettes, sweat drops, impact bursts, speed-line backgrounds, exaggerated emotion close-ups, dynamic diagonal manga panel language",
+ "authentic serialized manga action art, crisp black linework, dense screentone gradients, white paper highlights, hand-drawn Japanese comic energy, chibi reaction inset where appropriate, dramatic sound-effect shapes, cinematic close-ups, no painterly western comic coloring",
},
Horror: []string{
"vintage horror comic style, eerie shadows, gothic atmosphere, unsettling monsters, dramatic candlelit contrast, suspenseful panel staging",
"creepy supernatural horror comic style, fog, haunted architecture, anxious expressions, heavy inks, sickly green and crimson accents",
},
Watercolor: []string{
- "watercolor storybook comic style, soft washes, gentle ink outlines, luminous paper texture, warm hand-painted colors, whimsical atmosphere",
- "delicate watercolor children's adventure style, airy backgrounds, expressive simple characters, pastel palette, soft brush edges",
+ "pure transparent watercolor storybook comic style, visible cold-press paper grain, watery pigment blooms, uneven wash edges, granulation, soft bleeding colors, pale layered washes, loose pencil underdrawing, no digital airbrush, no oil-paint texture, no glossy comic coloring",
+ "hand-painted watercolor children's adventure style, translucent pastel washes, wet-on-wet skies, dry-brush texture, white paper highlights, delicate ink-and-pencil outlines, puddled pigment edges, airy negative space, gentle low-contrast rendering",
},
},
Narration: NarrationConfig{
@@ -426,8 +416,6 @@ func setDefaults(v *viper.Viper, cfg *Config) {
v.SetDefault("styles.cartoon", cfg.Styles.Cartoon)
v.SetDefault("styles.action_90s", cfg.Styles.Action90s)
v.SetDefault("styles.manga", cfg.Styles.Manga)
- v.SetDefault("styles.cyberpunk", cfg.Styles.Cyberpunk)
- v.SetDefault("styles.golden_age", cfg.Styles.GoldenAge)
v.SetDefault("styles.horror", cfg.Styles.Horror)
v.SetDefault("styles.watercolor", cfg.Styles.Watercolor)
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
index 1ae967c..902f432 100644
--- a/internal/config/config_test.go
+++ b/internal/config/config_test.go
@@ -53,10 +53,6 @@ styles:
- custom 90s action
manga:
- custom manga
- cyberpunk:
- - custom cyberpunk
- golden_age:
- - custom golden age
horror:
- custom horror
watercolor:
@@ -116,12 +112,6 @@ narration:
if got, want := len(cfg.Styles.Manga), 1; got != want || cfg.Styles.Manga[0] != "custom manga" {
t.Fatalf("Styles.Manga = %#v, want %q", cfg.Styles.Manga, "custom manga")
}
- if got, want := len(cfg.Styles.Cyberpunk), 1; got != want || cfg.Styles.Cyberpunk[0] != "custom cyberpunk" {
- t.Fatalf("Styles.Cyberpunk = %#v, want %q", cfg.Styles.Cyberpunk, "custom cyberpunk")
- }
- if got, want := len(cfg.Styles.GoldenAge), 1; got != want || cfg.Styles.GoldenAge[0] != "custom golden age" {
- t.Fatalf("Styles.GoldenAge = %#v, want %q", cfg.Styles.GoldenAge, "custom golden age")
- }
if got, want := len(cfg.Styles.Horror), 1; got != want || cfg.Styles.Horror[0] != "custom horror" {
t.Fatalf("Styles.Horror = %#v, want %q", cfg.Styles.Horror, "custom horror")
}
diff --git a/internal/image/styles.go b/internal/image/styles.go
index 387760b..f118020 100644
--- a/internal/image/styles.go
+++ b/internal/image/styles.go
@@ -18,7 +18,7 @@ var ArtisticStyles = []string{
"Street Art", "Graffiti Art", "Installation Art", "Land Art",
"Conceptual Art", "Performance Art", "Video Art", "Net Art",
"Generative Art", "Algorithmic Art", "Fractal Art", "Glitch Art",
- "Vaporwave", "Synthwave", "Cyberpunk", "Steampunk",
+ "Vaporwave", "Synthwave", "Steampunk",
"Fantasy Art", "Science Fiction Art", "Horror Art", "Gothic Art",
"Anime", "Manga", "Comic Book Art", "Cartoon",
"Caricature", "Editorial Illustration", "Children's Book Illustration", "Fashion Illustration",