← All articles

v1.8.0 BETA

Two and a half weeks and one very long changelog later, v1.8.0 is the biggest update since we opened the public beta. Most of it comes down to three things: your Bunny now reads your files completely instead of sampling them, it answers from all of your data instead of the first page of it, and the chat stopped fighting you.

Here is the whole list.

Your files get read all the way to the end

This is the big one. Until now, anything that was not a spreadsheet or a PDF was read once, up to a fixed size, and then quietly cut off. Nothing told you. We measured it against real uploads and it was worse than we thought:

  • a 5 MB text file: about 4% of it indexed
  • a 4.8 MB JSON file: about 4%
  • a large Korean text file: about 10%
  • a Word document: about 71%

Word, PowerPoint, CSV, TSV, plain text, Markdown, log, JSON, JSONL, XML and YAML files are now read one window at a time until the file is genuinely exhausted. CSV and TSV files are read in whole rows carrying their real row numbers, so a row never gets split down the middle and "row 4,812" means row 4,812.

Spreadsheets got the same treatment, plus repairs that matter if you keep numbers in them:

  • Formula cells are no longer silently dropped. A cell holding a formula used to come back empty, so a whole calculated column could vanish from your data without a trace. Worse, where a file carried a stale cached number, that stale number was handed over as fact. Formula cells are now labelled as formulas, with their stored value when there is one.
  • Columns past the 256th are no longer thrown away, and a row whose only content sat out there no longer disappears entirely.
  • Pictures inside a sheet are read as pictures. A photo sitting beside its row is now handed to your Bunny together with that row instead of being skipped.
  • A file that could not be read no longer looks fully indexed. An unsupported or corrupt file used to return exactly what a finished read returns, so your Bunny could tell you a document was completely indexed when it had read none of it. Failures are reported as failures now.
  • Long files stopped getting slower and slower. Reading a long document used to re-extract the whole thing from scratch for every chunk, so the files that needed the most passes were the ones most likely to run out of time. The extraction is reused between chunks now, and the reader jumps straight to the row it needs instead of re-scanning everything ahead of it.
  • Importing a big spreadsheet no longer trips over the database. Every row written also bumped a shared counter in a single spot, which made the database start refusing writes partway through a large import. Those updates are combined per batch now, and we back off properly when a limit does get hit, so a big import rides it out instead of erroring halfway.

Scanned pages and photos are actually read

A PDF's content is visual, so we stopped pretending it was text. PDF pages are rendered to images and shown to your Bunny as pictures, which means scanned documents finally index instead of coming back empty.

Those pages are sent at full detail now, too. The setting that controls image resolution only recognised bare model names, so anything with a suffix on it, including the cheaper mini and nano tiers, quietly fell through to a default that let the API shrink the very pixels that needed reading. In other words the tiers that needed the resolution most were the ones losing it. Rendered document pages are pinned to full detail whatever model you use.

Long documents also finish on their own now. The server walks page by page to the end rather than stopping wherever the AI happened to run out of room, so a several-hundred-page file indexes end to end, and it no longer depends on you keeping the browser tab open.

Stranded work recovers by itself as well. Once the server started queueing the next chunk of a long document, nothing in your browser was watching that work, so a single lost message could leave a file sitting at "(In queue)" forever with the rest of it never indexed. Stalled passes are now spotted and restarted, and only when restarting is provably safe, so nothing gets indexed twice.

And when the AI provider has a bad moment mid-run, the pass no longer just dies. Requests that were refused before any work started are retried with a sensible backoff, and a chunk that fails outright is re-queued as fresh work.

No more answers from a 50-row sample

Every spreadsheet row becomes its own record, and a plain query hands back only the first page of them, roughly fifty. Your Bunny was treating that page as the whole dataset: counting from it, totalling from it, and sometimes flatly telling you something was not in your data when it was sitting right there.

