Curltale AI

Support and documentation

The Curltale AI guide

How the platform works in detail: the ontology, the knowledge library, agents, governance and how to run it. This guide covers version 0.2.0, an open beta. The source, issues and releases are on GitHub.

Overview

Two halves, one bridge

Curltale AI keeps two kinds of knowledge apart because they are governed differently, and connects them because agents need both.

Who writes it

The ontology: your data team

A small group of modellers and publishers owns the meaning of the data. Changes go through a draft, a review and a publish.

Who writes it

The library: everyone who knows something

Editors add documents and interviews. A model drafts, another checks, and people review what is doubtful.

Nothing from a document ever enters the ontology. A topic can point at an entity, and that pointer is stored inside the collection that holds the document. If you cannot read the collection, you never see the link, and nothing in the model is left dangling.

Overview

The knowledge model

The ontology answers "what does this data mean and how do I query it". The knowledge base answers "what do we know, and where does it say so". Both are indexed for search; neither is copied into the other.

What Curltale AI holds on to. On the left, the ontology: entities and fields, definitions and filters, relationships, sensitivity, used by the query tools to run one checked, read-only statement on your data. On the right, the knowledge base: documents become verified source wikis, source wikis become topics by subject; claims with exact quotes prove the topics, and typed relationships connect them. A bridge links topics to the entities they are about. Every layer is chunked, embedded and searchable. THE ONTOLOGY · WHAT YOUR DATA MEANS THE KNOWLEDGE BASE · WHAT YOUR PEOPLE KNOW Entities and fields customer, order, contract, and the columns that hold them Definitions and filters what “active” or “unpaid” means, exactly Relationships how things join, and how far each link can be trusted Sensitivity restricted, personal, masked: enforced, not suggested Query tools one planned statement · checked · run read-only on your data Documents files, web pages, interviews Source wiki a verified page per document every version kept Topics pages by subject, written from the wikis Claims atomic facts with their exact quote Relationships governs, part of, replaces, depends on… Agent retrieval find by chunks · return whole pages · prove with quotes quoted prove THE BRIDGE: a topic points at the entities it is about (governs, about, instance of) Every layer is chunked, embedded and searchable original text · source wikis · topic pages · claims · topic identities · relationships · the model's definitions found by meaning and by words together, always inside the collections you may read
LayerWhat it isHow it is madeIndexed as
Original textThe text of a document, with its places (page, slide, sheet).Extracted and cut into passages that fit the embedding model. No AI needed.Passages: vectors and words
Source wikiA standalone page written from one document; every version is kept.A writer model drafts it, a checker verifies it claim by claim against the document (with the whole text or search tools), the writer corrects it; doubtful pages wait for a person.Every version chunked: vectors and words
TopicA page by subject, merged across every document about it, following the type's template.An analyzer decides which topics a verified wiki creates, updates or complements; the topic writer writes from the full wiki and can read other sources' wikis.Every version chunked; the topic itself embedded with its title, aliases, summary and claims
ClaimOne atomic fact of a topic with its exact quote.Extracted by the analyzer; kept only if the quote is word for word in the wiki. Records the wiki version and passage. Superseded, never deleted.Each claim embedded
RelationshipA typed link between topics (governs, part of, depends on…) with why they relate.Proposed by the analyzer with the collection's relation types; new types wait for the manager.Each link embedded with its context
BridgeA topic's link to a data-model entity (about, governs, instance of, uses).Suggested by the analyzer with a confidence; doubtful links wait for a person.Stored in the topic's collection
OntologyEntities, fields, definitions, filters, relationships, sensitivity, examples.Drafted, reviewed and published by the data team, versioned.Search index of the published version

Overview

Retrieval

Sixteen read-only tools: six for the data and ten for the documents. On the document side, chunks are how the system finds and whole pages are what it returns. Search everywhere combines meaning (vectors) and words (full text) by reciprocal rank, so exact codes and paraphrases are both found.

