Changes

What changed in Aeyo, and the thinking behind it.

1.8.4 Change many items at once

Any item list has a Select button now. Tapping a row chooses it instead of opening it, and a bar appears with Store, Category and Cart.

A confirmation names how many and where before anything happens. Afterwards one Undo returns every item to its own previous value — not to one shared value, but to whatever each had before, including having had none.

The title says where you are: Nothing selected until you pick something, then a count.

Schedule and pause are deliberately not offered. Setting a cadence back does not restore what changing it threw away, so an undo there would be a promise Aeyo cannot keep.

Smaller

A collapsed Occasional group opens when Select turns on. A group holding items you might want to choose should not hide them.

In a shared cart, a label that arrives after the item now reaches you. If someone files something under a category later, that fills a blank of yours — it still never overwrites what you set yourself.

Twelve new phrases in all six languages Aeyo speaks.

1.8.3 A trip is one scroll

A trip used to be a column of cards, each one a small window onto a store with room for about two items. A stop is a section now, and a trip reads top to bottom in one go.

The cards were fixed height by design — that is what a card is, something you take in at a glance — and it is why opening a trip showed you a smaller copy of the dashboard you had just left. A section has no such budget. Widening the reach now puts the extra items where you are already looking, instead of changing a number on a card.

Three things that were not working

The right-hand half of every item row did nothing. The tap target was the title text rather than the row, so the emptier a row was, the more of it was dead. The whole row is the target now.

Choosing Due sorted your items and then did not group them. Four of the five grouping modes put each group under its own heading; Due produced one unheaded list, which is the opposite of what picking a grouping asks for. It divides by day now.

The two icon buttons on a store card — the one that opens directions, and the one that opens the store’s website — had no name for VoiceOver to read. They are Navigate and Shop Web now, in every language Aeyo speaks.

A stop says which store, and where it is

The store line is two halves: the name, then where it is. A nickname you gave a store is what shows, and its street address is the fallback — you named it that for a reason.

Items with no store yet have their own section at the foot of the trip.

Smaller

Everywhere a date is put into words it now reads the same way. In 2 days, on every screen, rather than one phrasing here and another there.

Rows Aeyo had guessed at carried a small sparkle. When most of what you buy is occasional, nearly every row had one, so it marked nothing. It is gone. A guessed date still reads as a guess — Maybe, or a tilde — and is still never coloured as though it were urgent.

Every preview row shows its category icon, so the icons read as a column instead of appearing on some rows and not others.

Each stop carries a menu — open the list, edit the store, end a session running there — on a button you can see rather than a long press you have to know about.

My Carts and My Stores are Carts and Stores.

The guidebook was out of date about where store-less items gather

It said they gather at the bottom. That was true when it was written, and this build moved them: they are a section at the foot of a trip’s detail, and they are not on the dashboard at all. “The bottom” had come to name a place you could not find.

Corrected in all seven languages rather than one. The six translations were faithful to the English, which is exactly why all six were equally out of date.

1.8.2 A note counts too

The spec under an item’s title decided whether two things with the same name were one item or two. A note counted for nothing. Both count now, on equal terms — which field you typed into no longer matters, only what you wrote.

Greek Yogurt with Adam in the spec and Greek Yogurt with Isabelle in the note are two items. 拖鞋 with 小明 in the spec and 拖鞋 with 小明 in the note are one item, because you meant one. Which drawer the word landed in is Aeyo’s idea, not yours.

This corrects a line published here in 1.7.2 — the spec is now half of what makes an item itself. True then. The note is the other half now.

Your existing items are re-read, not rewritten, so the Duplicates card can change in both directions the first time you open this build: a pair you had kept apart with a note stops being a duplicate, and two items carrying the same word in different fields become one. Nothing is altered on disk, and moving a word between the two fields moves the answer back.

The spec field is called Tell apart

The same field with the same contents, and the sheet is titled Tell them apart. A control named after a drawer was the wrong name once the drawer stopped deciding anything.

Rows that only ever showed the spec now show the note when there is no spec.

Suggestions

Typing sourcream without the space now finds Sour Cream in Aeyo’s catalog. An item already in your own library still needs the space.

Two rows of the same thing differing only by a detail used to appear as two suggestions. They appear as one now, spelled the way you spell it — and when two spellings are exactly tied, neither is offered rather than one being picked for you.

1.8.1 Two languages it was skipping

Line splitting had never worked in Chinese or Japanese. The check that decides whether a line is worth asking about counted spaces, and neither language puts spaces between its words — so it saw a single word every time, concluded there was nothing to pull apart, and stopped. In English it looked healthy the whole time.

It now asks the system’s own text segmenter instead of counting spaces. 有机全脂牛奶 comes apart. 可乐 does not, because there is nothing in it to come apart, and saying nothing is the right answer there.

Answers also come back in the language you typed. A line carrying a digit — 2盒牛奶 — could always get through, and was being answered in English.

The describing word was being dropped

2 double tips pencil for Amy returned the name, the count and the note, and lost double tips on the way. The fields were being asked for in the wrong order. That is a server change rather than an app one, so it reached everyone the day the server was updated and needs no update to get.

500g pasta now puts 500g in the specification and leaves the quantity empty, which is what you meant.

The guidebook was wrong about where splitting happens

