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)