Now a complete scan is mandatory for any question that counts, totals, lists everything, compares across records, or asks whether something exists. Your Bunny is not allowed to tell you something is absent unless a complete scan came back empty. It also knows that a prefix filter cannot find a value buried in the middle of a longer string, such as a merchant name inside BQ*SKAPI#4070277042 or a card number inside a masked string, so it pulls the full set and matches it itself.

Related: there was a bad failure where you would upload a big PDF or spreadsheet, watch it index successfully, ask for a summary, and be told to upload the file again. A large result was being replaced by a 20-row preview, and your Bunny was explicitly told not to claim it had read everything. The complete result now comes back, in pages your Bunny reads one after another until it has all of it.

One status row per file, with a Stop button

A big file used to bury your conversation under a stack of near-identical "Indexing..." messages, one pair per chunk. Every pass for one file now folds into a single row with a spinner, a tick or an error, a pass count, and the file name as a download link. Click it to expand the individual steps if you want them.

And there is now a Stop button right on that row. Before this, a job you started by mistake had to run to the end. Stop cancels every queued and running pass of that file, not just the piece currently in flight, and it now lands on the server between chunks and even while a retry is waiting, so a long PDF stops queueing more work the moment you ask instead of finishing the plan it already made. Anything already indexed stays indexed, and stopping never blacklists a file: re-upload or re-index it and it starts fresh.

Follow-up passes read "Indexing (continuing)" now, so a long run looks like progress instead of the same step looping. Raw machine markers stopped showing up in your conversation too: the internal window instructions no longer render as a chat message, and the completion token the indexer is told to end with is stripped before you see the summary.

The chat stopped fighting you

  • A link with a space in it used to freeze the tab. The pattern we used to find links in a reply took about a minute on a 30-character link and never finished on longer ones, and it re-ran on every redraw. Our own database tools legitimately produce links like that, so it was easy to hit. It is instant now.
  • Fewer chats stuck on "Thinking..." forever. Several separate causes are gone. The main one: an invisible background indexing reply was being typed out letter by letter on the same queue as your answer, so your reply sat there as an empty bubble for as long as the hidden work took.
  • Your scroll position is kept. A reply streaming in, or an indexing step finishing above you, used to redraw the list and throw you back to the top or bottom.
  • Older messages are reachable again. History loads when you scroll to the top of the box, but a page of history that collapsed into one status row never filled the screen, so that scroll never happened and everything above your upload was stranded. The chat now keeps fetching until the box can actually scroll.
  • Switching tabs no longer throws away the history you scrolled back to load. Coming back used to replace your conversation with just the newest page.
  • Background progress checks pause while the tab is hidden and pick up when you return. Replies you are actually waiting on keep running.

Your projects stay out of each other's way

All of your projects were served by one shared chat session, and it showed. A message sent in one project could still be in memory when you switched to another, get written into that project's saved history, and replay every time you opened it. And if you sent a question while an attachment was still uploading, it could be dispatched to whichever project you had navigated to by the time the upload finished.

Every message is now stamped with the project it belongs to, and the project a question was written for is pinned the moment you press Send. Anything from somewhere else is dropped on load, on refresh, and when reading cached history.

Ask for your data as a file, and get a file

If you asked for "all of it as a CSV", your Bunny used to read every row into the conversation and retype it by hand as CSV text. On any real dataset it hit the message size limit partway through and gave up.

The file is now built on the server: the query runs, the rows go straight into a file without passing through the conversation, and you get a download link and a one-line summary of how many rows and which columns. CSV, TSV and JSONL, up to 500,000 rows. Non-Latin text opens correctly in Excel because the file is written with a byte-order mark, so a Korean datasheet is no longer mojibake, and cells that Excel would have executed as formulas are neutralised.

Your Bunny can also write you a document now. When it is composing something itself, such as an analysis or a set of meeting notes, it builds the document across several steps and hands you the finished file instead of stretching it over a wall of chat messages. It refuses to use this for dumping database rows and points itself at the spreadsheet export instead, so you never get a hand-retyped CSV with transcription errors in it.