It said Aeyo splits what you type on your device, and asks a model only when it cannot. There is no on-device splitting — the model does all of it. What your device decides is whether to ask at all, and most lines never get asked about. The sentence is corrected in all six languages. The privacy policy and the 1.8.0 entry here were corrected the day it was found.

Two crashes

Aeyo could close itself when it noticed you had arrived at a store, if you had two categories with the same name. The arrival notification went with it, which made it a failure at the one moment that feature exists for.

Separately, a shared-cart invitation with a repeated parameter in it closed the app when opened.

A cart named with an ampersand

Snacks & Drinks produced an invitation link that stopped at the ampersand, so the person receiving it joined a cart called Snacks. An invitation that does not work now says so, instead of opening Aeyo and saying nothing.

1.8.0 Type the whole thing on one line

Type an item the way you would say it — 2 pencils for Amy — and Aeyo offers to put the pieces where they belong: the count in quantity, the person in a note, and pencil as the name. One line instead of three.

The offer appears under the name when you finish the line, and only when there is something worth moving. Take it or ignore it. Nothing is filled in without a tap.

The third step is switched on

1.7.0 described reading a list as a stack of steps, and said of the last one: “A third step, which would not, is written and is switched off in this build. Whether it ever ships is a question about whether it earns its cost, and that has not been measured yet.”

It has been measured, and it ships. An LLM does the splitting. What your phone decides is whether a line is worth asking about at all — one it already recognizes, or one with nothing to pull apart is never sent — and the rest is the one time the words you typed leave your phone.

What that means, exactly

Nothing is sent until you allow it. The first time it could help, Aeyo asks, on that line, with the choice in front of you. Until then nothing is sent and no server is contacted. Decline, and you are not asked again.

One line is what goes. Not your list, not your cart, not your purchase history, not your name — there is no Aeyo account for it to be attached to.

It goes through Aeyo first. The line reaches the LLM by way of a server Aeyo runs. If your phone asked the model directly, the model’s operator would see your device on every request. This way each request arrives from one address shared by everyone, so nothing ties a line to a device, or one line to the next.

Which model, today, is Cloudflare Workers AI. The provider can change, and nothing above changes with it — every protection here is a property of how Aeyo is built, not of who runs the model.

The line is not stored. What Aeyo’s server keeps is a count of how many lines a device has sent. Cloudflare says it does not use what is sent to train models, and does not say how long it holds it.

Photographing a list is unaffected. Reading a paper list with the camera runs on your phone, as it always has. Allowing a typed line to be split allows that and nothing else.

Settings → Mind → Line splitting turns it off, and on again.

In six languages

Everything new here is translated. So is the Live Activity: the Lock Screen and the Dynamic Island shipped without a string catalog, so they had been reading English on every device since the day they arrived. In Japanese, the Add Item button was misspelled.

1.7.8 Categories say their own name

A category you named yourself now shows that name. Since June, a single-word category you typed — vitamins, garage, beach — has been reading “Unassigned” instead, wherever it appeared.

Renaming a category keeps its items. Renaming used to strand them: the items stayed on your list but lost the category, and the delete confirmation for that category then told you it held nothing.

A category also reads the same everywhere now. The same one could show your name for it in search and “Unassigned” in the Library.

Shared lists

A category you typed yourself now travels with a shared item — its name, its icon and its colour. When Aeyo had not yet matched your category to one in its catalog, all three were held back, and the item arrived plain for the other person. That was the case for every category you named yourself.

Adding several

Marking a staged row as a different item from the one in your library keeps the detail you gave it. That detail was dropped on the way to the form, so the form asked again, and adding then created the item without it.

1.7.7 Add, or add and done

Add & Done is no longer a setting. When you search while shopping, every result has two targets: tap the row to add it to the trip, or tap the ✓ on the right to add it and check it off at once. You say which, item by item.

The old switch in Settings is gone. It gave one answer for every item, and the answer differs per item — something already in your hand is not the same act as something you still have to find. The toast names which one ran. A result your library already holds shows no ✓; touch and hold to create it anyway.

Pick

The opening set leaves out names your library already has. Search still shows them, greyed — that grey is what separates “you already have this” from “nothing is called that”.

The starter suggestions now come from Aeyo’s catalog in your own language, rather than from a fixed English list. They span groceries, household and personal care, and they thin as your library fills. When it covers them all, Pick says so instead of showing you an empty cloud.

Shared lists

A partner’s changes now arrive without you opening the list. The connection belongs to your account rather than to whichever screen happens to be open, so it outlives the screen — and checking something off from the Live Activity syncs too.

If you already had a shared list, open it and tap Share once to reconnect it. The other person will need a fresh invite afterwards — theirs will say the old link is out of date, and that is what it means.

One limit, unchanged: while Aeyo is fully closed it receives nothing. Changes arrive when you next open it.

Two fixes for lists that are not in English

Categories Aeyo creates for you now arrive in your language. They had been coming through in English whenever you had no matching category yet.

In French, fruit is filed under fruits. It had been going to vegetables.

1.7.5 In your language

The permission prompts now appear in the language your phone is set to — the camera request and both location requests. Until now they were English everywhere, even when the rest of Aeyo was not. The Magic Search scope picker is translated too.

Open source licenses

About has a new screen listing what Aeyo is built from, each license in full.

It replaces a credit that was wrong twice. name-suggestion-index was listed under the wrong license. And the icons were credited to the tool that converts them rather than to the five projects that drew them — Lucide, Tabler, Pictogrammers, Font Awesome and Remix Icon.

