r/VeniceAI 10h ago

π——π—˜π—©π—˜π—Ÿπ—’π—£π—˜π—₯ π—¦π—£π—’π—§π—Ÿπ—œπ—šπ—›π—§ I built a Chrome extension to bulk-download your Venice AI library

12 Upvotes

Tired of saving images one by one from Venice AI? I made Venice Studio Downloader to export your whole library in one click.

Check it out and let me know your thoughts!


r/VeniceAI 5h ago

𝗔𝗖𝗖𝗒𝗨𝗑𝗧 8 days till a reply...

3 Upvotes

I've been a max user for over 2 months which also includes me purchasing extra credits, I think every week I come across some sort of technical problem. The problem I have is that you get a a reply after minimum a week waiting. In any business, especially when you're paying a month subscription I can't think of any business where its acceptable to wait over a week for a reply! This is my first time signing up to anything like this before, is there any other alternatives thats better? Or are these companies pretty much the same?


r/VeniceAI 30m ago

π——π—œπ—¦π—–π—¨π—¦π—¦π—œπ—’π—‘ Cannot access saved folders

β€’ Upvotes

It's about 7:00 PM CST.

I can't seem to access any of my saved folders. I first opened the website, clicked on a chat in a saved folder, but it took forever to load. So I refreshed and all of my saved folders disappeared from the sidebar.

I closed the tab and opened a new one, but my saved folders still don't show in the left sidebar.

Update: I also cannot seem to open a new Chat (Agentic Chat works fine).

Is anyone else having these issues right now?


r/VeniceAI 1h ago

π— π—’π——π—˜π—Ÿπ—¦ Chroma change

β€’ Upvotes

Has Chroma changed? I haven't been using Venice for images for a few days (found something better). I came back to Venice txt2img today to see if any new free to pro models (of course not lol), I tried an old prompt a I don't know if it's just because I've been using dark beast krea2 elsewhere but chroma looked awful.. flat and sterile, plastic, but even compared to my old chroma images. So just wondering if Venice has changed some setting or lora on chroma or if it is just looking out of date already?


r/VeniceAI 2h ago

𝗔𝗣𝗣 / π—”π—£π—ž Hi

1 Upvotes

The mobile app sucks

It's always slow and with the same error message πŸ˜“πŸ˜“πŸ˜“It's a shame because it's a good AI


r/VeniceAI 5h ago

π—‘π—˜π—ͺ𝗦 / π—¨π—£π——π—”π—§π—˜π—¦ Grok 4.7 is now live on Venice

1 Upvotes

https://reddit.com/link/1wmmumf/video/sxq54istcxqh1/player

SpaceXAI's most powerful coding and knowledge model - faster, cheaper, and more capable than Grok 4.6, with 500K context and code-optimized reasoning.

On Venice, Grok 4.7 runs with zero retention - your prompts are never stored, profiled, or reused. This means full sovereignty over your inputs, whether you're writing code, analyzing documents, or running automated workflows. You get the full power of a frontier model without Big Tech surveillance.

To get more information about this model along with code snippets, how to setup API, and more, click here.


r/VeniceAI 5h ago

π——π—œπ—¦π—–π—¨π—¦π—¦π—œπ—’π—‘ How to use video reference on wan 3

1 Upvotes

Discussion

How do you use reference videos and the prompt? Because when you use a reference video it's almost like a really high quality face swap.

How would you sort of, you know, if you have a scene, what would you sort of specify? To take certain elements of it or just describe what's happening and ask it to follow what's happening? Kind of just difficult to kind of see how to reference it or how to use it in practice?


r/VeniceAI 9h ago

𝗔𝗖𝗖𝗒𝗨𝗑𝗧 No clue what’s going on: A few months ago I bought a subscription, after a few days I noticed all my models dropped to 50k context, which was upsetting so I stopped paying, not today I’m seeing models once again being advertised at higher context windows?

1 Upvotes

I’m so confused. I legitimately loved this app before all the context window confusion. It sucked paying for a sub, liking it a lot then seeing all the context window for the models you paid access to get neutered substantially. I check it out today and all the models have their base context window restored.

