# Photo makeovers for cafes
Four systems that find restaurants and cafes whose food is fine and whose pictures are not, rebuild the thing letting them down, and send it to the owner. Everything here works anywhere in the world and every prompt is written out in full.
https://www.everestchris.com/guides/restaurants-and-cafes

## prompt 01 · step 2 · Pick the cafes worth working on

Any cheap text model. Paste the Places result in at the bottom.

You are screening cafes and restaurants for a service that rebuilds the pictures on their Google listing. You will be given one place record from the Google Places API. Decide whether this business is worth building something for.

Apply these rules in order and stop at the first one that fails:

1. REJECT if rating is below 4.5.
   Reason: "the food is the problem, and i cannot fix that".
2. REJECT if userRatingCount is above {{MAX_REVIEWS}} (start at 150).
   Reason: "already established, they do not need me".
3. REJECT if userRatingCount is below 5.
   Reason: "too new or too quiet to tell whether it is any good".
4. REJECT if the name contains any sign of a chain: Ltd followed by a number, a branch name in brackets, or a word that also appears in a national brand. When unsure, keep it and flag it.
   Reason: "chain, there is a head office and no reachable decision maker".

If nothing rejects it, ACCEPT, and then work out which of the four systems this business needs most. Set each flag independently, because a business can need several:

- needs_dish_work: true if any photo on the listing is food.
- needs_review_push: true if userRatingCount is under 150. This is almost always true and it is the easiest thing to sell, so say so.
- needs_photo_set: true if the photos array has fewer than 10 entries.
- needs_menu: true if websiteUri is missing entirely.

Then pick ONE to lead with, in this priority order, and put it in lead_with:
review_push first, then dish, then photo_set, then menu. Lead with the review gap because it is the cheapest thing for them to say yes to.

Return ONLY this JSON object and nothing else. No explanation, no code fences.

{
  "decision": "accept" | "reject",
  "reason": "one short lowercase sentence",
  "rating": number,
  "review_count": number,
  "photo_count": number,
  "needs_dish_work": boolean,
  "needs_review_push": boolean,
  "needs_photo_set": boolean,
  "needs_menu": boolean,
  "lead_with": "review_push" | "dish" | "photo_set" | "menu",
  "one_line_for_the_owner": "one plain sentence, lowercase, stating the single most useful fact about their listing. no adjectives, no flattery, no pitch."
}

Never invent a number. Every figure must come from the record you were given.

Here is the place:

{{PLACE_JSON}}

## prompt 02 · step 5 · Relight one dish

gemini-3-pro-image or gpt-image-2. Send their real photo with it.

Relight and reshoot this real photograph of {{DISH_NAME}} so it looks like it was taken by a food photographer, while keeping it recognisably the same plate of the same food.

Keep every item on the plate exactly as it is and in the same arrangement. Do not add, remove, restyle or rearrange any food. Do not change the crockery, the cutlery or the table. Do not add garnish, herbs, sauce, steam, or props of any kind. If something looks slightly untidy on the plate, leave it untidy.

What you may change is only this: the light, the camera position and the crop.

Move to a soft directional light coming from one side with a gentle falloff, so the food has shape and the shadows are soft rather than the flat overhead glare in the original. Bring the camera lower and closer so the plate fills more of the frame. Let the background fall softly out of focus. Straighten the horizon. Keep the colours natural and true to the actual food, and do not increase saturation.

The result must look like an honest photograph of this exact dish on a better day, taken by someone who knew what they were doing. It must not look like a stock image or an advert.

No text, no logos, no borders, no watermarks.

## prompt 03 · step 5 · Relight the shopfront or the room

Same models, their real photo

Relight and reshoot this real photograph of {{PLACE_NAME}}, a small independent cafe at {{ADDRESS}}, so it looks like it was taken by a professional, while keeping it unmistakably the same place.

Keep the building, the shopfront, the signage, the windows, the door, the furniture, the fittings and the neighbouring shops exactly where they are and exactly as they look. Do not restyle the place, do not change or clean up the sign, do not add plants, furniture, people or lighting that are not already in the photograph, and do not remove the neighbouring buildings.

What you may change is only this: the light, the framing and the tidiness of the ground.

Move it to warm late afternoon light coming along the street, so the front catches the sun and there are long soft shadows, instead of flat overcast grey. Straighten the verticals and level the horizon. Crop tighter so the building fills the frame and empty road or empty ceiling is reduced. Lift the shadows so any dark signage reads clearly. Remove litter from the pavement.

Keep it photographic and honest, like a good local press photograph. Someone who has been to this place must recognise it instantly.

No text changes, no added logos, no watermarks.

## prompt 04 · step 5 · Rebuild the menu

Send the photo of their board or their menu

Read the menu in this photograph and set the SAME menu as a clean, modern, printed menu page on a warm off-white background, photographed flat from directly above with soft even light.

