Beta

Where is early software. Everything on this page works, but it has not yet been through much use by many people, so expect rough edges and keep a copy of your data folder. Problems are welcome on the issue tracker.

Which cupboard was that in?

Where is a small app for your own server that answers one question. Take a photograph, type what the thing is, choose the place it lives, and stop digging through the storage box. Searching gives you the plain answer: USB-C cable — Tray 14.

Free under the GPL. No account, no cloud, nothing to pay.

A search for the word usb in Where, returning two results. Each names the item and the place on one line, USB-C cable dash Tray 14, with a short description underneath saying black, right-angle plug, about a metre, and white, flat braided, very short.
The whole point. Search a word, get the thing and where it is.

The description writes itself

Most homes hold a dozen near-identical things. Typing “USB-C cable” fifteen times tells you nothing later. So you type the name and the photograph supplies the difference: black, right-angle plug, about a metre.

That is done by a vision model running on your own server through Ollama, not by a cloud service. The item saves the moment you press the button and the description fills in when it is ready, so a slow model never makes you wait. If the model is switched off the item still saves perfectly well, and you can ask for the description later or write your own. Anything it writes can be edited, and an edit you make is never overwritten.

The add item form in Where on a phone. A large dashed box invites you to take a photo, with fields underneath for the name, the place and an optional note, and a full width Save button.
The add lots from one photo screen in Where. It explains that you photograph a whole tray, the app lists what it can see, and you tick what to keep before it all goes into one place.

A whole tray in one photograph

Entering things one at a time is why cataloguing never gets finished. Photograph the whole tray instead. The model reads the picture and comes back with a list of what it can see. You untick the mistakes, correct the names, add anything it missed, and everything goes into that place at once.

How well this works depends on the model you give it. Moondream, the small default, is good at describing one item and weaker at listing a crowded tray. One line in the settings file swaps it for a larger model if your server has the memory.

Stick a label on it

Every place gets a QR code. Point your phone at one and that place opens with everything in it. Print one at a time, or tick several and get a single sheet.

A print sheet of QR labels in Where. Each label pairs a QR code with the place name in large bold text: Cupboard 1, Cupboard 2, Storage box, Top shelf, Tray 12, Tray 13.
Sized for 30 × 20 mm thermal labels, the common roll size. The name shrinks to fit rather than breaking a word in half.

Made for standing in front of a shelf

You will use this holding a phone in one hand. Add it to the home screen and it opens like an app: dark by default, big tap targets, and the camera one press away. It works just as well on a desktop, where the camera button becomes a file picker.

The Where home screen listing places: Cupboard 1, Cupboard 2, Storage box, Top shelf, Tray 12, Tray 13, Tray 14 and Under the bed, each with a count of how many items are in it.
Places are a flat list. No folders inside folders.
The Tray 14 page in Where, listing an HDMI cable and two USB-C cables with their descriptions, a collapsed section for items marked gone, and buttons to add an item or add lots from one photo.
Open a place and see what is in it.
The scan screen in Where, showing a camera viewfinder with a yellow frame and the instruction to point the camera at a place label.
Scan a label to open its place.

Two things, and only two

Most home inventory apps ask what something cost, when you bought it and which category it belongs to. Then adding one item takes two minutes and you stop. Where holds a place and an item, and nothing else.

  • A place is a name. Cupboard 1, Top shelf, Storage box, Tray 14. No rooms, no nesting, no hierarchy to maintain.
  • An item is a photograph, a name and a place. Plus a description you did not have to write, and a note for things that wander, like “usually on the desk”.
  • Used up or thrown out becomes one switch. The item drops out of lists and searches but is kept, so the record stays honest instead of quietly wrong.
  • No value, purchase date, supplier, receipt, warranty or quantity. This is not an insurance record and it will not become one.
  • No categories and no tags. Search reads the name, the description and the note, which is what you would have typed into a tag anyway.
  • No accounts and no users. One household, one list, reached over your own network.

Photographs of your home stay in your home

The whole point of describing pictures locally is that pictures of your cupboards are nobody else's business.

  • The vision model runs on your server. Ollama starts alongside the app in the same compose file. Point it at another machine on your network if you would rather.
  • No cloud service of any kind. No OpenAI, no Anthropic, no Google. There is no key to paste in because there is nothing to call.
  • No analytics, no telemetry, no third-party scripts, in the app or on this page. Nothing on this site is loaded from anywhere else.
  • No cookies. Whether you chose light or dark is remembered by your own browser and never sent to the server.
  • One folder to back up. A single database file and a folder of photographs, both on a path you chose, both readable without the app running.
  • Nothing is exposed to the internet. There is no sign-in page because it is not meant to face outwards. Reach it over your own network, or something like Tailscale.

Running in about five minutes