1.7.4 What a delete takes with it

Someone deleted the first list he had made, the way you throw away a piece of paper you have finished with. Afterwards he saw what had gone with it, and wrote to say so — adding that it was probably his own fault. It was not. Aeyo had asked him whether to delete the items too, and the word “items” told him nothing about what they carried.

The dialog says what it destroys

An item is not just a name. Behind it is the record of every time you bought it — how often, and when. That record is the whole reason Aeyo can suggest anything at all; a suggested date is not a setting someone chose, it is an observation about you. Delete the items and it goes with them, and adding the same name back later starts from nothing.

The old wording hid that behind a word doing too much work. To someone treating a list like paper, “items” means the things already bought and crossed off — precisely the part you want gone. So the sentence read as an offer to tidy up, and it was an offer to forget.

Deleting a list, a store or a category now says it plainly: deleting the items also deletes their purchase history, how often you buy each one and when. Keeping them is the other button, and it says where they land — out of the list and still in your library, or simply unassigned if it was a store or a category. The destructive route is unchanged and still one tap. What changed is that you are told first.

One related repair. The dialog used to work out the number of affected items separately from the delete that followed, and the two could disagree — it was possible to be told a store had no items, and to have items deleted anyway. The question is now asked of the delete itself, so the sentence and the act cannot come apart.

Need Now, a third time

Two releases ago Aeyo stopped undoing Need Now by itself. Last release closed a second route, on shared lists, where the other phone could arrive and undo it. This closes a third, and it is the quietest of them.

Saying you need something now sets a date you authored. Editing anything else about that item afterwards — a note, a spec, the quantity — counted as editing the schedule by hand, and threw that date away. For an occasional item this was not an edge case, it was the ordinary path: its timing comes from a forecast rather than a picker, so nothing had to look like a schedule edit for the date to be discarded. The loss then travelled to the other phones, faithfully.

Now only a real change counts as one. A genuine rename or a real change of frequency still clears the date, deliberately; editing a note does not. Purchase history was never involved in any of this.

Three fixes for one promise is worth saying out loud rather than presenting as a fresh feature. The promise was always the same — what you say outranks what Aeyo works out — and it had three separate routes to break it.

Two stores that look the same

If you shop at two branches of the same chain, Aeyo showed you two identical rows and left you to guess. Each row now carries the smallest part of its address that actually tells it apart from the other — not the full address, and not the same detail for every store, but whichever piece happens to be the one that separates them. Where a store has no location at all, and you are being asked to choose between stores, it now says so rather than showing nothing.

Copies Aeyo made of a brand

Aeyo keeps a row for each brand you shop, and it turned out to be creating those rows in several places that did not quite agree with each other — so the same brand could end up stored twice, from one moment where two of them raced. Accepting a suggested nearby store could also mint a second COSTCO beside your existing Costco, deterministically, with no race at all.

Duplicates that already exist are folded together the next time you open the app, without asking. Anything pointing at a copy is moved onto the survivor before the copy goes, so nothing is orphaned. If a brand you set yourself changes or disappears, that is a bug rather than housekeeping, and it is worth reporting.

The row you just fixed stays where it was

Some lists in Aeyo are worked out rather than stored — the duplicates it has noticed, the things left over after a shop. Fixing a row removed it from the reasoning that produced the list, so the row vanished the instant you dealt with it, which is a strange thing to happen under your hand. Rows you resolve now hold their place until you leave the screen. Anything that leaves for some other reason still leaves.

One card, and what it is actually asking for

The permission settings were four switches that each looked like an on-off toggle for a feature. They are now a single card that says what you are accepting before you accept it.

Noticing your arrival while Aeyo is closed needs background access, which iOS treats as a separate request and offers only once — Aeyo spends it on a tap you make, never on its own initiative. Allowed only while you are using Aeyo, arrival still works while the app is open. A saved store’s page tells you which level you have.

Also

Occasional items no longer have a pause, and the one-interval skip is gone. Both were answers to questions the design already answered elsewhere: an occasional item going quiet is a state it can already express, Snooze is the timer, and the X on the card is the off-switch.

The shopping tray has an “Also here” section for things this store carries that Aeyo is not currently guessing for. Add several now leads every empty list rather than sitting behind a menu, and it offers your own items, including names Aeyo has never heard of. A spec or a link you clear now actually clears, on every phone — both used to come back. A store card counts what is left rather than showing a fraction. Leaving Zen Mode is a labelled control instead of an x. And the setup steps can no longer run backwards.

1.7.3 What you say, and what Aeyo concludes

Last time ended with an honest limit: Need Now had stopped coming undone by itself on your own lists, and on a shared list there was still a route that could undo it. That is closed. The reason it existed is worth saying, because it changes something about how shared lists behave.

The rest of the Need Now fix

If a routine goes quiet for long enough, Aeyo pauses it. That is deliberate, and it is how a list stays calm after you have been away. Saying you need something now brings it back — and on a shared list, the other phone could arrive and pause it again.

Two different things were being treated as one.

When you pause something, that is a decision. It belongs to the household, and everyone should see it. When Aeyo pauses something because it has gone quiet, that is a conclusion — drawn from evidence about how you have been using the app, which has never left the phone that drew it. That conclusion was being sent anyway, so one phone’s guess about your habits could overwrite another phone’s record of what you actually said.