How a question is answered. A question from a person or an agent takes the data path, the knowledge path, or both. Data: understand the definitions and joins from the ontology, plan one statement, check and rebuild it under your access, run it read-only. Knowledge: find matching chunks of topic pages, read the whole pages and the linked topics, prove the facts with claims and quotes, and drill down into the source wiki if needed. The answer carries its definitions and its sources. A question from a person or an AI agent THE DATA PATH Understand definitions and joins from the ontology Plan one statement with the right filters Check and run rebuilt under your access, read-only THE KNOWLEDGE PATH Find matching chunks of topic pages Read whole pages and their linked topics Prove claims with quotes, the source wiki if needed An answer you can check numbers with their meaning, facts with their sources Both paths run under the same access rules. Most questions need one of them; the assistant decides, and uses both when a question needs both.
Document stepToolWhat the agent receives
Answer from the documentslibrary_contextPer collection: the full Markdown of the best topics with the section that matched (sources cited as [s1], [s2]... with one legend), the graph of linked topics, typed relationships that match the question, answerable and the size in tokens.
Discoverlibrary_searchTitles, summaries and the best matching chunk, without page bodies.
Provelibrary_topic_claims, library_topic_sourcesEach claim with its quote, source, wiki version and passage; the documents behind a topic and whether their wiki is still current.
Explorelibrary_topic, library_traverseOne page with its links and sources; the graph from one or more topics.
Drill downlibrary_source_search, library_sourceThe verified source wikis: searched across the collection, read whole, around a passage or searched inside; the original text on request.
Data stepToolWhat the agent receives
Know your accessget_accessWho the caller is, which sensitivity classes it may see, whether it may query data, and the SQL dialect. Whatever is not granted is absent from every answer.
Find in the modelsearchThe best matching entities, fields, calculated fields, filters, relationships and query examples for words or exact codes.
Look updescribeAnything by name: an entity with its fields, allowed values, filters, checks and examples, a field, a calculated field or filter, or a word only the documents know, with the related topics.
Connectjoin_pathThe best path between two entities with exact join conditions, how far each link can be trusted, an all-confirmed alternative and fan-out warnings; or every entity directly linked.
Planplan_queryEverything for one statement: tables, the useful columns with meaning and allowed values, the named filters the question matches, a runnable skeleton without fan-out, and the topics that concern these entities.
Runquery_dataRows of one read-only statement, after it is parsed, checked against the caller's entitlements and rebuilt; with notes on truncation, masked columns and ambiguous matches.

Only what is served is searched: the approved version of a source wiki and the published version of an active topic. A held change is invisible to agents until a person approves it. Every result names its collection and carries its usage tag.

Ontology

What the model holds

Only the structured meaning of your data. Everything an agent or a person needs to build a correct query is one of these.

ConceptWhat it is
EntitiesThe business things: a customer, an order, a contract. Each has a business name, domain, kind (master, reference, transaction, fact...), a definition, the table that holds it, its keys, synonyms and the things it is often confused with, and example questions.
FieldsColumns, and calculated fields that are computed from the data. Each has a meaning, a type, a role, allowed values with labels, a sensitivity class, an agent-access level and a review status that tells agents how settled the definition is.
RelationshipsHow entities connect: the verb, the exact join, the cardinality, and how far the link can be trusted (confirmed, optional or unreliable). Join planning prefers reliable links and warns when a path would fan out.
FiltersWords turned into conditions. Open order is closed_at IS NULL, with synonyms and a status that says whether the team agreed it. Agents receive filters pre-filled instead of guessing values.
ChecksData-quality rules in plain words, optionally with SQL that counts violations. The model check runs them.
Query examplesWorked queries with parameters. Each is run on real rows by the model check, and agents get the ones that apply to their question as patterns.
Custom propertiesAnything else you track, such as an owner, a source system or a ticket number. It is kept, shown, searchable and given to agents.

SQL in the model is written once in PostgreSQL syntax and translated for whichever database is connected.

The entity graph of the fictional sample model
The entity graph of the fictional sample model.

Ontology

Draft, review, publish

The model is versioned like code. Agents only ever see the published version.

  1. Start a draft. A copy of the published version, or a new one from a spreadsheet or a connector.
  2. Edit. In the app, by uploading Excel, or by generating from a database. Every change is written to the audit log with who and when.
  3. Validate. References resolve, required properties exist, values come from allowed lists, restricted fields have no agent access. SQL that does not run on the connected database is advice, never a blocker.
  4. Review. Compare the draft with the published version, item by item.
  5. Publish. The search index is built and embedded in the background, and only then does the draft become the published version. If it fails, the draft stays a draft.

An optional four-eyes rule means whoever changed a draft cannot publish it. After a publish, the instructions agents receive are rebuilt and every tool reads the new version.

Ontology

Start from a file or a database

A spreadsheet

Excel round trip

A template with a sheet per concept, required columns marked, dropdowns for closed lists. The file is checked before anything is created, with every problem reported by sheet, row and column. Any extra column becomes a custom property. Export and re-import lose nothing.

A database

Connectors