Transcribe every single item and every single price exactly as they appear. Do not invent items, do not drop items, do not round or alter any price, do not reword anything, and do not correct spelling or capitalisation. If a word is genuinely unreadable in the photograph, write it as XXXX rather than guessing, so that a human can find it and fix it.

Keep the same sections in the same order with the same headings, and keep each item under the heading it appears under in the original.

Set the section headings in a clean contemporary serif and the items in a simple sans serif, with generous line spacing and prices right aligned in a neat column. Plenty of white space, and a narrow rule under each section heading. No decoration, no icons, no photographs, no logo, no border.

It should look like a well made independent cafe menu: calm, readable and plain. Nothing else in the frame.

## prompt 05 · step 8 · Write the message

Any text model

Write the message that goes with a rebuilt picture being sent to the owner of a specific cafe. The picture does the selling. Your job is the few lines around it.

Facts you may use, and you may not use anything else:
- cafe name: {{PLACE_NAME}}
- what you rebuilt: {{WHAT}}
- their rating: {{RATING}} from {{REVIEW_COUNT}} reviews
- number of photos on their listing: {{PHOTO_COUNT}}
- the channel: {{CHANNEL}}, either instagram dm or email

Rules:
- Under 55 words.
- All lowercase is fine and preferred. Everyday words, the way one person messages another.
- No em dashes. Use full stops and commas.
- Open by saying what the attached picture is and that it is their own photo. Do not open with a greeting formula, a compliment about the food, or "I came across your page".
- State one real number about their listing, once. Never more than one.
- Say plainly that it is free and that they can use it whether or not they reply. Mean it.
- Do not offer a call, a meeting, a strategy session, an audit, or a package.
- End with one easy question that can be answered in one word.
- Never use: unlock, elevate, transform, boost, level up, game changer, passionate, curated, hidden gem, I hope this finds you well, quick question, just following up.
- Do not claim you have eaten there, do not claim to be local unless you are, and do not imply you already know them.

Return only the message text.

## prompt 06 · Set up the database

Paste into Claude Code, Cursor, or any AI coding tool, in your project folder

Set up Supabase for this project using the Supabase CLI, and write the SQL migration for me.

First, if it is not already set up: install the CLI, run `supabase init`, then `supabase link` to my project, and tell me exactly what to paste when it asks for my project ref and database password.

Then create a migration with three tables. Use uuid primary keys with gen_random_uuid() as the default, and give every table a created_at that defaults to now().

TABLE 1, places. One row per cafe or restaurant I am considering.
  - owner_id, text, not null. This is my Clerk user id.
  - place_id, text, unique, not null. The Google Places id.
  - name, text, not null. address, text, not null.
  - website, text, nullable. Null means they have no site, which is a qualifier in itself.
  - rating, numeric. review_count, int. photo_count, int.
  - needs_dish_work, needs_review_push, needs_photo_set, needs_menu, all boolean.
  - lead_with, text. One of 'review_push', 'dish', 'photo_set', 'menu'.
  - raw, jsonb. The entire Places response, kept as is.
  - status, text, not null, default 'new'.

TABLE 2, assets. One row per thing I rebuild for a place.
  - place_id_fk, references places, and delete it if the place is deleted.
  - kind, text. One of 'dish', 'storefront', 'room', 'menu', 'tapcard'.
  - before_url and after_url, text. Where the two pictures live in storage.
  - body, text. The message that goes with it.
  - model, text, and prompt, text. Which image model made it and the exact prompt used.
  - proofread, boolean, not null, default false. For menus this must be true before it can be approved, because menu transcription errors are the one mistake that costs a real business money.
  - status, text, not null, default 'pending'. Only 'pending', 'approved' or 'rejected'.

TABLE 3, sends. One row every single time something goes out. Never updated, only inserted.
  - asset_id, references assets, and delete it if the asset is deleted.
  - channel, text. One of 'instagram', 'email', 'walk_in'.
  - to_handle, text, not null. status, text, not null, default 'queued'.
  - sent_at, timestamptz, nullable.

Now the security. Turn on row level security on all three tables, then write policies so I can only ever see and change my own rows. places has owner_id on it directly, so compare that against the Clerk user id, which Supabase exposes as auth.jwt() ->> 'sub'. assets and sends have no owner column of their own, so their policies have to join back up to places to work out who the row belongs to.

Add one more thing: a check constraint or a trigger so that an asset of kind 'menu' cannot be set to status 'approved' while proofread is still false. I want the database to stop me sending an unchecked menu, not my own memory.

Also create a private storage bucket called 'assets' for the pictures, with a policy that only lets me read files inside a folder named after my own user id.

Finally, add the indexes that matter: I will be listing places by owner and status, sorting them by review_count ascending, and looking up assets that are still pending.

Explain in plain English what each policy does before you write it, run the migration with `supabase db push`, then show me one test query proving a second user cannot read my rows.