Now they are kept apart. A pause you set still reaches everyone. A pause Aeyo reached on its own stays on the phone that reached it. Two phones can briefly disagree about whether a routine has gone dormant, and that is the honest outcome — they are looking at different evidence, and neither one is entitled to answer for the other.

Saying you need something is also recorded now, and shared, so the other phone knows it happened rather than having to infer it from a purchase that has not been made yet.

The X on a guess now stops the guessing

An occasional item has no schedule of its own, so Aeyo guesses when you might want it next. The X on those cards used to push that one guess out by about a cycle, which meant it came back.

It now stops the guessing for that item. Not for a while — until you buy it again.

That is a real off-switch, per item, and it needs no visit to Settings. Buying the thing turns it back on, which is the only way to turn it back on, and it is an act you were going to perform anyway.

On a shared list the X reaches everyone, permanently. It also clears whatever date was on that card, including one another person put there — which is the part worth knowing before you tap it. The X has reached the whole household since the last release; what changed is that it now reaches further in time as well.

The item itself is not paused, hidden, or deleted. Search for it and it offers to put it on today’s list, which works without turning the guessing back on. It goes quiet again afterwards.

To move a single guess rather than stop them, open the item and use Snooze.

The stores Aeyo watches for you

iOS lets an app watch a limited number of places at once — twenty — and Aeyo keeps one of those for the store you are actually shopping in. Which nineteen got the rest was never really decided. It fell out of the order stores happened to be stored in, so an online shop with no address could hold a place while the supermarket two streets away had none. On a phone with a lot of stores, Nearby could be empty while you were standing in one of them.

The nineteen are now your nearest, and a store with no location never takes a place from one that has an address. The set is redrawn as you move — not on a timer, but when you have travelled far enough that the answer could have changed, which in a quiet suburb is a long way and downtown is not.

Aeyo also stopped claiming to watch places it is not. When iOS refuses one — over the limit, or permission narrowed — that store is no longer counted as watched. This is the fix that made the others findable: everything downstream had been confidently reporting on regions nobody was looking at.

And Start Shopping, on a store’s page, now opens that store. If a trip is already running somewhere else, it switches to the one you are looking at rather than quietly reopening the other one.

Two of the same store

If your library held one shop twice — the same address, the same banner — that came from Aeyo rather than from you. A store you already had could be re-created from the community catalog under its canonical name, once per record it matched.

That is fixed, and the copies already made are merged the next time you open the app. The row that survives is the one you made yours: its nickname, its address, its arrival radius, every purchase recorded at it, and its visit history. Items pointing at either copy end up pointing at the survivor.

A store you deliberately keep separate is never touched. A different banner is a different shop, and so is a branch far enough away to be one — and when two rows are close enough to be ambiguous, Aeyo leaves both alone rather than guessing. It also frees the places it was wasting: a duplicate was holding one of those nineteen slots.

A store is its name and its place

Rename a store to a different shop and it becomes that shop — Aeyo stops treating it as the old one, and reconnects it to what the community knows about the new one.

What it keeps is your history: the aisle order it learned and everything you have bought there stay with the row. That is deliberate. If you want the new shop’s layout instead of the old one’s, the form now offers to add it as a new store rather than rename this one, which is the version that starts clean.

Two smaller things on the same screen. When Aeyo fills in a location for you — because you picked a brand it recognises — the field says so, and it says so plainly enough that you notice it changed. And removing a location now actually removes it; it used to look removed and quietly come back.

Saving a physical store with no location at all asks once, rather than letting it happen silently. Without a location Aeyo cannot know you have arrived and the store cannot appear in Nearby, which is a lot to lose by accident.

Also

On a shared list, an update that arrives late can no longer overwrite a newer one. Messages do not always arrive in the order they were sent, and one door into the app was applying whatever came last rather than whatever was newest. Both doors now check.

1.7.2 Two things with the same name

Last time, two of Aeyo’s messages about duplicates were reworded so each described its own outcome — and that release said settling which behaviour was right would be separate work. This is that work.

The spec is now half of what makes an item itself

An item has a name and, under it, a spec — a short line for the detail the name cannot carry. Until now the spec was decoration. It is now half of an item’s identity.

So Flour with the spec organic and a plain Flour are two items, and Aeyo treats them as two. Nothing needs resolving, nothing is a duplicate, and nobody has to put a person’s name or a brand into the title to keep them apart.

The question is asked across your whole library rather than inside one list, because the thing a duplicate damages is the routine — one schedule and one purchase history, split across two rows — and a routine does not belong to a list.

Adding something you already have

Aeyo never blocked this and still doesn’t. What changed is what it offers at that moment, which used to be a sentence and nothing else.

Now the row asks one question — is this the item you already have, or a different one? — and gives you both answers:

  • Need Now puts the item you already have back on today’s list. If it was paused, it comes back.
  • Add a spec keeps both, by making them genuinely different items.

Paused items count. A paused routine is usually the copy holding the most history, and it used to be invisible at exactly the moment it mattered — you could not reach it, so the only thing left to do was make a second one.

Duplicates you already have

Nothing surfaced these before. Aeyo now notices when your library holds the same item more than once and offers one card for all of them, not one per pair.

