StickerCraft is a small web app for creating anime character presets and generating chibi stickers and extra images with the OpenAI Images API. Build a base reference once, then keep generating assets from it.
This project was created specifically for the OpenAI Community Dev Challenge.
- Turns a character idea into usable assets quickly without manual drawing.
- Keeps everything in one flow: create a reference, then generate stickers and images from it.
- Lets you generate lots of content with your character through a convenient interface.
- Stores metadata and files locally, so results are easy to find and reuse.
- Provides a simple API for integrating into other tools or pipelines.
- Create and save base references (anime, full body, neutral T-pose).
- Upload a preset image instead of generating one.
- Edit an existing reference with a text prompt.
- Generate chibi stickers from emotion prompts.
- Generate extra images using a custom prompt plus optional helper image.
- Local storage for metadata and files; images are served from
/files/....
- Create a base reference from text or an upload.
- The app stores metadata in
storage/db.jsonand files instorage/files. - Generate stickers or extra images as needed.
- The chibi preset is created on demand when the first sticker is generated.
- All images are accessible via
/files/....
Note: Place screenshots in screenshots/ using the filenames below.
This is the entry point to create or select a reference.
Describe a character or upload a base image.
View the base preset and apply edits.
Generate single chibi stickers from emotion prompts.
Generate extra images with ratio, quality, background, and optional helper image.
- Backend: Node.js + Express
- Frontend: vanilla HTML/CSS/JS (served by Express)
- Images: OpenAI Images API (default model
gpt-image-1.5)
- Install deps:
npm install - Copy env:
cp .env.example .env - Set your key:
OPENAI_API_KEY=... - Start:
npm run dev - Open:
http://localhost:3000
OPENAI_API_KEY(required) - OpenAI API key.PORT(default3000) - server port.OPENAI_BASE_URL(defaulthttps://api.openai.com/v1) - API base URL.IMAGE_MODEL(defaultgpt-image-1.5) - image model.
storage/db.json- local metadata DB.storage/files/- all generated and uploaded images:references/<id>/base.*- base reference.references/<id>/chibi.png- chibi preset.stickers/<id>/...- stickers.generations/<id>/...- extra generations.
storage/uploads/- temp uploads (removed after processing).
GET /api/health- server health check ({ ok: true }).GET /api/config- client config (image sizes, model).GET /api/emojis- list of emojis and emotion prompts.
GET /api/references- list all references.GET /api/references/:id- reference plus related assets.POST /api/reference(multipart/form-data) - create a reference:description(string, optional ifimageis provided)image(file, optional)- returns
{ reference }
POST /api/reference/upload(multipart/form-data) - upload a reference without generation:description(string, optional)image(file, required)- returns
{ reference }
POST /api/reference/:id/edit(JSON) - edit an existing reference:{ "prompt": "new description or changes" }- returns
{ reference }
POST /api/sticker(JSON) - single sticker:{ "referenceId": "...", "emoji": "<emoji>", "emotionPrompt": "optional override" }- returns
{ sticker }
DELETE /api/sticker/:referenceId/:id- delete a sticker.
POST /api/generate(multipart/form-data):referenceId(string, required)prompt(string, optional)quality(low|medium|high|auto, defaultmedium)background(transparent|opaque|auto, defaultauto)ratio(square|portrait|landscape|auto, defaultauto)n(1-5, default1)image(file, optional) - helper input image- returns
{ generations }
PATCH /api/generate/:referenceId/:id- update caption:{ "caption": "..." }- returns
{ generation }
DELETE /api/generate/:referenceId/:id- delete a generation.
- Uploads: PNG/JPG/WEBP, up to 10 MB.
- PNG is recommended for base references.
- All images are served from
/files/...and stored instorage/files.
- Include colors, outfit, and overall vibe.
- Short and specific prompts are more stable.
- Use
/api/reference/:id/editto refine while keeping identity.




