Your Character Prompt Base
Type a profession, role, or character idea...
💡 100% free • No sign-up • Your data stays local
Type what you're creating - profession, role, character type:
You'll be asked 7 questions:
As you answer, watch your character build in real-time in the preview box at the top.
Each character card has buttons:
⬇ Export JSON:
figura-library.json⬇ Export TXT:
figura-library.txt⬇ Export CSV:
figura-library.csv⬆ Import JSON:
🗑 Clear All:
⚠️ IMPORTANT: Your data is stored in your browser only!
What this means:
Recommended:
Copy prompts and use them in any AI image generation tool:
You can also:
My characters disappeared!
Import isn't working!
Can't save characters!
For developers who want to add new question categories or expand existing options.
This guide is for editing the HTML/JavaScript source code. You'll need:
Figura uses two JavaScript arrays that must match exactly:
1. questions array - What users see (buttons)
const questions = [
{
id: 'ethnicity',
text: '> Ethnicity?',
prompt: 'Cultural background or heritage:',
buttons: ['South Asian', 'East Asian', 'Black', ...]
}
];
2. randomOptions object - What random button picks from
const randomOptions = {
ethnicity: ['South Asian', 'East Asian', 'Black', ...]
};
⚠️ Critical: Both arrays must have matching options (spelling, capitalization)!
Step 1: Find the ethnicity question in the questions array:
{
id: 'ethnicity',
text: '> Ethnicity?',
prompt: 'Cultural background or heritage:',
buttons: [
'South Asian',
'East Asian',
'Black',
'Hispanic',
'White',
'Middle Eastern',
'Mixed',
'Pacific Islander', // ADD HERE
'🎲 Random'
]
}
Step 2: Add to randomOptions.ethnicity:
const randomOptions = {
ethnicity: [
'South Asian',
'East Asian',
'Black',
'Hispanic',
'White',
'Middle Eastern',
'mixed heritage',
'Pacific Islander' // ADD HERE (exact match!)
],
// ... other options
};
Step 3: Save file and test:
Step 1: Add to questions array (after existing questions):
const questions = [
// ... existing questions ...
{
id: 'accessories',
text: '> Accessories?',
prompt: 'What items or accessories?',
buttons: [
'Glasses',
'Hat',
'Jewelry',
'Watch',
'Scarf',
'None',
'🎲 Random'
]
}
];
Step 2: Add to randomOptions:
const randomOptions = {
// ... existing options ...
accessories: [
'wearing glasses',
'wearing hat',
'wearing jewelry',
'wearing watch',
'wearing scarf',
'no accessories'
]
};
Step 3: Update assemblePrompt() function:
Find this function and add your new field:
function assemblePrompt(isFinal = true) {
let parts = [];
// ... existing assembly code ...
// Add your new field
if (characterData.accessories) {
parts.push(characterData.accessories);
}
// ... rest of function
}
Step 4: Update progress dots (optional):
Progress dots auto-update based on questions.length, so no changes needed!
Before deploying changes:
❌ Spelling Mismatch
buttons: ['South Asian'] randomOptions: ['SouthAsian'] // WRONG - no space!
Result: Random button won't include this option
❌ Case Mismatch
buttons: ['Black'] randomOptions: ['black'] // WRONG - lowercase!
Result: Random button won't include this option
❌ Forgot randomOptions
// Added to buttons but not randomOptions buttons: ['New Option', '🎲 Random'] // randomOptions missing this option
Result: Random button won't pick new option
❌ Forgot assemblePrompt update
// Added new question but didn't update assemblePrompt() // New data collected but not used in final prompt
Result: New question asked but doesn't appear in final prompt
The assemblePrompt() function controls how your final prompt is built.
function assemblePrompt(isFinal = true) {
let parts = [];
// Build profession part with modifiers
if (characterData.profession) {
let profPart = '';
if (characterData.age) profPart += characterData.age + ' ';
if (characterData.ethnicity) profPart += characterData.ethnicity + ' ';
if (characterData.gender) profPart += characterData.gender + ' ';
profPart += characterData.profession;
parts.push(profPart);
}
// Add other attributes
if (characterData.build) parts.push(characterData.build + ' build');
if (characterData.hair) parts.push(characterData.hair);
if (characterData.mood) parts.push(characterData.mood);
if (characterData.setting) parts.push(characterData.setting);
// Join with commas
let prompt = parts.join(', ');
// Add prefix/suffix if final
if (isFinal) {
prompt = 'Photorealistic portrait of ' + prompt +
', professional photography, 8K resolution, natural lighting, highly detailed';
}
return prompt;
}
Before making changes:
figura-v1.0-backup.htmlIf you're stuck:
This guide covers the basics. For advanced customization (multiple libraries, different art styles, etc.), you'll need to extend the codebase significantly.
We don't collect, store, or sell your data. Everything stays on your device.
All your characters are stored in your browser only. We never see what you create.
Free to use. No guarantees. Don't be evil.
If the service is not running, it's not running. That's it.
We're creators who kept getting stuck on demographics when making AI image prompts.
What age? What ethnicity? What body type? We built Figura.wiki to fix it.