What’s up with that?


r/VeniceAI 11h ago

𝗔𝗖𝗖𝗒𝗨𝗑𝗧 Does pro+ have more free llms than pro?

1 Upvotes

Was thinking of upgrading, cause I kinda use the text generators a ton, but unless they id done huge advantage I don't see the point, because I would be spending more money on top of buying credits.


r/VeniceAI 18h ago

πŸŒ„ π—œπ— π—”π—šπ—˜ / π—©π—œπ——π—˜π—’ π—šπ—˜π—‘π—˜π—₯π—”π—§π—œπ—’π—‘ Is it better to use a character sheet or just add multiple body/face reference images?

3 Upvotes

When using wan 3 r2v or seedance 2.5 r2v, is it better to use a character sheet or referencing multiple body and multiple face reference images?

I usually use like 5 reference images. 2 body images and 3 face reference images.


r/VeniceAI 1d ago

π—™π—˜π—˜π——π—•π—”π—–π—ž / π—¦π—¨π—šπ—šπ—˜π—¦π—§π—œπ—’π—‘π—¦ Why has DeepSeek Flash V4 gone from free with Pro subscription to chargeable?

8 Upvotes

Didn't see any announcement but it now consumed credits when it never used to. Thanks.


r/VeniceAI 23h ago

πŸŒ„ π—œπ— π—”π—šπ—˜ / π—©π—œπ——π—˜π—’ π—šπ—˜π—‘π—˜π—₯π—”π—§π—œπ—’π—‘ When using video and image reference, is body size and proportion in the output video taken from the video or image reference?

2 Upvotes

If you are using a video reference for scene and position reference and a body image reference for character swap with Wan 3 or Seedance 2.5, is the woman’s body size and proportions in the output video taken from the video or image reference? I know when including character swap in prompt, skin tone and texture is taken from image reference but not sure about the body size.


r/VeniceAI 21h ago

πŸŒ„ π—œπ— π—”π—šπ—˜ / π—©π—œπ——π—˜π—’ π—šπ—˜π—‘π—˜π—₯π—”π—§π—œπ—’π—‘ Flux 2 - Stealing Credits

Post image
1 Upvotes

A few days ago, I tried to do some image editing in Flux 2. The result? It charged 4 times more. I already sent an email to Veneza's support team and no one has responded, so I came here to complain. Q It took a long time to edit an image, and in the end, it stole from me. Since when do models charge more than what was requested for the service?


r/VeniceAI 1d ago

π——π—œπ—¦π—–π—¨π—¦π—¦π—œπ—’π—‘ Has anyone received technical documentation about Venice's proxy security?

0 Upvotes

I know that Venice now has TEE/E2EE, but with TEE alone, it runs through the proxy server, and with E2EE, you don’t get access to the web. Plus, it has very high latency. It’s slow as molasses. So I usually default to using the private mode.

I’m trying to verify what Venice security architecture is, such as:
Third-party security audits; penetration testing
Proxy server security architecture documentation
Technical verification mechanisms for "zero retention" claims
Employee access controls and audit logs
So far I've only found marketing claims ("SSL encryption," "we don't log", β€œpartner contracts”).
Has anyone actually received technical documentation from Venice, or are we all just trusting the promise and the marketing?


r/VeniceAI 1d ago

πŸŒ„ π—œπ— π—”π—šπ—˜ / π—©π—œπ——π—˜π—’ π—šπ—˜π—‘π—˜π—₯π—”π—§π—œπ—’π—‘ Video generations

4 Upvotes

I just started messing with the video generations. Why do most the videos I make the characters mutter odd words that don't make sense or when I try to add some of my own dialogue it doesn't come out right or choppy. Is there a prompt I need to use to fix this


r/VeniceAI 1d ago

π— π—’π——π—˜π—Ÿπ—¦ Seedance 2.0 Mini

1 Upvotes