The screen behind it shows each copy’s list, whether that list is shared, whether it is paused, and how many times it has been bought — before you tap anything. That last one is not decoration: deleting a copy deletes its purchase history with it, and the copy that looks disposable is sometimes the one carrying two years of evidence. The rows are ordered by that evidence, most-established first.

Deleting is undoable for five seconds, and on a shared list nothing reaches the other person until that window closes.

In a store

Adding an item in Shopping Mode is instant — one tap and it is in your cart, which is right when your hands are full and wrong when the tap was an accident.

So when you type something your library already holds, the row that would create a second one asks you to touch and hold instead of tap. The catalog row does the same, and keeps its category, so a second item you meant to make is not born emptier than the first one was. Anything you don’t already own is still a single tap.

Need Now used to come undone by itself

If a routine had gone quiet for long enough, Aeyo would pause it — that part is deliberate, and it is how a list stays calm after you have been away.

But if you then said you needed it now, it came back, and the next time you opened the dashboard it was paused again. Every time. Aeyo was reading your purchases to decide whether you still wanted something, and could not see you saying so directly.

It can now, and saying you need something outranks Aeyo’s own conclusion about whether you do.

One honest limit, found after this build was already submitted: if the item lives in a shared list, there is a second route that can still pause it — the other phone’s copy can arrive and overwrite yours. On your own lists this is fixed. On a shared one it is better than it was and not yet right, and the remaining half is being worked on rather than left. Better said here than discovered.

Also

Magic Add respects specs, so adding a plain Oat Milk in a store no longer quietly revives one with a spec on it — they are two items now, and it makes the one you asked for.

Need Now on a paused item used to write down a date nothing ever read, which meant the button did nothing. It works.

1.7.1 A promise the app had been making for months

All fixes this time, and the first one is not really a new feature — it is Aeyo finally doing something it had been telling you it did.

Arriving at a store, with Aeyo closed

When Aeyo asks for location, one of the things iOS shows you is a sentence about noticing when you arrive at a store even when the app isn’t open. Aeyo has been showing that sentence for a long time. It did not work. Not intermittently, not on some phones — it had never worked for anyone.

It works now, and asking for it is its own deliberate step rather than something folded into a permission you granted months ago for a different reason.

There are two levels, and Aeyo now says which one you are on instead of showing a green checkmark and leaving it at that:

  • While you’re using Aeyo — arrival is noticed when the app is open. This is what you get when you first save a store with a location, and for most of Aeyo’s life it was the only level that did anything.
  • With Aeyo closed — arrival reaches you whether or not the app is running. This is the one the sentence was always describing.

Open a store you have saved and its arrival line tells you where you stand, and is itself the way to change it. iOS only ever shows the background request once, so Aeyo will not spend it on your behalf — it asks when you ask.

Both permission sentences were rewritten, because you are now actually reading them. The first one used to talk about sorting nearby stores, which is not what you are agreeing to at that moment.

The lock-screen card stays for the whole trip

Check off the last thing on your list and the card used to end, right there. If you then remembered one more item — which is exactly when you need a list — the lock screen had already gone quiet.

The card now belongs to the trip, not to the list being empty. It stays until you finish shopping, says “All caught up.” in the meantime, and picks up anything you add after.

The header changed with it. It used to read as a fraction, 3 of 7, and the total moved whenever an item left the list without being bought — you would watch 2 of 7 become 2 of 6 for reasons you could not see. It now counts what is left: Costco · 3 left. That number only ever falls.

It also survives the app being closed or evicted mid-trip. Previously a card in that state was frozen — it could not update, and it could not even be dismissed, so it sat there until iOS cleared it. And starting a trip at a second store now always leaves you with one card rather than two.

Two things Aeyo was saying that weren’t true

Adding an item you already have said “Already in your library.” That is a statement of fact worded like a refusal, and it isn’t one — Aeyo has never stopped you having two items with the same name. At least one person read it as a rule and worked around it. It now says what will actually happen if you continue.

The other direction was worse: adding several at once does skip duplicates, silently, with no message at all. That now says so too.

Both messages now describe their own outcome, which is a smaller claim than it sounds — the two paths still behave differently from each other, and settling which behaviour is right is a separate piece of work, not something this release decides.

Category colours

Nothing to look at here, but worth knowing if you have deliberately coloured a category. Aeyo pools anonymous votes to work out what colour a category usually is. Two things were wrong with how it voted: the form fills in a random colour before you have looked at it, and that random colour was being voted as though you had chosen it — and merely renaming a category cast a vote too.

Aeyo now votes a colour only when you actually picked one. A colour you chose is also no longer overwritten by what everyone else picked.

1.7.0 Mostly groundwork, and one photo

Most of this release is work you cannot see. The part of Aeyo that reads a shopping list — a photograph, a pasted block of text, eventually a list someone shares with you — was rebuilt from the inside. What surfaced from it is one thing: Aeyo can now read a whole paper list from a single photo.

The rest is about taking things back — a refusal you can undo, and a name that was telling you something untrue.

Photograph the list

Open Add several, switch to Scan, and there is a shutter on the camera preview. One press reads the whole list instead of asking you to tap each line.

Tapping still works, and it is still the precise path — you can see each word land. The photo is the fast one. If a photo turns up nothing you don’t already have, Aeyo says so rather than leaving you wondering whether the press registered; a duplicate tap stays quiet, because you watched that one happen.

