Flow Auto-Pilot: trusted-CDP input driver, local queue server, 91-prompt bank
DOM automation for Google Labs Flow — background worker injects trusted input via the DevTools Protocol (Flow's editor ignores synthetic events), polls a local queue, harvests generated asset URLs. Includes the generated game+promo prompt bank. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
commit
7ae0a73db0
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
# python
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# local runtime output (harvested URLs)
|
||||
results.jsonl
|
||||
|
||||
# saved SPA pages can embed auth tokens / cookies — never commit
|
||||
Google Flow*.html
|
||||
flow_live.html
|
||||
*_files/
|
||||
|
||||
.DS_Store
|
||||
57
background.js
Normal file
57
background.js
Normal file
@ -0,0 +1,57 @@
|
||||
// Background service worker: performs TRUSTED input via the Chrome DevTools Protocol.
|
||||
// Flow's agent editor ignores synthetic DOM events (isTrusted=false) — the text shows
|
||||
// but the app's state stays empty ("no prompt" on send). CDP Input.* events are trusted,
|
||||
// so the framework actually registers them. Requires the "debugger" permission; the user
|
||||
// sees a "started debugging this browser" banner while it runs (expected).
|
||||
|
||||
const attached = new Set();
|
||||
|
||||
function attach(tabId) {
|
||||
return new Promise((res, rej) =>
|
||||
chrome.debugger.attach({ tabId }, '1.3', () =>
|
||||
chrome.runtime.lastError ? rej(chrome.runtime.lastError) : res()));
|
||||
}
|
||||
function cmd(tabId, method, params) {
|
||||
return new Promise((res, rej) =>
|
||||
chrome.debugger.sendCommand({ tabId }, method, params || {}, (r) =>
|
||||
chrome.runtime.lastError ? rej(chrome.runtime.lastError) : res(r)));
|
||||
}
|
||||
async function ensure(tabId) {
|
||||
if (attached.has(tabId)) return;
|
||||
try { await attach(tabId); attached.add(tabId); }
|
||||
catch (e) {
|
||||
// "Another debugger is already attached" => DevTools open on the tab; treat as attached-ish
|
||||
if (/already attached/i.test(String(e.message || e))) attached.add(tabId);
|
||||
else throw e;
|
||||
}
|
||||
}
|
||||
|
||||
const ENTER = { key: 'Enter', code: 'Enter', windowsVirtualKeyCode: 13, nativeVirtualKeyCode: 13 };
|
||||
|
||||
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
|
||||
const tabId = sender.tab && sender.tab.id;
|
||||
(async () => {
|
||||
try {
|
||||
if (!tabId) throw new Error('no tab id');
|
||||
await ensure(tabId);
|
||||
if (msg.type === 'insertText') {
|
||||
await cmd(tabId, 'Input.insertText', { text: msg.text });
|
||||
sendResponse({ ok: true });
|
||||
} else if (msg.type === 'pressEnter') {
|
||||
await cmd(tabId, 'Input.dispatchKeyEvent', { type: 'keyDown', ...ENTER });
|
||||
await cmd(tabId, 'Input.dispatchKeyEvent', { type: 'keyUp', ...ENTER });
|
||||
sendResponse({ ok: true });
|
||||
} else if (msg.type === 'detach') {
|
||||
if (attached.has(tabId)) { chrome.debugger.detach({ tabId }, () => {}); attached.delete(tabId); }
|
||||
sendResponse({ ok: true });
|
||||
} else {
|
||||
sendResponse({ ok: false, error: 'unknown message' });
|
||||
}
|
||||
} catch (e) {
|
||||
sendResponse({ ok: false, error: String(e.message || e) });
|
||||
}
|
||||
})();
|
||||
return true; // keep the message channel open for the async response
|
||||
});
|
||||
|
||||
chrome.debugger.onDetach.addListener((src) => { if (src.tabId) attached.delete(src.tabId); });
|
||||
268
content.js
Normal file
268
content.js
Normal file
@ -0,0 +1,268 @@
|
||||
// Flow Auto-Pilot v2 — drives the Google Flow AGENT panel and HARVESTS outputs.
|
||||
//
|
||||
// Reuses DEALGOD's "poll until the SPA settles" discipline (waitForStable), NOT its
|
||||
// full selector-discovery engine — Flow is one known page, not the open web, so
|
||||
// auto-recipe/variance scoring would be over-engineering here.
|
||||
//
|
||||
// Loop: poll local queue -> type prompt into the agent box -> submit ->
|
||||
// wait for a NEW asset to appear + the media grid to stop growing ->
|
||||
// harvest the new video/image URL(s) -> report them back to the queue.
|
||||
//
|
||||
// Prereq you set ONCE by hand in Flow: Agent settings -> Confirm before generating
|
||||
// = "Never", model + x4 defaults. The driver still clicks a confirm button if one
|
||||
// shows up (covers both modes), but "Never" is what makes it truly unattended.
|
||||
|
||||
let settings = {
|
||||
serverUrl: 'http://localhost:8017',
|
||||
isRunning: false,
|
||||
// Optional CSS overrides — leave blank to use the resilient generic finders.
|
||||
promptSel: '',
|
||||
submitSel: '',
|
||||
resultSel: '', // scope for harvesting (e.g. the media library container)
|
||||
pollInterval: 4000,
|
||||
genTimeoutMs: 8 * 60 * 1000 // Veo clips can take minutes
|
||||
};
|
||||
|
||||
let pollTimeout = null;
|
||||
let generationInProgress = false;
|
||||
|
||||
function init() {
|
||||
chrome.storage.local.get(settings, (data) => {
|
||||
settings = { ...settings, ...data };
|
||||
log('system', `Content script connected (${settings.isRunning ? 'ACTIVE' : 'idle'}).`);
|
||||
if (settings.isRunning) startPolling();
|
||||
});
|
||||
}
|
||||
|
||||
// ---- helpers -------------------------------------------------------------
|
||||
|
||||
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
|
||||
const visible = (el) => !!el && el.offsetWidth > 0 && el.offsetHeight > 0;
|
||||
|
||||
// Poll a predicate until truthy or timeout. Returns the truthy value or null.
|
||||
async function waitFor(pred, maxMs = 15000, step = 400) {
|
||||
const t0 = Date.now();
|
||||
while (Date.now() - t0 < maxMs) {
|
||||
let v; try { v = pred(); } catch (_) { v = null; }
|
||||
if (v) return v;
|
||||
await sleep(step);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// DEALGOD discipline: call countFn() every `step`ms; resolve once the value is
|
||||
// the SAME for `stableFor` consecutive polls (the grid stopped growing), or cap.
|
||||
async function waitForStable(countFn, { maxMs = settings.genTimeoutMs, step = 1500, stableFor = 2, min = 1 } = {}) {
|
||||
const t0 = Date.now();
|
||||
let prev = -1, stable = 0;
|
||||
while (Date.now() - t0 < maxMs) {
|
||||
const c = countFn();
|
||||
if (c >= min && c === prev) {
|
||||
if (++stable >= stableFor) return c;
|
||||
} else {
|
||||
stable = 0;
|
||||
}
|
||||
prev = c;
|
||||
await sleep(step);
|
||||
}
|
||||
return prev;
|
||||
}
|
||||
|
||||
// React-aware value injection (kept from v1 — this part was correct).
|
||||
function setElementValue(el, value) {
|
||||
if (!el) return false;
|
||||
el.focus();
|
||||
if (el.tagName === 'TEXTAREA' || el.tagName === 'INPUT') {
|
||||
const setter = Object.getOwnPropertyDescriptor(el.__proto__, 'value')?.set;
|
||||
setter ? setter.call(el, value) : (el.value = value); // bypass React's value shadowing
|
||||
el.dispatchEvent(new Event('input', { bubbles: true }));
|
||||
el.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
} else {
|
||||
el.innerText = value;
|
||||
el.dispatchEvent(new InputEvent('input', { bubbles: true, cancelable: true, inputType: 'insertText', data: value }));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Read whatever text is currently in the editor (textarea value or contenteditable text).
|
||||
function editorText(el) {
|
||||
const t = (el.tagName === 'TEXTAREA' || el.tagName === 'INPUT') ? el.value : (el.innerText || el.textContent || '');
|
||||
return (t || '').trim();
|
||||
}
|
||||
|
||||
// Ask the background worker for a TRUSTED action via the DevTools Protocol.
|
||||
// Flow's editor ignores synthetic DOM events (isTrusted=false): the text shows but
|
||||
// the app's state stays empty ("no prompt" on send). CDP Input.* events are trusted.
|
||||
function bg(msg) {
|
||||
return new Promise((resolve) => {
|
||||
try { chrome.runtime.sendMessage(msg, (r) => resolve(chrome.runtime.lastError ? null : r)); }
|
||||
catch (_) { resolve(null); }
|
||||
});
|
||||
}
|
||||
|
||||
// Focus, clear, then insert the prompt as trusted input. Falls back to DOM injection
|
||||
// if the debugger path is unavailable. Returns chars that landed (0 = failed).
|
||||
async function typeIntoEditor(el, text) {
|
||||
el.focus();
|
||||
await sleep(120);
|
||||
try { document.execCommand('selectAll', false, null); document.execCommand('delete', false, null); } catch (_) {}
|
||||
const r = await bg({ type: 'insertText', text });
|
||||
if (!r || !r.ok) {
|
||||
try { document.execCommand('insertText', false, text); } catch (_) {} // fallback
|
||||
if (!editorText(el).length) setElementValue(el, text);
|
||||
}
|
||||
await sleep(200);
|
||||
return editorText(el).length;
|
||||
}
|
||||
|
||||
// Submit via a trusted Enter (what works by hand). Falls back to synthetic keys.
|
||||
async function submitEditor(el) {
|
||||
el.focus();
|
||||
const r = await bg({ type: 'pressEnter' });
|
||||
if (!r || !r.ok) {
|
||||
const o = { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true, cancelable: true };
|
||||
el.dispatchEvent(new KeyboardEvent('keydown', o));
|
||||
el.dispatchEvent(new KeyboardEvent('keypress', o));
|
||||
el.dispatchEvent(new KeyboardEvent('keyup', o));
|
||||
}
|
||||
}
|
||||
|
||||
// ---- element finders (few, known targets; overrides win) -----------------
|
||||
|
||||
function findAgentInput() {
|
||||
if (settings.promptSel) { const el = document.querySelector(settings.promptSel); if (visible(el)) return el; }
|
||||
// Flow's agent box is a visible contenteditable[role=textbox] or textarea.
|
||||
const boxes = [
|
||||
...document.querySelectorAll('div[contenteditable="true"][role="textbox"]'),
|
||||
...document.querySelectorAll('div[contenteditable="true"]'),
|
||||
...document.querySelectorAll('textarea')
|
||||
];
|
||||
return boxes.find(visible) || null;
|
||||
}
|
||||
|
||||
// The submit control is the unlabeled arrow near the input. Find the nearest
|
||||
// enabled button after the input, preferring aria-labels that read like "send".
|
||||
function findSubmit(inputEl) {
|
||||
if (settings.submitSel) { const el = document.querySelector(settings.submitSel); if (visible(el) && !el.disabled) return el; }
|
||||
const scope = inputEl?.closest('form, [class*="composer"], [class*="session"], [class*="input"]') || document;
|
||||
const btns = [...scope.querySelectorAll('button, [role="button"]')].filter(b => visible(b) && !b.disabled);
|
||||
const byLabel = btns.find(b => /send|submit|create|generate|run/i.test((b.getAttribute('aria-label') || '') + b.innerText));
|
||||
if (byLabel) return byLabel;
|
||||
// else: the last enabled icon-only button in the composer (the → arrow)
|
||||
const iconOnly = btns.filter(b => !b.innerText.trim() && b.querySelector('svg'));
|
||||
return iconOnly[iconOnly.length - 1] || btns[btns.length - 1] || null;
|
||||
}
|
||||
|
||||
// If a confirm/generate dialog appears (Always mode), click it. No-op under Never.
|
||||
function clickConfirmIfPresent() {
|
||||
const b = [...document.querySelectorAll('button, [role="button"]')]
|
||||
.find(x => visible(x) && !x.disabled && /^(generate|create|confirm|continue|yes)\b/i.test(x.innerText.trim()));
|
||||
if (b) { b.click(); return true; }
|
||||
return false;
|
||||
}
|
||||
|
||||
// Snapshot real media URLs currently on the page (the harvest surface).
|
||||
function snapshotAssets() {
|
||||
const scope = (settings.resultSel && document.querySelector(settings.resultSel)) || document;
|
||||
const urls = new Set();
|
||||
const push = (u) => { if (u && /^https?:/.test(u) && !/^data:/.test(u)) urls.add(u.split('#')[0]); };
|
||||
scope.querySelectorAll('video[src]').forEach(v => push(v.src));
|
||||
scope.querySelectorAll('video source[src]').forEach(s => push(s.src));
|
||||
scope.querySelectorAll('a[href*="googleusercontent"], a[download][href]').forEach(a => push(a.href));
|
||||
scope.querySelectorAll('img[src]').forEach(i => { if (/googleusercontent|lh3|storage/.test(i.src)) push(i.src); });
|
||||
return urls;
|
||||
}
|
||||
|
||||
// ---- queue loop ----------------------------------------------------------
|
||||
|
||||
function startPolling() {
|
||||
if (pollTimeout) clearTimeout(pollTimeout);
|
||||
if (!settings.isRunning) return;
|
||||
pollTimeout = setTimeout(async () => {
|
||||
if (generationInProgress) return startPolling();
|
||||
try {
|
||||
const res = await fetch(`${settings.serverUrl}/next-task`);
|
||||
if (res.status === 204) return startPolling();
|
||||
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
||||
const task = await res.json();
|
||||
if (task && task.id) { log('info', `Task ${task.id}: ${String(task.prompt).slice(0, 60)}…`); await executeTask(task); }
|
||||
else startPolling();
|
||||
} catch (err) {
|
||||
log('error', `Poll failed: ${err.message}`);
|
||||
startPolling();
|
||||
}
|
||||
}, settings.pollInterval);
|
||||
}
|
||||
|
||||
async function executeTask(task) {
|
||||
generationInProgress = true;
|
||||
chrome.storage.local.set({ status: 'working' });
|
||||
try {
|
||||
const input = await waitFor(findAgentInput, 20000);
|
||||
if (!input) throw new Error('Agent input box not found — are you on the Flow project page?');
|
||||
|
||||
const before = snapshotAssets();
|
||||
|
||||
const landed = await typeIntoEditor(input, task.prompt);
|
||||
if (!landed) throw new Error('Prompt did not register in the editor (injection failed) — nothing submitted.');
|
||||
log('info', `Prompt set (${landed} chars). Submitting…`);
|
||||
await sleep(300);
|
||||
|
||||
await submitEditor(input); // trusted Enter via the DevTools Protocol
|
||||
await sleep(700);
|
||||
const submit = findSubmit(input); // arrow button, as a fallback
|
||||
if (submit) submit.click();
|
||||
clickConfirmIfPresent(); // harmless under "Never"
|
||||
|
||||
await sleep(1500);
|
||||
log('info', 'Submitted. Waiting for generation…');
|
||||
|
||||
// Wait until a NEW asset appears AND the asset count stops growing.
|
||||
const appeared = await waitFor(() => snapshotAssets().size > before.size, settings.genTimeoutMs, 2500);
|
||||
if (!appeared) {
|
||||
// last-chance: a quota/credit wall?
|
||||
const wall = [...document.querySelectorAll('*')].some(e => visible(e) && /credit|quota|limit|run out/i.test(e.textContent || '') && (e.textContent || '').length < 120);
|
||||
throw new Error(wall ? 'Stopped: credits/quota wall detected.' : 'Timed out waiting for output.');
|
||||
}
|
||||
await waitForStable(() => snapshotAssets().size, { min: before.size + 1 });
|
||||
|
||||
const after = snapshotAssets();
|
||||
const fresh = [...after].filter(u => !before.has(u));
|
||||
log('success', `Harvested ${fresh.length} asset(s).`);
|
||||
await reportCompletion(task.id, 'success', null, fresh);
|
||||
} catch (err) {
|
||||
log('error', `Task ${task.id} failed: ${err.message}`);
|
||||
await reportCompletion(task.id, 'failed', err.message, []);
|
||||
} finally {
|
||||
generationInProgress = false;
|
||||
chrome.storage.local.set({ status: settings.isRunning ? 'running' : 'idle' });
|
||||
startPolling();
|
||||
}
|
||||
}
|
||||
|
||||
async function reportCompletion(id, status, error, assets) {
|
||||
try {
|
||||
await fetch(`${settings.serverUrl}/task-completed`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ id, status, error, assets }) // assets = harvested URLs
|
||||
});
|
||||
} catch (err) {
|
||||
log('error', `Report failed: ${err.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
function log(level, text) {
|
||||
console.log(`[Flow][${level}] ${text}`);
|
||||
chrome.storage.local.get({ logs: [] }, (r) => {
|
||||
chrome.storage.local.set({ logs: [...r.logs, { level, text, timestamp: Date.now() }].slice(-100) });
|
||||
});
|
||||
}
|
||||
|
||||
chrome.storage.onChanged.addListener((c, area) => {
|
||||
if (area !== 'local') return;
|
||||
for (const k of Object.keys(c)) if (k in settings) settings[k] = c[k].newValue;
|
||||
if (c.isRunning) { c.isRunning.newValue ? startPolling() : (pollTimeout && clearTimeout(pollTimeout)); }
|
||||
});
|
||||
|
||||
init();
|
||||
126
local_server_example.py
Executable file
126
local_server_example.py
Executable file
@ -0,0 +1,126 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Flow Auto-Pilot local queue.
|
||||
|
||||
Source of work: queue.jsonl — one task per line: {"prompt": "...", "kind": "video"|"image", "model": "Veo 3.1 - Fast"}
|
||||
(id optional; auto-assigned by line number)
|
||||
Output: results.jsonl — one record per finished task: {id, status, assets:[urls], error, ts}
|
||||
|
||||
Behaviour:
|
||||
* /next-task -> hands out the next PENDING task, video-first (rinse the pricey credits first).
|
||||
* /task-completed -> appends to results.jsonl, marks done.
|
||||
* On startup, tasks already in results.jsonl are skipped -> safe to restart during a month-long run.
|
||||
|
||||
Harvested `assets` are googleusercontent URLs; they need your logged-in session to download,
|
||||
so this just records them. ponytail: fetch+save the blobs from the extension later if you want local files.
|
||||
"""
|
||||
import json, os, time
|
||||
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
QUEUE_FILE = os.path.join(HERE, "queue.jsonl")
|
||||
RESULTS_FILE = os.path.join(HERE, "results.jsonl")
|
||||
|
||||
# Fallback demo queue if queue.jsonl is absent (so it runs out of the box).
|
||||
DEMO = [
|
||||
{"prompt": "Cinematic synthwave keyboard warrior fighting digital demons, 8k", "kind": "video", "model": "Veo 3.1 - Fast"},
|
||||
{"prompt": "Op-shop record crate, warm 90s film grain, product hero shot", "kind": "image", "model": "Nano Banana 2"},
|
||||
]
|
||||
|
||||
def load_queue():
|
||||
rows = []
|
||||
if os.path.exists(QUEUE_FILE):
|
||||
with open(QUEUE_FILE) as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line:
|
||||
rows.append(json.loads(line))
|
||||
else:
|
||||
rows = list(DEMO)
|
||||
# assign stable ids by position; video first so the expensive credits burn first
|
||||
for i, r in enumerate(rows):
|
||||
r.setdefault("id", f"task_{i:05d}")
|
||||
r.setdefault("kind", "image")
|
||||
rows.sort(key=lambda r: 0 if r.get("kind") == "video" else 1)
|
||||
return rows
|
||||
|
||||
def done_ids():
|
||||
ids = set()
|
||||
if os.path.exists(RESULTS_FILE):
|
||||
with open(RESULTS_FILE) as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line:
|
||||
ids.add(json.loads(line).get("id"))
|
||||
return ids
|
||||
|
||||
class Handler(BaseHTTPRequestHandler):
|
||||
def _send(self, code=200, body=None):
|
||||
self.send_response(code)
|
||||
self.send_header("Access-Control-Allow-Origin", "*")
|
||||
self.send_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
|
||||
self.send_header("Access-Control-Allow-Headers", "Content-Type")
|
||||
self.send_header("Content-Type", "application/json")
|
||||
self.end_headers()
|
||||
if body is not None:
|
||||
self.wfile.write(json.dumps(body).encode())
|
||||
|
||||
def do_OPTIONS(self):
|
||||
self._send(200, {})
|
||||
|
||||
def do_GET(self):
|
||||
if self.path != "/next-task":
|
||||
return self._send(404, {"error": "not found"})
|
||||
done = done_ids()
|
||||
for t in load_queue():
|
||||
if t["id"] not in done and t["id"] not in INFLIGHT:
|
||||
INFLIGHT[t["id"]] = time.time()
|
||||
remaining = sum(1 for x in load_queue() if x["id"] not in done)
|
||||
print(f"[SERVER] -> {t['id']} ({t.get('kind')}) | {remaining} left")
|
||||
return self._send(200, t)
|
||||
return self._send(204) # queue drained
|
||||
|
||||
def do_POST(self):
|
||||
if self.path != "/task-completed":
|
||||
return self._send(404, {"error": "not found"})
|
||||
n = int(self.headers.get("Content-Length", 0))
|
||||
rec = json.loads(self.rfile.read(n).decode() or "{}")
|
||||
rec["ts"] = time.time()
|
||||
INFLIGHT.pop(rec.get("id"), None)
|
||||
with open(RESULTS_FILE, "a") as f:
|
||||
f.write(json.dumps(rec) + "\n")
|
||||
assets = rec.get("assets") or []
|
||||
print(f"[SERVER] <- {rec.get('id')} {str(rec.get('status')).upper()} | {len(assets)} asset(s)")
|
||||
self._send(200, {"ok": True})
|
||||
|
||||
def log_message(self, *a): # quiet the default noise
|
||||
pass
|
||||
|
||||
INFLIGHT = {}
|
||||
|
||||
def selftest():
|
||||
# video-first ordering + resume-skip
|
||||
global load_queue
|
||||
_orig = load_queue
|
||||
load_queue = lambda: [ # noqa: E731
|
||||
{"id": "a", "kind": "image"}, {"id": "b", "kind": "video"}]
|
||||
assert [t["id"] for t in load_queue()] == ["a", "b"] # loader keeps as-is here
|
||||
q = sorted(load_queue(), key=lambda r: 0 if r["kind"] == "video" else 1)
|
||||
assert q[0]["id"] == "b", "video must be handed out first"
|
||||
load_queue = _orig
|
||||
print("selftest ok")
|
||||
|
||||
def run(port=8017):
|
||||
print(f"--- Flow queue on http://localhost:{port} ---")
|
||||
print(f"queue: {QUEUE_FILE if os.path.exists(QUEUE_FILE) else '(demo — no queue.jsonl)'}")
|
||||
print(f"pending: {sum(1 for t in load_queue() if t['id'] not in done_ids())}")
|
||||
HTTPServer(("", port), Handler).serve_forever()
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
if "--selftest" in sys.argv:
|
||||
selftest()
|
||||
else:
|
||||
try:
|
||||
run()
|
||||
except KeyboardInterrupt:
|
||||
print("\nstopped")
|
||||
30
manifest.json
Normal file
30
manifest.json
Normal file
@ -0,0 +1,30 @@
|
||||
{
|
||||
"manifest_version": 3,
|
||||
"name": "Google Labs FX Flow Auto-Pilot",
|
||||
"version": "1.0",
|
||||
"description": "Automate prompt execution, model selection, and video/image generation using local queue integration.",
|
||||
"permissions": [
|
||||
"storage",
|
||||
"debugger"
|
||||
],
|
||||
"background": {
|
||||
"service_worker": "background.js"
|
||||
},
|
||||
"host_permissions": [
|
||||
"http://localhost:8017/*",
|
||||
"https://labs.google/*"
|
||||
],
|
||||
"action": {
|
||||
"default_popup": "popup.html"
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": [
|
||||
"https://labs.google/fx/tools/flow*",
|
||||
"https://labs.google/fx/tools/whisk*"
|
||||
],
|
||||
"js": ["content.js"],
|
||||
"run_at": "document_idle"
|
||||
}
|
||||
]
|
||||
}
|
||||
369
popup.css
Normal file
369
popup.css
Normal file
@ -0,0 +1,369 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&family=Space+Mono&display=swap');
|
||||
|
||||
:root {
|
||||
--bg-main: #0b0c10;
|
||||
--bg-card: rgba(22, 24, 33, 0.85);
|
||||
--bg-card-hover: rgba(29, 32, 44, 0.9);
|
||||
--border-color: rgba(255, 255, 255, 0.08);
|
||||
--text-primary: #f3f4f6;
|
||||
--text-secondary: #9ca3af;
|
||||
--text-muted: #6b7280;
|
||||
|
||||
--primary-glow: rgba(139, 92, 246, 0.5);
|
||||
--primary: #8b5cf6;
|
||||
--primary-hover: #a78bfa;
|
||||
|
||||
--danger: #ef4444;
|
||||
--danger-hover: #f87171;
|
||||
--danger-glow: rgba(239, 68, 68, 0.4);
|
||||
|
||||
--success: #10b981;
|
||||
--success-glow: rgba(16, 185, 129, 0.4);
|
||||
|
||||
--warning: #f59e0b;
|
||||
|
||||
--font-sans: 'Outfit', sans-serif;
|
||||
--font-mono: 'Space Mono', monospace;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
width: 360px;
|
||||
background-color: var(--bg-main);
|
||||
color: var(--text-primary);
|
||||
font-family: var(--font-sans);
|
||||
font-size: 14px;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.app-container {
|
||||
padding: 18px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
background-image: radial-gradient(circle at top right, rgba(139, 92, 246, 0.12), transparent 60%);
|
||||
}
|
||||
|
||||
/* Header */
|
||||
.app-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
.logo-area {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.logo-icon {
|
||||
font-size: 24px;
|
||||
background: linear-gradient(135deg, #a78bfa, #8b5cf6);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
filter: drop-shadow(0 2px 8px var(--primary-glow));
|
||||
}
|
||||
|
||||
.logo-text h1 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.5px;
|
||||
background: linear-gradient(to right, #ffffff, #e2e8f0);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.logo-text .subtext {
|
||||
font-size: 10px;
|
||||
color: var(--text-secondary);
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
/* Status Indicator */
|
||||
.status-indicator {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
padding: 4px 10px;
|
||||
border-radius: 20px;
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.status-indicator .dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
background-color: var(--text-muted);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.status-indicator.active .dot {
|
||||
background-color: var(--success);
|
||||
box-shadow: 0 0 8px var(--success-glow);
|
||||
animation: pulse 1.8s infinite;
|
||||
}
|
||||
|
||||
.status-indicator.error .dot {
|
||||
background-color: var(--danger);
|
||||
box-shadow: 0 0 8px var(--danger-glow);
|
||||
}
|
||||
|
||||
.status-indicator.paused .dot {
|
||||
background-color: var(--warning);
|
||||
box-shadow: 0 0 8px rgba(245, 158, 11, 0.4);
|
||||
}
|
||||
|
||||
.status-label {
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
/* Forms */
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
label {
|
||||
font-size: 11px;
|
||||
color: var(--text-secondary);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.8px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
input[type="url"],
|
||||
input[type="text"],
|
||||
input[type="number"] {
|
||||
width: 100%;
|
||||
background: rgba(15, 17, 26, 0.8);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 8px;
|
||||
padding: 10px 12px;
|
||||
color: var(--text-primary);
|
||||
font-family: var(--font-sans);
|
||||
font-size: 13px;
|
||||
transition: all 0.25s ease;
|
||||
}
|
||||
|
||||
input:focus {
|
||||
outline: none;
|
||||
border-color: var(--primary);
|
||||
box-shadow: 0 0 0 2px rgba(139, 92, 246, 0.2);
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.btn {
|
||||
width: 100%;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
padding: 12px;
|
||||
font-weight: 600;
|
||||
font-family: var(--font-sans);
|
||||
cursor: pointer;
|
||||
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.btn-primary.start-state {
|
||||
background: linear-gradient(135deg, #8b5cf6, #6366f1);
|
||||
color: white;
|
||||
box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3);
|
||||
}
|
||||
|
||||
.btn-primary.start-state:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 6px 20px rgba(99, 102, 241, 0.45);
|
||||
}
|
||||
|
||||
.btn-primary.stop-state {
|
||||
background: linear-gradient(135deg, #ef4444, #dc2626);
|
||||
color: white;
|
||||
box-shadow: 0 4px 15px rgba(239, 68, 68, 0.3);
|
||||
}
|
||||
|
||||
.btn-primary.stop-state:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 6px 20px rgba(239, 68, 68, 0.45);
|
||||
}
|
||||
|
||||
.btn:active {
|
||||
transform: translateY(1px);
|
||||
}
|
||||
|
||||
/* Console Section */
|
||||
.console-section {
|
||||
background: var(--bg-card);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 12px;
|
||||
padding: 12px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.24);
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
|
||||
.console-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 11px;
|
||||
color: var(--text-secondary);
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.btn-text {
|
||||
background: none;
|
||||
border: none;
|
||||
color: var(--text-muted);
|
||||
cursor: pointer;
|
||||
font-family: var(--font-sans);
|
||||
font-size: 11px;
|
||||
transition: color 0.2s ease;
|
||||
}
|
||||
|
||||
.btn-text:hover {
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.console-body {
|
||||
background: rgba(10, 11, 15, 0.7);
|
||||
border-radius: 8px;
|
||||
height: 120px;
|
||||
overflow-y: auto;
|
||||
padding: 8px;
|
||||
font-family: var(--font-mono);
|
||||
font-size: 11px;
|
||||
line-height: 1.5;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.console-body::-webkit-scrollbar {
|
||||
width: 4px;
|
||||
}
|
||||
|
||||
.console-body::-webkit-scrollbar-thumb {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
.log-entry {
|
||||
word-break: break-all;
|
||||
border-left: 2px solid transparent;
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
.log-entry.system-log {
|
||||
color: var(--text-muted);
|
||||
border-left-color: var(--text-muted);
|
||||
}
|
||||
|
||||
.log-entry.info-log {
|
||||
color: #60a5fa;
|
||||
border-left-color: #3b82f6;
|
||||
}
|
||||
|
||||
.log-entry.success-log {
|
||||
color: #34d399;
|
||||
border-left-color: var(--success);
|
||||
}
|
||||
|
||||
.log-entry.error-log {
|
||||
color: #f87171;
|
||||
border-left-color: var(--danger);
|
||||
}
|
||||
|
||||
/* Advanced Settings Dropdown */
|
||||
.advanced-settings {
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 12px;
|
||||
background: var(--bg-card);
|
||||
overflow: hidden;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.advanced-settings[open] {
|
||||
background: var(--bg-card-hover);
|
||||
}
|
||||
|
||||
summary {
|
||||
padding: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--text-secondary);
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
font-size: 12px;
|
||||
outline: none;
|
||||
transition: color 0.2s ease;
|
||||
}
|
||||
|
||||
summary:hover {
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.settings-content {
|
||||
padding: 0 12px 14px 12px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
margin-top: 2px;
|
||||
padding-top: 12px;
|
||||
}
|
||||
|
||||
.settings-info {
|
||||
font-size: 11px;
|
||||
color: var(--text-muted);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* Footer */
|
||||
.app-footer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 10px;
|
||||
color: var(--text-muted);
|
||||
border-top: 1px solid var(--border-color);
|
||||
padding-top: 12px;
|
||||
}
|
||||
|
||||
.version {
|
||||
font-family: var(--font-mono);
|
||||
}
|
||||
|
||||
/* Keyframes */
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
transform: scale(1);
|
||||
box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4);
|
||||
}
|
||||
70% {
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 0 0 6px rgba(16, 185, 129, 0);
|
||||
}
|
||||
100% {
|
||||
transform: scale(1);
|
||||
box-shadow: 0 0 0 0 rgba(16, 185, 129, 0);
|
||||
}
|
||||
}
|
||||
88
popup.html
Normal file
88
popup.html
Normal file
@ -0,0 +1,88 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Flow Auto-Pilot</title>
|
||||
<link rel="stylesheet" href="popup.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="app-container">
|
||||
<!-- Header -->
|
||||
<header class="app-header">
|
||||
<div class="logo-area">
|
||||
<span class="logo-icon">⚡</span>
|
||||
<div class="logo-text">
|
||||
<h1>Flow Auto-Pilot</h1>
|
||||
<span class="subtext">Labs FX Integration</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="status-indicator" id="global-status">
|
||||
<span class="dot"></span>
|
||||
<span class="status-label">Idle</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Control Panel -->
|
||||
<main class="control-panel">
|
||||
<!-- Connection Input -->
|
||||
<div class="form-group">
|
||||
<label for="server-url">Local Server URL</label>
|
||||
<div class="input-with-button">
|
||||
<input type="url" id="server-url" value="http://localhost:8017" placeholder="http://localhost:8017">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Action Button -->
|
||||
<div class="actions">
|
||||
<button id="toggle-btn" class="btn btn-primary start-state">Start Automation</button>
|
||||
</div>
|
||||
|
||||
<!-- Console / Activity Logs -->
|
||||
<div class="console-section">
|
||||
<div class="console-header">
|
||||
<span>Activity Log</span>
|
||||
<button id="clear-logs" class="btn-text">Clear</button>
|
||||
</div>
|
||||
<div class="console-body" id="log-console">
|
||||
<div class="log-entry system-log">[System] Extension loaded. Click Start to begin.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Collapsible Settings -->
|
||||
<details class="advanced-settings">
|
||||
<summary>Advanced Selector Adjustments</summary>
|
||||
<div class="settings-content">
|
||||
<p class="settings-info">Customize targets if the page layout changes. Leave blank for auto-detection.</p>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="sel-prompt">Prompt Input Selector</label>
|
||||
<input type="text" id="sel-prompt" placeholder="Auto-detect (textarea / editable div)">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="sel-generate">Submit Button Selector</label>
|
||||
<input type="text" id="sel-generate" placeholder="Auto-detect (→ arrow / send)">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="sel-model">Results / Media Selector</label>
|
||||
<input type="text" id="sel-model" placeholder="Auto-detect (media library container)">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="poll-interval">Polling Interval (ms)</label>
|
||||
<input type="number" id="poll-interval" value="4000" min="1000" step="500">
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="app-footer">
|
||||
<span>Active Tab Automation</span>
|
||||
<span class="version">v1.0.0</span>
|
||||
</footer>
|
||||
</div>
|
||||
<script src="popup.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
155
popup.js
Normal file
155
popup.js
Normal file
@ -0,0 +1,155 @@
|
||||
// Default Settings
|
||||
const DEFAULT_SETTINGS = {
|
||||
serverUrl: 'http://localhost:8017',
|
||||
isRunning: false,
|
||||
promptSel: '',
|
||||
submitSel: '',
|
||||
resultSel: '',
|
||||
pollInterval: 4000,
|
||||
logs: []
|
||||
};
|
||||
|
||||
// UI Elements
|
||||
const serverUrlInput = document.getElementById('server-url');
|
||||
const toggleBtn = document.getElementById('toggle-btn');
|
||||
const globalStatus = document.getElementById('global-status');
|
||||
const statusLabel = globalStatus.querySelector('.status-label');
|
||||
const logConsole = document.getElementById('log-console');
|
||||
const clearLogsBtn = document.getElementById('clear-logs');
|
||||
|
||||
// Advanced inputs
|
||||
const selPromptInput = document.getElementById('sel-prompt');
|
||||
const selGenerateInput = document.getElementById('sel-generate');
|
||||
const selModelInput = document.getElementById('sel-model');
|
||||
const pollIntervalInput = document.getElementById('poll-interval');
|
||||
|
||||
// Load settings on startup
|
||||
chrome.storage.local.get(DEFAULT_SETTINGS, (settings) => {
|
||||
serverUrlInput.value = settings.serverUrl;
|
||||
selPromptInput.value = settings.promptSel;
|
||||
selGenerateInput.value = settings.submitSel;
|
||||
selModelInput.value = settings.resultSel;
|
||||
pollIntervalInput.value = settings.pollInterval;
|
||||
|
||||
updateToggleUI(settings.isRunning);
|
||||
renderLogs(settings.logs);
|
||||
updateStatusUI(settings.isRunning ? 'running' : 'idle');
|
||||
});
|
||||
|
||||
// Helper: Append log to UI console
|
||||
function appendLogToUI(log) {
|
||||
const entry = document.createElement('div');
|
||||
entry.className = `log-entry ${log.level}-log`;
|
||||
|
||||
const time = new Date(log.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' });
|
||||
entry.innerText = `[${time}] ${log.text}`;
|
||||
|
||||
logConsole.appendChild(entry);
|
||||
logConsole.scrollTop = logConsole.scrollHeight;
|
||||
}
|
||||
|
||||
// Render entire log list
|
||||
function renderLogs(logs) {
|
||||
logConsole.innerHTML = '';
|
||||
if (!logs || logs.length === 0) {
|
||||
const entry = document.createElement('div');
|
||||
entry.className = 'log-entry system-log';
|
||||
entry.innerText = '[System] No logs yet. Click Start to run.';
|
||||
logConsole.appendChild(entry);
|
||||
return;
|
||||
}
|
||||
logs.forEach(appendLogToUI);
|
||||
}
|
||||
|
||||
// Update Toggle Button Style
|
||||
function updateToggleUI(isRunning) {
|
||||
if (isRunning) {
|
||||
toggleBtn.textContent = 'Stop Automation';
|
||||
toggleBtn.className = 'btn btn-primary stop-state';
|
||||
} else {
|
||||
toggleBtn.textContent = 'Start Automation';
|
||||
toggleBtn.className = 'btn btn-primary start-state';
|
||||
}
|
||||
}
|
||||
|
||||
// Update Global Status indicator
|
||||
function updateStatusUI(status) {
|
||||
globalStatus.className = 'status-indicator';
|
||||
if (status === 'running') {
|
||||
globalStatus.classList.add('active');
|
||||
statusLabel.textContent = 'Running';
|
||||
} else if (status === 'idle') {
|
||||
statusLabel.textContent = 'Idle';
|
||||
} else if (status === 'error') {
|
||||
globalStatus.classList.add('error');
|
||||
statusLabel.textContent = 'Error';
|
||||
} else if (status === 'working') {
|
||||
globalStatus.classList.add('active');
|
||||
statusLabel.textContent = 'Generating...';
|
||||
}
|
||||
}
|
||||
|
||||
// Input Change Handlers
|
||||
function saveSetting(key, value) {
|
||||
chrome.storage.local.set({ [key]: value });
|
||||
}
|
||||
|
||||
serverUrlInput.addEventListener('change', (e) => saveSetting('serverUrl', e.target.value));
|
||||
selPromptInput.addEventListener('change', (e) => saveSetting('promptSel', e.target.value));
|
||||
selGenerateInput.addEventListener('change', (e) => saveSetting('submitSel', e.target.value));
|
||||
selModelInput.addEventListener('change', (e) => saveSetting('resultSel', e.target.value));
|
||||
pollIntervalInput.addEventListener('change', (e) => saveSetting('pollInterval', parseInt(e.target.value, 10) || 4000));
|
||||
|
||||
// Clear Logs
|
||||
clearLogsBtn.addEventListener('click', () => {
|
||||
chrome.storage.local.set({ logs: [] }, () => {
|
||||
logConsole.innerHTML = '';
|
||||
});
|
||||
});
|
||||
|
||||
// Toggle Run Loop
|
||||
toggleBtn.addEventListener('click', () => {
|
||||
chrome.storage.local.get('isRunning', (res) => {
|
||||
const nextState = !res.isRunning;
|
||||
chrome.storage.local.set({ isRunning: nextState }, () => {
|
||||
updateToggleUI(nextState);
|
||||
updateStatusUI(nextState ? 'running' : 'idle');
|
||||
|
||||
// Log event
|
||||
const logMsg = nextState ? 'Automation started.' : 'Automation stopped.';
|
||||
addSystemLog(logMsg);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Add System Log Helper
|
||||
function addSystemLog(text) {
|
||||
chrome.storage.local.get({ logs: [] }, (res) => {
|
||||
const newLog = {
|
||||
level: 'system',
|
||||
text: text,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
const updated = [...res.logs, newLog].slice(-100); // limit to 100 logs
|
||||
chrome.storage.local.set({ logs: updated }, () => {
|
||||
appendLogToUI(newLog);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Listen for storage changes to sync UI across multiple popup openings
|
||||
chrome.storage.onChanged.addListener((changes, area) => {
|
||||
if (area === 'local') {
|
||||
if (changes.isRunning) {
|
||||
updateToggleUI(changes.isRunning.newValue);
|
||||
updateStatusUI(changes.isRunning.newValue ? 'running' : 'idle');
|
||||
}
|
||||
if (changes.status) {
|
||||
updateStatusUI(changes.status.newValue);
|
||||
}
|
||||
if (changes.logs) {
|
||||
// Re-render logs if they changed (e.g. from background content script)
|
||||
renderLogs(changes.logs.newValue);
|
||||
}
|
||||
}
|
||||
});
|
||||
91
queue.jsonl
Normal file
91
queue.jsonl
Normal file
@ -0,0 +1,91 @@
|
||||
{"id": "shop_promo_video_000", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] At the counter, Robot holds two identical black LP sleeves side by side and sweeps a thin green scan beam from its chest across both records left to right; Monster leans in close, eyes widening as the beam glows brighter over the left copy.\n[AUDIO] Robot (crisp, matter-of-fact synth voice): \"Left copy first pressing, right reissue.\"", "title": "Green Scan Grading \u2014 First Pressing vs Reissue", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_001", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Robot notices a plastic genre divider tab leaning crooked in a blue crate, reaches in with two precise fingers and straightens it perfectly upright with a tiny satisfying click while Monster nods in approval beside it.\n[AUDIO] Robot (quiet, pleased tone): \"There. Straight at last.\"", "title": "Fixing the Crooked Genre Divider", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_002", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Monster pinches the corner of an old orange price sticker on a vinyl sleeve and slowly peels it off in one clean satisfying strip, holding it up triumphantly as the sticky end curls; Robot watches, LED eyes squinting in mock suspense.\n[AUDIO] Monster (delighted, breathy squeal): \"Ohhh, clean peel!\"", "title": "Peeling the Sticky Price Tag", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_003", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Monster pulls a dusty record sleeve from the back of a bin, holds it flat, and blows a big puff across the cover; a golden cloud of dust motes lifts and swirls through a shaft of warm volumetric light while Monster's fur ruffles from the effort.\n[AUDIO] Monster (soft, then a tiny sneeze): \"Whew \u2014 achoo!\"", "title": "Blowing Dust Off a Sleeve", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_004", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Monster stands at a full crate and rhythmically flips through the vinyl sleeves one by one with both paws, each sleeve tipping back with a crisp cardboard thock, head bobbing to the rhythm of the flip-through as the camera dollies slowly along the bin.\n[AUDIO] Monster (content, sing-song murmur): \"Flip, flip, flip \u2014 perfect.\"", "title": "The Satisfying Flip-Through", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_005", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Robot lowers a record onto the store turntable beside the \"Now Playing\" stand and gently drops the tonearm; as the needle lands, warm light pulses and Monster's whole body sways as the groove catches.\n[AUDIO] Robot (warm, low hum then a click): \"Now playing... this one's a keeper.\"", "title": "Cueing Up the Now Playing Record", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_006", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Robot slides a bare black record out of its sleeve and runs its green scan beam flat across the surface; the beam ripples along a visible warp in the vinyl and Robot's LED eyes flicker amber as Monster winces and covers its eyes.\n[AUDIO] Robot (flat, faintly disappointed): \"Slight warp detected \u2014 plays, but barely.\"", "title": "Green Scan Grading \u2014 Warped Copy Warning", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_007", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Monster hugs a tall stack of fresh vinyl to its chest and files them one at a time into a half-empty blue crate, patting the last sleeve flush with a proud two-paw press; the crate now sits perfectly packed.\n[AUDIO] Monster (huffing, satisfied): \"Just one more... and done.\"", "title": "Restocking the Blue Crate", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_008", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Robot holds a shining black record vertically and buffs a smudge in slow concentric circles with a soft microfiber cloth; the surface catches the fairy-light bokeh and gleams as Robot tilts it to inspect the mirror finish.\n[AUDIO] Robot (soft, precise): \"Spotless. Grade goes up.\"", "title": "Wiping a Fingerprint Off the Vinyl", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_009", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Monster stretches up on tiptoe and bounces to reach a rare framed record displayed high on the wall; Robot smoothly extends one telescoping arm, plucks it down, and hands it to a beaming Monster who cradles it like treasure.\n[AUDIO] Monster (awed whisper): \"The grail... I can't believe it.\"", "title": "Reaching the Top-Shelf Grail", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_010", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Robot guides a record's inner paper sleeve into the cardboard jacket in one smooth, perfectly aligned motion, seating it flush with a soft cardboard whisper while Monster gives a slow, impressed clap.\n[AUDIO] Robot (calm, satisfied): \"Snug. Just how it should be.\"", "title": "Sliding Record Back Into Its Sleeve", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_011", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Monster stands at a small chalkboard easel by the bins and draws a big loopy underline beneath the words \"NEW ARRIVALS,\" chalk dust puffing off the tip, then spins the board proudly toward the camera; Robot dots a tiny final flourish with one finger.\n[AUDIO] Monster (proud, cheerful): \"Fresh crates, come dig in!\"", "title": "Chalking the New Arrivals Sign", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_012", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Monster holds up two matching sleeves and Robot passes its green scan beam over both at once; the beam glows an even steady green across each and Robot gives a single confident nod as Monster grins and bumps the two sleeves together like a toast.\n[AUDIO] Robot (bright, certain): \"Both mint \u2014 a matched pair.\"", "title": "Green Scan Grading \u2014 Twin Copies Match", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_013", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] Robot rapidly reshuffles a jumbled row of sleeves in a blue crate, sliding three of them into new slots with quick precise motions until they line up perfectly; Monster watches the sleeves fall into order and throws both paws up in celebration.\n[AUDIO] Robot (clipped, efficient): \"A, B, C \u2014 order restored.\"", "title": "Alphabetizing a Messy Bin", "category": "shop_promo_video"}
|
||||
{"id": "shop_promo_video_014", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "[STYLE LOCK] Stylized-realism 3D, Pixar-meets-stop-motion, Octane render, warm analog color grade, 35mm f/2.8 shallow DoF, slow cinematic dolly, no motion blur on characters, volumetric lighting.\n[CHARACTERS] Monster: short round furry purple mascot, high-quality fur (subsurface scattering), lavender highlights, big expressive eyes, plush bouncy movement. Robot: medium glossy cobalt-blue metallic (anisotropic reflections), soft white LED eyes, precise-but-fluid mechanical movement.\n[ENVIRONMENT] Cozy authentic indie record store: rows of wooden bins holding blue plastic crates packed with 12-inch vinyl sleeves, blurred posters, a \"Now Playing\" stand, music gear, hanging fairy-light bokeh, textured white ceiling tiles, dust motes, warm analog warmth.\n[CONTINUITY] Same store, characters and lighting as prior shot; do not restyle.\n[ACTION] At day's end Monster flips a little wooden \"OPEN\" sign to \"CLOSED\" in the foreground while Robot dims the fairy lights with a soft gesture; the two lean together and give a warm wave toward the camera as the store glows amber.\n[AUDIO] Monster (cozy, sleepy): \"Come dig again tomorrow!\"", "title": "Closing Time Wave-Off", "category": "shop_promo_video"}
|
||||
{"id": "djsim_promo_video_015", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second promo shot for a 1990s Australian DJ life-sim in a low-poly, flat-shaded 3D diorama style (Schedule 1 / THRIFTGOD lineage: blocky chunky geometry, matte materials, roughness ~0.85, almost no gloss on world surfaces, deliberately un-photoreal early-3D console look). Interior of Club Chrome, the CBD club at NIGHT: near-black room, deep blue-black sky glow through a high window, saturated neon pops in hot pink #ff5cad, neon green #3dff8b and gold #ffd23d washing across a low-poly crowd. A scruffy battle-DJ (TRICKSTER class, backwards cap, oversized flannel over a tee) stands at twin silver Technics-style turntables and a black 2-channel battle mixer, one hand riding a fader, head nodding. Camera pushes in slowly on a smooth dolly from behind the crowd toward the booth, shallow depth of field, warm grimy 90s color grade, dust motes in the neon beams. On the beat, the neon signs pulse brighter and the DJ throws one hand up. Audio: heavy jungle break at 160 BPM, and the DJ shouts 'HERE WE GO!' as the crowd roars. Warm, sweaty, nostalgic, never slick or clean.", "title": "Club Chrome \u2014 neon drop", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_016", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second sequence for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (blocky chunky geometry, matte materials near-zero gloss, un-photoreal early-3D console feel). Inside The Waxworks, a salt-bleached seaside collector record shop in THE ESPY precinct during golden ARVO light (sky #ffd890 to #88a8d0, warm golden-hour sun raking through dusty windows). A HUSTLER-class DJ in a chill-lean thrifted bowling shirt riffles fast through a milk-crate and long bins of low-poly record sleeves, flipping sleeve after sleeve, occasionally yanking one out to inspect. Series of quick smooth camera moves: overhead top-down of hands flipping records, then a low tracking push along the bin, then a close rack-focus onto a single pulled sleeve. Warm sun-faded dusty grade, shallow depth of field, floating dust. Cozy clutter of crates and flat vinyl stacks. Audio: mellow dub bassline at 74 BPM, the papery flick-flick-flick of record sleeves, and a low voice muttering 'nah... nah... THERE it is.'", "title": "Crate-dig montage \u2014 Waxworks", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_017", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second promo shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (chunky blocky geometry, matte materials, roughness ~0.85, un-photoreal early-3D console look). A raw brick Warehouse venue in THE JUNCTION rail suburb at LATE night (sky #101028 to #040408, deep blue-black, cold moonlight through skylights fought by hot neon). Reverse angle from the DJ booth looking out over a dense low-poly street crowd, all arms thrown up in unison, speech bubbles popping ('OI!' / 'AGAIN!'). Neon green #3dff8b and hot pink #ff5cad strobe across sweating blocky faces, graffiti burners glowing on the back brick wall. Camera slowly cranes upward and back over the booth, revealing the whole packed room, shallow depth of field, warm grimy nostalgic grade, haze and light beams. On the drop the crowd density surges and every hand shoots higher. Audio: pounding warehouse breakbeat, an air-horn stab, and the crowd chanting 'PLAY IT! PLAY IT!'", "title": "Crowd hands-up \u2014 Warehouse", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_018", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second intimate shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (blocky chunky geometry, matte materials near-zero gloss, un-photoreal early-3D console feel). Tight over-the-shoulder on a SCENESTER-class DJ, dressed for the club door (slick club-lean jacket, gold hoop), cueing the next record: closed-back black low-poly DJ headphones pressed to one ear with a raised hand, the other hand nudging a silver Technics-style platter, eyes half-closed listening. Setting is a dim booth at NIGHT with hot pink #ff5cad and gold #ffd23d neon rimming the silhouette, near-black background #0a0a12. Very shallow depth of field, warm grimy grade, single warm point-light #ffd9a0 on the face, soft focus falloff. Camera holds almost still, a slow subtle push, then a tiny nod as the beat locks in. Audio: a muffled beat bleeding from one headphone cup, a vinyl backspin rewind, and a quiet confident 'yeah, that's the one.'", "title": "Headphone cue \u2014 one-ear", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_019", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second mood shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (chunky blocky geometry, matte materials, roughness ~0.85, un-photoreal early-3D console look). Empty street of THE JUNCTION rail suburb at KICKON, 2-6am (sky #06060f fading to #000000, near-black with a faint blue, dead quiet, first birds), warm streetlamp point-lights #ffc880 pooling on wet red-brick footpath. A tired lone DJ walks away from camera down the middle of the road, a black milk-crate of vinyl under one arm and closed-back headphones slung around the neck, rusted awnings and a dead neon shop sign overhead, a BUS 96 stop and flyer pole passing by. Camera tracks smoothly behind at a slow walking pace, shallow depth of field, warm grimy nostalgic grade, faint haze and long shadows. The sky imperceptibly lightens toward peach dawn. Audio: distant freight-train rumble, footsteps and the clink of records in the crate, one bird, and a soft exhale \u2014 no dialogue.", "title": "Dawn walk home \u2014 Junction", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_020", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second playful brand cameo for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style for the world (blocky chunky matte geometry, un-photoreal early-3D console look) \u2014 but the two studio mascots are rendered SHINIER than anything else, a deliberate glossy contrast. In a neon DJ booth at NIGHT (hot pink #ff5cad, neon green #3dff8b, gold #ffd23d), the MonsterRobot mascots crash the decks: MONSTER, a short round squat purple furry creature, huggable, bounces behind the turntables; ROBOT, a glossy clean blue chrome-toy with a bright specular sheen, spins a tiny record on one finger. Both simple and iconic. Warm grimy world behind them, but the duo pops with clean toy-plastic shine. Camera does a smooth playful arc around the booth, shallow depth of field, warm 90s grade. Monster throws both stubby arms up; Robot does a stiff robotic head-bob. Audio: bouncy upbeat party groove, a cartoon 'boing', and Monster giggling while Robot beeps 'LET'S. GO.'", "title": "Monster + Robot booth cameo", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_021", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second detail shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (blocky chunky geometry, matte materials roughness ~0.85, un-photoreal early-3D console feel with period-correct gear). Extreme close-up on a TRICKSTER-class battle DJ's hands over a silver Technics-style turntable: fingers work a black-faceplate battle mixer crossfader in fast chops while the other hand rocks the record back and forth, a Concorde-shaped cartridge riding the low-poly vinyl groove. Setting is a home booth at NIGHT, neon green #3dff8b edge light and a warm lamp #ffd9a0, near-black background. Very shallow depth of field locked on the hands and platter, warm grimy grade, subtle motion blur on the scratching hand. Camera holds tight, tiny handheld-feel drift. Audio: a crisp transformer scratch pattern over a boom-bap beat, the crossfader clicking, and off-screen mentor Deckhand Dave saying 'nah, like THIS.'", "title": "Trickster scratch close-up", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_022", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (chunky blocky matte geometry, un-photoreal early-3D console look). Descending unmarked arcade stairs into Kickdrum Imports, the hidden specialist DJ shop in THE ESPY, at ARVO golden light bleeding down the stairwell (warm #ffd890 fading to cool shop interior). A DJ in chill-lean thrift steps down into a cramped low-poly basement crammed with import 12-inch sleeves, flight cases, and a counter where the knowing, slightly smug chill-lean counter guy waits. Camera cranes down the stairs following the DJ, then settles as the counter guy slides a rare record across the bench. Shallow depth of field, warm dusty grimy grade, single warm hanging bulb #ffc880, neon green #3dff8b price-tag glow. The DJ picks up the record and turns it to the light. Audio: muffled dub from a corner speaker, footsteps down stairs, and the counter guy drawling 'you won't find that anywhere else, mate.'", "title": "Kickdrom Imports \u2014 the dig reveal", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_023", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second diegetic shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (blocky chunky matte geometry, period-correct hi-fi gear, un-photoreal early-3D console feel). Close on the back of a silver brushed-aluminium hi-fi amp with two glowing needle VU meters and a black battle mixer, red and white RCA plugs and a ground wire dangling loose from a PHONO/LINE/GND socket panel. Home booth at LATE night, cold moonlight #101028 through a window fighting a warm desk lamp #ffd9a0, near-black room. The loose ground wire sparks a faint issue: the VU needles jitter and a visible buzz shimmer ripples the image. A hand reaches in and re-seats the ground wire; the needles settle. Camera slow macro push onto the socket panel, very shallow depth of field, warm grimy grade. Audio: a loud 60-cycle mains HUM buzzing, then a click as the wire seats and the hum cuts to clean silence, followed by a relieved 'there.'", "title": "Signal-chain fault \u2014 the hum", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_024", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second establishing shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (chunky blocky matte geometry, un-photoreal early-3D console look, hand-painted 90s signage). Exterior of The Regent, a second-run cinema in THE JUNCTION, at NIGHT (sky #ff7848 dusk into #28285c purple, neon just igniting). A glowing low-poly marquee with chunky hand-set letters and a warm bulb border, gig posters and street-press pages stapled to a flyer pole beside it, red-brick facade with a faded graffiti burner, wet footpath reflecting neon. Camera does a smooth slow lateral tracking pan across the marquee and up the facade, shallow depth of field, warm grimy nostalgic grade, glowing #ffc880 marquee bulbs and hot pink #ff5cad neon trim. Two low-poly punters queue at the sticky-carpet doors. Audio: distant traffic and freight rumble, the electric buzz of the marquee lights, muffled synth-pop from inside, and a passerby saying 'seen it yet?'", "title": "Regent marquee \u2014 night pan", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_025", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second cutscene for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (blocky chunky matte geometry, cozy clutter, un-photoreal early-3D console feel). The HOME HUB bedroom at MORNING (sky #f8c890 to #8fb8e8, warm peach dawn, soft light through thin curtains). The canonical setup: a dark-walnut DJ table with four thick square legs holding twin silver Technics-style turntables, a black 2-channel battle mixer, a silver hi-fi amp with two needle VU meters, black grille-less bookshelf speakers, a milk-crate of vinyl, flat vinyl stacks and a black flight case; plus an unmade bed, a wardrobe, THE PHONE, THE TELLY with VCR, a crate shelf and a 'poster of the week' on the wall. Warm peach dawn light creeps across the gear as the room brightens. Camera does a slow smooth reveal pan from the bed across to the decks, shallow depth of field, warm nostalgic grade, floating dust. Audio: birdsong and distant freight, a ticking clock, and an old answering-machine beep with a booking message: 'gig's Friday night, don't be late.'", "title": "Home hub \u2014 sunrise wake", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_026", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second promo shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (chunky blocky matte geometry, un-photoreal early-3D console look). Inside Cafe Nero, a polished CBD TOWN club at NIGHT (deep blue-black room, granite and brass catching neon, gold #ffd23d and cyan #4dd8ff pops). A SCENESTER-class DJ dressed sharp for the club door works two silver decks with smooth, unhurried moves for a dressed-up low-poly club crowd swaying in unison. Camera does a slow smooth 180-degree arc from the crowd around to a profile of the DJ, shallow depth of field, warm grimy grade tempered with cool club blues, soft haze and lens glint off brass. On the phrase change the DJ eases a long crossfade and the crowd lifts their drinks. Audio: a deep house groove around 124 BPM, a filtered build-up, and a smooth crowd 'oooh' as the bass returns.", "title": "Cafe Nero \u2014 smooth club set", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_027", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second detail cutscene for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (blocky chunky matte geometry, un-photoreal early-3D console feel). Close on THE TELLY and VCR in the HOME HUB at LATE night (cold moonlight #101028, warm lamp #ffd9a0, near-black room). A hand slides a low-poly VHS battle tape \u2014 its skinnable cover reading 'X-MEN IN X-ERCIZE #1', clearly the grail \u2014 into the front-loading VCR. The CRT flickers to life showing a low-gen dub with rolling tracking lines and static across grainy footage of DJs battling. Camera slow push onto the CRT screen, very shallow depth of field, warm grimy nostalgic grade, phosphor-green #3dff8b screen glow spilling onto the DJ's blocky face. The tracking briefly rolls then locks. Audio: the mechanical chunk-whirr of a VHS loading, tape hiss and warble, a scratched-up battle routine, and a hushed 'no way... this is the ORIGINAL.'", "title": "VCR battle tape \u2014 grail insert", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_028", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second establishing shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (chunky blocky matte geometry, un-photoreal early-3D console look, sun-faded worn textures). The Trash & Treasure flea market in THE ESPY: a weekend car-park swap meet at early MORNING (sky #f8c890 to #8fb8e8, warm peach dawn, long soft shadows, Norfolk pines and a milk bar in the distance). Rows of low-poly trestle tables piled with dusty records, old amps, milk-crates and junk; a few early-bird diggers hunched over the bins. A DJ crouches, flipping through a crate of cheap vinyl, breath faintly visible in cool dawn air. Camera does a slow smooth crane-up revealing the whole market laid out under the pines, shallow depth of field, warm nostalgic grimy grade, golden dawn haze. The DJ pulls a record and grins. Audio: gulls and distant surf, murmuring haggling, the shuffle of records, and a vendor calling 'two bucks each, love!'", "title": "Trash & Treasure dawn swap meet", "category": "djsim_promo_video"}
|
||||
{"id": "djsim_promo_video_029", "kind": "video", "model": "Veo 3.1 - Fast", "prompt": "Cinematic 8-second dramatic shot for a 1990s Australian DJ life-sim, low-poly flat-shaded 3D diorama style (blocky chunky matte geometry, un-photoreal early-3D console feel). A street venue in THE JUNCTION at NIGHT (sky #ff7848 into #28285c, neon just on, hot pink #ff5cad and neon green #3dff8b). A DJ mid-set has just bombed: the low-poly crowd is visibly thinning, arms crossed, speech bubbles griping ('PLAY SOMETHING WE KNOW'). The DJ, sweating and tense, slams a fresh record onto a silver deck and drops a banger \u2014 and the crowd stops, turns, and begins to fill back in and lift their hands. Camera starts tight on the anxious DJ then pulls back and rises as the room re-energizes, shallow depth of field, warm grimy grade, dust in the neon beams. Audio: an awkward beat that stumbles, boos and grumbling, then a crisp new drop and the crowd flipping to a rising cheer as someone yells 'OH NOW you're talkin'!'", "title": "Bomb-out recovery \u2014 thinning crowd", "category": "djsim_promo_video"}
|
||||
{"id": "game_characters_030", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character sprite of a broke 1990s bedroom DJ, TRICKSTER class (scruffy battle-DJ street look). Blocky chunky geometry, readable silhouette over detail, matte flat materials with almost no gloss (roughness ~0.85), early-3D console-diorama fidelity like a THRIFTGOD / Schedule 1 mannequin. Full-body three-quarter front standing pose, arms slightly out and hands emphasized (fingers ready to scratch), relaxed weight on one leg. Outfit reads STREET: worn snapback cap, oversized faded band tee, baggy cargo pants, scuffed skate shoes; sun-faded, second-hand, a little grimy. Palette: warm browns and muted greys for clothing with one hot-pink #ff5cad or neon-green #3dff8b accent detail; skin and fabric slightly desaturated and warm-graded, never clinical. Even neutral studio lighting, soft warm key from upper left, no harsh specular. TRANSPARENT BACKGROUND, sprite-sheet framing, centered, full figure inside frame with small margin, consistent scale for a character roster. NOTE: base art for Aseprite cleanup \u2014 keep edges clean and the silhouette unambiguous.", "title": "Player DJ base \u2014 Trickster class", "category": "game_characters"}
|
||||
{"id": "game_characters_031", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character sprite of a 1990s bedroom DJ, HUSTLER class (the dealmaker who works a room). Blocky chunky primitives, flat matte materials (roughness ~0.85), early-3D diorama look, readable silhouette. Three-quarter front pose mid-gesture: one hand out in a persuasive open-palm 'let's-do-a-deal' motion, confident lean, chin slightly up. Outfit blends STREET and CLUB: a second-hand blazer over a plain tee, dark jeans, decent-but-scuffed shoes, a beeper clipped at the waist; sun-faded and thrifted, not slick or expensive. Palette warm browns/creams #f5ecd8 with a gold #ffd23d accent (watch or chain) and muted blue-grey blazer; warm nostalgic grade. Soft even studio lighting, gentle warm key upper-left, minimal specular. TRANSPARENT BACKGROUND, sprite-sheet framing, centered full figure with margin, roster-consistent scale. NOTE: base art for Aseprite cleanup.", "title": "Player DJ base \u2014 Hustler class", "category": "game_characters"}
|
||||
{"id": "game_characters_032", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character sprite of a 1990s DJ, SCENESTER class (social butterfly dressed for the club door). Blocky low-poly geometry, matte flat shading (roughness ~0.85), early-3D console-diorama fidelity, strong readable silhouette. Confident front-facing catwalk-ish pose, hand on hip, head tilted, ready to greet the door. Outfit reads CLUB: sharp thrifted deceased-estate-suit jacket, tight top, fitted trousers, pointy shoes, small tinted club shades; a touch worn at the seams \u2014 thrifted glamour, never genuinely expensive. Palette near-black #0a0a12 clothing with saturated neon pops \u2014 hot pink #ff5cad and cyan #4dd8ff accents (shades, trim) \u2014 against warm skin. Deep-ish key light with a subtle cool neon rim on one side to hint at club light, still mostly even and clean. TRANSPARENT BACKGROUND, sprite-sheet framing, centered full figure with margin, consistent roster scale. NOTE: base art for Aseprite cleanup.", "title": "Player DJ base \u2014 Scenester class", "category": "game_characters"}
|
||||
{"id": "game_characters_033", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character portrait of DECKHAND DAVE, the warm mate-ish mentor DJ from a 1990s Australian DJ life-sim. Blocky chunky geometry, matte flat materials (roughness ~0.85), early-3D diorama fidelity, readable silhouette. Waist-up three-quarter pose caught mid-teach: reaching one hand forward as if grabbing the player's wrist to guide a scratch ('nah, like THIS'), open friendly grin, eyebrows up. STREET lean: faded flannel shirt over a tee, forearm tattoo, a bit of stubble, well-worn look. Palette warm browns #6b4a3a and muted denim blue with a small neon-green #3dff8b wristband accent; warm grimy nostalgic grade, second-hand feel. Soft warm interior key light (#ffd9a0), gentle fill, low specular. TRANSPARENT BACKGROUND, sprite-sheet framing, centered, small margin, scaled to match the NPC roster. NOTE: base art for Aseprite cleanup.", "title": "Deckhand Dave \u2014 mentor NPC portrait", "category": "game_characters"}
|
||||
{"id": "game_characters_034", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character portrait of the RECORD-SHOP COUNTER GUY from a 1990s DJ sim \u2014 a knowing, slightly smug crate-wisdom clerk who busts myths and drops battle-history gossip. Blocky low-poly geometry, matte flat shading (roughness ~0.85), early-3D diorama fidelity, clean silhouette. Waist-up pose leaning one elbow on an unseen counter, arms loosely crossed, one eyebrow raised, faint smirk. CHILL lean: rumpled vintage bowling shirt or op-shop cardigan, thick-rimmed glasses, a bit of a belly, coffee-shop-clerk energy. Palette muted creams #f0e8d0 and warm browns with a gold #ffd23d shirt-detail accent; warm faded nostalgic grade, sun-bleached seaside-suburb feel. Soft warm key light with a little dusty ambient, minimal gloss. TRANSPARENT BACKGROUND, sprite-sheet framing, centered with margin, roster-consistent scale. NOTE: base art for Aseprite cleanup.", "title": "Record-shop counter guy \u2014 clerk portrait", "category": "game_characters"}
|
||||
{"id": "game_characters_035", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character portrait of a STREET-lean WAREHOUSE PROMOTER \u2014 the venue owner of a gritty inner-industrial rail-suburb warehouse party in a 1990s Australian DJ sim. Blocky chunky geometry, matte flat materials (roughness ~0.85), early-3D console-diorama fidelity, bold readable silhouette. Waist-up pose, arms folded, a hard but fair once-over stare, walkie or torch clipped to belt. Look: black bomber jacket, beanie, keys on a carabiner, roughed-up hi-vis-orange detail somewhere; working-class, no-nonsense, everyone-knows-you vibe. Palette near-black #0a0a12 and muted grey #3a3a42 with an orange #ff8a50 hi-vis accent and one neon-green #3dff8b glow catch (as if lit by a warehouse sign). NIGHT lighting mood: deep blue-black ambient with a saturated neon rim light on one shoulder, warm point-light kicker on the face. TRANSPARENT BACKGROUND, sprite-sheet framing, centered with margin, roster scale. NOTE: base art for Aseprite cleanup.", "title": "Warehouse street venue owner NPC", "category": "game_characters"}
|
||||
{"id": "game_characters_036", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character portrait of a CLUB-lean CLUB MANAGER \u2014 the smooth, image-conscious owner of a CBD nightclub in a 1990s Australian DJ sim. Blocky low-poly geometry, matte flat shading (roughness ~0.85), early-3D diorama fidelity, sharp silhouette; still part of a grimy world, so 'polished' means well-dressed, not photoreal-shiny. Waist-up pose, one hand adjusting a lapel, cool appraising half-smile, chin level. Look: fitted dark suit jacket, open-collar silk-look shirt, slicked hair, small earpiece \u2014 CBD-mall-after-dark glamour. Palette near-black #06060c suit with hot-pink #ff5cad and purple #b08aff neon accents (club-sign spill on the collar and hair). CLUB/NIGHT lighting: deep blue-black background, saturated pink neon key on one side, cyan #4dd8ff rim on the other, keeping the face readable. TRANSPARENT BACKGROUND, sprite-sheet framing, centered with margin, roster-consistent scale. NOTE: base art for Aseprite cleanup.", "title": "Polished CBD club manager NPC", "category": "game_characters"}
|
||||
{"id": "game_characters_037", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character portrait of a CHILL-lean OLD PUBLICAN \u2014 the weathered owner of a salt-bleached seaside record bar in a 1990s Australian DJ sim. Blocky chunky geometry, matte flat materials (roughness ~0.85), early-3D diorama fidelity, calm readable silhouette. Waist-up pose behind an unseen bar, drying a glass with a tea towel, easy weary smile, crow's-feet. Look: rolled-sleeve shirt, apron, grey moustache, sun-leathered skin, relaxed old-timer energy. Palette warm off-whites #f5ecd8 and faded blues with a small gold #ffd23d accent (an old badge or bottle-opener); warm golden-arvo nostalgic grade, sun-bleached weatherboard feel. ARVO golden-hour lighting: warm #ffdca0 key from a low side sun, soft long-shadow warmth, minimal specular. TRANSPARENT BACKGROUND, sprite-sheet framing, centered with margin, roster scale. NOTE: base art for Aseprite cleanup.", "title": "Seaside chill-bar publican NPC", "category": "game_characters"}
|
||||
{"id": "game_characters_038", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character sprite of a RIVAL HEADLINER BATTLE-DJ \u2014 an aspirational, highly skilled turntablist the player watches to learn (90s battle-ladder lore energy). Blocky low-poly geometry, matte flat shading (roughness ~0.85), early-3D console-diorama fidelity, dynamic readable silhouette. Full-body action pose hunched over invisible decks, both hands working a record and crossfader mid-scratch, headphones cupped to one ear, focused intensity. Look: crisp street B-boy outfit \u2014 fresh cap turned back, gold-detail tracksuit jacket, clean sneakers; sharper and more confident than the scrappy player, but still low-poly matte. Palette bold \u2014 near-black with hot-pink #ff5cad and gold #ffd23d accents, one cyan #4dd8ff highlight. NIGHT stage lighting: deep blue-black, saturated neon key and rim from two sides, warm point-light on the hands. TRANSPARENT BACKGROUND, sprite-sheet framing, centered full figure with margin, roster scale. NOTE: base art for Aseprite cleanup.", "title": "Rival battle-DJ headliner sprite", "category": "game_characters"}
|
||||
{"id": "game_characters_039", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character sprite of a single WAREHOUSE STREET-CROWD 'ghost' \u2014 one generic party-goer used to fill a warehouse rave crowd in a 1990s Australian DJ sim (rendered as density, so keep it simple and iconic). Blocky chunky geometry, minimal facial detail, matte flat materials (roughness ~0.85), early-3D diorama fidelity, ultra-readable silhouette meant to repeat in a mass. Full-body pose: arms up mid-dance, head back, loose and sweaty. STREET-crowd look: baggy tee, cargo pants, bucket hat, work boots; scrappy, unglamorous. Palette muted browns/greys with a single neon-green #3dff8b glow-stick or wristband accent so it pops in a dark room. NIGHT/LATE lighting: deep blue-black ambient, strong neon rim light, faint warm kicker; body slightly silhouetted to read as a crowd 'ghost'. TRANSPARENT BACKGROUND, sprite-sheet framing, centered full figure with margin, consistent scale for tiling into a crowd. NOTE: base art for Aseprite cleanup \u2014 silhouette clarity matters more than face detail.", "title": "Warehouse street crowd 'ghost' NPC", "category": "game_characters"}
|
||||
{"id": "game_characters_040", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character sprite of a single DRESSED-UP CLUB-CROWD 'ghost' \u2014 one generic clubber for filling a CBD nightclub crowd in a 1990s DJ sim. Blocky low-poly geometry, minimal face detail, matte flat shading (roughness ~0.85), early-3D diorama fidelity, clean repeatable silhouette. Full-body pose: hips-and-shoulders groove, one arm raised holding an invisible drink, poised and cool. CLUB look: little black going-out top or slim shirt, fitted trousers, heeled or pointy shoes, styled hair; thrifted-glam, worn but sharp. Palette near-black #0a0a12 with saturated hot-pink #ff5cad and cyan #4dd8ff neon accents catching the club light. NIGHT club lighting: deep blue-black, pink neon key one side, cyan rim other side, keeping a strong silhouette for crowd tiling. TRANSPARENT BACKGROUND, sprite-sheet framing, centered full figure with margin, consistent tiling scale. NOTE: base art for Aseprite cleanup \u2014 prioritize silhouette.", "title": "Dressed-up club crowd 'ghost' NPC", "category": "game_characters"}
|
||||
{"id": "game_characters_041", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character sprite of a single MELLOW CHILL-BAR-CROWD 'ghost' \u2014 one relaxed patron for filling a seaside record-bar crowd in a 1990s Australian DJ sim. Blocky chunky geometry, minimal facial detail, matte flat materials (roughness ~0.85), early-3D diorama fidelity, simple readable silhouette for repeating. Full-body pose: leaning easily against an invisible wall or standing with a drink, gentle head-nod, low energy. CHILL look: linen shirt or loose knit, rolled chinos, sandals or canvas shoes, sun-faded seaside casual. Palette warm off-whites #f0e8d0 and faded blues with a soft gold #ffd23d accent; warm nostalgic grade. ARVO/NIGHT transition lighting: warm low golden key fading to soft dusk purple ambient, gentle and calm, low specular. TRANSPARENT BACKGROUND, sprite-sheet framing, centered full figure with margin, consistent tiling scale for a crowd. NOTE: base art for Aseprite cleanup \u2014 keep the silhouette clear and simple.", "title": "Mellow chill-bar crowd 'ghost' NPC", "category": "game_characters"}
|
||||
{"id": "game_characters_042", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character of MONSTER, the studio mascot for MonsterRobot (monsterrobot.games), appearing as an in-game cameo in a 1990s DJ life-sim. Monster is short, round, squat and huggable, fully covered in soft PURPLE fur, with a big friendly open-mouthed grin, two little round eyes, and stubby arms and legs. Blocky-but-rounded low-poly geometry to fit the game world, BUT render Monster deliberately cuter and a touch softer than the game's grimy matte props \u2014 plush, warm, inviting. Pose: standing front-on with both arms raised in a happy 'party!' cheer, a tiny DJ headphone slung around the neck as a nod to the sim. Palette dominant purple #b08aff fur with darker purple shadows and a neon-green #3dff8b accent on the headphones. Clean even lighting, soft warm key upper-left, gentle rounded ambient occlusion, mascot-clean and iconic. TRANSPARENT BACKGROUND, sprite-sheet framing, centered full figure with margin. Keep it simple and iconic \u2014 this is the brand layer, not a grimy world prop.", "title": "Monster mascot \u2014 brand cameo", "category": "game_characters"}
|
||||
{"id": "game_characters_043", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D character of ROBOT, the studio mascot for MonsterRobot (monsterrobot.games), as an in-game cameo in a 1990s DJ life-sim. Robot is a glossy BLUE chrome-toy character with a clean shiny finish \u2014 deliberately the ONE shiny thing against the game's matte-grime world, so render it with a smooth reflective sheen (higher specular than anything else in-game). Simple friendly design: boxy rounded head with two round glowing eyes and a little antenna, a compact cylindrical body, segmented arms and legs, an unthreatening cute look. Pose: standing front-on giving a cheerful two-thumbs-up (or waving one arm) beside an unseen partner, a tiny record spinning on one fingertip as a DJ-sim nod. Palette glossy blue #4dd8ff and deeper blue with chrome highlights and a gold #ffd23d antenna-light and eye accent. Bright clean studio lighting with crisp specular highlights and soft reflections, mascot-clean and iconic. TRANSPARENT BACKGROUND, sprite-sheet framing, centered full figure with margin. Keep it simple and iconic \u2014 brand layer, shinier than the world.", "title": "Robot mascot \u2014 brand cameo", "category": "game_characters"}
|
||||
{"id": "game_characters_044", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D illustration of the MonsterRobot studio mascot duo (monsterrobot.games) as a splash/loading cameo for a 1990s Australian DJ life-sim \u2014 the one shiny, cute brand exception to the game's grimy matte world. On the left, MONSTER: short, round, squat, huggable, covered in soft PURPLE #b08aff fur, big open grin, tiny round eyes. On the right, ROBOT: glossy BLUE #4dd8ff chrome-toy, boxy rounded head, glowing eyes, little antenna, rendered noticeably shinier and more reflective than Monster's matte fur. Both share a small pair of silver Technics-style DJ decks and a black battle mixer between them, spinning records and cheering as a party duo \u2014 a clear nod to the sim without being a grimy world prop. Composition: the pair centered as a balanced logo-style pairing, three-quarter view, party energy. Palette: purple fur + glossy blue chrome against a deep near-black #0a0a12 club-neon backdrop, with neon-green #3dff8b, hot-pink #ff5cad and gold #ffd23d accent glows framing them. Lighting: clean warm key with saturated neon rim lights, crisp specular on Robot, soft on Monster. Optional tasteful Courier-mono terminal-green flourish reading 'MONSTERROBOT'. TRANSPARENT BACKGROUND, centered, generous margin, iconic and clean. Brand layer \u2014 keep it simple, cute and shiny.", "title": "Monster + Robot duo \u2014 splash/loading cameo", "category": "game_characters"}
|
||||
{"id": "game_characters_045", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly, flat-shaded 3D head-and-shoulders PORTRAIT BUST of the customizable player DJ from a 1990s Australian DJ life-sim, built as neutral base art for a character-creator (so it can later be re-skinned across hat/top slots and the three leans). Blocky chunky geometry, matte flat materials (roughness ~0.85), early-3D console-diorama fidelity, clean symmetrical readable silhouette. Pose: straight-on neutral portrait, calm confident half-smile, eyes level to camera, no hat and plain crew-neck tee so the base is easy to customize. Ambiguous-but-broke-nobody styling, warm skin, slightly messy hair. Palette warm neutral browns and off-white #f5ecd8 tee, one faint neon-green #3dff8b accent as a rim glow; warm nostalgic grade, never clinical. Even soft portrait lighting, gentle warm key upper-left, low specular, no dramatic shadows so features stay editable. TRANSPARENT BACKGROUND, sprite-sheet framing, centered bust with even margin, scaled to match the portrait roster. NOTE: base art for Aseprite cleanup \u2014 keep the head neutral and symmetrical for customization.", "title": "Player DJ portrait bust \u2014 customizable base head", "category": "game_characters"}
|
||||
{"id": "game_environments_046", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment render, early-3D console-diorama look, deliberately un-photoreal. A cozy cramped 1990s bedroom-DJ studio, seen in three-quarter isometric-ish view for parallax layering. Centerpiece: a dark walnut DJ table with four thick square legs holding twin silver Technics-style turntables, a black 2-channel battle mixer between them, closed-back black DJ headphones resting on one deck, and a Concorde-shaped cartridge on the platter. Behind it a silver brushed-aluminium hi-fi amplifier with two glowing needle VU meters, flanked by two black bookshelf speakers with exposed round brown paper woofers and no grille. Around the room: an unmade bed, a wooden wardrobe, a milk-crate full of vinyl, flat stacks of records, a black flight case with butterfly latches, a chunky beige telly with a VCR, a corkboard 'poster of the week', and a crate shelf. Flat matte materials, roughness about 0.85, almost no gloss on world surfaces, blocky chunky geometry, readable silhouettes over detail, real-object accuracy under the low-poly skin. Palette: warm woods and browns (#6b4a3a, #4a3b2c, #8a6d4a), muted blue-greys, cream off-whites (#f5ecd8). ARVO golden-hour lighting: sky gradient warm gold #ffd890 at top to muted blue #88a8d0 at bottom, low warm sun tinting everything gold through the window, warm point-lamp glow #ffd9a0. Cozy clutter, sun-faded, dusty, sticky-carpet texture, second-hand and lived-in. Never clean, never expensive-looking. No text, no logos, no watermark. Wide 16:9 aspect, parallax-friendly clean background.", "title": "Home Hub \u2014 Bedroom DJ Setup, Late Afternoon (ARVO)", "category": "game_environments"}
|
||||
{"id": "game_environments_047", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D console-diorama aesthetic, deliberately un-photoreal, chunky blocky geometry with flat matte materials (roughness ~0.85, no gloss). Same cramped 1990s bedroom-DJ studio as the game's home hub, three-quarter view: dark walnut DJ table with four thick square legs, twin silver Technics-style turntables, black 2-channel battle mixer, black closed-back DJ headphones, silver brushed-aluminium hi-fi amp with two needle VU meters faintly lit, two black bookshelf speakers with exposed woofers and no grille. Surrounding cozy clutter: unmade bed, wardrobe, milk-crate of vinyl, flat record stacks, black flight case with butterfly latches, beige telly and VCR, crate shelf, weekly poster. KICKON 2-6am lighting: sky through the window near-black, gradient #06060f fading to pure black #000000, faint cold blue moonlight, dead-quiet mood, a single warm bedside lamp glowing #ffc880 casting a small pool of amber light. Deep blue-black shadows, a few neon accents from a small sign \u2014 neon green #3dff8b \u2014 reflecting on the turntable platters. Warm woods and browns under cold moonlight, grimy, nostalgic, lonely-late-night feel. The one lamp is the only warm island in a dark room. No text, no logos, no watermark. Wide 16:9, parallax-friendly background.", "title": "Home Hub \u2014 Bedroom DJ Setup, KICKON 3am Dead Quiet", "category": "game_environments"}
|
||||
{"id": "game_environments_048", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment render, early-3D diorama look, blocky chunky primitives, flat matte materials (roughness ~0.85, minimal specular), readable silhouettes. An inner-industrial Australian rail-suburb street in the 1990s \u2014 'The Junction'. Red-brick shopfronts with rusted corrugated-iron awnings, a graffiti burner mural on a brick wall, power lines overhead, cracked footpath. Hand-painted comedy shop signs for a 'Save-A-Lot' op shop, 'Cash Kingdom' pawn, and 'Spincycle Records', all slightly worn and sun-faded. A green-and-cream BUS 96 stop, a promo flyer pole plastered with gig posters, a freight-rail overpass in the background. Working-class, gritty, lived-in. Side-scrolling parallax-friendly composition, flat clear ground plane. Palette: warm red brick, rusted browns (#6b4a3a, #4a3b2c), muted blue-greys, cream signage (#f0e8d0). MORNING 6-10am lighting: soft warm peach dawn, sky gradient #f8c890 at top to soft blue #8fb8e8 at bottom, low soft warm sun, long gentle shadows, faded pastel daytime grade, dusty air. Neon signs are OFF this early. Warm, grimy, nostalgic Australian 90s. Never slick, never clean. No readable brand logos beyond hand-painted in-world signage, no watermark, no UI. Wide 16:9 aspect.", "title": "The Junction \u2014 Rail Suburb Street, MORNING Dawn", "category": "game_environments"}
|
||||
{"id": "game_environments_049", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D diorama, deliberately un-photoreal, chunky blocky geometry, flat matte materials (roughness ~0.85). Same gritty inner-industrial Australian rail suburb 'The Junction' at dusk: red-brick shopfronts, rusted corrugated awnings, a graffiti burner mural, power lines, a BUS 96 stop, a flyer pole thick with peeling gig posters, freight-rail overpass behind. Hand-painted worn shop signs \u2014 op shop, pawn, record store \u2014 now with their neon tubes IGNITED. NIGHT 6-10pm lighting: sky gradient hot orange dusk #ff7848 at top bleeding into deep purple #28285c at bottom, low dim warm sun, the club-neon language switching on. Saturated neon pops against the darkening sky: neon green #3dff8b, hot pink #ff5cad, gold #ffd23d signs glowing and casting colored light on wet-look footpath, warm street-lamp point-lights #ffd9a0 pooling on the ground. Deep warm shadows, grimy nostalgic grade, second-hand and sun-worn. That transitional magic-hour moment when the street wakes up. Never polished, never expensive. Only hand-painted in-world signage, no external logos, no watermark, no HUD. Side-scrolling parallax-friendly, wide 16:9.", "title": "The Junction \u2014 Rail Suburb Street, NIGHT Dusk with Neon On", "category": "game_environments"}
|
||||
{"id": "game_environments_050", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D console-diorama style, blocky chunky geometry, flat matte materials (roughness ~0.85), readable silhouettes over detail. A polished 1990s Australian CBD pedestrian mall \u2014 'TOWN', the club precinct by night but sterile by day. Granite-paved pedestrian street, brass bollards and planters, a heritage arcade entrance, a grand 'Mayne's Department Store' facade with hand-painted-style signage, a 'City Mission' op shop and a 'Central News' kiosk. Clean-cut, corporate-polished compared to the grimy suburbs, muzak-quiet feeling, empty and a bit lifeless mid-shopping-day. Flat clear ground for parallax. Palette: cool granite greys and blue-greys (#8a8a9a, #3a3a42), brass-gold accents, muted cream stone (#f5ecd8). MIDDAY 10am-2pm lighting: bright neutral blue sky gradient #6fb4f0 top to pale #a8d4f8 bottom, high bright sun (highest intensity), short hard shadows, faded pastel daytime grade but clean and even. Neon OFF. Warm nostalgic 90s but this precinct reads deliberately cleaner and colder than the rest \u2014 granite and brass, not brick and rust. Only in-world hand-painted signage, no external logos, no watermark, no UI. Wide 16:9, parallax-friendly.", "title": "Town CBD Pedestrian Mall \u2014 MIDDAY (dead polished daytime)", "category": "game_environments"}
|
||||
{"id": "game_environments_051", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D diorama, un-photoreal, chunky blocky geometry, flat matte materials with a couple of glossy neon accents. The CBD 'TOWN' precinct after dark \u2014 the granite pedestrian mall transformed into club territory. Foreground: the entrance to 'Club Chrome', a chrome-and-black nightclub facade with a velvet-rope door, a bouncer podium, and a blazing neon sign. Brass bollards and granite pavers now lit by colored light, a queue-line stanchion, a lit arcade mouth beside it. NIGHT 6-10pm dusk-to-dark lighting: sky gradient orange dusk #ff7848 fading to deep purple-blue #28285c, low dim warm sun nearly gone. Intense club-neon pops: hot pink #ff5cad and neon green #3dff8b and gold #ffd23d tubes, secondary cyan #4dd8ff and purple #b08aff, all glowing hard and spilling saturated color onto polished granite and chrome. Warm street-lamp point-lights #ffd9a0. Deep blue-black shadows, saturated neon reflections, that 'the mall dies at 5:30 then the clubs wake up' contrast. Grimy-nostalgic 90s but glossier here than the suburbs. Only in-world signage, no real brand logos, no watermark, no HUD. Wide 16:9 aspect, parallax-friendly clean composition.", "title": "Town \u2014 Club Chrome Exterior, NIGHT Neon Club Front", "category": "game_environments"}
|
||||
{"id": "game_environments_052", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment render, early-3D diorama, deliberately un-photoreal, blocky chunky geometry, flat matte materials (roughness ~0.85), readable silhouettes. An old salt-bleached Australian seaside suburb in the 1990s \u2014 'The Espy', the chill precinct. Tall dark-green Norfolk Island pines lining a weatherboard street, a corner milk bar with a hand-painted 'Gull's Milk Bar' sign and a Peters ice-cream flag, faded weatherboard cottages, a glimpse of flat ocean at the end of the street, a rusted Holden parked at the kerb. Mellow, unhurried, coastal. Flat ground plane for parallax layering. Palette: salt-bleached pale timber, sea-greens and muted blues, warm cream signage (#f0e8d0), sun-faded pastels. ARVO 2-6pm golden-hour lighting: sky gradient warm gold #ffd890 top to soft muted blue #88a8d0 bottom, low warm golden sun raking long shadows across the road, everything bathed in nostalgic amber light. Neon still OFF. Warm, calm, sun-worn, sleepy-beachside-arvo mood \u2014 the softest, gentlest of the three precincts. Second-hand and weathered but peaceful. Only in-world hand-painted signage, no external logos, no watermark, no UI. Wide 16:9, side-scrolling parallax-friendly.", "title": "The Espy \u2014 Seaside Suburb Street, ARVO Golden Hour", "category": "game_environments"}
|
||||
{"id": "game_environments_053", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D console-diorama look, un-photoreal, chunky blocky geometry, flat matte materials (roughness ~0.85). Interior of 'Kickdrum Imports', the hidden specialist DJ record shop down unmarked arcade stairs in 'The Espy'. A cramped underground room stacked wall-to-wall with vinyl: rows of record bins, packed shelves of 12-inch sleeves rendered in varied musical-style cover art, a listening station with twin silver Technics-style decks and a black battle mixer, closed-back headphones on a hook, gig flyers stapled to the walls, a milk-crate stack, a single flickering fluorescent tube. Grimy crate-digger den, no windows. Palette: warm woods and browns (#6b4a3a, #2a2118), muted greys, colorful record spines as pops of color. LATE 10pm-2am lighting even though it's underground: cold fluorescent overhead washing the room, deep blue-black shadows in the corners, one warm point-lamp #ffc880 over the counter, a small neon-green #3dff8b 'OPEN' sign glowing. Dusty, cramped, sacred-basement feeling, records everywhere, sticky carpet. Never clean, never spacious. No external logos, only in-world flyers and hand-painted signage, no watermark, no HUD. Wide 16:9, parallax-friendly with clear foreground counter and deep bin rows behind.", "title": "Kickdrum Imports \u2014 Specialist DJ Shop Interior, LATE Night", "category": "game_environments"}
|
||||
{"id": "game_environments_054", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D diorama, deliberately un-photoreal, chunky blocky geometry, flat matte materials (roughness ~0.85), readable silhouettes over detail. Interior of 'The Waxworks', a seaside collector record shop in 'The Espy'. A warm cluttered room with wooden record bins full of alphabetized vinyl, glass display cases of rare sleeves, a knowing counter with a cash register and a spinning demo turntable, framed gig posters and battle flyers on timber-panelled walls, a milk-crate stool, hanging bunting. The chill-lean crate-wisdom counter. Palette: warm honey woods and browns (#8a6d4a, #6b4a3a), cream walls (#f5ecd8), colorful record spines. MIDDAY 10am-2pm lighting: bright neutral daylight streaming through a shopfront window, sky visible outside as pale blue #a8d4f8, high sun casting warm dusty light-shafts across the bins, gentle interior shadows, faded pastel grade. A small neon sign in the window unlit in daytime. Cozy, dusty, lovingly-cluttered, sun-faded record-shop warmth. Second-hand and worn but cared-for. No external logos, only in-world signage and flyers, no watermark, no UI. Wide 16:9, parallax-friendly with foreground counter and receding bin rows.", "title": "The Waxworks \u2014 Collector Record Shop Interior, MIDDAY", "category": "game_environments"}
|
||||
{"id": "game_environments_055", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D diorama, un-photoreal, chunky blocky geometry, flat matte materials (roughness ~0.85) with a glowing lit marquee. Exterior of 'The Regent', a shabby second-run cinema in 'The Junction' rail suburb \u2014 sticky-carpet, past-its-prime picture palace. A worn art-deco brick facade with a big illuminated marquee sign whose lettering-board is blank (ready to be filled by the game), rows of exposed bulbs around the marquee edge, faded movie-poster light-boxes flanking the ticket booth, a chipped ticket window, gum-spotted footpath, a flyer pole nearby. Nostalgic, run-down, beloved. NIGHT 6-10pm dusk lighting: sky gradient orange dusk #ff7848 top into deep purple #28285c bottom, low dim warm sun almost gone. The marquee bulbs and neon IGNITED \u2014 warm gold #ffd23d bulb-glow, a hot-pink #ff5cad and neon-green #3dff8b neon trim, casting colored light on the brick and wet footpath. Warm street-lamp point-lights #ffd9a0. Deep warm shadows, saturated nostalgic neon, grimy 90s picture-palace charm. Never restored, never glossy. Marquee board and posters left blank/generic, no real film titles or brand logos, no watermark, no HUD. Wide 16:9, parallax-friendly.", "title": "The Regent \u2014 Second-Run Cinema Exterior with Marquee, NIGHT", "category": "game_environments"}
|
||||
{"id": "game_environments_056", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D console-diorama look, deliberately un-photoreal, chunky blocky geometry, flat matte materials on the room surfaces (roughness ~0.85). Interior of an illegal warehouse party venue in 'The Junction' \u2014 the STREET-lean rave space. A big raw industrial room: exposed brick and steel-truss ceiling, a low homemade DJ stage built from milk crates and gaffer-taped plywood holding twin silver Technics decks and a black battle mixer, a stack of scuffed black PA speakers, dangling work-lights and a single mirror ball, cabling gaffer-taped across a concrete floor, a graffiti burner on the back wall. Blocky crowd 'ghosts' rendered as simple low-poly figures with density. Grimy, sweaty, second-hand rig. Palette: dark brick and concrete greys (#3a3a42, #26263a), warm wood stage. LATE 10pm-2am peak-rave lighting: near-black room, deep blue-black base, blasted through with saturated club-neon \u2014 hot pink #ff5cad, neon green #3dff8b, cyan #4dd8ff, purple #b08aff beams cutting the haze, gold #ffd23d wash on the stage. Volumetric smoke-haze catching colored light, mirror-ball speckle. Warm point-light #ffc880 over the decks. Sweaty-warehouse-at-3am energy, grimy and un-slick. No real logos, only in-world graffiti/flyers, no watermark, no HUD. Wide 16:9, parallax-friendly with clear foreground stage and deep hazy crowd behind.", "title": "Warehouse Venue Interior \u2014 Street Rave, LATE 3am Peak", "category": "game_environments"}
|
||||
{"id": "game_environments_057", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D diorama, un-photoreal, chunky blocky geometry, flat matte materials (roughness ~0.85), readable silhouettes. Interior of 'The Lism Record Bar', a mellow seaside chill-lean venue in 'The Espy'. A warm intimate weatherboard-walled bar: a small corner DJ booth with a single silver turntable and mixer on a timber shelf, a wall of vinyl behind the bar, worn leather couches, low round tables with candles, a modest speaker pair, hanging Edison-style bulbs, framed sun-faded gig posters, a few relaxed low-poly patron 'ghosts' seated. Cozy, unhurried, salt-air calm. Palette: warm honey timber and browns (#8a6d4a, #6b4a3a), muted sea-greens, cream (#f0e8d0). NIGHT 6-10pm dusk-into-evening lighting: a window showing the dusk sky gradient orange #ff7848 into purple #28285c, but the interior is lit warm and low \u2014 amber point-lights #ffd9a0 and #ffc880 from bulbs and candles pooling gently, one small neon-green #3dff8b bar sign. Soft warm shadows, saturated-but-cozy neon accent, nostalgic mellow-bar grade. The gentle, low-key chill counterpart to the sweaty warehouse. Second-hand, worn, welcoming. No real logos, only in-world signage, no watermark, no HUD. Wide 16:9, parallax-friendly.", "title": "The Lism Record Bar \u2014 Chill Seaside Venue Interior, NIGHT", "category": "game_environments"}
|
||||
{"id": "game_environments_058", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment render, early-3D console-diorama look, deliberately un-photoreal, blocky chunky geometry, flat matte materials (roughness ~0.85), readable silhouettes over detail. A weekend dawn car-park swap meet in 'The Espy' seaside suburb \u2014 the 'Trash & Treasure Flea'. Rows of fold-out trestle tables under the open sky in an asphalt car park, piled with second-hand junk: milk-crates of vinyl records, old hi-fi gear, dusty amps with needle VU meters, boxes of VHS tapes, bric-a-brac, hand-lettered cardboard price signs. A few beat-up station wagons with open tailgates, tarps, a couple of low-poly early-riser figures browsing. Norfolk pines and a flat ocean glimpse behind. Bargain-hunter dawn-run energy. Palette: warm asphalt greys, sun-faded plastic colors, colorful record spines and junk, cream cardboard (#f0e8d0). MORNING 6-10am dawn lighting: soft warm peach dawn, sky gradient #f8c890 top to soft blue #8fb8e8 bottom, very low soft warm sun casting long gentle shadows across the asphalt, cold morning air warming, faded pastel grade. Neon OFF. Warm, grimy, hopeful early-morning treasure-hunt mood. Everything worn, dusty, second-hand. No real brand logos, only hand-lettered in-world signs, no watermark, no HUD. Wide 16:9, parallax-friendly with foreground table of goods and receding rows behind.", "title": "Trash & Treasure Flea Market \u2014 Dawn Car-Park Swap Meet, MORNING", "category": "game_environments"}
|
||||
{"id": "game_environments_059", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D diorama, un-photoreal, chunky blocky geometry, flat matte materials (roughness ~0.85). Exterior of the broke bedroom DJ's flat in 'The Junction' rail suburb \u2014 a shabby two-storey red-brick block of flats with rusted iron balconies, a cracked concrete stoop, a single lit window on the upper floor (the player's room) glowing warm amber #ffc880 with a faint neon-green #3dff8b glow inside, wheelie bins by the gate, a Hills-hoist clothesline in a scrappy side yard, power lines, a graffiti tag on the fence. Working-class, run-down, home. Freight-rail line hinted behind. Palette: warm red brick, rusted browns (#6b4a3a, #4a3b2c, #2a2118), muted blue-greys, deep night tones. Transitional NIGHT-into-LATE lighting: sky gradient upper mostly deep blue-black #101028 fading to near-black #040408 with faint early stars, cold blue moonlight #8090ff on the brick, low ambient. The one warm lit window is the emotional focal point against the cold dark facade. A weak street-lamp point-light #ffd9a0 pooling on the footpath below. Grimy, lonely, nostalgic, second-hand. Never nice, never expensive \u2014 a broke kid's rented flat. No real logos, only in-world graffiti, no watermark, no HUD. Wide 16:9, parallax-friendly.", "title": "Player's Flat Building Exterior \u2014 The Junction, NIGHT into LATE", "category": "game_environments"}
|
||||
{"id": "game_environments_060", "kind": "image", "model": "Nano Banana 2", "prompt": "Low-poly flat-shaded 3D game environment, early-3D console-diorama style, deliberately un-photoreal, chunky blocky geometry, flat matte materials (roughness ~0.85), readable silhouettes. Exterior of 'Sharkey's', an old salt-bleached beachfront pub venue in 'The Espy' seaside suburb. A tiled Australian corner-pub facade with a wide wraparound verandah, a faded hand-painted pub sign, a lit beer-brand-style neon in the window (generic, no real brand), Norfolk pines flanking it, a bottle-shop drive-through side entrance, a few parked cars, the flat dark ocean and a jetty silhouette behind, gulls. Weathered, characterful, end-of-the-night quiet. Palette: salt-bleached pale tiles and timber, muted sea blue-greys (#3a3a42, #26263a), warm cream signage (#f0e8d0). LATE 10pm-2am blue-hour lighting: sky gradient deep blue-black #101028 top to near-black #040408 bottom with faint stars, cold moonlight #8090ff on the tiles and water, low ambient. Warm neon and window glow cutting the cold \u2014 hot pink #ff5cad and gold #ffd23d neon, warm verandah point-lights #ffd9a0, their reflection shimmering on the wet road. Saturated warm neon against deep cold blue night, nostalgic-melancholy coastal-pub mood, grimy and worn. Never restored, never glossy. Generic in-world signage only, no real brand logos, no watermark, no HUD. Wide 16:9, parallax-friendly.", "title": "Sharkey's Beachfront Pub Exterior \u2014 The Espy, LATE Blue Hour", "category": "game_environments"}
|
||||
{"id": "game_ui_items_061", "kind": "image", "model": "Nano Banana 2", "prompt": "A clean three-icon UI set for a 90s Australian DJ life-sim game, rendered as flat vector badges on a transparent dark near-black background (#06060c). Three square icons in a row, each with a thin 1px neon border and a rounded-square dark translucent panel behind it (rgba(6,6,12,0.8)). LEFT icon 'STREET' coded hot pink #ff5cad: a stylized graffiti-tag brick / battle-DJ hand-scratch motif. CENTER icon 'CLUB' coded neon green #3dff8b: a stylized club-neon / disco-column motif. RIGHT icon 'CHILL' coded gold #ffd23d: a stylized Norfolk-pine / ocean-wave seaside motif. Each icon sits above its uppercase label in monospace Courier New with wide letter tracking. Minimal, iconic, bold silhouettes readable at 32px, flat matte fills with no gloss, no gradients except a faint neon glow on the borders. Consistent line weight across all three, CRT terminal aesthetic, sharp clean edges. Square 1:1 icons, sheet layout, high contrast.", "title": "Triad lean icon set (STREET/CLUB/CHILL)", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_062", "kind": "image", "model": "Nano Banana 2", "prompt": "Three collectible quality-grade badges for a 90s DJ game item system, arranged in a horizontal row on a transparent near-black background (#0a0a12). Each badge is a small hexagonal or shield-shaped chip with a thin 1px neon border and dark translucent fill. LEFT reads 'VG-' in muted orange #ff8a50 with a faintly worn, scuffed edge. CENTER reads 'VG' in neon green #3dff8b, clean. RIGHT reads 'VG+' in gold #ffd23d with a subtle sparkle accent, the premium tier. All text in bold uppercase monospace Courier New. Flat matte design, low-poly-friendly, CRT street-press aesthetic, readable at very small size (down to 24px). Consistent badge shape and size across all three, only color and wear differ to signal quality. High contrast, clean crisp vector edges, subtle neon glow on borders, no photorealism. Sheet-style presentation.", "title": "VG grade badges (VG- / VG / VG+)", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_063", "kind": "image", "model": "Nano Banana 2", "prompt": "A single square vinyl record album sleeve rendered as game item art for a 90s Australian DJ sim, front-facing, centered on a transparent dark background (#06060c). Low-poly flat-shaded illustration style with a slightly sun-faded, worn, second-hand op-shop look: soft creases at the corners, a small price sticker in the corner. The sleeve artwork is a STREET-lean cover coded hot pink #ff5cad and near-black \u2014 bold graffiti-burner lettering and a grimy urban brick motif, no readable band name (abstract type shapes). The black inner vinyl peeks out one edge, glossy record surface with a small hot-pink center label. Warm grimy 90s color grade, matte flat materials, thin neon accent. Courier-mono tiny catalog code in a corner. Crisp edges, readable as a 64px inventory icon, high contrast against dark. Square 1:1.", "title": "Vinyl record sleeve icon (STREET style)", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_064", "kind": "image", "model": "Nano Banana 2", "prompt": "A row of five matching flat item icons for a DJ signal-chain system in a 90s life-sim game, on a transparent near-black background (#0a0a12), each in its own thin-neon-bordered dark rounded-square panel. From left: (1) silver Technics-style turntable seen top-down, tonearm and platter, low-poly. (2) a black Concorde-shaped phono cartridge. (3) a black 2-channel battle mixer with two vertical faders and a crossfader. (4) a red-and-white RCA plug pair with a green ground wire. (5) a brushed-aluminium hi-fi amp with two round needle VU meters. All rendered low-poly flat-shaded, period-correct 1990s hi-fi gear, matte materials with almost no gloss, warm silver and black tones with neon green #3dff8b accent highlights. Consistent scale, weight and lighting across all five icons. Readable at 40px, CRT terminal UI aesthetic, crisp clean edges, no photorealism. Horizontal sheet layout.", "title": "Signal-chain component icon set", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_065", "kind": "image", "model": "Nano Banana 2", "prompt": "Three warning-style fault symptom icons for a DJ gear troubleshooting minigame in a 90s sim, arranged in a row on a transparent dark background (#06060c). Each in a small dark translucent panel with a thin 1px neon border tinted warning-orange #ff8a50. LEFT 'HUM': a stylized sine-wave with a jagged 60Hz buzz and a broken ground-wire symbol. CENTER 'SKIP': a vinyl record groove with a needle jumping/scratching arc and a skip-jump chevron. RIGHT 'WOW/FLUTTER': a wobbling warped record disc with wavy pitch lines. All rendered as bold flat monochrome-plus-orange glyphs, low-poly friendly, uppercase Courier New mono label beneath each. Grimy 90s CRT diagnostic aesthetic, high contrast, readable at 32px, clean sharp edges, consistent line weight, no photorealism. Horizontal sheet.", "title": "Signal-chain fault icons (hum / skip / wow-flutter)", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_066", "kind": "image", "model": "Nano Banana 2", "prompt": "A single pair of closed-back black DJ headphones as a game inventory item icon for a 90s Australian DJ sim, three-quarter angle, centered on a transparent near-black background (#0a0a12). Low-poly flat-shaded, period-correct 1990s DJ cans: chunky blocky earcups, thick padded headband, coiled cable trailing off one side, one earcup flipped slightly as if for cueing. Matte black plastic with a faint worn scuff and a small strip of gaffer tape on the headband (second-hand feel). Subtle neon green #3dff8b rim light on the near edge. Warm grimy nostalgic grade, no gloss, no photorealism, chunky readable silhouette. Reads clearly as a 64px item icon in a dark translucent UI panel with a thin pink #ff5cad neon border. Square 1:1, crisp edges, high contrast.", "title": "DJ battle headphones item icon", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_067", "kind": "image", "model": "Nano Banana 2", "prompt": "A single VHS videocassette tape shown front-face as collectible item art for a 90s DJ sim's battle-tape archive, centered on a transparent dark background (#06060c). Low-poly flat-shaded chunky VHS cassette with a paper spine label reading 'X-MEN IN X-ERCIZE #1' in hand-lettered marker, the grail tape. Front sleeve art is a garish 90s bootleg-comp collage in hot pink #ff5cad, gold #ffd23d and neon green #3dff8b \u2014 muscle-and-workout parody motif \u2014 deliberately cheap and photocopied-looking with faint horizontal tracking lines across it signalling a low-generation dub. Worn corners, a dog-eared rental sticker, sun-faded. Matte materials, grimy nostalgic grade, Courier-mono catalog number in a corner. Reads clearly at 80px, crisp edges, high contrast, no photorealism. Square-ish 4:5 item card.", "title": "DJCOMPS battle-tape VHS cover (X-Men in X-Ercize grail)", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_068", "kind": "image", "model": "Nano Banana 2", "prompt": "A vertical rhythm-game lane strip UI element for a 90s DJ-hero timing minigame, on a transparent near-black background (#06060c). Four vertical lanes side by side over a dark translucent panel: three note lanes tinted neon green #3dff8b, cyan #4dd8ff and hot pink #ff5cad, plus a fourth wider 'TRICK' lane tinted gold #ffd23d on the right, each labelled A / S / D / T in uppercase Courier New mono at the top. A bright horizontal hitline glows across the lower third. Falling cue sprites are chunky rounded blocks in each lane's color, one landing on the hitline with a burst of hit-spark, another slightly off showing a faint miss shadow. Flat matte design, thin neon lane dividers, CRT arcade aesthetic, grimy 90s grade, high contrast, crisp clean edges, no photorealism. Tall 3:4 layout.", "title": "Mix minigame lane strip (3 lanes + trick lane)", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_069", "kind": "image", "model": "Nano Banana 2", "prompt": "A single trick-selector UI card from the gig panel of a 90s DJ battle sim, on a transparent dark background (#0a0a12). A dark translucent rounded panel (rgba(6,6,12,0.8)) with a thin 1px hot-pink #ff5cad neon border. Header in uppercase wide-tracked Courier New mono reads 'TRICKS'. Inside, a small grid of four square trick buttons: three are dark blocks with neon-green #3dff8b glyph icons of scratch/crossfader hand-moves and a bright name label each ('CHIRP', 'FLARE', 'CRAB'), and one slot is blank/redacted with a dim '???' to signal an unknown unrevealed trick. One button shows a green hover-glow highlight. Flat matte design, monospace terminal aesthetic, grimy 90s CRT feel, crisp edges, high contrast, readable at UI scale, no photorealism. Landscape 4:3 card.", "title": "Trick-move gig panel selector card", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_070", "kind": "image", "model": "Nano Banana 2", "prompt": "An empty UI modal window frame for a 90s Australian DJ sim, designed to overlay a 3D game world, on a fully transparent background. A dark translucent near-black panel (rgba(6,6,12,0.8)) with slightly rounded corners and a crisp thin 1px hot-pink #ff5cad neon border with a faint outer glow. Across the top, a header bar with an uppercase wide-tracked Courier New monospace title placeholder and a small square close 'X' button in the corner. A subtle inner divider line in neon green #3dff8b beneath the header. Bottom edge has two dark block buttons with thin neon borders (one green-accented 'hover' state). Empty content area in the middle. Flat matte terminal aesthetic, CRT street-press feel, high contrast, sharp clean vector edges, no photorealism. Landscape 4:3.", "title": "Menu frame / modal window chrome", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_071", "kind": "image", "model": "Nano Banana 2", "prompt": "A single milk-crate full of vinyl records as a game inventory item icon for a 90s Australian DJ sim, three-quarter angle, centered on a transparent near-black background (#0a0a12). Low-poly flat-shaded plastic milk crate in a faded warm color, stuffed with a row of vertical record sleeves whose visible spines are a mix of hot pink #ff5cad, gold #ffd23d, neon green #3dff8b, cyan #4dd8ff and grimy brown card \u2014 a well-dug second-hand crate. Slightly sun-faded, dusty, one sleeve pulled up higher than the rest. Matte materials, no gloss, warm nostalgic op-shop grade, chunky readable silhouette. Sits in a dark translucent UI panel with a thin neon green border. Reads clearly at 64px, crisp edges, high contrast, no photorealism. Square 1:1.", "title": "Milk-crate record box item icon", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_072", "kind": "image", "model": "Nano Banana 2", "prompt": "A 2D flat back-panel diagram UI for a DJ signal-chain wiring puzzle in a 90s sim game, on a transparent dark background (#06060c) inside a dark translucent panel with a thin neon border. Head-on view of the rear of a brushed-aluminium hi-fi amp: a labelled row of sockets in uppercase Courier New mono \u2014 'PHONO L', 'PHONO R', 'LINE', and a 'GND' ground screw terminal. A red RCA plug and a white RCA plug (with a green ground wire) float nearby, mid-drag, one hovering over its matching hole with a neon-green #3dff8b snap-highlight ring. Flat schematic style, low-poly-friendly, period-correct 1990s connectors, matte silver and black, grimy CRT diagnostic aesthetic, thin neon accents, high contrast, crisp clean edges, no photorealism. Landscape 4:3.", "title": "Flip-the-rig back-panel connection view", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_073", "kind": "image", "model": "Nano Banana 2", "prompt": "A game HUD status cluster for a 90s Australian DJ life-sim, on a fully transparent background, meant to float over a 3D world. A horizontal dark translucent bar (rgba(6,6,12,0.8)) with a thin 1px neon green #3dff8b top border. Left: a small pixel-clock and calendar readout in uppercase Courier New mono ('THU ARVO'). Center: a segmented energy bar with a bright neon-green fill about two-thirds full over a dark track. Right: a nag chip in a thin hot-pink #ff5cad neon border reading 'NEXT GIG: FRI NIGHT \u2014 IN 3'. Along the very bottom, a thin scrolling street-press ticker strip with faint marquee text. Flat matte terminal aesthetic, tight letter-spacing, CRT feel, high contrast, crisp edges, no photorealism. Wide 16:5 banner layout.", "title": "HUD status bar cluster (clock + energy + gig nag)", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_074", "kind": "image", "model": "Nano Banana 2", "prompt": "A weekly cinema movie-poster card as UI item art for a 90s Australian DJ sim's Regent second-run cinema, centered on a transparent dark background (#06060c). A portrait poster inside a chunky low-poly marquee frame with small round bulb lights around the edge, a few unlit to feel worn. The poster art is a garish invented 90s B-movie in gold #ffd23d, hot pink #ff5cad and cyan #4dd8ff \u2014 bold hand-painted comedy movie lettering (abstract, no readable studio name), sun-faded and slightly torn at one corner. A small 'NOW SHOWING' banner in uppercase Courier New mono across the bottom. Sticky-carpet grimy nostalgic grade, matte flat materials, warm point-light glow from the marquee bulbs, high contrast, crisp edges, readable at 80px, no photorealism. Portrait 3:4.", "title": "Movie marquee / weekly poster card", "category": "game_ui_items"}
|
||||
{"id": "game_ui_items_075", "kind": "image", "model": "Nano Banana 2", "prompt": "A single black DJ flight case as a game inventory item icon for a 90s Australian DJ sim, three-quarter closed view, centered on a transparent near-black background (#0a0a12). Low-poly flat-shaded rugged road case: matte black textured panels, chunky metal corner protectors, and two silver butterfly latches on the front, a recessed handle on top. Worn stickers and a strip of peeling gaffer tape on the lid (heavily gigged, second-hand feel), a small VG grade chip decal in gold #ffd23d on the corner. Faint neon green #3dff8b rim light on the near edge. Warm grimy nostalgic grade, matte materials, no gloss, chunky readable silhouette. Sits in a dark translucent UI panel with a thin hot-pink neon border. Reads clearly at 64px, crisp edges, high contrast, no photorealism. Square 1:1.", "title": "Flight-case gear item icon", "category": "game_ui_items"}
|
||||
{"id": "game_keyart_076", "kind": "image", "model": "Nano Banana 2", "prompt": "Marketing key art / title-screen composition for a 90s Australian DJ life-sim video game. Low-poly, flat-shaded 3D diorama style (Schedule 1 / THRIFTGOD lineage): blocky chunky geometry, flat matte materials (roughness ~0.85, almost no gloss on world surfaces), readable silhouettes over detail, deliberately un-photoreal early-3D console look. Center: a scruffy broke bedroom DJ character (battle-DJ street lean, baggy tee, cap, worn cargo pants) hunched over twin silver Technics-style turntables and a black 2-channel battle mixer on a dark walnut DJ table, one hand on the platter mid-scratch. Flanking him as a duo: on the left a short round furry PURPLE monster mascot, squat and huggable; on the right a glossy CHROME BLUE robot mascot with a clean shiny toy sheen \u2014 both mascots rendered noticeably shinier and cuter than the matte grimy world around them. Night lighting: deep blue-black sky gradient from #ff7848 at top down into #28285c, neon signs igniting. Neon accent trio dominant \u2014 neon green #3dff8b, hot pink #ff5cad, gold #ffd23d \u2014 as club-neon glow rimming the characters. Warm point lights #ffd9a0 on faces. Grimy nostalgic warm grade, sticky-carpet texture, dust in the air. Big empty upper region reserved for a game title. Eye-catching, poster-grade, still on-brand low-fi. 16:9.", "title": "Hero Trio Title Screen", "category": "game_keyart"}
|
||||
{"id": "game_keyart_077", "kind": "image", "model": "Nano Banana 2", "prompt": "Marketing key art for a nostalgic 90s Australian bedroom-DJ life-sim. Low-poly, flat-shaded 3D style, blocky geometry, matte materials (roughness ~0.85, minimal specular), un-photoreal early-3D diorama feel. A lone broke DJ (trickster class, scruffy street look: bucket hat, oversized flannel, worn sneakers) stands behind a full battle rig \u2014 twin silver Technics-style decks, black battle mixer, closed-back black DJ headphones round the neck, a silver brushed-aluminium hi-fi amp with two glowing needle VU meters, black bookshelf speakers with exposed woofers and no grilles, a milk-crate of vinyl at his feet. Setting: a sweaty inner-industrial warehouse venue at 3am, red brick walls with graffiti burners, black flight cases stacked. Late-night lighting: near-black sky, deep blue-black room, cold #6070c0 moonlight from a high window mixed with saturated neon pops of #3dff8b green and #ff5cad pink from a homemade light rig. Volumetric haze, warm #ffc880 point light on the DJ. Dramatic low three-quarter hero angle. Grimy, warm, funny, second-hand \u2014 never slick or expensive. Room reserved lower-third for title text. 16:9 promo still.", "title": "DJ Solo Warehouse Rig", "category": "game_keyart"}
|
||||
{"id": "game_keyart_078", "kind": "image", "model": "Nano Banana 2", "prompt": "Establishing key art for a 90s Australian DJ life-sim, wide cinematic street view. Low-poly flat-shaded 3D diorama, chunky blocky buildings, flat matte surfaces (roughness ~0.85), hand-placed prop feel, deliberately low-fi and boxy. Scene: THE JUNCTION, an inner-industrial rail suburb \u2014 a strip of shopfronts in red brick with rusted awnings and hand-painted comedy shop signs (an op shop, a pawn shop, a record store, a video rental), a BUS 96 stop, a flyer pole plastered with gig posters, freight-rail overpass with graffiti burners on the brick, power lines sagging overhead, sun-faded and dusty. A small scruffy DJ character walks the footpath carrying a milk-crate of records. Golden-hour ARVO lighting: warm sky gradient #ffd890 at top to #88a8d0 at bottom, long warm shadows, golden-hour glow on the brick. Palette: warm woods and browns, muted blue-greys, cream signage, with a single lit neon sign starting to buzz (#3dff8b green). Nostalgic warm working-class Australian 90s mood, cozy and grimy. Wide 16:9, empty sky for logo placement. Poster-quality store-page still.", "title": "The Junction Street Wide", "category": "game_keyart"}
|
||||
{"id": "game_keyart_079", "kind": "image", "model": "Nano Banana 2", "prompt": "Studio brand splash / loading-screen key art for MonsterRobot Games. Clean iconic hero shot of two mascots as a party duo, rendered against a simple dark near-black backdrop (#0a0a12). Left: MONSTER \u2014 a short, round, furry PURPLE creature, squat and huggable, big friendly eyes, simple and cute. Right: ROBOT \u2014 a glossy CHROME BLUE robot toy, clean rounded chrome sheen, boxy but adorable, one hand raised in a wave. Both are the one shiny, polished, cute exception to an otherwise matte-grime world \u2014 render them with a bright toy-like glossy finish and soft studio rim light. Between and around them: subtle floating low-poly 90s DJ icons (a tiny vinyl record, a Concorde phono cartridge, closed-back headphones) as flat matte props for contrast. Neon accent trio glow behind them \u2014 hot pink #ff5cad, neon green #3dff8b, gold #ffd23d \u2014 like club lights. Courier-mono terminal aesthetic hint. Centered symmetrical composition, generous margins, logo-ready. Eye-catching, friendly, brand-forward. 16:9, could crop square.", "title": "Mascot Duo Splash", "category": "game_keyart"}
|
||||
{"id": "game_keyart_080", "kind": "image", "model": "Nano Banana 2", "prompt": "Cozy key art of the game's home-hub bedroom for a 90s Australian bedroom-DJ life-sim. Low-poly flat-shaded 3D diorama, blocky geometry, matte materials (roughness ~0.85, no gloss), warm hand-placed clutter, un-photoreal. Interior: a broke kid's bedroom-DJ setup \u2014 a dark walnut DJ table with four thick square legs holding twin silver Technics-style turntables, a black 2-channel battle mixer, a silver brushed-aluminium hi-fi amp with two needle VU meters; black bookshelf speakers with exposed woofers flanking; closed-back black DJ headphones hung on a hook; a wooden milk-crate of vinyl and flat vinyl stacks on the floor; a black flight case; an unmade bed, a wardrobe, an old TELLY + VCR, a beige rotary/push-button PHONE, a crate shelf, a 'poster of the week' on the wall. Sticky carpet, dust, empty cans. Lighting: warm evening lamplight, warm point light #ffd9a0 pooling over the decks, deep blue dusk outside the window (sky #ff7848 to #28285c), a small neon sign glow #3dff8b leaking in. Nostalgic, warm, safe, funny. Cutaway diorama three-quarter view. Room top-left for title. 16:9 store still.", "title": "Bedroom Home Hub Cozy", "category": "game_keyart"}
|
||||
{"id": "game_keyart_081", "kind": "image", "model": "Nano Banana 2", "prompt": "Bold three-panel key art poster for a 90s Australian DJ life-sim, illustrating its three musical precincts. Low-poly flat-shaded 3D diorama style throughout, blocky matte geometry, un-photoreal early-3D look, consistent low-fi fidelity. Three vertical bands, each a mini-scene with its own lean and color-coded neon: LEFT = STREET (THE JUNCTION), a red-brick industrial rail suburb, graffiti burners, warehouse party, keyed to neon green #3dff8b, gritty golden-hour. CENTER = CLUB (TOWN CBD), a granite-and-brass pedestrian mall gone to club neon at night, sleek arcade, keyed to hot pink #ff5cad, deep blue-black NIGHT sky #ff7848 into #28285c. RIGHT = CHILL (THE ESPY), a salt-bleached seaside suburb with Norfolk pines and a milk bar, keyed to gold #ffd23d, calm golden-hour ARVO sky #ffd890 to #88a8d0. A small DJ character silhouette appears in each band. Thin 1px neon dividers between panels, Courier-mono uppercase labels 'STREET / CLUB / CHILL' with wide letter-spacing. Warm grimy nostalgic grade. Balanced triptych, header space reserved. 16:9 promo.", "title": "Triple-Precinct Split Poster", "category": "game_keyart"}
|
||||
{"id": "game_keyart_082", "kind": "image", "model": "Nano Banana 2", "prompt": "Dynamic key art for a 90s DJ battle life-sim: a turntable face-off. Low-poly flat-shaded 3D diorama, chunky blocky characters, matte materials (roughness ~0.85), readable silhouettes, un-photoreal. Two DJs face each other over their own decks in a head-to-head battle \u2014 foreground our scruffy underdog player DJ (street lean, cap backwards, mid-scratch on a silver Technics-style deck and black battle mixer), across from a skilled aspirational rival headliner (sharper club look, confident). A dense low-poly crowd of NPC 'ghosts' fills the background as blocky density with comic speech bubbles ('PLAY SOMETHING WE KNOW'). Sweaty warehouse venue, black flight cases, milk crates of vinyl. Night club lighting: deep blue-black, saturated neon pops \u2014 hot pink #ff5cad and neon green #3dff8b spotlight beams crossing, gold #ffd23d accents, warm #ffc880 point light on faces. Motion energy, low hero angle between the two rigs. Grimy, funny, high-stakes 90s battle-DJ mood. Upper banner space clear for title. 16:9 eye-catching promo still.", "title": "Battle Face-Off Rivals", "category": "game_keyart"}
|
||||
{"id": "game_keyart_083", "kind": "image", "model": "Nano Banana 2", "prompt": "Atmospheric key art for a 90s Australian DJ life-sim: the dawn record dig. Low-poly flat-shaded 3D diorama, blocky matte geometry, un-photoreal, warm sun-faded textures. Scene: a weekend dawn car-park swap meet (Trash & Treasure flea market at THE ESPY seaside suburb) \u2014 trestle tables and cardboard boxes crammed with low-poly vinyl records in worn sleeves, milk crates, dusty old hi-fi gear, Norfolk pines in the background, a salt-bleached weatherboard milk bar. A bleary-eyed early-bird DJ character (chill lean, hoodie, coffee cup) crouches flipping through a crate of records, one sleeve half-pulled. MORNING lighting: soft warm peach dawn, sky gradient #f8c890 at top to #8fb8e8 at bottom, low warm sun, long soft shadows, gentle haze. Palette: warm woods, cream, muted blue-grey, a touch of neon-green #3dff8b on a hand-painted market sign. Nostalgic, quiet, hopeful, grimy-cozy. Intimate three-quarter angle. Sky reserved for title. 16:9 store-page still.", "title": "Dawn Op-Shop Dig", "category": "game_keyart"}
|
||||
{"id": "game_keyart_084", "kind": "image", "model": "Nano Banana 2", "prompt": "Slick-but-still-grimy key art for a 90s DJ life-sim: the CBD club at night. Low-poly flat-shaded 3D diorama, blocky matte architecture, un-photoreal early-3D look \u2014 polished-looking but never expensive-clean. Scene: TOWN precinct, a granite-and-brass pedestrian mall that has died for the day and reawakened as club neon \u2014 'Club Chrome' venue frontage with a buzzing neon sign, a queue of a dressed-up NPC crowd (blocky ghosts in club outfits) at the door under a bouncer, arcades and shuttered department-store windows reflecting light. A scenester-class DJ character (dressed for the club door, sharp jacket) strides toward the entrance carrying a record bag. NIGHT lighting: dusk sky gradient #ff7848 at top into #28285c, neon fully ignited \u2014 dominant hot pink #ff5cad wash with neon green #3dff8b and gold #ffd23d sign glow, cyan #4dd8ff highlights, wet-pavement reflections, warm #ffd9a0 street-lamp pools. Nostalgic urban 90s night mood, glossy neon over matte concrete. Low hero angle up at the sign. Title banner space up top. 16:9 promo.", "title": "Club Chrome Night CBD", "category": "game_keyart"}
|
||||
{"id": "game_keyart_085", "kind": "image", "model": "Nano Banana 2", "prompt": "Stylized systems key art for a 90s DJ life-sim, hero-ing the 'flip the rig' signal-chain mechanic. Low-poly flat-shaded 3D presentation crossed with a clean 2D back-panel diagram overlay, matte materials, un-photoreal, Courier-mono terminal aesthetic. Center hero: the back panel of a silver brushed-aluminium hi-fi amp and a black battle mixer, showing red and white RCA plugs and a green ground wire being plugged into PHONO / LINE / GND sockets \u2014 a hand guiding a plug toward a hole. Around it, floating dark translucent UI panels (rgba(6,6,12,0.8)) with thin 1px neon borders \u2014 hot pink #ff5cad for modals, neon green #3dff8b for accents \u2014 showing Courier New readouts, needle VU meters, and small fault-symptom icons (hum, skip, wow/flutter, worn-needle crackle). The full low-poly signal chain (deck \u2192 cartridge \u2192 mixer \u2192 RCA \u2192 amp \u2192 speakers) laid out as blocky props beneath. Dark near-black backdrop #06060c, neon-green terminal glow. Diagrammatic, clever, techy-but-90s. Header space clear. 16:9 store feature still.", "title": "Signal Chain Flip-The-Rig", "category": "game_keyart"}
|
||||
{"id": "game_keyart_086", "kind": "image", "model": "Nano Banana 2", "prompt": "Energetic key art for a 90s DJ life-sim's rhythm mix-minigame. Low-poly flat-shaded 3D world seen behind a floating diegetic rhythm-game UI, matte materials, un-photoreal, Courier-mono aesthetic. Foreground: a DJ-hero timing game \u2014 falling neon cue sprites tumbling down three lanes plus one distinct 'trick' lane toward a glowing hitline, keys A/S/D + T implied, timing windows visualized as widening/tightening bands, bright hit-flash and miss-shake feedback. Lanes glow in the accent trio \u2014 neon green #3dff8b, hot pink #ff5cad, gold #ffd23d \u2014 over dark translucent panels with thin 1px neon borders. Behind the UI: a blocky low-poly DJ character mid-scratch on twin silver Technics-style decks and a black battle mixer, a warehouse stage, a low-poly crowd of ghosts cheering. NIGHT club lighting, deep blue-black room, saturated neon spotlights, warm #ffc880 rim on the DJ. High-energy, arcade-ish, motion-blur streaks on the falling cues, but still grimy 90s underneath. Title space top-left. 16:9 eye-catching promo.", "title": "The Mix Minigame Rhythm", "category": "game_keyart"}
|
||||
{"id": "game_keyart_087", "kind": "image", "model": "Nano Banana 2", "prompt": "Collector-focused key art for a 90s DJ life-sim: the battle-tape grail. Low-poly flat-shaded 3D diorama, blocky matte props, un-photoreal, warm nostalgic grade. Hero subject: a single worn VHS tape resting on a TELLY + VCR combo, its skinnable cover art reading like a bootleg battle-tape ('X-MEN in X-ERCIZE #1' style hand-drawn sleeve), with faint tracking lines suggesting a low-generation dub. Around it: a collection wall / 'Pok\u00e9dex' archive of twelve VHS spines in a shelf, some greyed-out as unowned, black DJ headphones, a milk-crate of vinyl, a scruffy DJ character reaching for the tape. Setting: the home-hub bedroom, sticky carpet, cozy clutter. Lighting: warm LATE-night TV glow \u2014 the telly casting cold #8090ff blue light plus a warm #ffc880 lamp, deep blue-black room. Neon-green #3dff8b accent from a small sign, hot pink #ff5cad UI-panel glow floating with Courier-mono labels. Nostalgic, obsessive-collector mood, grimy and warm. Three-quarter angle, title space upper-right. 16:9 store still.", "title": "VHS Battle-Tape Grail", "category": "game_keyart"}
|
||||
{"id": "game_keyart_088", "kind": "image", "model": "Nano Banana 2", "prompt": "Character-driven key art for a 90s Australian DJ life-sim: the mentor moment. Low-poly flat-shaded 3D diorama, blocky matte characters, un-photoreal, warm nostalgic grade. Scene: Deckhand Dave \u2014 a warm, mate-ish, street-lean older DJ NPC (worn tee, stubble, cap) \u2014 grabs the young player DJ's wrist and guides it across the platter of a silver Technics-style turntable, teaching a scratch ('nah, like THIS'), the black battle mixer between them, a comic speech bubble in Courier-mono. Setting: a cramped bedroom-DJ corner, milk-crate of vinyl, black bookshelf speakers with exposed woofers, closed-back headphones on the table, poster-of-the-week on the brick wall. Lighting: warm evening lamplight, warm point light #ffd9a0 over the decks, deep blue dusk outside (sky #ff7848 to #28285c), a soft neon-green #3dff8b glow from a window sign. Genuine, funny, human, second-hand grimy. Intimate two-shot, over-the-decks angle. Space at top for title. 16:9 promo still.", "title": "Deckhand Dave Mentor", "category": "game_keyart"}
|
||||
{"id": "game_keyart_089", "kind": "image", "model": "Nano Banana 2", "prompt": "Serene key art for the CHILL precinct of a 90s Australian DJ life-sim. Low-poly flat-shaded 3D diorama, blocky matte geometry, un-photoreal, warm sun-bleached textures. Scene: THE ESPY, an old seaside suburb at golden hour \u2014 salt-bleached weatherboard cottages, tall Norfolk pines, a retro milk bar with a hand-painted sign (Gull's Milk Bar), a low seawall, a calm flat ocean horizon, an unmarked arcade stairwell hinting at a specialist DJ import shop below. A relaxed chill-lean DJ character sits on the seawall with headphones on and a milk-crate of vinyl beside them, watching the water. ARVO golden-hour lighting: warm sky gradient #ffd890 at top to #88a8d0 at bottom, long warm shadows, hazy sun flare, gulls. Palette: warm cream, faded blue-grey, weathered timber, a single gold #ffd23d neon accent on the milk bar starting to glow. Nostalgic, calm, wistful, warm Australian 90s summer. Wide, tranquil, low horizon. Big sky for logo. 16:9 store-page still.", "title": "Espy Golden-Hour Chill", "category": "game_keyart"}
|
||||
{"id": "game_keyart_090", "kind": "image", "model": "Nano Banana 2", "prompt": "Wide hero banner / store-page header key art for a 90s Australian DJ life-sim by MonsterRobot Games. Low-poly flat-shaded 3D diorama, blocky matte geometry, un-photoreal early-3D look, Courier-mono CRT aesthetic. Composition built as a wide horizontal banner with a strong empty central zone for the game logo. Left third: the scruffy player DJ mid-scratch on twin silver Technics-style decks, black battle mixer, milk-crate of vinyl, warehouse grime. Right third: the two studio mascots as a duo \u2014 a round furry PURPLE monster and a glossy CHROME BLUE robot, both bright, shiny and cute against the matte world, waving. Connecting them across the middle: a wall of gig flyers, a cinema marquee, a BUS 96 sign, and floating low-poly 90s icons (vinyl, Concorde cartridge, headphones, VHS tape). NIGHT lighting, deep blue-black sky #ff7848 into #28285c, neon signs blazing \u2014 neon green #3dff8b, hot pink #ff5cad, gold #ffd23d, cyan #4dd8ff \u2014 reflecting on wet pavement. Thin neon border framing, Courier-mono street-press ticker along the bottom edge. Warm grimy nostalgic, one shiny mascot exception. Ultra-wide 21:9 banner, generous center margin for title.", "title": "Neon Logo Wide Banner", "category": "game_keyart"}
|
||||
Loading…
Reference in New Issue
Block a user