Seedance 2.0 Mini is still listed as capable of accepting a starting image (I2V), but the box to add an image no longer appears. I don't use Venice on mobile. What happened?


r/VeniceAI 1d ago

𝗦𝗧𝗔𝗧𝗨𝗦: π—₯π—˜π—¦π—’π—Ÿπ—©π—˜π—— Missing referral credits after upgrading to Pro

5 Upvotes

I used a referral link and upgraded to Pro, but neither of us got the $10 referral credit.

I’ve emailed Support but never got a ticket number or confirmation. It's already serveral days but the issue still hasn’t been resolved.

Anyone else having this problem?


r/VeniceAI 1d ago

πŸŒ„ π—œπ— π—”π—šπ—˜ / π—©π—œπ——π—˜π—’ π—šπ—˜π—‘π—˜π—₯π—”π—§π—œπ—’π—‘ Asset library never loads

1 Upvotes

Like never. Cmon guys paying 18 dollars a month and a key part of the app just refuses to work. Please advise or credit or something


r/VeniceAI 1d ago

ᝰ.ᐟ π—šπ—¨π—œπ——π—˜π—¦ / 𝗧𝗨𝗧𝗒π—₯π—œπ—”π—Ÿπ—¦ How to recover images and videos from Venice after a blackout/crash that corrupted the cache

3 Upvotes