The still is read in memory and discarded — never written to disk, never added to Photos, never sent anywhere. What is kept is the item names, exactly as if you had typed them. That is the same posture the camera has always had here, and the shutter did not change it.

It reads the script your list is written in. A list in Chinese reads as Chinese. Previously the scanner was asked for a specific language and quietly took only the first one it was given, which meant lists in other scripts came back empty with no explanation.

Lists written as bullets or dashes come apart more reliably too.

The part you cannot see

Reading a list used to be one piece of code that knew about shopping-item names, and it did well on tidy input and poorly on anything else — a photographed shelf tag, a paragraph, a recipe. It is now a stack of steps that each do one thing, tried in order, each free to say “not mine” and hand on.

Two of those steps ship here. One recognises the shape of a list — that lines beginning with dashes are separate items — before anything looks at the words. The other is the dictionary of item names that was already there, now sitting behind the same door as everything else.

Both run on your phone. A third step, which would not, is written and is switched off in this build. Whether it ever ships is a question about whether it earns its cost, and that has not been measured yet — so it sits behind a fence that a release check refuses to let past.

None of this makes Aeyo cleverer today. It is the groundwork for reading messier things than a neat column of words, and it was the bulk of the work in this release.

”Add your usuals” is now “Add several”

The old name was describing a place that does not exist.

“Add your usuals” reads as go to your usuals — and the tab beside Scan was called “Usuals”, which reads as a container, the screen where your things are kept. It is not. It offers items Aeyo does not already have, so opening it after building a list showed you none of your own items. A tester read exactly that and concluded his items hadn’t been saved, and expected to enter them all again. They had been saved; Library has always shown every item you own, whichever cart it sits in. Nothing was ever lost.

Both tabs now name a way of capturing rather than a place: Pick and Scan. The panel is Add several.

Refusing a suggestion is no longer permanent

Ignoring a suggestion still quiets it for longer each time, and refusing the same one three times still retires it. What changed is that retiring it is no longer a one-way door:

Ignore a suggestion and it goes quiet, longer each time it returns. Refuse the same one three times and Aeyo stops offering it, unless you change the item yourself. A reminder about something still unfinished is different — it waits, and goes when the thing is done.

The added clause is the part worth knowing. If you change an item’s schedule, or start it up again after pausing it, Aeyo takes that as new information and will ask about that item once more. A refusal means don’t do this, not never mention it again — and before this, there was no way back at all.

What Aeyo has worked out about an item

Open an item and there is a small schedule mark beside its dates. Tap it and Aeyo states the rhythm it has learned — “every 9 days” — and only then offers to apply it.

The first tap only tells you. This is deliberate: the suggestion was already there, buried in a long-press menu on the Up Next carousel, where you had to know it existed. It is a thing you go and look at, not a thing that interrupts you, and it shows even for items whose suggestions you have turned down — a suggestion you refused is exactly when a manual door is worth having.

Smaller things

Cards in Up Next now show an item’s specification — the size or kind you buy — the way every other item surface already did. It sits above the name, so names stay aligned down the list.

Buttons inside a notice at the top of a screen work again. The notice had claimed the whole row as one tap target, so a control sitting inside it could not be pressed.

The colour row on the Share Cart screen was indented three times over and sat visibly out of line with everything above it. Reported by someone using it, with a screenshot.

A suggestion about a weekday now reads “Milk · Tuesdays” rather than naming one particular Tuesday, which is what it actually means.

Everything new is translated in all six languages.

1.6.4 Mostly repairs

Three things in Aeyo said one thing and did another. A button that did nothing, a form that helpfully made you a duplicate, and a screen that could quietly drop an address you had typed. This release is about closing that gap, plus a real pass over the location map.

Ignore now means something

Ignoring a suggestion used to be, for most kinds of card, a no-op — the card came back, sometimes the same second. Every kind of suggestion now answers the same way, and the rule is stated plainly in the guidebook:

Ignore a suggestion and it goes quiet, longer each time it returns. Refuse the same one three times and Aeyo stops offering it. A reminder about something still unfinished is different — it waits, and goes when the thing is done.

The last clause is deliberate. A card that is waiting on something you haven’t done yet isn’t ignoring you; there is nothing to decide until the thing is done, so it doesn’t take a refusal personally.

Dismissals you made before this release were carried over. Nothing you had already refused should reappear.

A store you already have

Add a store whose brand you already shop — a second Walmart, a second Costco — while standing near, or picking a location near, the one already saved, and the form now tells you so. It names the store you have and offers two routes: use that one, or add this as a separate store.

Choosing to add separately asks you to set a location, because that location is the entire reason the two are different stores. Two genuinely different stores of the same brand still add cleanly.

What it will not do is fill in the same address and leave you with two identical stores. Guessing that two things are the same is how the duplicates happened; declining to guess is the fix.

The location map

The picker got a real pass.

Your own stores appear as pins. Tap one and it tells you which store it is and how far its arrival radius reaches — it identifies, it never places a location for you. Identifying is not choosing, and a map that answered a tap by silently placing a pin on top of a store you already have is how you end up with the duplicate above.

Nothing commits until you tap Confirm. Pan, zoom, tap around, then Cancel, and nothing has changed.

Opening a store that has an address opens the map on that address, rather than on wherever you happen to be standing and then flying there. Searching now follows the map: pan to another city, search again, and the results are from the city you are looking at — previously the search stayed anchored where it began, and no amount of retyping moved it. The search field itself has moved down within reach of a thumb.

