Compare commits

...

4 Commits

Author SHA1 Message Date
naomi 8d88342fc5 release: v1.2.0
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m38s
CI / Lint & Check (push) Successful in 13m1s
CI / Build Windows (push) Successful in 26m10s
2026-04-28 14:53:49 -07:00
hikari 957ef8c84c feat: update reference sheet and refine character design prompt (#20)
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m18s
CI / Lint & Check (push) Successful in 12m37s
CI / Build Windows (push) Successful in 25m52s
## Summary

- Updates the reference image to the latest version
- Removes the barefoot/no socks instruction from the character prompt
- Clarifies that vampire fangs are only visible when the mouth is open

 This PR was created with help from Hikari~ 🌸

Reviewed-on: #20
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
2026-04-28 14:22:06 -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
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.2.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.2.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.2.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.2.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 };
};