DEV Community

OnePassApps
OnePassApps

Posted on

The File Picker Contract of 22 App Pages: 9 Open One, 4 Say the Same Accept List

I work on OnePassApps, so this is our own site and our own build. Every string below was read out of the live DOM of our own app pages today, 9 November 2026, in one signed-out Chrome tab, one pass, page by page.

Our 22 app pages under /apps/ take input in two different shapes. Nine of them open a file picker. Thirteen never do. This is the accept attribute on every file input we ship - the list the browser uses to filter its own file chooser.

The nine pages that open a file picker

Nine of the 22 app pages carry a file input. Across those nine pages the DOM holds 15 file input elements, and 10 of those carry an accessible label naming the file they want:

App The label the input carries The accept list
/apps/paperkit Add PDF files application/pdf,.pdf
/apps/cv-builder Choose résumé JSON file .json,application/json
/apps/chart-maker Choose CSV file .csv,text/csv
/apps/subtitle-workbench Select subtitle files .srt,.vtt,text/vtt,application/x-subrip
/apps/subtitle-workbench Choose reference media audio/*,video/*,.mp3,.wav,.m4a,.aac,.ogg,.oga,.opus,.flac,.mp4,.m4v,.webm,.mov
/apps/social-card Local image image/png,image/jpeg,image/webp
/apps/citation-formatter Choose bibliography JSON file .json,application/json
/apps/calendar-maker Choose calendar JSON file .json,application/json
/apps/word-counter Open a text file .txt,.md,.markdown,text/plain,text/markdown
/apps/invoice-maker Choose invoice JSON file .json,application/json

That is the whole surface: 10 named inputs across 9 pages, and every one of them states its own filter.

Four apps say exactly the same thing

Four of those rows carry the identical accept list, .json,application/json:

  • /apps/cv-builder - Choose resume JSON file
  • /apps/citation-formatter - Choose bibliography JSON file
  • /apps/calendar-maker - Choose calendar JSON file
  • /apps/invoice-maker - Choose invoice JSON file

The picker cannot tell those four apart. It will offer the same files to a resume, a bibliography, a calendar and an invoice, because the accept list only says "this is a JSON file", and each of those four apps wants a different document inside that container. The app's own label is what disambiguates it - a resume JSON file is not a bibliography JSON file - and that label is the only place the difference is written down.

The same idea, spelled five different ways

The accept lists are not written in one house style:

  • /apps/paperkit puts the media type first: application/pdf,.pdf
  • /apps/chart-maker puts the extension first: .csv,text/csv
  • /apps/word-counter puts three extensions and two media types: .txt,.md,.markdown,text/plain,text/markdown
  • /apps/subtitle-workbench mixes them: .srt,.vtt,text/vtt,application/x-subrip
  • /apps/social-card names three image types only: image/png,image/jpeg,image/webp

The reference-media input on /apps/subtitle-workbench is the longest list we ship: audio/,video/,.mp3,.wav,.m4a,.aac,.ogg,.oga,.opus,.flac,.mp4,.m4v,.webm,.mov - two wildcards and thirteen extensions.

The other thirteen pages never open a picker

NewsFlow, MovieMatcherAI, the Email Signature Builder, the Browser Teleprompter, the Screen & Cinema Planner, the Label & Card Maker, the Password Generator, the Focus Timer, the QR Code Maker, the Ambient Noise Mixer, the Time Zone Planner, the Signature Maker and the Screen Recorder have no file input at all. Their input is typed, drawn, chosen from a list, or handed over by the browser - the Signature Maker draws on a canvas and the Screen Recorder asks the browser for a screen.

Five pages hold a second, unnamed copy

Of the 15 file inputs, 10 carry an accessible label and 5 do not. The five unlabelled ones are second elements on the same page: /apps/paperkit, /apps/cv-builder, /apps/subtitle-workbench, /apps/social-card and /apps/citation-formatter each hold a second input element with the same accept list and no accessible name. Only the labelled element carries a name, so the label is the only thing that tells a screen reader which file the control wants.

What this does not say

This is a reading of the accept attribute, not a test of what the apps accept. accept is the attribute a browser uses to filter its own file chooser; it says nothing about whether a file with the right extension has the right shape inside it. I did not rename a file and force it through a picker, and I did not check what any app does with a file whose extension lies. What is measured here is the filter each page hands its own file chooser.

One build, one browser, one signed-out pass, 9 November 2026. 22 app pages, 15 file input elements, 10 of them labelled.

More of our tools: https://app.onepassapps.com/apps/paperkit?utm_source=devto&utm_medium=community&utm_campaign=file-picker-contract&utm_content=app-link
Guides for each app: https://app.onepassapps.com/guides?utm_source=devto&utm_medium=community&utm_campaign=file-picker-contract&utm_content=guides-link

Top comments (0)