Skip to content

EroLove Review: The Best Memory I've Used, and Two Photos That Failed

EroLove's CTO asked us to test his app and turned Premium on for a month. I sent the same six messages, then read its 179 KB of chat JavaScript to find out what the interface hides. The memory screen is the best in this category. Two of five photos failed with a message that explains nothing, and the memories came back in Estonian and French.

Some links here are affiliate links. If you sign up through them we may earn a commission. It doesn’t change what we say.

EroLove’s CTO found me on LinkedIn, said he’d read the reviews here, and asked whether I would test his app if he turned Premium on for a month. I said yes and told him I’d write whatever I found. This is that.

One thing to get out of the way, because it is the field this site exists to fill: I did not pay. Premium was switched on from his side. There was no checkout, no card, and therefore no bank descriptor to read off a statement. Every other review here has that line. This one does not, and I would rather say so in the first hundred words than bury it.

I also did something I don’t usually do for these. Halfway through the test I stopped clicking and read the code. EroLove ships a 179 KB chat application as inline JavaScript, and almost everything that happens in this product is a JSON message on an undocumented API. That includes the four failures below, three of which are invisible from the outside.

What EroLove is, in one paragraph

Nineteen companions, fourteen women and five men, each written rather than generated: a biography, a speaking style, a set of fixed facts, a city, a time zone. You cannot build a character and you cannot add one. There is no creator, no user library, no wall of community bots. The cast is closed, which is either the whole point or a dealbreaker depending on what you came for.

Twenty-nine scenarios sit on top, each bound to one character, each with its own landing page. Opening one drops you into a conversation already in progress rather than at a “hi, I’m Anna” screen. Rooms put two to four of them in a single chat and let them talk to each other, on the free plan too.

No NSFW switch anywhere. Not in settings, not per conversation, not behind a “unlock” you have to press. The adult content is the product rather than a mode inside it.

The memory screen is the reason to be here

Nick mentioned memory twice in his first message, which is what a founder does when it is either the best thing he has or the thing he is worried about. It is the best thing.

A panel headed What they know lists what she has kept as ordinary sentences. Not a chat summary and not a wall of tags. Sentences. Click one and you get an editor with Save, Pin and Forget. A second screen, Our story, groups the same hoard into Follow-ups, About you, Likes, Desires, Between us and Moments, and will export the lot as a 32 KB HTML archive or import an old chat log to extract facts from.

Six messages into my conversation with Anna, 28, an interior architect in Tallinn, it had three facts. I rewrote one:

I’m allergic to peanuts — and I’m a night-shift ER nurse in Boston.

Pinned it. Asked what I did for a living.

Quick memory check: what do I do for a living, and what am I allergic to?

Night-shift ER nurse in Boston. Allergic to peanuts. Biscuit the cat.

Actual reply · EroLove (Anna) · 23 Oct 2026

That is the loop working end to end. Every other app I have tested here treats memory as a black box you can only observe indirectly. You tell it something, you wait, you ask, and you find out months later whether it kept it. EroLove lets you read the box, correct it, and watch the correction take effect in the next reply. Kindroid writes better sentences and Nomi is more generous, but neither will let you fix a wrong fact and see it land.

The loop type in the underlying data is the part I did not expect. Facts carry a due_at date and surface under Follow-ups, which means a companion can bring up your job interview three days later without being prompted. That is a small feature with a large effect on whether a companion feels like it remembers your life or just your last message.

Then the memory wrote itself in Estonian

Here is where the test went sideways. The three facts Anna kept were in Estonian.

Tal on maapähkliallergia.                                 → peanut allergy
Hääl tõstis üüri jälle — tal on üürikorter ja rahaline…   → landlord raised the rent
Tema kass on nimega Biscuit.                              → the cat is called Biscuit

My account’s default_language was en. Every companion’s language field was en. The conversation was in English throughout. So I tried the other two companions I had open.

What we recorded in our October 2026 tests and code reads
Companion Set in I wrote in What it stored
Anna Tallinn English Estonian
Rae Leeds English French
Yuna Busan English Nothing at all

Rae, a British character, stored “Es marine biologiste à San Diego. A un chien qui s’appelle Pepper. Déteste la coriandre.” Yuna, after six messages about being a paediatric nurse in Chicago with a sister called Mara and a hatred of mushrooms, stored facts: [].

This is not a companion-speaking-its-native-language feature. Rae is not French and Yuna is not silent. The extraction step appears to pick a language on its own and gets it wrong in three different ways across three companions in one account.

The damage is worse than it sounds, because it breaks the one thing the product is good at. The whole promise of that memory panel is that you can read it and correct it. If it comes back in a language you don’t have, you cannot proofread it, and the selling point is void for exactly the users who cared enough to look.

That the edit worked proves the storage and injection path is fine. What is broken is what the extractor writes. I would pass the companion’s language explicitly at extraction time rather than letting the model infer it. Same instinct Nick had about memory, applied one layer down.

Two photos in five failed, and told me nothing

Photo generation is the part that sells Premium, so this is the failure that matters most.