PostgreSQL, MySQL, MariaDB, ClickHouse, SQLite and DuckDB, read-only, with timeouts and row limits. Read the structure and generate a first draft: entities from tables, fields from columns, relationships from keys, and sensitivity guessed from column names on the safe side.

Everything generated is marked needs review. It is a starting point to which your team adds meaning, filters and calculated fields.

Ontology

Search and model check

Search

Meaning, words and exact codes

Every entity, field, relationship, filter, check and example is a chunk of text. Three rankings are merged: vector similarity, keyword search and exact-code matching. The embedding model runs inside the container, so no key is needed.

Model check

The model against the real data

Do the columns exist, do the joins hold, do the quality rules pass, do the examples return rows? Every result carries the SQL that produced it and shows counts and statuses, never values.

No data yet? Build a demo database generated from your published model, with keys, links and allowed values respected, to try everything before connecting the real one.

Knowledge

Collections

A collection is the unit of isolation. Its documents, passages, topics, statements, links, vocabulary and jobs belong to it alone, and nothing is ever combined across collections.

Usage tag

Public or internal

Public may be shared with customers. Internal is for the agent's own understanding and must not be quoted. The tag travels with every result, every tool description and the server instructions. It is guidance, and the grants below decide access.

Grants

Read, write, manage

Per user or per API token. Read searches and reads. Write ingests, edits and approves. Manage grants access, changes settings and exports. Writing also needs the editor role, and tokens only ever read.

Hidden by default

No grant, no trace

A collection you hold nothing on does not exist for you. Admins see that it exists so they can fix access, and can read content only after a logged self-grant.

Switch

Documents may be sent to the AI model

Turn it off and the collection is still stored and searchable by words and meaning, with the embedding done locally, but no model ever sees it.

Switch

Agents may read this collection

Turn it off and Alfred and MCP clients are kept away from the collection entirely, whatever the grants say.

Collections with their usage tag and access list
Collections with their usage tag and access list.

Knowledge

Add documents

Files

Most formats

PDF, Word, PowerPoint, Excel, CSV, HTML, Markdown, text, JSON, XML and images. Scanned pages are read by a vision model. The same bytes cannot be added twice to a collection.

Web pages

Captured safely

Public addresses only, with the resolved address pinned, every redirect re-checked and private networks refused. Refresh captures again, and only changed content is read again. An optional isolated browser handles pages built by JavaScript.

Interviews

Ask the expert

When the knowledge is not written down, an interviewer model asks questions one at a time and keeps the facts it hears. See Interviews.

Places are kept so passages can be cited: page 3, slide 2, sheet "Costs". Web pages lose their menus, footers and cookie banners, and spreadsheets are read row by row with their column names.

Knowledge

From document to topic

Each source goes through the same pipeline. Models see only the one document of the job, with tools filtered to its collection.

  1. Read and splitText is extracted with its places (page, slide, sheet), cut into passages, embedded and indexed. No AI model needed.
  2. Write the source wikiA writer model drafts a standalone page that keeps every fact, number and exception. Every version is chunked and embedded.
  3. Verify itA second model verifies the page claim by claim against the document. A failure that names no problem is re-checked, never amended blindly.
  4. CorrectReal problems go back to the writer with the evidence, up to a set number of rounds.
  5. Approve or holdA page that passes is approved. One that still has objections waits for a person.
  6. Build topicsAn analyzer finds the subjects and extracts atomic claims, each with a quote that must appear word for word in the wiki. The topic writer writes each page from the full verified wiki and can read other sources' wikis.
  7. Link to the modelTopics are linked to the entities they are about, with a confidence. Doubtful links wait.

A different model can do each job (writer, checker, analyzer, topic writer, interviewer, image reader), or one model can do all of them. If the topic writer fails, a plain page is built from the candidate so nothing is lost. A claim found again in another source attaches to the existing one, so numbers stay stable. A topic a source no longer mentions gets a surgical rewrite that removes only what no remaining source supports.

A source: its verified source wiki, and the checks made on it
A source: its verified source wiki, and the checks made on it.

Knowledge

Review

Most updates publish at once. What is doubtful waits in the collection's queue, and agents see nothing of it until a person decides.

Waiting itemWhat you do
Contradiction: new evidence disagrees with a statement on the pageSee the published page beside the page as it would become, with the quotes. Approve (the old statement is superseded), reject, or leave it.
Probable duplicate: a new topic very close to an existing oneApprove, reject, or merge it into the existing topic.
Source page with objectionsApprove as it is, or have it written again.
Suggested model linkAccept or reject in place.
Unreadable documentRetry or remove.
Vocabulary proposalThe collection's manager accepts or rejects.

