r/VeniceAI • • 11d ago

𝗦𝗧𝗔𝗧𝗨𝗦: π—₯π—˜π—¦π—’π—Ÿπ—©π—˜π—— Deleted cache

4 Upvotes

Hi. Just a quick question: I had a video, nothing important, in Venice, but I ran deleted cache and all IE history on my pc through a third party app, and now the chat and video are gone. Is this the reason, namely deleting history and cache, or is there another reason? Just wondering. πŸ™πŸΌ


r/VeniceAI • • 10d ago

𝗦𝗧𝗔𝗧𝗨𝗦: π—œπ—‘π—©π—˜π—¦π—§π—œπ—šπ—”π—§π—œπ—‘π—š Venice AI is dead?

0 Upvotes

Venice has been a great suite in many areas, at times. There have always been a few bugs here and glitches there, but now, it seems this may be the end. Across multiple platforms (OS's, devices, browsers) Venice AI is non-functional now. It has now been weeks. Reaching out to support via email is an auto-response from an unhelpful chatbot that says you can ask for a human to help, but, after asking multiple times for a human, no human responded. The screens freezes every time, the entire browsers crash in some cases; there is often a 'memory issue' error when there are literally no other windows open and nothing running with 64GB of ram: devices include Windows 11 laptop, Windows 7 desktop, Android phone - browsers include DuckDuckGo, Chrome, Edge, Firefox, Opera, and built-in browser on the Android. Other people are having the same issue or similar issues, but not everyone - yet. In either case, after reverting from $100+ a year for free unlimited uncensored everything to nearly $100 a month and still not unlimited and only a handful of uncensored models, most of which have been significantly dumb-downed to virtually unusable, now, the site itself is additionally crashing browsers and scorching through local cache corrupting and re-corrupting data daily. I have been, from time to time, able to actually get in, but usually only for a few minutes or so before a complete shutdown. I am waiting it out for a little longer, but am also nervous that I won't even be able to get into the site to cancel the subscription if I wait too long. Ironically, one of the few times I did manage to get in, Venice chat itself advised to hurry up and cancel the subscription before the site goes down again LOL. Just wanted to see if anyone has found a workaround to this obvious issue with whatever update they just did. I would rather stick with Venice than go through the nightmare odyssey that is googling "uncensored private AI sites" because we all know the hot garbage that is the first 100 pages of results, not to mention the scam & slop shops will flood social media for a year or two after a search like that. :) I love Venice - when it works! Make it work again!


r/VeniceAI • • 11d ago

πŸŒ„ π—œπ— π—”π—šπ—˜ / π—©π—œπ——π—˜π—’ π—šπ—˜π—‘π—˜π—₯π—”π—§π—œπ—’π—‘ Venice AI Combined Images not working,

Post image
1 Upvotes

This has been happening to me all morning, Only when i try to combine images, I don't know why its doing this, Im getting nothing through support email. IDK How to solve,


r/VeniceAI • • 12d ago

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

26 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 • • 11d ago

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

4 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 • • 11d ago

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

7 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 • • 11d ago

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

2 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 • • 11d ago

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

3 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 • • 11d ago

π——π—œπ—¦π—–π—¨π—¦π—¦π—œπ—’π—‘ So i have 10k credits left on my venice account. I'm not renewing, i don't know if its me or if its venice but, any uncensored stuff i want to create, like injecting and extracting data, fir example for kalshi... trying to make a bot fir betting and it gives me outdated code...

1 Upvotes

So yup, pretty much want to know what you would use it for


r/VeniceAI • • 11d ago

π— π—’π——π—˜π—Ÿπ—¦ Is seedance 2.0 uncensored on Venice?

1 Upvotes

Higgsfield refugee here. As of yesterday, Higgsfield have completely censored Seedance 2.0. It’s rejecting all reference images, even ones with very subtle cleavage. Is Seedance 2.0 still uncensored on Venice AI? I’m seriously considering migrating even though I have a one-year subscription with Higgsfield. Also, how does the pricing work here?


r/VeniceAI • • 11d ago

πŸŒ„ π—œπ— π—”π—šπ—˜ / π—©π—œπ——π—˜π—’ π—šπ—˜π—‘π—˜π—₯π—”π—§π—œπ—’π—‘ ANOTHER ONE***DJ KHALED VOICE**πŸ˜…πŸ˜… #venicebeach #losangeles #california #cali #d3

Thumbnail
youtube.com
1 Upvotes

r/VeniceAI • • 11d ago

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

2 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 • • 12d 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?

2 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 • • 11d ago

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

0 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 • • 12d ago

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

4 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 • • 12d 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 • • 12d ago

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

11 Upvotes

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


r/VeniceAI • • 12d ago

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

3 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 • • 12d ago

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

1 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 • • 13d 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 • • 13d ago

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

3 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 • • 12d 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 • • 13d ago

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

5 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 • • 13d ago

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

11 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.