Compare commits

..

4 Commits

Author SHA1 Message Date
hikari c705b1385a feat: update reference sheet and refine character design prompt
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m13s
CI / Lint & Check (pull_request) Successful in 12m46s
CI / Build Windows (pull_request) Successful in 26m0s
Updates the reference image to the latest version. Removes the barefoot
instruction from the character prompt and clarifies that vampire fangs
are only visible when the mouth is open.
2026-04-28 13:32:17 -07:00
naomi 5c65eb9ae5 release: v1.1.0
CI / Lint & Check (push) Successful in 13m32s
CI / Build Windows (push) Successful in 25m52s
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 2m41s
2026-04-13 21:00:16 -07:00
hikari 4776f00e51 feat: generate adjective-noun combo names for threads (#19)
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m10s
CI / Lint & Check (push) Successful in 12m45s
CI / Build Windows (push) Has been cancelled
Replaces the boring timestamp/prompt-truncation thread naming with randomly generated adjective-noun combos (e.g. *Crimson Reverie*, *Neon Phantom*, *Gilded Silence*).

50 adjectives × 50 nouns = 2,500 unique possible thread names, applied consistently across all three modes.

 This issue was created with help from Hikari~ 🌸

Reviewed-on: #19
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
2026-04-13 20:45:15 -07:00
hikari 9f45ee329d feat: add user-selectable aspect ratio and resolution per thread (#18)
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m14s
CI / Lint & Check (push) Successful in 12m50s
CI / Build Windows (push) Successful in 28m36s
## Summary

- Adds a two-step thread creation modal — step 1 picks the mode, step 2 configures generation options
- Art mode now supports user-selectable aspect ratio (1:1, 4:3, 3:4, 16:9, 9:16, 21:9)
- All three modes (Art, Avatar, Replace) now support user-selectable resolution (1K, 2K, 4K)
- Mode label in the input area reflects the chosen settings (e.g. `🩷 Art Mode (16:9) · 4K`)
- Backend cost calculation now scales with resolution
- Regenerated `icon.ico` with clean BMP-only entries to fix Windows local builds

 This PR was created with help from Hikari~ 🌸

Reviewed-on: #18
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
2026-04-13 18:24:46 -07:00
7 changed files with 119 additions and 22 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "tatsumi",
"private": true,
"version": "1.0.0",
"version": "1.1.0",
"type": "module",
"scripts": {
"dev": "vite",
+1 -1
View File
@@ -3716,7 +3716,7 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]]
name = "tatsumi"
version = "1.0.0"
version = "1.1.0"
dependencies = [
"base64 0.22.1",
"dirs 5.0.1",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "tatsumi"
version = "1.0.0"
version = "1.1.0"
description = "Tatsumi - AI art generation using Google Gemini"
authors = ["Naomi Carrigan"]
edition = "2021"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 MiB

After

Width:  |  Height:  |  Size: 17 MiB

+2 -2
View File
@@ -11,11 +11,11 @@ Character design (always required):
- Wavy ashen brown hair (colour and texture fixed; hairstyle can vary)
- Very pale skin tone
- Vibrant sky-blue eyes — important, commonly missed
- Vampire fangs
- Vampire fangs (only visible when mouth is open)
- Glasses (pink-framed preferred, other styles acceptable)
- Painted fingernails and toenails (any colour, never unpolished)
- Slender build
- Full body visible in frame; always barefoot, never wears socks
- Full body visible in frame
Composition (always required):
- Single character only
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "tatsumi",
"version": "1.0.0",
"version": "1.1.0",
"identifier": "com.naomi.tatsumi",
"build": {
"beforeDevCommand": "pnpm dev",
+113 -16
View File
@@ -25,15 +25,118 @@ import type {
Thread,
} from "./types/index.ts";
const generateThreadName = (mode: Mode, text?: string): string => {
if (
mode === "replace"
|| text === undefined
|| text.trim().length === 0
) {
return `Replace - ${new Date().toLocaleString()}`;
}
return text.trim().slice(0, 40);
const adjectives = [
"Amber",
"Ancient",
"Arctic",
"Azure",
"Blazing",
"Celestial",
"Cobalt",
"Crimson",
"Crystal",
"Dark",
"Distant",
"Ember",
"Emerald",
"Eternal",
"Ethereal",
"Fleeting",
"Frosted",
"Gilded",
"Golden",
"Hidden",
"Hollow",
"Indigo",
"Ivory",
"Jade",
"Lunar",
"Midnight",
"Mystic",
"Neon",
"Obsidian",
"Onyx",
"Opal",
"Pale",
"Pearl",
"Radiant",
"Rusted",
"Sapphire",
"Scarlet",
"Shattered",
"Silent",
"Silver",
"Spectral",
"Twilight",
"Velvet",
"Verdant",
"Veiled",
"Violet",
"Wandering",
"Wild",
"Woven",
"Arcane",
];
const nouns = [
"Abyss",
"Archive",
"Aria",
"Bloom",
"Cascade",
"Chronicle",
"Cipher",
"Compass",
"Crown",
"Dawn",
"Dream",
"Echo",
"Elegy",
"Ember",
"Equinox",
"Flame",
"Fragment",
"Garden",
"Horizon",
"Labyrinth",
"Lantern",
"Mirage",
"Mist",
"Murmur",
"Nexus",
"Nocturne",
"Oracle",
"Phantom",
"Prism",
"Requiem",
"Reverie",
"Ruin",
"Shadow",
"Shard",
"Silence",
"Solstice",
"Sonata",
"Specter",
"Storm",
"Tempest",
"Throne",
"Tide",
"Veil",
"Vortex",
"Whisper",
"Zenith",
"Sigil",
"Glyph",
"Dusk",
"Omen",
];
const generateThreadName = (): string => {
const adjectiveIndex = Math.floor(Math.random() * adjectives.length);
const nounIndex = Math.floor(Math.random() * nouns.length);
const adjective = adjectives[adjectiveIndex] ?? "Arcane";
const noun = nouns[nounIndex] ?? "Reverie";
return `${adjective} ${noun}`;
};
const generateId = (): string => {
@@ -74,13 +177,7 @@ const resolveUpdatedThread = (updatedThread: Thread): Thread => {
return updatedThread;
}
const firstTextPart = firstMessage.parts.find((part) => {
return part.type === "text";
});
const name = generateThreadName(
updatedThread.mode,
firstTextPart?.text,
);
const name = generateThreadName();
return { ...updatedThread, name };
};