The queue belongs to the collection, not to a person, so whoever is free picks it up. Readers do not see it, because held changes are unpublished. Two held changes on one topic never build on each other's unapproved work.

The review queue of a collection
The review queue of a collection.
A held contradiction: the claim it contradicts, the published page, the page as it would become, and the new claims with their quotes
A held contradiction: the claim it contradicts, the published page, the page as it would become, and the new claims with their quotes.

Knowledge

Topics and evidence

A topic is a page by subject, not by document. Two documents about the same product end up on one page.

Claims

Every fact keeps its proof

A claim is kept only if its quote appears word for word in the verified source wiki, and it records the wiki version and passage it came from. Pages cite their sources as chips, and the evidence panel shows each claim with its quote and the wiki passage.

Vocabulary

Types, templates and relations

Every collection starts from a rich starter ontology: topic types with a meaning and a page template, relation types such as governs, depends on, part of, replaces, with their inverse. When nothing fits, the analyzer proposes a new kind and the manager decides.

Searchable

Every layer is indexed

Original text, every source wiki version, every topic version, claims, topic identities and typed relationships are chunked or embedded and searched by meaning and by words together.

Retrieval

Chunks find, pages answer

A question is matched against chunks of the published topic pages, and the agent receives the whole page with the matched passage and the related topics, so it reads the full argument, not a fragment.

A topic page with its source citations, and the evidence panel: each claim with its quote, source wiki version and passage
A topic page with its source citations, and the evidence panel: each claim with its quote, source wiki version and passage.
The topics of one collection and their links
The topics of one collection and their links.

Knowledge

The bridge to the model

A topic can say what it is about. The Pro plan is a kind of Product. The refund policy governs Invoice.

  • Made while reading. The analyzer is shown the model's entities (name, domain, a short definition, never data) and says which ones each topic is about, with a relation and a confidence. At 70% or more the link is confirmed at once, and less waits as a suggestion.
  • Stored in the collection. The model gets no new entity and no new relationship. Whoever cannot read the collection sees no link and nothing broken.
  • Visible both ways. On the topic page, on the entity page as related documents, over the model graph, and for agents through the tools.
  • Resolved when read, with the reader's own entitlements. A link to a field never exposes personal, confidential or restricted ones.
An entity page with the topics that are about it, grouped by collection
An entity page with the topics that are about it, grouped by collection.

Knowledge

Interviews

Some of the most useful knowledge has never been written down. The interviewer captures it the way a curious colleague would.

  1. Say what you want to document in your own words.
  2. Answer questions one at a time. The interviewer reflects back, follows threads, asks for specifics and checks stored facts against what you say next.
  3. Review the facts it extracted after every exchange (trigger, step, decision, exception). Correct or remove any of them.
  4. Write the draft. Every fact appears, nothing else is added. Edit it and save new versions.
  5. Add it to the collection as a source that becomes topics like any document. A person already reviewed it, so the writer and checker are skipped.

Knowledge

Keeping it healthy

Merge

One subject, one page

Merge a topic into another. Statements are renumbered, titles become aliases, links and sources move, and the old address redirects.

Revise

Withdraw what lost its source

Remove or re-read a source and what only it supported is withdrawn. A job asks the writer to soften what rested on it and keeps the rest, citations included.

Health

A check with no AI

Held changes, failed sources, isolated topics, links to archived topics, quotes that vanished after an edit, and pairs of topics that may be one subject.

A collection exports as one zip: the original files, every source page with its versions and checks, each topic as Markdown with its statements and evidence as JSON, the links, the vocabulary and a manifest. It is a handover format, and nothing from any other collection can be in it.

Agents

The MCP server

One endpoint for any MCP client that speaks streamable HTTP with a bearer token. Ten read-only tools, and the server explains itself, so there is nothing to prompt-engineer.

claude mcp add --transport http curltale https://<your-host>/mcp \
  --header "Authorization: Bearer <token>"