An address that could disappear

A store with an address but no pinned location would open the picker already believing something had changed, so a single tap on Confirm could commit an empty address over the one you had typed. It was a real way to lose data and it is closed: nothing is committed unless you have actually changed something.

A crash that was waiting

A suggestion card about an item you had since deleted would take the app down when tapped. Nobody reported it — it was found by a test rather than by anyone’s bad afternoon — but the path was real and it is fixed at the root. The card now simply goes away.

Dark mode

Aeyo’s brand teal had no dark variant, so tinted controls sat too dark on dark backgrounds — most visibly the Cancel and Confirm buttons on the location picker, and the arrival radius drawn over dark map tiles. It adapts now, at the source, so everything tinted adapts with it. The Live Activity had been carrying a private copy of the theme colours; it reads the real ones.

Everything new is translated in all six languages.

1.6.3 A pile of items, quietly

Adding one item at a time is fine. Adding thirty is where a list app either helps or gets in the way. This release is the second pass on adding in bulk — and a small change to what “Not here” means that turns out to matter more than its size.

The staging list is the feature

Items you’re adding now wait in a list you can actually work with. Rows come in two densities: full, or compact enough to see the whole pile at once — where each item’s kind is carried by the shape of its mark, so a glance still tells you what’s what. One tap on the chevron collapses the source area and lets the list fill the screen.

The name of an item is now the door to its full form. There’s no separate button for it — one less thing on every row.

Nothing you’ve staged can be lost by accident. Cancelling with work in progress asks first, and a mis-tap can’t discard the pile.

Scanning stages as you tap

Point the camera at a handwritten list and tap the words you want. Each tap is a row, immediately — no confirm step, no bouncing back and forth. The camera stays live, and a mis-tap is just a row you swipe away.

Items that arrive from a scan stay quiet until you buy them the first time. Hand-picked items don’t. The difference is stated plainly before anything is added, in whichever direction it falls.

Categories that look like themselves

Category editing got a calmer form and a real icon picker: 152 curated icons, searchable, with a suggested set first.

A category name you typed is now marked as yours. Aeyo’s own tidying pass will never rewrite it — a name that changed back on its own was a real bug, and this is its root fix.

”Not here” sets an item loose

Items without a store don’t belong to any aisle. While you shop, an empty aisle offers to pull them into this trip for a week, and buying one makes that store stick.

What changed: an item already pulled into one store no longer gets taken by the next store you walk into. It stays where it is until the week runs out — or until you tap Not here, which sets it loose again so the next aisle you shop can pick it up. Previously that tap sent it back to the start; now it hands it forward. Moving an item on is something you do deliberately, rather than something that happens to it.

Items arrive knowing more

Items added in bulk now resolve their store the same way Magic Search always has — by title, against the shared catalog. Suggested staples used to arrive blank while the identical title typed into Magic Search arrived filled. They now take the same path.

Everything new is translated in all six languages.

1.6.2 Shared carts, honest about time

A correctness release. When a cart is shared between people and devices, the story of when things happened has to survive the retelling — offline stretches, reconnects, a phone re-announcing old news. This release makes that story truthful end to end. Most of it you’ll notice as things that stop happening.

Purchases, on the record

Every item’s detail sheet now has a Purchases list — each recorded purchase with its date, quantity, and store, newest first. This is the raw evidence behind every date Aeyo suggests, in plain sight.

Checked off stays checked off

A recurring item checked off in a shared cart could reappear the next morning reading “overdue yesterday” — and drift a day worse each day. The cause ran deep: an old “due” date could outlive the purchase that satisfied it, and come back with every reconnect. Purchases now carry their own timestamps everywhere they travel, so every device reaches the same conclusion: bought is bought. Cards stuck this way from earlier builds clear on their own.

No phantom guesses

A device repeating old news could mint purchases that never happened, which taught Aeyo rhythms that didn’t exist — items you bought once guessing ”~ yesterday”. A purchase now states when it actually happened, no matter when or how often it’s re-told, so a guess can only come from real repetition.

A shared cart arrives organized

Join a cart and its items now land carrying the sharer’s category and store labels — used once to fill in your blanks, never overwriting your own organization. What used to be a pile to sort is a list that’s already sorted.

Rhythms travel too

A joined cart also warms up its sense of timing from the cart’s recent history — including items with names Aeyo has never seen. Quiet items arrive quiet, instead of all guessing “maybe today”.

Everything new is translated in all six languages.

1.6.1 Two questions, and a mode with no clock

Aeyo has two dials — Presence, how much it shows up, and Mind, how much it manages on its own. This release lets you set both by answering two questions, and adds a mode for people who want no schedule at all.

Two questions

Settings opens with a small card: how should dates treat you, and whose job is the list? Answer both and the dials are set to match — delegators get a quieter, more self-managing Aeyo; owners keep every decision. The full dials stay one tap away, and the card never returns once you’ve answered or dismissed it.

Timeless

A fourth Presence stop, at the calm end. No arrival pings, softer colors, and nothing is ever overdue — a missed date rolls forward on the item’s own rhythm instead of counting up in red. For lists that should be ready when you are, not the other way around.

Hunches, always on