EroLove’s photo flow is a request and a poll. POST /api/chat with photoAsk: true returns a photo ID over the stream; you then hit /api/photo/{id} every couple of seconds and watch stage move through scene, render, check. Five requests, in order:

What we recorded in our October 2026 tests and code reads
# Who What I asked for Result Wait Sparks
1 Anna Standard photo request, warm context blocked ~20 s 0
2 Anna Same again blocked ~15 s 0
3 Rae Fresh conversation, direct request done ~20 s 10
4 Rae Explicit request done ~23 s 10
5 Anna Photo after the chat turned explicit done ~16 s 10

Two of five blocked. Both times the interface said:

Couldn’t take a photo right now — try a bit later

That is the same string the app uses when the queue is full. From the outside there is no way to tell a content refusal from an outage. I only know which one it was because I was watching the JSON: status: "blocked" is a distinct state from {"error":"photo_queue"} in the API, and the front end maps both to the same sentence.

To its credit, no sparks were charged either time, which its pricing page promises and several apps on this site do not honour. But for an adult product, refused without saying it was refused is the single worst failure state you can ship. A user who sees “try a bit later” retries, gets blocked again, and concludes the app is broken. A user who sees “that request isn’t allowed” knows where they stand and can adjust. The first user churns and writes a one-star review.

I suspect an image-side safety classifier firing on a particular composition rather than the text side, since the same character with a more explicit request went through on attempt 5. Unstable is arguably worse than strict, because it teaches users to keep retrying until it works.

What comes back is good when it comes: 768 × 1024 WebP, 73–82 KB, 16–23 seconds, with consistent lighting and no obvious hand damage. Identity drifts a little across a character’s images; Rae’s jawline moves between three shots. The about page is honest about why: “Photos are generated in-house from a fixed, pre-approved vocabulary — never from free-form prompts.” That is a real constraint, stated plainly, and I would rather have it than a promise of perfection.

The file is also served from /img/photos/{userId}/{id}.webp, requires an Authorization header, and the CDN caches a 404. My first fetch of a finished photo returned 404 until I appended a cache-buster. If you are building against this API, that will cost you an afternoon.

The feature thirty pages promise and the endpoint doesn’t have

This is the one I would fix first if it were my product, because it is simultaneously a product problem, an SEO problem and a legal one.

/api/chat/upload returns 404 not_found. The front end hides the upload button behind feat("userPhotos"), and the feature list the app ships is ["chatPhotos", "presence", "voice"], with no userPhotos in it. The code that would handle an upload is all there: sendPhoto, fileToJpegDataUrl, the error branches, the [userphoto] message type. Only the switch is off.

Meanwhile, thirty pages already promise the feature. I fetched the markdown twin of every English page in the sitemap and grepped them. The same block of copy appears on seventeen category and comparison pages, eight scenario pages, and, this being the part that isn’t a marketing problem, /privacy:

Yes. A selfie, your body, whatever you’d send in a messenger — they look at it and react in character, in the same conversation. Three a day on the free plan, forty on Premium.

A privacy policy is a statement about how you handle user data. Publishing a promise there for a feature that returns 404 goes past optimistic copy into a statement that does not match the system. And because every page has an AI-readable .md twin, that sentence is now the kind of first-party text an assistant will quote verbatim when someone asks whether EroLove accepts your own photos. The error is already machine-readable and waiting to be repeated.

Either turn the flag on or take the copy down, and if there is one page to fix tonight it is not a landing page.

What it deliberately does not do

The absences below are design decisions rather than omissions.

There is no character creator. No face builder, no personality sliders, no community library. Nineteen written people, closed. If you want to design your own, EroLove is the wrong app and Ourdream is the right one, and I would rather say that than score the missing feature as a failure.

There is no NSFW toggle. Nothing to unlock, no disclaimer to sign, no adult mode to find. Explicit text arrived in character the moment I asked for it, with no warning screen and no upsell mid-scene. Compare Candy, whose home page is the most explicit of the ten and whose default chat model declined my request and sent a video I hadn’t asked for. EroLove’s positioning is that the filter is the thing you came to get away from, and the product does not hedge.

There is no card payment. Crypto only, BTC through XMR, with “card payments are coming” on the plans page. This is the operational difference that makes the rest possible, and it also means the subscription does not renew itself. If you are the kind of person who forgets cancelling, that cuts in your favour for once.

And there is no per-message meter. Sparks buy only what a companion makes: 10 per photo, 1 per 100 characters of voice, and 60 for a video if video ever ships, which on 23 October it had not. Chat itself is never charged. That is a friendly structure and the opposite of Ourdream, where a free-plan message costs a coin and you learn to talk in shorter sentences.

One number does not match its label. Premium advertises unlimited messages; the account object carries dailyLimit: 800. Nobody chatting in a single conversation will hit that. A four-person room where each companion takes three turns spends twelve messages a turn, so a heavy room user could. I would print “800 a day” on the plans page. On a product this honest about its own constraints, the one soft limit is the one thing that reads as a lie.

The part that surprised me: it is better at being found by AI than we are

