Search
By Meaning

Tagona is a database that selects objects of any type by the facts inside them. Store 10,000 documents, images, video, or audio and query by whatever matters — api + auth + example , Ford + SUV + no scratches , refund + angry . Tagona evaluates those properties with AI as the query runs, and caches the labels forever.


The more you ask, the faster it answers.

MIT·self-hosted·docker compose up·no API key required· MIT·self-hosted·docker compose up·no API key required· MIT·self-hosted·docker compose up·no API key required· MIT·self-hosted·docker compose up·no API key required·
01

How it works

No embeddings. No guessing in vector space. Tagona indexes itself from the questions you actually ask.

put

new, unlabeled objects

Insert
castle tower house tipi tent
T
search
Query
comfy:true fortified:false

AI labels the data until the query's required amount is fulfilled

Index
comfyfortified
tower ✗✓
house ✓✗
tipi ✗✗

labels stay

Fetch
house — the only match
objects retrieved
Read the docs
02

Example

The same flow as the diagram above — create a collection, upload objects, query by tags — in three tabs.

from tagona import Client

client = Client("http://localhost:8080")

# 1. Create a collection
client.create_collection("structures", data_type="png")

# 2. Upload objects — raw bytes, no labels attached
for name in ("tower.png", "house.png", "tipi.png"):
    client.upload("structures", name, data_type="png")

# 3. Query by tags that were never defined
results = client.query("structures", tags={"comfy": True, "fortified": False}, limit=5)

# 4. Read a matched object
house = results.objects[0]
print(client.get_data("structures", house.id))
# A cozy house with a steep roof, big windows, and a warm fireplace.
# 1. Create a collection
curl -s -X POST http://localhost:8080/v1/collections \
  -H "Content-Type: application/json" \
  -d '{"name":"structures","data_type":"png"}'

# 2. Upload objects — raw bytes, no labels attached
curl -s -X POST "http://localhost:8080/v1/collections/structures/objects?data_type=png" \
  -H "Content-Type: image/png" \
  --data-binary @tower.png
# (same for: house.png and tipi.png)

# 3. Query by tags that were never defined
curl -s -X POST "http://localhost:8080/v1/collections/structures/objects/query" \
  -H "Content-Type: application/json" \
  -d '{"tags":{"comfy":true,"fortified":false},"limit":5}'
# → {"objects":[{ ...the house... }]}
tagona--url http://localhost:8080 create-collection --name structures --data-type png

tagona --url http://localhost:8080 upload --collection structures --data-type png --file tower.png
tagona --url http://localhost:8080 upload --collection structures --data-type png --file house.png
tagona --url http://localhost:8080 upload --collection structures --data-type png --file tipi.png

tagona --url http://localhost:8080 query --collection structures --tag comfy=true --tag fortified=false --limit 5
# (--tag with no =value defaults to true)
Read the docs

Find
By Asking

Tagona Advanced edition offers you a smart layer over the Classic edition that reads your direct question, reviews the tags that are already present in the system, and translates your query into the set of labels.


Get what you need, let robot decide.

01

How it works

Same engine underneath — you just stop speaking in tags. Ask in plain words; the smart layer reuses the labels it knows and coins the ones it needs.

ask
Query

“What home is comfy and has windows?”

smart layer over the classic engine

Translate
comfy windowsnew

reuses existing “comfy”, coins “windows”

AI labels the data until the query's required amount is fulfilled

Index
comfyfortifiedwindows
tower ✗✓✗
house ✓✗✓
tipi ✗✗✗

labels stay

Fetch
house — the only match
objects retrieved
Read the docs
02

Example

One call. Ask in plain language — the smart layer resolves the tags, then the classic engine takes over.

from tagona import Client

client = Client("http://localhost:8080")

# Ask in plain language — no tags to pick, nothing to translate yourself
results = client.query(
    "structures",
    ask="What home is comfy and has windows?",
    limit=5,
)

# The smart layer resolved your words to tags: comfy (existing) + windows (new)
print(results.tags)  # {"comfy": True, "windows": True}

home = results.objects[0]
print(client.get_data("structures", home.id))
# A cozy house with thick stone walls and a steep roof that shrugs off storms.
# Ask in plain language — the smart layer translates it into tags
curl -s -X POST "http://localhost:8080/v1/collections/structures/objects/query" \
  -H "Content-Type: application/json" \
  -d '{"ask":"What home is comfy and has windows?","limit":5}'
# → {"tags":{"comfy":true,"windows":true},"objects":[{ ...the house... }]}
tagona --url http://localhost:8080 query --collection structures \
  --ask "What home is comfy and has windows?" --limit 5
# resolved tags: comfy (existing), windows (new)
Read the docs