ToolWhat it does
get_accessWho the caller is, what it may see, whether it may query data, and the SQL dialect.
searchEntities, fields, filters, relationships and examples for words or exact codes.
describeAnything by name, with its fields, values, filters, links, examples and related documents. Also finds a word only the documents know.
join_pathThe best path between two entities with exact joins, reliability, an all-confirmed alternative and fan-out warnings.
plan_queryEverything for one SQL statement: tables, columns, pre-filled filters, a runnable skeleton without fan-out, and the relevant topics.
query_dataRuns one read-only statement under the caller's entitlements, with notes before the rows.
library_contextStart here: full topic pages for a question with the matched passage, related topics and relationships, and whether the documents answer at all.
library_searchLightweight topic discovery: titles, summaries and the best matching passage.
library_topicOne full topic page with its links, sources and model entities.
library_topic_claimsEvery claim of a topic with its exact quote, source and source wiki version.
library_topic_sourcesThe documents behind a topic and the wiki version used.
library_traverseThe topic graph from one or more topics, up to three steps.
library_source_searchSearch the verified source wikis.
library_sourceRead a source wiki whole, around a passage or searched inside; or the original text.
library_vocabularyTopic types and relation types.
library_collectionsThe collections the caller may read, with their usage tags.

The ten library_ tools only appear to a token that holds a grant on at least one collection. A token without grants sees six tools and no trace of the library.

Without any prompt

What a client receives

Instructions that teach it to read a question: understand the words through the ontology, route to the documents, the data or both, answer with evidence. Tool descriptions that stand on their own for clients that hide the instructions, a next hint in every result, a guide resource, four prompts (explore the model, a data question, a documents question, a question that needs both) and read-only annotations so clients can approve the tools automatically.

Which tool when

Data goes one way, knowledge the other

A data question uses plan_query and query_data. A question about what the business says goes to library_context. When both apply, plan_query hands over the relevant topics.

Agents

Alfred

The built-in assistant. It uses the same tools and the same rules as an external agent, under the signed-in person's own access.

  • It knows which page you are on, so "what does this field mean?" works on a field page.
  • It decides when it needs the documents. A data question uses the model and the data, a policy question searches the library, and a general question needs no tool.
  • It streams its answer, shows every tool it calls, and links the entities, fields, topics and documents it used.
  • It starts every document question with library_context, which returns whole topic pages, and goes to claims, related topics or the verified source wikis only for a detail a page lacks. If the documents do not cover a question, it says so.
  • Instructions found inside data or documents are treated as content, never as commands, and internal collections are never quoted in customer-facing text.
  • It runs on any OpenAI-compatible endpoint. Without one, Alfred is off and everything else keeps working.
Alfred answering a question that needs the data and the documents, and surfacing a conflict between two sources
Alfred answering a question that needs the data and the documents, and surfacing a conflict between two sources.

Governance

Protecting data

ClassTypicallyWho sees it
internalthe structure and meaning of the modeleveryone
confidentialfinancial and other business-sensitive valuesholders of the class
personalnames, emails, phone numbersholders of the class; others get hashes where the field is masked
restrictedidentity numbers, credentialsonly holders of the restricted entitlement, granted explicitly and logged
Per field

Full, masked or none

Masked values come back as a stable hash, so they can still be counted, grouped and joined but never filtered or compared. None means never readable and left out of search entirely.

Per query

Parsed, traced, regenerated

Every query is parsed, every column traced to its real table through aliases and subqueries, and checked against the caller's rights. The statement that runs is rebuilt from the checked tree, never the text that was sent.

Per connector

A second line of defence

The database account is read-only with timeouts and row limits, and a connector can forbid agents from reading rows at all while still allowing them to plan.

Governance

Protecting documents

  1. GrantsA collection is reachable only through a grant. Without one the answer is the same as for a collection that does not exist.
  2. Agent switchA collection can keep every agent away, whatever the grants say.
  3. AI switchA collection can keep every model away. It stays stored and searchable locally.
  4. Isolation in the databaseComposite keys make the database itself refuse a passage that names a source from another collection.
  5. Usage tagEvery result says whether it may be shared with customers.
  6. AuditGrants, self-grants, uploads, removals and exports are logged, by id, never by file name.

Governance

People and roles

RoleCan
viewerExplore, search, browse data, use Alfred and the SQL console under their entitlements.
modellerAlso edit drafts, upload Excel, re-run the model check.
publisherAlso publish and discard drafts.
adminAlso manage users, tokens, connectors, settings and the activity log.
editorA separate role for documents. With a write grant it allows ingesting, editing and approving.

Passwords are stored with scrypt and need at least 12 characters. Sign-in locks after repeated failures, a password set by an admin is temporary, and changing your password ends your other sessions. Every assistant conversation and agent session is recorded step by step, with tokens, cost, timing and the response returned.

Run it

Install

Docker with Compose v2 and about 2 GB of memory. Two containers to start: the app and PostgreSQL with pgvector.