You need Docker. Nothing else, and no accounts anywhere. The vision model downloads itself the first time it is needed, which is about 1.7 GB for the default.

  1. Make the folders

    Where runs as a normal user inside the container, user ID 1000, so the data folder on the host has to belong to that same ID or the app cannot write to it.

    sudo mkdir -p /opt/where/data /opt/where/ollama
    sudo chown -R 1000:1000 /opt/where/data
  2. Write the settings file

    Save this as .env next to the compose file. Everything you might want to change lives here, so you never have to edit the compose file itself.

    WHERE_PORT=4150
    WHERE_DATA=/opt/where
    OLLAMA_HOST=http://ollama:11434
    OLLAMA_MODEL=moondream
    WHERE_PUBLIC_URL=
    TZ=Europe/London
  3. Start it

    Save this as docker-compose.yml and bring it up. The second container is Ollama, which does the picture reading.

    services:
      where:
        image: ghcr.io/lightmorphic/where:latest
        container_name: where
        restart: unless-stopped
        ports:
          - "${WHERE_PORT:-4150}:8080"
        volumes:
          - ${WHERE_DATA:-/opt/where}/data:/data
        environment:
          OLLAMA_HOST: ${OLLAMA_HOST:-http://ollama:11434}
          OLLAMA_MODEL: ${OLLAMA_MODEL:-moondream}
          WHERE_PUBLIC_URL: ${WHERE_PUBLIC_URL:-}
          TZ: ${TZ:-Europe/London}
        depends_on:
          - ollama
    
      ollama:
        image: ollama/ollama:latest
        container_name: where-ollama
        restart: unless-stopped
        volumes:
          - ${WHERE_DATA:-/opt/where}/ollama:/root/.ollama
        environment:
          OLLAMA_KEEP_ALIVE: "10m"
    docker compose up -d
  4. Name your first place, add your first thing

    Open it on port 4150. Add a place, press Add item here, take a photograph and type what it is. The front page tells you whether the vision model is ready; the first description takes longer while the model downloads.

  5. Reach it from your phone over https

    Browsers only allow camera access on a secure address. Something like Tailscale Serve gives you one without opening anything to the internet. On plain http you can still choose a photograph from the gallery, but live QR scanning will not start.

What it deliberately does not do

Worth knowing before you spend those five minutes.

  • It is not an inventory system. No prices, no purchase dates, no receipts, no insurance fields. If you need those, this is the wrong tool.
  • It does not look things up online. No barcode scanning against a retail database. The photograph and your own words are the record.
  • There is no sign-in. Anyone who can reach the address can use it, which is why it belongs on a private network and not on the open internet.
  • It does not track lending. No record of who borrowed what. It tells you where a thing lives, not where it went.
  • It is not hosted for you. There is no signup page and no service to join. You run it yourself or you do not run it.

Questions people ask

Is Where finished?
No. It is in beta. Everything on this page works, but it is early software that has not yet been used for long by many people. Expect rough edges, and keep a copy of your data folder.
Does Where send my photographs anywhere?
No. Photographs are stored in a folder on your own server and described by Ollama, which also runs on your server. Nothing is sent to a cloud service and there is no account to make.
What happens if the vision model is switched off?
Items still save immediately. Only the automatic description is missing, and you can type one yourself or ask for it again later. Saving never waits for the model.
Which model should I use?
Moondream is the default because it is small, quick and runs without a graphics card. It writes a good short description of a single item. It is weaker at listing everything in a tray photograph, so if that part disappoints, set OLLAMA_MODEL=minicpm-v in your settings file and restart. The new model downloads itself.
What hardware does it need?
The app itself is tiny. The vision model is the demanding part. Moondream uses about two and a half gigabytes of memory and needs no graphics card. On a modest processor a description takes a minute or two, which is exactly why the app never makes you wait for one.
What size are the QR labels?
30 by 20 millimetres, a common thermal label roll size, the sort sold for Amazon FBA. Each label is one page, so set the printer to that paper size with no margins. You can print a single label or tick several places and get one sheet.
Can I use it on my phone?
Yes, that is the main way. Add it to your home screen and it opens like an app. The camera opens straight from the add form, and scanning a place label opens that place. Camera access needs the app to be reached over https.
Where is my data kept?
In one folder on your own server: a single SQLite database and a folder of photographs. Copy that folder and you have everything. The downloaded model sits in a separate folder and can always be fetched again.
What does it cost?
Nothing. It is released under the GNU General Public Licence version 3, so you can run it, read it and change it. There is no paid tier and no hosted version to buy.
How do I update it?
Run docker compose pull, then docker compose down and docker compose up -d. A plain up -d will not fetch a newer image on its own.
What is it built with?
Python and Flask, with SQLite for storage and plain CSS for the interface. No JavaScript framework and no build step. It is small enough to read in an evening.