195 Commits
Author SHA1 Message Date
google-labs-jules[bot] 6e5c303650 Update model recommendations in READMEs (#62)
- Update `README.md` to recommend "Nano Banana (non-Pro)" for Asset Extraction, with "Nano Banana Pro" as a fallback.
- Update `README_CN.md` with the same recommendation translated into Chinese.
- Fix typo "Nanao" to "Nano" in `README_CN.md` and ensure consistent use of "Nano Banana Pro".

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-02-22 17:31:20 +08:00
google-labs-jules[bot] 31771d0ffa feat: Add EnlargableImage component for ExtractionStage (#61)
- Created `EnlargableImage` component in `src/ui/components/EnlargableImage.tsx`.
- Updated `ExtractionStage` to use `EnlargableImage` for displaying extraction results.
- Supports full-screen image viewing with zoom-in/out cursors and click-to-close behavior.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-02-22 17:15:47 +08:00
google-labs-jules[bot]andyiling ji a44ab5168d Refactor Extractor Workflow (#60)
* Refactor Extractor workflow to use atomic extraction

* Refactor Extractor workflow to use atomic extraction

* Refactor Extractor workflow to use atomic, sequential extraction

* fix(extractor): resolve overflow issues in SelectionStage

- Constrain `ScrollArea` in `SelectionStage` with `min-h-0` to ensure proper scrolling within flex container.
- Add `overflow-hidden` to `SelectionStage` container.
- Add `overflow-hidden` to `ExtractorDialog` content area to prevent content spillover.
- Ensure header in `SelectionStage` does not shrink (`shrink-0`).

* fix: ensure equipment is updated on re-extraction

- Verified that `src/api/extract.ts` uses `equipmentService.updateEquipment` when `previousEquipmentId` is provided.
- Confirmed that `src/service/equipment.ts` performs an SQL UPDATE and cleans up the old asset file.
- No new code changes were needed as the previous submission already covered this requirement.

* fix: use default extract model in re-extract dialog

- Updated `ExtractorDialog` to fetch `default_extract_model` from settings.
- Passed `defaultModel` to `ExtractionStage`.
- Updated `ExtractionStage` to initialize the re-extract model selection with `defaultModel`.

* fix: correct setting key for default extract model

- Updated `ExtractorDialog` to use `step_refine_model` instead of `default_extract_model` to fetch the default extraction model from settings, as confirmed by the `ExtractionFlowDesigner` configuration.

* fix: update extraction stage layout and buttons

- Enforced a square aspect ratio for the image container in extraction cards using `aspect-square`.
- Removed the "Cancel" button from the footer in `ExtractionStage`.
- Updated the footer to be always visible.
- Changed the "Finish" button to display "Extracting..." and be disabled while extraction is in progress, and "Finish" when complete.

* fix: resolve lint errors and refine extraction UI

- Removed unused `onCancel` prop from `ExtractionStage` to fix linting error.
- Updated `ExtractorDialog` to remove the unused `onCancel` callback passed to `ExtractionStage`.
- Ensured consistent image sizing (square aspect ratio) in extraction cards.
- Refined footer behavior to always show actions, with dynamic "Extracting..." state.

* refine ui

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: yiling ji <njjyl723@gmail.com>
2026-02-22 16:37:03 +08:00
Yiling-J e8952c43c3 Fix spelling error in image generation section
Corrected the spelling of 'Nanao' to 'Nano' in image generation recommendations.
2026-02-20 13:32:08 +08:00
google-labs-jules[bot] 8421238d79 fix(build): use absolute paths for built assets (#59)
Configures `Bun.build` with `publicPath: '/'` to ensure that generated script and style tags in `index.html` use absolute paths (e.g., `/chunk-....js`). This fixes "Failed to load module script" errors when accessing the application via deep links (e.g., `/characters/...`) in production environments where the browser would otherwise attempt to load assets relative to the nested path.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-02-20 12:56:32 +08:00
google-labs-jules[bot] b99d1c6e06 Add Chinese README and language switcher (#58)
* Add Chinese README and language switcher

* Add Chinese README and language switcher

* Update READMEs with model recommendation for Refine Asset step

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-02-20 11:28:54 +08:00
Yiling-J cef04fb60b Revise model recommendations in README
Updated model recommendations for equipment extraction, character generation, and image generation. Added notes on budget-friendly alternatives and potential limitations of non-Pro models.
2026-02-20 10:51:04 +08:00
yiling ji 408c780591 remove demo video 2026-02-20 10:42:20 +08:00
Yiling-J c971523958 Add video element to README for character forging
Added a video element to showcase character forging.
2026-02-20 10:40:48 +08:00
yiling ji 7d185c33c7 add demo video 2026-02-20 10:29:07 +08:00
google-labs-jules[bot] 7b5ff3d4b1 feat: fix RefineStage overflow and update extraction prompts (#57)
- Fix `RefineStage` overflow by applying `overflow-hidden` to the parent container and `min-h-0` to the `ScrollArea`.
- Update `generateTextureSheet` to use Chroma Green background.
- Update `refineAsset` prompt to extract the main equipment into a white background, using name and description for context.
- Update tests and API to support these changes.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-02-20 10:18:12 +08:00
yiling ji 3b2913c435 force image generation to be square 2026-02-19 20:34:53 +08:00
Yiling-J 47da84f986 Simplify SQLite setup instructions in AGENTS.md
Removed redundant information about SQLite database configuration and environment variables.
2026-02-19 17:31:49 +08:00
Yiling-J 1573978f73 Simplify requirements section in README 2026-02-19 17:30:19 +08:00
google-labs-jules[bot]andyiling ji 32324464b0 Update Look Details Dialog with Image Zoom and Scrollable List (#54)
* Update Look Details Dialog with image zoom and scrollable list

* add missing migration

* minor change

* fix test

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: yiling ji <njjyl723@gmail.com>
2026-02-19 17:27:34 +08:00
yiling ji b726965678 fix fitting room ui 2026-02-19 16:07:15 +08:00
google-labs-jules[bot] f7af709826 Simplify extraction grid dimensions logic (#52)
- Updated `getGridDimensions` in `src/service/extraction.ts` to use a 2x2 grid for 4 or fewer assets, and a 3x3 grid otherwise.
- Updated `src/service/extraction.test.ts` to reflect the new grid dimensions in the `cropAssets` test.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-02-19 16:04:32 +08:00
google-labs-jules[bot] 7121ea4084 Fix scanline animation race condition in AnalyzeStage (#51)
Renamed the keyframes in `AnalyzeStage.tsx` to `scanline-analyze` to prevent conflict with the global `scanline` animation.
Also removed unused `scanline` keyframes from `RefineStage.tsx` to avoid potential future conflicts.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-02-19 15:53:25 +08:00
yiling ji c2ff4604a6 update sidebar icon 2026-02-19 15:48:51 +08:00
google-labs-jules[bot] 9758a7785e Use OpenAI Image Edit API for generation (#50)
* feat(ai): use OpenAI Image Edit API instead of Responses API

Replaces the deprecated/unofficial Responses API usage for image generation with the standard `client.images.edit` API.
This change supports multi-image inputs and follows the user's provided example for `gpt-image-1.5` model compatibility.

- Updates `generateImageOpenAI` in `src/service/ai.ts` to use `client.images.edit`.
- Handles conversion of text prompts and inline/reference images to the required format using `toFile`.
- Updates `src/service/ai.test.ts` to mock the new API call and verify correct behavior.

* feat(ai): use OpenAI Image Edit API instead of Responses API

Replaces the deprecated/unofficial Responses API usage for image generation with the standard `client.images.edit` API.
This change supports multi-image inputs and follows the user's provided example for `gpt-image-1.5` model compatibility.

- Updates `generateImageOpenAI` in `src/service/ai.ts` to use `client.images.edit`.
- Removes `response_format` parameter as it's not supported/needed for GPT image models (which default to base64).
- Handles conversion of text prompts and inline/reference images to the required format using `toFile`.
- Updates `src/service/ai.test.ts` to mock the new API call and verify correct behavior.

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-02-19 15:42:59 +08:00
google-labs-jules[bot]andyiling ji 3209e088e5 Fix toast visibility and Create Look dialog error handling (#49)
* Fix toast visibility z-index issue and Create Look dialog error handling

- Moved `<Toaster />` outside of `SidebarProvider` in `Layout.tsx` and increased z-index to ensure toasts appear above dialog overlays.
- Updated `CreateLookDialog.tsx` to use `toast.error()` for API errors instead of displaying them inline at the bottom of the dialog.

* Fix Extractor error handling, toast visibility, and Create Look dialog errors

- Updated `ExtractorDialog.tsx` to reset the stage to `'selection'` on refinement error, preventing infinite loading.
- Updated `CreateLookDialog.tsx` to use `toast.error()` for API errors instead of inline text.
- Moved `<Toaster />` in `Layout.tsx` outside of `SidebarProvider` to ensure toasts appear above dialog overlays.
- Ensured `package.json` and `sonner.tsx` remain clean (reverted temporary changes).

* fix sonner

* fix lint

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: yiling ji <njjyl723@gmail.com>
2026-02-19 13:45:58 +08:00
Yiling-J 308d1d4f58 Merge pull request #47 from Yiling-J/update-github-icon-13733616666157520181
Refactor GitHub icon to Icons component and resize
2026-02-19 12:40:27 +08:00
google-labs-jules[bot] fe67119b50 Refactor GitHub icon to Icons component and resize
- Moved `GithubIcon` to `src/ui/components/Icons.tsx` as `Icons.Github`.
- Updated `src/ui/Layout.tsx` to use the new `Icons.Github` component.
- Increased icon size to `h-7 w-7`.
- Deleted `src/ui/components/GithubIcon.tsx`.
2026-02-19 04:35:08 +00:00
Yiling-J e73def39dc Merge pull request #46 from Yiling-J/refactor-settings-api-masking-and-cleanup-7139160603327351483
Refactor: API Key masking, settings UI improvements, and subCategory removal
2026-02-19 11:20:44 +08:00
yiling ji cd7fc8735b minor ui change 2026-02-19 11:18:58 +08:00
google-labs-jules[bot] 83b6c497e2 Refactor: API Key masking, settings UI improvements, and subCategory removal
- Removed `subCategory` field from Equipment model (DB), API, and UI.
- Generated Prisma migration `20260219022619_remove_subcategory_and_update_settings`.
- Implemented API Key masking (******) in settings service and UI.
- Updated Settings page to show 'Saved' state for API Key/URL buttons.
- Renamed 'Extraction Flow Defaults' to 'Default Models' in Settings.
- Fixed Fitting Room scrolling issue by adding `min-h-0` constraints.
- Updated tests and verifying scripts.
2026-02-19 02:35:28 +00:00
Yiling-J bbd1fd320c Update README.md 2026-02-19 09:36:36 +08:00
Yiling-J 9c139d5bfb Merge pull request #45 from Yiling-J/feat-add-download-option-4326109535126942932
Add download option to cards
2026-02-18 22:53:07 +08:00
google-labs-jules[bot] bb4f6f61fb feat: add download option to VibeCard and Fitting Room looks
- Added download option to VibeCard dropdown menu when an image is present.
- Added download option to Fitting Room generated look card dropdown menu.
- Implemented client-side download logic using temporary anchor tag.
- Verified with typecheck and tests.
2026-02-18 14:44:27 +00:00
Yiling-J a88422aca4 Merge pull request #44 from Yiling-J/update-docker-config-12796957791026376751
Update Docker Compose to use latest image and add standalone run instructions
2026-02-18 22:19:54 +08:00
google-labs-jules[bot] 7da8e28f32 Update Docker Compose to use latest image and add standalone run instructions to README
- Updated `docker-compose.yml` to pull `yilingj/forgery:latest` instead of building locally.
- Updated `README.md` with instructions for using Docker Compose with the pre-built image.
- Added instructions for standalone `docker run` execution in `README.md`.
2026-02-18 13:19:56 +00:00
yiling ji a890555c4e remove sha tag from dockerhub 2026-02-18 21:05:47 +08:00
Yiling-J 6411eb1e68 Merge pull request #43 from Yiling-J/chore-add-release-workflow-7734661522119203214
Add Release Workflow for Docker Hub
2026-02-18 21:00:49 +08:00
google-labs-jules[bot] 068dc39d39 chore: add release workflow for docker hub
- Added `.github/workflows/release.yml` for multi-platform Docker builds.
- Configured triggers for `main` branch pushes and `v*` tags.
- Uses `docker/metadata-action` for tagging:
  - `latest` is only updated on semantic version tags (e.g., `v1.0.0`).
  - `main` branch pushes are tagged with `main` and commit SHA.
- Supports `linux/amd64` and `linux/arm64`.
- Uses hardcoded `yilingj` username and `DOCKERHUB_TOKEN` secret.
2026-02-18 12:59:14 +00:00
google-labs-jules[bot] e7bdaf75d2 chore: add release workflow for docker hub
- Added `.github/workflows/release.yml` for multi-platform Docker builds.
- Configured triggers for `main` branch pushes and `v*` tags.
- Uses `docker/metadata-action` for tagging:
  - `latest` is only updated on semantic version tags (e.g., `v1.0.0`).
  - `main` branch pushes are tagged with `main` and commit SHA.
- Supports `linux/amd64` and `linux/arm64`.
- Requires `DOCKERHUB_USERNAME` and `DOCKERHUB_TOKEN` secrets.
2026-02-18 12:47:53 +00:00
google-labs-jules[bot] 7aca5c1ff9 chore: add release workflow for docker hub
- Added `.github/workflows/release.yml` to build and push Docker images to Docker Hub.
- Configured trigger on `push` to `main` branch and `v*` tags.
- Enabled multi-platform builds for `linux/amd64` and `linux/arm64`.
- Uses `docker/metadata-action` for automatic tagging (`latest`, semver).
- Requires `DOCKERHUB_USERNAME` and `DOCKERHUB_TOKEN` secrets.
2026-02-18 12:31:11 +00:00
yiling ji cc086fec3a fix docker build 2026-02-18 19:53:18 +08:00
Yiling-J 5095881cc1 Merge pull request #42 from Yiling-J/update-outfit-ui-grid-2148683806176639834
Enhance Outfit List UI and Edit Functionality
2026-02-18 15:29:35 +08:00
google-labs-jules[bot] b292548d6e Improve Outfit List and Create Outfit Dialog UI 2026-02-18 07:22:46 +00:00
google-labs-jules[bot] 1761bed9ce feat(ui): Enhance Outfit list UI and add Edit functionality
- Update `VibeCard` to support custom `children` content and ensure text readability with a gradient overlay.
- Refactor Outfit list in `Equipments.tsx` to use a grid of `VibeCard` components.
- Implement a 3x3 equipment preview grid inside Outfit cards, with overflow (+N) handling.
- Center the preview grid to 80% height as per design requirements.
- Update `CreateOutfitDialog` to support editing existing outfits (PUT request).
- Change category selection in `CreateOutfitDialog` to single-select.
- Update equipment selection grid in `CreateOutfitDialog` to fixed 3 columns.
- Add "Edit" action to Outfit cards.
2026-02-18 05:07:13 +00:00
Yiling-J d712452645 Add MIT License to the project 2026-02-18 12:35:09 +08:00
Yiling-J 69c56d064b Merge pull request #41 from Yiling-J/fix-fitting-room-and-extractor-save-14637309535569615021
Fix Fitting Room overflow and add Save as Outfit to Extractor
2026-02-18 12:22:07 +08:00
yiling ji 82aa28000a update ui 2026-02-18 12:21:07 +08:00
google-labs-jules[bot] 599f566f80 Remove verification artifacts
- Deleted `verification/fitting_room_v2.png`
- Deleted `verification/verify_fitting_room_v2.py`
2026-02-18 03:24:08 +00:00
google-labs-jules[bot] 219d9224d0 Fix Fitting Room UI, add Extractor outfit save, update Dockerfile
- Fitting Room:
  - Constrain page height to viewport.
  - Use `ScrollArea` for "Generated Looks".
  - Ensure character image uses `object-contain` and empty state is centered.
- Extractor:
  - Add "Save as Outfit" checkbox and name input to `RefineStage`.
  - Implement API call to create outfit upon completion.
- Dockerfile:
  - Copy `example-data` directory to final image.
2026-02-18 03:05:10 +00:00
google-labs-jules[bot] 7f12e5f909 Fix Fitting Room overflow and add Save as Outfit to Extractor
- Fixed Fitting Room page overflow by constraining height and using ScrollArea for the Generated Looks section.
- Added "Save as Outfit" checkbox and input to the Refine stage of the Extractor dialog.
- Installed @radix-ui/react-checkbox and added Shadcn Checkbox component.
- Updated Dockerfile to include example-data directory in the final image.
2026-02-18 02:50:22 +00:00
yiling ji 9eaf136550 add example data 2026-02-18 10:12:35 +08:00
Yiling-J 2ea634090d Merge pull request #40 from Yiling-J/refactor-poses-expressions-db-14152250609701592538
Refactor Poses and Expressions to be Database-Driven
2026-02-17 17:24:53 +08:00
google-labs-jules[bot] 58fd8fa537 Refactor poses and expressions to be fully database-driven
- Removed hardcoded `BUILTIN_POSES` and `BUILTIN_EXPRESSIONS` constants.
- Updated `PoseService` and `ExpressionService` to only list and delete items from the database.
- Removed the `type` field ('builtin' | 'custom') from `PoseItem` and `ExpressionItem`.
- Updated `GenerationService` to resolve pose and expression assets strictly from the database (`data/files`) instead of falling back to `public/`.
- Updated `Poses.tsx` and `Expressions.tsx` to remove "SYSTEM" vs "CUSTOM" UI distinction and enable deletion for all items.
- Updated `pose.test.ts` and created `expression.test.ts` to verify the new behavior.
- Fixed `generation.test.ts` to mock database calls correctly for pose/expression lookups and avoid polluting other tests.
2026-02-17 09:18:04 +00:00
google-labs-jules[bot] 14d23144c4 Refactor poses and expressions to be fully database-driven
- Removed hardcoded `BUILTIN_POSES` and `BUILTIN_EXPRESSIONS` constants.
- Updated `PoseService` and `ExpressionService` to only list and delete items from the database.
- Removed the `type` field ('builtin' | 'custom') from `PoseItem` and `ExpressionItem`.
- Updated `GenerationService` to resolve pose and expression assets strictly from the database (`data/files`) instead of falling back to `public/`.
- Updated `Poses.tsx` and `Expressions.tsx` to remove "SYSTEM" vs "CUSTOM" UI distinction and enable deletion for all items.
- Updated `pose.test.ts` and created `expression.test.ts` to verify the new behavior.
2026-02-17 04:59:16 +00:00