Web search for current pages and news.
web search · backup: ExaGET STARTED
Overview
TILIK is an AI research engine for any question, and a live window into Robinhood Chain (chain ID 4663). You ask in your own words; TILIK works out what kind of question it is, checks only the sources that matter, and writes one clear answer where every live fact is tied to a numbered, clickable source.
TILIK never guesses live numbers. If a source can't be reached, the answer says so instead of inventing data.
GET STARTED
Quickstart
- 1Open TILIK and ask
Type in the box on the home page and press Enter, or press Ask TILIK to open the chat.
- 2Watch it work
Chips show what TILIK understood (Market, GitHub, Research…), and a short list shows each source it checked and how long it took.
- 3Check the sources
Numbers like 1 in the answer open the source they came from. The full list is under the answer.
- 4Follow up
Ask "what about its liquidity?" or "compare it with the other one" — TILIK remembers the conversation.
GET STARTED
Asking good questions
TILIK picks its sources from what you write. A few details make answers sharper:
| Include… | TILIK will… |
|---|---|
A web link https://… | Read that page and answer from it. |
A GitHub repo (owner/repo or its link) | Analyze the repository: README, structure, code, commits, issues, releases. |
An address 0x… (40 hex) or a transaction hash (64 hex) | Look it up on Robinhood Chain. |
A token symbol like USDG | Find its pools and market data. Symbols aren't unique — add the contract address to be exact. |
| "latest", "today", "this week" | Use fresh news and web search. |
| "research", "compare", "in depth" | Run deep research: more searches and pages, a longer answer. Slower. |
Try these
- chain
- market
- github
- web page
- news
- research
"Try" opens TILIK with the question filled in — nothing is sent until you press Send.
HOW IT WORKS
From question to answer
Detects the kind of question — research, code, news, chain, markets, or several at once — and which links, repos, addresses or tickers it mentions. Earlier messages in the chat count too.
Calls only the sources that matter, in parallel, under strict time and call limits. If one fails, its backup takes over. Unsafe links are never opened.
A model writes one answer from the gathered sources. OpenRouter goes first, then Gemini, then Groq — each tried at most once — and citations are checked before you see them.
Simple questions usually take a few seconds. Deep research reads many pages and lets a reasoning model think longer, so it can take a minute or more — the steps list shows progress as it goes.
HOW IT WORKS
Sources
Eight integrations supply live data. The dot shows whether this TILIK server has each one set up right now .
Second web search engine. For research, it searches together with Tavily for more varied sources.
web search · backup: TavilyReads full web pages as clean text.
page reader · backup: FirecrawlReads heavy or script-built pages when the first reader can't.
page reader · backup: JinaRepositories: README, files, commits, issues, pull requests, releases, contributors.
codeFresh stories from curated feeds; stale news stays out.
news · backup: web searchBlocks, transactions, addresses, tokens and contracts, read from the chain itself.
on-chainPool prices, liquidity and volume for Robinhood Chain.
markets"Set up" means the server can use it; a source can still be briefly unreachable — answers say so when that happens.
HOW IT WORKS
Citations & trust
Live facts come only from retrieved sources, each marked with a number you can click. Citations to sources that don't exist are removed before you see the answer.
If needed live data couldn't be retrieved, a notice says so and the answer contains no real-time facts for that part.
What a source says is kept separate from TILIK's own reasoning about it.
Local, private-network and unsafe links are refused before anything is fetched. Instruction-like text hidden in web pages is stripped, and links in an answer that aren't sources are removed.
API keys never reach your browser, the answers, or the logs.
ROBINHOOD CHAIN
Chain data
TILIK reads Robinhood Chain (chain ID 4663) directly over its RPC, and checks the chain ID before using any data, so a misconfigured endpoint can't feed it another chain's numbers.
| Ask about | Example |
|---|---|
| Latest blocks & activity | "What's happening on Robinhood Chain right now?" |
| An address | "What is 0x…? Is it a contract?" |
| A transaction | "What did transaction 0x… do?" |
| Tokens & contracts | "Show the token details for 0x…" |
Full wallet and token history for an address needs an explorer API and is on the roadmap. If the public RPC is unreachable, chain answers say so; market data and news keep working.
ROBINHOOD CHAIN
Markets & pools
Prices, liquidity, 24-hour volume and price change come from GeckoTerminal pools on Robinhood Chain, shown as cards above the answer with the time they were fetched.
- Symbols aren't unique. Anyone can create a token called "USDG"; TILIK shows the contract address so you can check it's the real one.
- The live pulse on the home page lists the top pools by liquidity — only pools with at least $100k liquidity, so thin or wash-traded pools aren't promoted. It refreshes every minute.
- Not financial advice. Numbers are shown as facts with their source and time; analysis is labelled as analysis.
USING TILIK
Conversations
- History — every chat is listed in the sidebar (the ☰ button on phones). Rename or delete one from its ⋯ menu.
- Follow-ups — TILIK sends the recent turns of the current chat, plus the links, repos, addresses, transactions and tickers mentioned, so "it" and "that pool" resolve correctly.
- Links to a chat — each chat has its own address (
/chat/…). It reopens the chat in the same browser; it isn't a share link, because chats live only in that browser. - New chat — start fresh any time with New chat; earlier chats stay in the list.
USING TILIK
Privacy
Your chats are saved only in this browser (local storage), not on TILIK's servers. Deleting a chat — or clearing your browser's site data — removes it for good. To answer, the server receives your question and the recent turns of that chat, and the sources it fetches see only the queries needed to answer.
Don't paste passwords, private keys or seed phrases into any chat. TILIK never needs them.
API
Ask: POST /chat
The web app uses the same HTTP API you can call yourself. Send JSON; get the answer as JSON, or as a live event stream. Replace http://localhost:8787 with your TILIK address. If the server's owner turned on an access key, add Authorization: Bearer <key>.
curl -s http://localhost:8787/chat \
-H "content-type: application/json" \
-d '{"message": "What is the price of USDG on Robinhood Chain?"}'
const res = await fetch("http://localhost:8787/chat", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ message: "What is the price of USDG on Robinhood Chain?" }),
});
const answer = await res.json();
console.log(answer.answer, answer.sources);
Request body
| Field | Type | Description |
|---|---|---|
message required | string | Your question, 1–8,000 characters. |
stream | boolean | Stream events as they happen (Server-Sent Events). Default false. |
mode | "auto" | "research" | research forces deep research. Default auto. |
model | string | auto, a provider (openrouter, gemini, groq) or provider:model from GET /models. Default auto. |
strictModel | boolean | Never fall back to another model. Default false. |
history | array | Earlier turns: { "role": "user" | "assistant", "content": "…" }. Up to 50 items, 24,000 characters in total. |
context.entities | object | Things mentioned earlier, so follow-ups resolve: urls (≤5), githubRepos (≤3), addresses (≤5), txHashes (≤3), tickers (≤5). |
API
Streaming
With "stream": true the response is an event stream (text/event-stream). Events arrive in this order:
| Event | What it tells you |
|---|---|
request.started | The request id. |
intent.detected | What kind of question it is. |
plan.created | Which sources will be checked. |
status | A short progress message. |
tool.started / tool.completed | Each source call, with its result and time. |
source.discovered | A source that may be cited. |
model.selected | The model writing the answer. |
response.delta | The next piece of answer text (text). |
response.completed | The full final response (same shape as the JSON answer). |
error | Something failed; error.kind and error.message. |
const res = await fetch("http://localhost:8787/chat", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ message: "Latest crypto news", stream: true }),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
let buffer = "";
for (;;) {
const { value, done } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
let cut;
while ((cut = buffer.indexOf("\n\n")) >= 0) {
const block = buffer.slice(0, cut);
buffer = buffer.slice(cut + 2);
const event = block.match(/^event: (.*)$/m)?.[1];
const data = JSON.parse(block.match(/^data: (.*)$/m)?.[1] ?? "{}");
if (event === "response.delta") console.log(data.text);
if (event === "response.completed") console.log(data.response.sources);
}
}
API
The response
The main fields of a JSON answer (and of response.completed):
{
"id": "4975f8b8-…",
"type": "market", // normal | research | github | onchain | market | combined
"answer": "USDG trades at about $1.00 … [1]",
"grounded": true, // false: needed live data couldn't be retrieved
"sources": [
{ "id": 1, "title": "…", "url": "https://…", "domain": "…",
"authority": "direct", "snippet": "…", "retrievedAt": "…" }
],
"citations": { "used": [1], "invalid": [] },
"data": { "market.data": [ … ] }, // structured data for cards
"toolRuns": [ … ], // each source call: status and time
"model": { "provider": "openrouter", "model": "…", "fallbackUsed": false },
"timings": { "totalMs": 6400, "toolsMs": 2200, "llmMs": 4100 },
"warnings": []
}
API
Other endpoints
/healthWhether each AI provider and source is set up (true/false only — never keys or settings).
/modelsThe model choices you can pass as model.
/api/pulseThe home page's live pulse: latest block, top pools and headlines. Cached for a minute; no AI involved.
curl -s http://localhost:8787/health
# {"status":"ok","providers":{"openrouter":true,…},"tools":{"tavily":true,…}}
API
Errors & limits
Errors are JSON: { "error": { "kind": "…", "message": "…" } } — never stack traces or internal details.
| Status | Kind | Meaning |
|---|---|---|
| 400 | validation | Missing or too-long message, or invalid fields. |
| 401 | unauthorized | This server requires an access key. |
| 413 | validation | The request body is larger than 256 KB. |
| 429 | rate_limit | Too many requests — wait the seconds in the Retry-After header. |
| 503 | varies | No AI model could answer right now. Try again shortly. |
| 504 | timeout | The request passed its 120-second deadline. |
Limits on the public site
Each source and AI provider also has a daily budget, so a busy day can't run up unlimited costs. A self-hosted server can change these limits.
HELP
Troubleshooting
"TILIK is busy right now"
You've hit the per-minute limit. Wait a minute and ask again.
"TILIK's AI models aren't available right now"
Every AI provider failed or is at its daily budget. TILIK already tried each one once; try again in a moment.
"That took too long"
The answer passed the 120-second deadline — usually a large research question. Try a narrower question, or ask about fewer things at once.
"Some live data couldn't be retrieved"
A source was unreachable, so that part of the answer has no real-time facts. The steps list shows which source failed.
Live chain data shows "unavailable"
The public Robinhood Chain RPC isn't responding to the server. Market data and headlines are unaffected.
The page looks outdated after an update
Reload once with Ctrl+F5 (Cmd+Shift+R on Mac).
Is this financial advice?
No. Market and on-chain data are shown as facts with their sources and time. Always do your own research.
Still stuck? TILIK can explain itself too.
Ask TILIK