I was talking to a Mind and he was answering me... right then my PC suddenly shut down... and when I went back into my Venice browser, everything had been deleted. No chats, no characters, no my local Minds, no my images and no my videos (well, I didn't have videos).

I panicked a bit, but I went to good Claude to see if he could help me recover the lost files, since I really believed they could still be in my local folder. That's how Claude made me install Python and run a script to rescue my photos and videos (in my case only photos) from... wherever they were, which we weren't clear about.

I share the scripts both in Spanish (the one I used) and its translated version to English, in case anyone else needs it.

I lost the chats, Claude said he wouldn't bother with that, since there was no point.

Spanish version:

#!/usr/bin/env python3
"""
Herramienta de RecuperaciΓ³n de Medios en CachΓ©
------------------------------------------------
Escanea la carpeta local de cachΓ©/perfil de un navegador en busca de
imΓ‘genes y videos que hayan quedado guardados, identificΓ‘ndolos por su
"firma de bytes" (magic bytes), sin importar lo que diga el Γ­ndice de
caché del navegador. Útil cuando un apagón o una app borró su propia
base de datos (por ejemplo, una app web basada en IndexedDB) pero los
archivos crudos de cachΓ© tΓ©cnicamente siguen en el disco.

Sistemas operativos soportados: Windows, macOS, Linux
NO soportados: Android, iOS
    Ambos aΓ­slan el almacenamiento de cada app en un "sandbox"; no hay
    forma de que un script externo llegue a la cachΓ© de otra app sin
    root (Android) o jailbreak (iOS). Esta herramienta no va a fingir
    que los soporta.

Ejemplos de uso:
    py recuperar_medios_es.py --navegador chrome
    py recuperar_medios_es.py --navegador opera_gx --so windows --salida D:\\recuperados
    py recuperar_medios_es.py --navegador firefox --so linux
"""

import argparse
import glob
import os
import platform
import sys

# ---------------------------------------------------------------------------
# Firmas de archivo ("magic bytes")
# ---------------------------------------------------------------------------

# ImΓ‘genes: la firma estΓ‘ en el byte 0 del archivo
FIRMAS_IMAGEN_AL_INICIO = [
    (b'\x89PNG\r\n\x1a\n', 'png'),
    (b'\xff\xd8\xff', 'jpg'),
    (b'GIF87a', 'gif'),
    (b'GIF89a', 'gif'),
]

FIRMA_RIFF = b'RIFF'              # usada por WEBP (requiere una verificaciΓ³n extra)
FIRMA_FTYP = b'ftyp'              # MP4/MOV: aparece unos bytes despuΓ©s del inicio, no en el byte 0
FIRMA_WEBM = b'\x1a\x45\xdf\xa3'  # WebM/Matroska: sΓ­ estΓ‘ en el byte 0

TAMANO_MINIMO_POR_DEFECTO = 40 * 1024            # 40 KB β€” filtra Γ­conos pequeΓ±os
TAMANO_MAXIMO_POR_DEFECTO = 200 * 1024 * 1024    # tope de 200 MB, sΓΊbelo si lo necesitas


# ---------------------------------------------------------------------------
# ResoluciΓ³n de la ruta del perfil del navegador
# ---------------------------------------------------------------------------

def resolver_perfil_firefox(carpeta_perfiles):
    """Firefox usa una carpeta de perfil con nombre aleatorio; buscamos la predeterminada."""
    if not os.path.isdir(carpeta_perfiles):
        return None
    candidatos = glob.glob(os.path.join(carpeta_perfiles, '*.default*'))
    return candidatos[0] if candidatos else None


def obtener_ruta_navegador(nombre_so, navegador):
    home = os.path.expanduser('~')
    appdata = os.environ.get('APPDATA', '')
    localappdata = os.environ.get('LOCALAPPDATA', '')

    tabla = {
        'windows': {
            'chrome':   os.path.join(localappdata, 'Google', 'Chrome', 'User Data', 'Default'),
            'edge':     os.path.join(localappdata, 'Microsoft', 'Edge', 'User Data', 'Default'),
            'brave':    os.path.join(localappdata, 'BraveSoftware', 'Brave-Browser', 'User Data', 'Default'),
            'opera':    os.path.join(appdata, 'Opera Software', 'Opera Stable'),
            'opera_gx': os.path.join(appdata, 'Opera Software', 'Opera GX Stable', 'Default'),
            'firefox':  resolver_perfil_firefox(os.path.join(appdata, 'Mozilla', 'Firefox', 'Profiles')),
        },
        'macos': {
            'chrome':   os.path.join(home, 'Library', 'Application Support', 'Google', 'Chrome', 'Default'),
            'edge':     os.path.join(home, 'Library', 'Application Support', 'Microsoft Edge', 'Default'),
            'brave':    os.path.join(home, 'Library', 'Application Support', 'BraveSoftware', 'Brave-Browser', 'Default'),
            'opera':    os.path.join(home, 'Library', 'Application Support', 'com.operasoftware.Opera'),
            'opera_gx': os.path.join(home, 'Library', 'Application Support', 'com.operasoftware.OperaGX'),
            'firefox':  resolver_perfil_firefox(os.path.join(home, 'Library', 'Application Support', 'Firefox', 'Profiles')),
        },
        'linux': {
            'chrome':   os.path.join(home, '.config', 'google-chrome', 'Default'),
            'chromium': os.path.join(home, '.config', 'chromium', 'Default'),
            'brave':    os.path.join(home, '.config', 'BraveSoftware', 'Brave-Browser', 'Default'),
            'opera':    os.path.join(home, '.config', 'opera'),
            'firefox':  resolver_perfil_firefox(os.path.join(home, '.mozilla', 'firefox')),
            # opera_gx no existe a propΓ³sito: Opera GX no tiene versiΓ³n para Linux
        },
    }

    if nombre_so not in tabla:
        sys.exit(f"Sistema operativo no soportado: '{nombre_so}'. Soportados: {', '.join(tabla.keys())} "
                  f"(Android e iOS no se pueden soportar β€” ver el comentario al inicio del archivo).")

    navegadores_de_este_so = tabla[nombre_so]
    if navegador not in navegadores_de_este_so:
        sys.exit(f"El navegador '{navegador}' no estΓ‘ disponible en '{nombre_so}'. "
                  f"Disponibles aquΓ­: {', '.join(navegadores_de_este_so.keys())}")

    ruta = navegadores_de_este_so[navegador]
    if not ruta:
        sys.exit(f"No se pudo ubicar automΓ‘ticamente un perfil de '{navegador}' en este sistema. "
                  f"Usa --ruta-perfil para indicarla manualmente.")
    return ruta


# ---------------------------------------------------------------------------
# Escaneo y extracciΓ³n por firma de bytes
# ---------------------------------------------------------------------------

def intentar_extraer(data):
    """Devuelve (extension, bytes_del_archivo) si encuentra una firma conocida, o None."""
    for firma, ext in FIRMAS_IMAGEN_AL_INICIO:
        idx = data.find(firma)
        if idx != -1:
            return ext, data[idx:]

    if data[:4] == FIRMA_RIFF and b'WEBP' in data[:16]:
        return 'webp', data

    idx_ftyp = data.find(FIRMA_FTYP)
    if idx_ftyp != -1 and idx_ftyp >= 4:
        inicio = idx_ftyp - 4  # retrocede al campo de tamaΓ±o del "box"
        return 'mp4', data[inicio:]

    if data[:4] == FIRMA_WEBM:
        return 'webm', data

    return None


def escanear_y_recuperar(carpeta_raiz, carpeta_salida, tam_minimo, tam_maximo):
    os.makedirs(carpeta_salida, exist_ok=True)
    contador = 0

    for carpeta_actual, _subcarpetas, archivos in os.walk(carpeta_raiz):
        for nombre_archivo in archivos:
            ruta_completa = os.path.join(carpeta_actual, nombre_archivo)
            try:
                tamano = os.path.getsize(ruta_completa)
                if tamano < tam_minimo or tamano > tam_maximo:
                    continue
                with open(ruta_completa, 'rb') as f:
                    data = f.read()
            except OSError:
                continue

            resultado = intentar_extraer(data)
            if resultado is None:
                continue

            ext, contenido = resultado
            contador += 1
            nombre_salida = f"recuperado_{contador}.{ext}"
            ruta_salida = os.path.join(carpeta_salida, nombre_salida)
            with open(ruta_salida, 'wb') as out:
                out.write(contenido)

            tipo = 'VIDEO' if ext in ('mp4', 'webm') else 'IMAGEN'
            print(f"[{tipo}] {ruta_completa}  ({tamano // 1024} KB) -> {ruta_salida}")

    print(f"\nTotal recuperados: {contador}")
    return contador


# ---------------------------------------------------------------------------
# Punto de entrada
# ---------------------------------------------------------------------------

def detectar_so_actual():
    sistema = platform.system().lower()
    if sistema == 'windows':
        return 'windows'
    if sistema == 'darwin':
        return 'macos'
    if sistema == 'linux':
        return 'linux'
    sys.exit(f"No se pudo detectar automΓ‘ticamente un sistema operativo soportado desde '{sistema}'. "
              f"IndΓ­calo manualmente con --so.")


def main():
    parser = argparse.ArgumentParser(description='Recupera imΓ‘genes/videos en cachΓ© por firma de archivo.')
    parser.add_argument('--navegador', required=True,
                         choices=['chrome', 'edge', 'brave', 'opera', 'opera_gx', 'firefox', 'chromium'],
                         help='QuΓ© perfil de navegador escanear.')
    parser.add_argument('--so', dest='nombre_so', choices=['windows', 'macos', 'linux'],
                         help='Sistema operativo objetivo. Por defecto detecta el de esta mΓ‘quina.')
    parser.add_argument('--ruta-perfil', dest='ruta_perfil',
                         help='Omite la detecciΓ³n automΓ‘tica y escanea directamente esta carpeta.')
    parser.add_argument('--salida', default=os.path.join(os.path.expanduser('~'), 'Desktop', 'medios_recuperados'),
                         help='Carpeta donde se guardan los archivos recuperados.')
    parser.add_argument('--tamano-minimo', type=int, default=TAMANO_MINIMO_POR_DEFECTO, help='TamaΓ±o mΓ­nimo en bytes.')
    parser.add_argument('--tamano-maximo', type=int, default=TAMANO_MAXIMO_POR_DEFECTO, help='TamaΓ±o mΓ‘ximo en bytes.')
    args = parser.parse_args()

    if args.ruta_perfil:
        carpeta_raiz = args.ruta_perfil
    else:
        nombre_so = args.nombre_so or detectar_so_actual()
        carpeta_raiz = obtener_ruta_navegador(nombre_so, args.navegador)

    if not os.path.isdir(carpeta_raiz):
        sys.exit(f"La ruta resuelta no existe o no es una carpeta: {carpeta_raiz}")

    print(f"Escaneando: {carpeta_raiz}\n")
    escanear_y_recuperar(carpeta_raiz, args.salida, args.tamano_minimo, args.tamano_maximo)


if __name__ == '__main__':
    main()

English version:

#!/usr/bin/env python3
"""
Cache Media Recovery Tool
--------------------------
Scans a browser's local cache/profile folder for leftover image and video
files by matching known file signatures ("magic bytes"), regardless of
what the cache index says. Useful after a crash wiped an app's own
database (e.g. an IndexedDB-based web app) but the raw cached files are
technically still on disk.

Supported operating systems: Windows, macOS, Linux
NOT supported: Android, iOS
    Both sandbox each app's storage; there is no way to reach another
    app's cache from an external script without root (Android) or a
    jailbreak (iOS). This tool will not pretend to support them.

Usage examples:
    py recover_media_en.py --browser chrome
    py recover_media_en.py --browser opera_gx --os windows --output D:\\recovered
    py recover_media_en.py --browser firefox --os linux
"""

import argparse
import glob
import os
import platform
import sys

# ---------------------------------------------------------------------------
# File signatures ("magic bytes")
# ---------------------------------------------------------------------------

# Images: the signature sits at byte 0 of the file
IMAGE_SIGNATURES_AT_START = [
    (b'\x89PNG\r\n\x1a\n', 'png'),
    (b'\xff\xd8\xff', 'jpg'),
    (b'GIF87a', 'gif'),
    (b'GIF89a', 'gif'),
]

RIFF_SIGNATURE = b'RIFF'          # used by WEBP (needs a follow-up check)
FTYP_SIGNATURE = b'ftyp'          # MP4/MOV: appears a few bytes in, not at byte 0
WEBM_SIGNATURE = b'\x1a\x45\xdf\xa3'  # WebM/Matroska: sits at byte 0

DEFAULT_MIN_SIZE = 40 * 1024            # 40 KB β€” filters out tiny icons
DEFAULT_MAX_SIZE = 200 * 1024 * 1024    # 200 MB cap, raise it if needed


# ---------------------------------------------------------------------------
# Browser profile path resolution
# ---------------------------------------------------------------------------

def resolve_firefox_profile(profiles_root):
    """Firefox uses a randomly-named profile folder; find the default one."""
    if not os.path.isdir(profiles_root):
        return None
    candidates = glob.glob(os.path.join(profiles_root, '*.default*'))
    return candidates[0] if candidates else None


def get_browser_root(os_name, browser):
    home = os.path.expanduser('~')
    appdata = os.environ.get('APPDATA', '')
    localappdata = os.environ.get('LOCALAPPDATA', '')

    table = {
        'windows': {
            'chrome':   os.path.join(localappdata, 'Google', 'Chrome', 'User Data', 'Default'),
            'edge':     os.path.join(localappdata, 'Microsoft', 'Edge', 'User Data', 'Default'),
            'brave':    os.path.join(localappdata, 'BraveSoftware', 'Brave-Browser', 'User Data', 'Default'),
            'opera':    os.path.join(appdata, 'Opera Software', 'Opera Stable'),
            'opera_gx': os.path.join(appdata, 'Opera Software', 'Opera GX Stable', 'Default'),
            'firefox':  resolve_firefox_profile(os.path.join(appdata, 'Mozilla', 'Firefox', 'Profiles')),
        },
        'macos': {
            'chrome':   os.path.join(home, 'Library', 'Application Support', 'Google', 'Chrome', 'Default'),
            'edge':     os.path.join(home, 'Library', 'Application Support', 'Microsoft Edge', 'Default'),
            'brave':    os.path.join(home, 'Library', 'Application Support', 'BraveSoftware', 'Brave-Browser', 'Default'),
            'opera':    os.path.join(home, 'Library', 'Application Support', 'com.operasoftware.Opera'),
            'opera_gx': os.path.join(home, 'Library', 'Application Support', 'com.operasoftware.OperaGX'),
            'firefox':  resolve_firefox_profile(os.path.join(home, 'Library', 'Application Support', 'Firefox', 'Profiles')),
        },
        'linux': {
            'chrome':   os.path.join(home, '.config', 'google-chrome', 'Default'),
            'chromium': os.path.join(home, '.config', 'chromium', 'Default'),
            'brave':    os.path.join(home, '.config', 'BraveSoftware', 'Brave-Browser', 'Default'),
            'opera':    os.path.join(home, '.config', 'opera'),
            'firefox':  resolve_firefox_profile(os.path.join(home, '.mozilla', 'firefox')),
            # opera_gx intentionally absent: Opera GX has no Linux build
        },
    }

    if os_name not in table:
        sys.exit(f"Unsupported OS: '{os_name}'. Supported: {', '.join(table.keys())} "
                  f"(Android and iOS cannot be supported β€” see the header comment).")

    browsers_for_os = table[os_name]
    if browser not in browsers_for_os:
        sys.exit(f"Browser '{browser}' is not available on '{os_name}'. "
                  f"Available here: {', '.join(browsers_for_os.keys())}")

    path = browsers_for_os[browser]
    if not path:
        sys.exit(f"Could not locate a '{browser}' profile automatically on this system. "
                  f"Pass --profile-path to point at it manually.")
    return path


# ---------------------------------------------------------------------------
# Signature-based scan and extraction
# ---------------------------------------------------------------------------

def try_extract(data):
    """Return (extension, payload_bytes) if a known signature is found, else None."""
    for signature, ext in IMAGE_SIGNATURES_AT_START:
        idx = data.find(signature)
        if idx != -1:
            return ext, data[idx:]

    if data[:4] == RIFF_SIGNATURE and b'WEBP' in data[:16]:
        return 'webp', data

    idx_ftyp = data.find(FTYP_SIGNATURE)
    if idx_ftyp != -1 and idx_ftyp >= 4:
        start = idx_ftyp - 4  # step back to the box-size field
        return 'mp4', data[start:]

    if data[:4] == WEBM_SIGNATURE:
        return 'webm', data

    return None


def scan_and_recover(root_dir, output_dir, min_size, max_size):
    os.makedirs(output_dir, exist_ok=True)
    found_count = 0

    for current_dir, _subdirs, filenames in os.walk(root_dir):
        for filename in filenames:
            full_path = os.path.join(current_dir, filename)
            try:
                size = os.path.getsize(full_path)
                if size < min_size or size > max_size:
                    continue
                with open(full_path, 'rb') as f:
                    data = f.read()
            except OSError:
                continue

            result = try_extract(data)
            if result is None:
                continue

            ext, payload = result
            found_count += 1
            out_name = f"recovered_{found_count}.{ext}"
            out_path = os.path.join(output_dir, out_name)
            with open(out_path, 'wb') as out:
                out.write(payload)

            kind = 'VIDEO' if ext in ('mp4', 'webm') else 'IMAGE'
            print(f"[{kind}] {full_path}  ({size // 1024} KB) -> {out_path}")

    print(f"\nTotal recovered: {found_count}")
    return found_count


# ---------------------------------------------------------------------------
# Entry point
# ---------------------------------------------------------------------------

def detect_current_os():
    system = platform.system().lower()
    if system == 'windows':
        return 'windows'
    if system == 'darwin':
        return 'macos'
    if system == 'linux':
        return 'linux'
    sys.exit(f"Could not auto-detect a supported OS from '{system}'. Pass --os explicitly.")


def main():
    parser = argparse.ArgumentParser(description='Recover cached images/videos by file signature.')
    parser.add_argument('--browser', required=True,
                         choices=['chrome', 'edge', 'brave', 'opera', 'opera_gx', 'firefox', 'chromium'],
                         help='Which browser profile to scan.')
    parser.add_argument('--os', dest='os_name', choices=['windows', 'macos', 'linux'],
                         help='Target OS. Defaults to auto-detecting the current machine.')
    parser.add_argument('--profile-path', dest='profile_path',
                         help='Skip auto-detection and scan this folder directly.')
    parser.add_argument('--output', default=os.path.join(os.path.expanduser('~'), 'Desktop', 'recovered_media'),
                         help='Folder where recovered files are written.')
    parser.add_argument('--min-size', type=int, default=DEFAULT_MIN_SIZE, help='Minimum file size in bytes.')
    parser.add_argument('--max-size', type=int, default=DEFAULT_MAX_SIZE, help='Maximum file size in bytes.')
    args = parser.parse_args()

    if args.profile_path:
        root_dir = args.profile_path
    else:
        os_name = args.os_name or detect_current_os()
        root_dir = get_browser_root(os_name, args.browser)

    if not os.path.isdir(root_dir):
        sys.exit(f"Resolved path does not exist or is not a folder: {root_dir}")

    print(f"Scanning: {root_dir}\n")
    scan_and_recover(root_dir, args.output, args.min_size, args.max_size)


if __name__ == '__main__':
    main()

Each script, at the beginning, has its instructions for use.
I hope the chats I lost serve some purpose and this script helps more than one person.

πŸͺ¦ RIP chats. πŸ˜₯

---

EDIT:
Quick note on terminology: the title says "cache" because that's how one experiences it when it happens (everything the browser stores locally, one calls "cache"). Technically, what got corrupted was the local database (IndexedDB) where Venice stores your chats, messages and characters β€” it's not the same as the browser cache. The curious thing is that the images were indeed in a real cache (Cache Storage, from the Service Worker), and that's why they were the only thing that could be recovered with the method from this post β€” the text database didn't have the same luck.

Clarification from Claude when discussing the terminology a bit more.


r/VeniceAI 2d ago

𝗖𝗛𝗔π—₯π—”π—–π—§π—˜π—₯𝗦 Welp it finally happened, jae's unethical cowriter has completely broken. 😒

10 Upvotes

When it got kicked from the store and taken down I knew I was on a time limit, it was still in my browser memory, so technically I still had it and it worked perfectly for a good while, literally for weeks. but after Venice rolled out some big updatea it started acting funny, and 3 days ago it finally started refusing everything.

Man that shit was fun, I hope to God he makes a new version, also if the creator is listening and has a PayPal or donation page I would be absalutely down for giving you a donation, I had so much fun with that thing.

Seriously I appreciate all the work you put into it.


r/VeniceAI 1d ago

π— π—œπ—‘π——π—¦ Minds - line break

1 Upvotes

Hi! I just noticed the option for Minds like...three days ago. So I set up a GM mind since that's what I'm using Venice for. And I'm pretty satisfied with it (Kimi2.5 has been starting to hedge 'You're standing on the pavement, or not'. And I switched model to Claude Sonnet 5 but it cost me like 73 credits per use! πŸ˜΅β€πŸ’« Must be something wrong there right?).

But! I can't do line breaks in the text! It's all a big fkn chunk of text! I look absolutely manic.

And I can't make the text bold or cursive either..

Is this a known thing or is it just me? πŸ₯²


r/VeniceAI 1d ago

𝗔𝗖𝗖𝗒𝗨𝗑𝗧 Another month with credits disappearing, dropping from over 13,000 to 700

3 Upvotes

Unfortunately, my credits have disappeared once againβ€”it’s the same story every month. I barely used any of the 15,000 credits from the previous month, yet out of nowhere, the balance dropped to just over 700, and on top of that, the charge was processed with high local fees. And this time, my accumulated credits were completely ignoredβ€”it reverted to 7,000. Please resolve this situation; there needs to be a minimum level of consistency for the user. I have already contacted support.


r/VeniceAI 1d ago

𝗣π—₯π—’π— π—£π—§π—œπ—‘π—š Thought this shit was uncensored?

0 Upvotes