Links and downloads that keep working

  • A download link now mints a fresh download the moment you click it. Links used to be signed with short-lived credentials that often died before their stated expiry, so a link created an hour ago gave you "invalid token". The link is also short and opaque now, instead of 447 characters your Bunny had to retype perfectly into its reply, and it no longer reveals where the file is stored. Older links already sitting in your conversations still work.
  • Dead export links are fixed. For a few days an export could hand you the file's internal storage location instead of the proper link, which stops working within minutes. That was the broken CSV people were hitting. The correct link also downloads as a named file now instead of opening as plain text in the browser.
  • Attachment links in old conversations stop going dead. Stored links pointed at an address that expires; those are now recognised and quietly refreshed when you click them, including in conversations you already have.
  • The link your Bunny is handed is minted seconds before it reads the file. It used to be a long-lived address baked in when you uploaded, sitting in the request and in your saved history for a day or two, so a job that waited in the queue or got retried could be handed a link that had already died. Every call, retry and continuation pass now gets a fresh short-lived one.
  • A link at the end of a sentence no longer swallows the full stop into its address and 404s. Only real files in your project turn into download chips, so other people's links, mailto:, tel: and page anchors stay ordinary links.
  • Files you asked for are kept, throwaway ones clean themselves up. Exports and reports you requested are kept, so the link in your chat keeps working. Files the system generated on its own age out after a day so they do not quietly eat your storage allowance, and both kinds live in a hidden folder instead of cluttering your file browser.

Files and folders

  • Overwriting a file replaces its data instead of duplicating it. Whether a file already existed used to be decided from the browser's own folder cache, and when that cache was cold the cleanup was skipped, the file was indexed twice, and answers could double-count it. The server decides now. One caveat: rows indexed in the very first days of July are not linked back to their file, so re-indexing a file from back then can still leave some old rows behind.
  • A failed upload finally tells you why: too large, permission denied, a network timeout, or the storage service's own message, instead of a bare "Upload failed".
  • Files with a # in the name work again. Everything after the # was being thrown away, so your Bunny went looking for a file that did not exist.
  • The file browser stops showing the wrong folder's contents when you click into a folder while another is still loading, and Prev and Next no longer walk you into blank pages.
  • A teammate's upload folder shows their email and a person icon instead of a raw internal id.
  • Collaborators do not see the attach button on a frozen project, instead of being offered an upload that would be rejected.

Better questions about numbers

Every record can carry many searchable labels but only one sortable number, and your Bunny kept spending that single slot on something like a filename, which cannot be sorted, summed or averaged. "What did I spend in total", "show me everything over 100" and "sort these by date" were unreliable as a result. Descriptive things now become labels and the number slot goes to the one quantity worth ordering or totalling. This applies to files indexed from now on, so re-index an older file if you want it to benefit.

Small things you will still notice

  • Every settled message carries a date and time, to the second: when you asked, and when the answer landed.
  • The default OpenAI model moved up from gpt-5.4 to gpt-5.6-luna, if you never picked one yourself.
  • The browser's page translator no longer mangles your chat. It was re-tokenizing message text and dropping spaces, which was especially rough on Korean.
  • First visit is light mode unless you pick dark yourself.
  • The nav bar shows the project you are in as a pill you can click to get back to your project list, and the footer shows which version you are running.
  • A single bad row no longer throws away a whole batch. Indexed data was saved all-or-nothing, so one malformed item lost every healthy row with it. Rows are saved in groups now, a failed group is retried row by row, and your Bunny gets an exact report of what landed instead of telling you your data is stored when it is not.

PSST...

Still true from the beta announcement: every BunnyQuery project is a full Skapi service. You will find it in your Skapi service list, and it is the same account either way.

More news coming up!

Subscribe to the newsletter from your account profile page so you do not miss anything, and past articles are always at bunnyquery.com/articles.

That is it for this round. Enjoy your Bunny!

Baksa, Creator of BunnyQuery