Ten years ago we built file hosting: upload over web and FTP, preview for images and audio, bulk management in a panel. Back then a file was the end of the road — it sat there waiting for someone to download it.

Today a file is the beginning. You upload a meeting recording, a scanned contract or a PDF and you expect a note, a summary, an entry. One thing changed: between the file and the result stands a model that cannot always read that file — and does not always say so.

Silent failure is worse than an error

An .m4a recording from a phone went straight to our transcription model. The model reads files through libsndfile, which does not know AAC. The result: a note produced without the content of the recording. No exception, no red banner, an empty result and a confident text "about" the file.

That is a pattern, not a one-off. Asked for a note from a file it did not read, a model will write a note. It will not say "I could not manage" unless you tell it to.

An attachment is not one type

Images, recordings and documents need three different paths:

  • an image goes to the model as an image, inlined — no intermediate description that loses the details;
  • audio and video go through ffmpeg into transcription, segmented and processed in parallel;
  • a document goes through text extraction with a character limit and an explicit marker when it is truncated;
  • anything else goes as a link, with a note that its content was not read.

Plus one detail that cost us a wrong note: a phone sends every photo as image.jpg, so matching attachments by file name gives you two copies of the first scan page. Matching goes by index, and the prompt carries [i/N] numbering.

What you can build on top

Once that layer is done properly, "file hosting" turns into something else: you drop material in and the system hands content back. Our private notes platform is built on exactly that flow — the chat has 23 tools it drives itself, and it can fetch a source, process it, save an entry and attach a file inside one answer.

It is a private project, an internal application for one of our clients, so there is no public address. We show the mechanics, the model evaluation numbers and screenshots on a call.

What to check in your own setup

  1. Check what happens when a file is unreadable. If you get a smooth answer instead of an error, you have a problem.
  2. Check the input format, not just the extension. Phones record in AAC, and not every library reads it.
  3. Check what ends up in the prompt after a long document is truncated, and whether the truncation is visible at all.
  4. Check the cost and the time per operation before you pick a model. Ours is picked by measurement, not by what was fashionable last month.