The on/off switch for hunches is gone. Aeyo’s soft guesses about occasional items simply appear — always tentative, always cheap to wave off — and skipping one keeps that item quiet until its evidence actually changes.

Sharing, sturdier again

A change made in the first seconds after launching the app — a check-off, an edit — could fail to reach the other person on a shared cart. Fixed, and any divergence left behind by earlier builds heals itself on the next connection.

Away and back

Come back from a couple of weeks away and the pile that fell behind moves forward together — each item to its own next date, never all onto today.

Everything new is translated in all six languages.

1.6.0 Add your usuals

Starting a list one item at a time is the slowest part of any list app. This release removes that step.

A whole list at once

  • Type or paste several items together — each arrives already carrying its category and a rough rhythm.
  • Point the camera at a handwritten list and Aeyo reads it, splitting items apart even when they share a line.
  • Suggested staples skip anything you already keep — no duplicates.
  • Items added in bulk stay quiet until the first time you actually buy them. No guessing before there’s history to guess from.

Items that belong nowhere yet

Some things aren’t tied to one store. Items without a store now live in Anywhere: while you shop, an empty aisle offers to pull them into this trip for a week. Buying one makes the store stick; Not here sends it back to Anywhere.

A calmer occasional lifecycle

  • Occasional items in a cart gather into one group instead of scattering across sections.
  • A guessed date always reads tentative — a ”~”, a “Maybe” — never a firm Today.
  • A Today button on every date picker sets the date in one tap.

In the store

Items you check off, snooze, or mark “not here” gather in a Recent Items tray you can revisit within the same trip — and the store-arrival notification now counts exactly what the list shows.

1.5.2 Sharing that holds

Sharing arrived in 1.5.0. This release makes it dependable. The sync layer underneath shared carts was rebuilt, and the goal was deliberately boring: check-offs shouldn’t get lost, deletes should stay deleted, and joining should just work — even over a bad connection.

Shared carts that don’t lose your place

Two people, two phones, patchy signal — the hard case for any shared list. This release is about that case.

  • Check items off with no signal, mid-aisle, and they reach everyone the moment you’re back online. None dropped.
  • A deleted item stays deleted. It won’t quietly reappear on someone else’s phone later.
  • Join a cart and its recurring items arrive with sensible dates, already in Up Next — no vanishing until you first buy them.
  • There’s now a Join a cart entrance on the New Cart form, alongside link and QR.

Check marks that tell the truth

  • The “who checked this” mark shows only where someone actually checked something — never on your own taps, never on an item nobody touched.
  • On the lock screen, an unchecked item never shows as checked, and an item your partner adds mid-trip arrives unchecked.

Honest dates on a guess

  • When Aeyo is only guessing an occasional item’s timing, it shows a tentative date — a ”~”, a “Maybe” — never a firm “Today” it can’t stand behind.
  • Need something sooner? Searching surfaces a Need now action on a guessed item that brings it to today.
  • Category suggestions now arrive as one stack you clear in a single sitting, instead of in batches of three.

A calmer return

Come back after days away and the first screen is already settled — no pile of overdue items rearranging themselves while you watch.

1.5.1 A delete you can take back

A small release. The one thing you’ll see is a safety net under deleting; the rest is language — making what Aeyo already does read more honestly.

A delete you can take back

Deleting was the one action with no way back. Now it waits.

  • Removing an item no longer commits right away. It leaves the list, and a quiet Item deleted · Undo bar stays for a few seconds.
  • Tap Undo and the item returns. Let the bar fade and it’s gone for real.
  • Delete a few things in a row and the undo still brings them all back.

Words that match what Aeyo does

  • Membership reads plainly now: Aeyo is free to use, and Premium only lifts limits — no more than that.
  • The Overdue setting says what it actually does, and the shared-cart disclosure is clearer that the cart is shared while the learning stays on your device.
1.5.0 Aeyo asks for less

Aeyo asks you to set up less and carries more of the work itself. Frequency is rebuilt around that idea; carts, sharing, and settings follow from it.

Aeyo expects nothing about frequency

Telling a list how often you buy something was friction. It’s gone.

  • Every new item starts occasional. Nothing to choose.
  • Aeyo learns its purchase pattern from the first day and surfaces it — exactly the way a recurring item surfaces — when it’s likely needed again.
  • When a steady rhythm appears, Aeyo promotes the item to recurring. When the rhythm breaks, it demotes it back. On its own.
  • You set a frequency by hand only when you already know it. Short of that, Aeyo expects nothing from you.

Carts carry less

Because items now learn their own timing, the cart no longer has to supply it.

  • A cart no longer holds a frequency or a due date for the things inside it.
  • It keeps one optional finish date — for a one-time project that should clear itself once it’s done.

A cart you can share

Carts can now be shared with the people you shop with, built from scratch.

  • Check-offs sync in real time.
  • The cart is shared; the learning isn’t. Aeyo learns each person’s rhythm on their own device, separately.
  • Join by link or QR code, set a profile on your device, and manage who’s in the cart.

A slider before the detail

Aeyo learns thoroughly, and it exposes nearly every parameter to tune — transparency and control for the people who want them. It’s also built to stay simple, for the people who don’t. Those two pulls used to fight.

  • Before any detail screen sit two sliders: how present Aeyo is (Presence), and how much it manages your lists on its own (Mind).
  • Every underlying control is still there, one layer down. The slider moves them together; you can still move them one at a time.