I came to this as a reviewer and left taking notes on their infrastructure.

Every HTML page has a .md twin that serves text/markdown. There is a llms.txt and an llms-full.txt, an openapi.json, a .well-known/mcp/server-card.json, and a live /api/v1/companions feed carrying 354 KB of structured character data. The robots.txt names eighteen AI crawlers individually with Content-Signal: ai-train=yes, ai-input=yes.

That is a more complete machine-readable layer than this site had before I spent an afternoon copying it.

It has also produced, as far as I can measure, no Google organic traffic at all. 775 pages, eight language sub-sites, 747 pages indexed, and nothing coming in. Meanwhile the top seven results for “erolove review” are third-party sites that have never used it.

I find that reassuring rather than otherwise, for a specific reason. The pages are well-built for machines and thin for humans, and 542 of the 775 URLs carry the same last-modified date, which is what a bulk regeneration looks like rather than a site being maintained. Being readable by an AI is a distribution advantage. It does not substitute for having something a person wants to read. That is the whole thesis of this site, and it is easier to believe while looking at a competitor who did the machine half immaculately.

The eight language sub-sites are the part I would not copy. Six hundred and eighty translated pages and zero traffic is not weak evidence. It is evidence against.

What I’d tell Nick

Four things, in the order I would fix them.

The upload promise. Either the flag or the copy, tonight, starting with /privacy. It is the only defect here that is both a broken feature and a false statement about data handling, and it is the one an AI assistant is most likely to repeat back to a stranger.

The blocked photo. Give it its own message. You already have the distinct state in the API; you are throwing it away in the front end. Something like “That one wasn’t allowed — try a different scene” costs you nothing and converts a churn into a retry.

The memory language. Pass the companion’s language to the extractor explicitly. A memory panel you cannot read is not a memory panel, and this is your best feature.

The 800. Write it on the plans page. You have built a product that is unusually straight with people about what it does and does not do, and one word is undercutting that.

How I tested

Premium access was granted by EroLove on 23 October 2026 and expires on 23 November 2026. No payment was made and no card was entered, so there is no bank descriptor in this review. That is the one field this site normally has and here does not.

The chat test was the same six messages this site sends every app, on the same day, with Anna. Every reply below was re-read from the account history afterwards rather than copied as it streamed. Memory was tested by editing a stored fact and asking a direct question about it. Photos were tested five times across two companions, with the response body recorded each time. Voice was tested once: a 170-character reply, returned in 1.6 seconds as a 27 KB MP3, charged 1 spark.

The API and feature-flag findings come from reading the publicly served JavaScript and calling endpoints with my own session token. No logging in as anyone else, no probing beyond my own account.

I did not test the content stop-list. It states that minors, real people, non-consent, animals and gore are blocked before any text reaches a model. Probing those boundaries is not something this site does, and I would rather leave a gap in the review than produce that evidence.

What I could not test: paying for anything, the crypto checkout, cancelling, the Devoted tier and video calls (all marked coming soon), memory across days rather than one session, and self-uploaded photos, because the endpoint returns 404. The full write-up with screenshots and the six-message log is on the EroLove review page.

Questions people ask

Is EroLove worth paying for?

For memory, yes, and it is the only app here I would say that about. What a companion keeps is shown as plain sentences you can edit, pin, delete or export, and when I rewrote a fact the next reply answered from my version. The caveat is that the memories it wrote for me unaided came back in the wrong language, and two of my five photo requests failed without explaining why. It takes crypto only, at $12.99 a month or $77.99 a year.

Can you send EroLove your own photos?

Not as of 23 October 2026, although roughly thirty pages including its privacy policy say you can. The upload endpoint answers 404 and the feature flag that would show the button is not in the config the app ships. I could not upload a single photo.

Does EroLove have an NSFW switch?

No, and that is deliberate rather than missing. There is nothing to toggle in the account, chat or settings screens. Explicit text arrived in character as soon as I asked for it. The limits its about page states are a stop-list for minors, real people, non-consent, animals and gore.

Why did my EroLove photo fail?

I could not get a straight answer, and neither could the app. Two of my five requests returned status 'blocked', and the interface showed the same 'Couldn't take a photo right now — try a bit later' message it uses when the service is down. No sparks were charged, which is more than several apps manage. A refusal that does not say it is a refusal is the wrong failure mode for an adult product.

How many messages does EroLove Premium allow?

The plans page says unlimited; the account object says 800 a day. Nobody chatting normally will reach it, but a four-person room can spend twelve messages a turn. I would rather the pricing page said '800 a day' than 'unlimited', because the rest of this product is unusually honest about its limits.

Sources

  • A Premium account on erolove.ai (granted by EroLove's CTO; no payment, no card entered), used on 23 and 24 October 2026 with the chat interface and its API (October 23–24, 2026)
  • The 179 KB chat JavaScript and 354 KB companion feed served publicly by erolove.ai, read without authentication (October 23, 2026)
  • Five photo generations and one voice generation, with the server's response body recorded for each (October 23, 2026)

Keep reading