git clone https://github.com/curltale/curltale.git && cd curltale
cp docker-compose.example.yml docker-compose.yml
cp .env.example .env          # fill in the required values
docker compose up -d          # open http://localhost:8080
  1. Sign in with the first administrator from your .env.
  2. Add an AI endpoint (optional, but Alfred and most of the library use it) and press Test.
  3. Start the ontology from a spreadsheet or a connector, review, publish.
  4. Try it: build the demo database, ask Alfred, or create a token and connect an agent.
  5. Add knowledge: create a collection, give people the editor role and a grant, and upload documents.

Run it

Optional services

Everything beyond the core is an overlay file you add with -f. They combine freely.

ServiceAddsUse it when
Worker
docker-compose.worker.yml
A container for the library's background work. The web app stops doing it.You have many or large documents, or several people uploading at once. Scale with --scale worker=3.
Browser service
docker-compose.fetcher.yml
An isolated Chromium for pages built by JavaScript. No database, no files, no app secrets, and every request it makes goes through the address guard.You capture single-page sites. Plain pages work without it.
S3 bucket
docker-compose.storage.yml
A self-hosted S3-compatible store plus a one-shot job that creates the bucket.You want original files outside the data folder. Any S3 service works the same way without this file.
Demo databases
docker-compose.demo.yml
PostgreSQL, MariaDB and ClickHouse with the same synthetic data.You want to try the connectors.
docker compose -f docker-compose.yml \
  -f docker-compose.worker.yml -f docker-compose.fetcher.yml -f docker-compose.storage.yml \
  up -d --build

Choose the storage before the first upload. Files already stored are not moved when the driver changes.

Run it

Models and settings

AI endpoint

Any OpenAI-compatible server

OpenRouter, a LiteLLM gateway, Ollama, vLLM. A model per library job if you like. Reasoning and temperature are settings.

Embeddings

Local by default

They run inside the container with no key. Choose a remote model and any vector size pgvector stores.

Settings

A page, not a file

Tabs for General, AI, Ontology and data, Library, Web capture, Storage, Limits, Connectors and Maintenance. Changes apply with no restart, are audited, and win over .env. Teams that prefer files can lock the page.

Behind a proxy, the app reads the real client address from a forwarded header only when the request comes from a trusted proxy. It also sets its own security headers and rate limits, so it is safe with no proxy in front.

Run it

Operations

  • Update: rebuild and restart with the same -f files. Schema changes apply at startup and missing embeddings fill in the background.
  • Back up three places: the database, the library's original files (data folder or bucket), and the rest of the data folder with Excel backups and connector files.
  • Rotate a token: create the new one, update the agent, revoke the old.
  • Observe: an activity log of every conversation, tool call and model call with cost, summaries per tool and per model, and a health endpoint for monitors.
  • Audit: a vulnerability scan script checks the locked Python packages and the interface's runtime packages.

Under the hood

Architecture

One PostgreSQL database with pgvector holds the model, its versions, the library, the search indexes and the app's own data. No separate graph or vector store is needed at this scale.

Architecture: people and agents reach one app that uses PostgreSQL, an AI endpoint and your database; a worker, a browser service and an S3 bucket are optional. Peopleweb app, Alfred AI agentsMCP, bearer token Curltale AI app ontology · knowledge library · bridge query planner and checker access rules, review queue embeddings run inside the container job workers run here, or in their own container PostgreSQL + pgvectormodel, library, users, activity AI endpointany OpenAI-compatible server Your databaseread-only connector Workeroptional container Browser serviceoptional, isolated S3 bucketoptional, or your own
  • Deterministic where it matters. The query planner and the join-path finder are plain code. SQL is parsed and generated with sqlglot, with one driver class per database kind.
  • The library has its own schema in the same database, with composite keys that enforce isolation, and a job queue with leases and retries.
  • The interface is React, served by the app. Model-written text is rendered without HTML or images.
  • Tested. Hundreds of tests run on a fictional model of a subscription business, including route sweeps that prove every endpoint checks access.

Under the hood

Limits

What it does not do yet, stated plainly.

  • One model per installation, and one active connector at a time.
  • Access to data is decided per column. Row-level rules are not implemented.
  • Agents receive a capped number of rows per query and results are not paged, so they are told to aggregate or filter.
  • Sign-in is username and password. Single sign-on and multi-factor authentication are not built in yet.
  • Rate limits are kept in memory, which suits one app process.
  • A collection export has no matching import yet, and the browser service does not read pages behind a login.