I work on OnePassApps, the team behind app.onepassapps.com, so this is a look inside our own shipped build: the studio registry it carries, and the two different ways it names the same 49 tools.
Everything below was measured on 5 November 2026 from outside the browser - plain HTTPS, no session, no cookies - by fetching our public assets and reading them as bytes. The only browser involved was a signed-out read of the seven studio pages, to compare the registry's names against the tab labels a visitor actually clicks.
Where the registry lives
The registry is one array literal inside one chunk: assets/app-shell-shared-D9IUHDyB.js. I mapped all 69 chunks our entry bundle points at in this post, fetched every one of them today, and searched for one tool name, "Find duplicates". It appears in exactly 1 of them - in that chunk, and nowhere else. The registry is not split across the build: it is one array, in one file, that all seven studio routes read.
Next to it sits the whitelist of studio ids, seven strings:
var _h=[`image`,`audio`,`files`,`text`,`data`,`icons`,`colour`]
A route helper turns a URL segment into a studio id, and it returns null when that segment is not in the set - so /studios/anything-else is not a studio page at all. Verbatim:
function Sh(e){let t=e.replace(/\/+$/,``)||`/`;if(t===`/studios`)return{id:`image`}
The registry, verbatim
[
{ id: `image`, title: `Image Studio`, href: `/studios/image`,
summary: `Convert, compress, resize, crop and prepare images on this device.`,
tools: [`Convert`, `Compress`, `Resize`, `Crop`, `Remove background`, `Remove metadata`, `Images to PDF`] }
{ id: `audio`, title: `Audio Studio`, href: `/studios/audio`,
summary: `Trim and convert local audio with formats checked against your browser.`,
tools: [`Convert`, `Compress`, `Trim`, `Extract`] }
{ id: `files`, title: `File Studio`, href: `/studios/files`,
summary: `Create archives, compare hashes, rename copies and join split files.`,
tools: [`ZIP files`, `Unzip files`, `Batch rename`, `File hash`, `Find duplicates`, `Split file`, `Join parts`] }
{ id: `text`, title: `Text Studio`, href: `/studios/text`,
summary: `Clean, compare, convert and inspect text in your browser.`,
tools: [`Clean`, `Case`, `Duplicate lines`, `Sort lines`, `Find & replace`, `Diff`, `Markdown`, `Base64`] }
{ id: `data`, title: `Data Studio`, href: `/studios/data`,
summary: `View and transform CSV, JSON and YAML without sending data anywhere.`,
tools: [`CSV viewer`, `Sort / filter`, `Columns`, `Remove duplicates`, `Merge CSV`, `Split CSV`, `CSV to JSON`, `JSON formatter`, `JSON validator`, `JSON to CSV`, `JSON and YAML`] }
{ id: `icons`, title: `Icon Studio`, href: `/studios/icons`,
summary: `Make favicon and app-icon files, resize images and work safely with SVG.`,
tools: [`SVG to PNG`, `PNG to ICO`, `Favicon pack`, `App icons`, `Resize set`, `Optimize SVG`, `Recolour SVG`, `Trim / padding`] }
{ id: `colour`, title: `Colour Studio`, href: `/studios/colour`,
summary: `Sample colours, build palettes and check accessible contrast locally.`,
tools: [`Picker & converter`, `Contrast & gradient`, `Palettes`, `Image sampler`] }
]
Seven studios, 49 tool names - the same 49 I counted tab by tab on the live pages in the post I wrote about the studio skeleton.
The one line each studio carries is a marketing sentence, and they are not the sentences the pages show:
-
Image Studio (
/image): Convert, compress, resize, crop and prepare images on this device. -
Audio Studio (
/audio): Trim and convert local audio with formats checked against your browser. -
File Studio (
/files): Create archives, compare hashes, rename copies and join split files. -
Text Studio (
/text): Clean, compare, convert and inspect text in your browser. -
Data Studio (
/data): View and transform CSV, JSON and YAML without sending data anywhere. -
Icon Studio (
/icons): Make favicon and app-icon files, resize images and work safely with SVG. -
Colour Studio (
/colour): Sample colours, build palettes and check accessible contrast locally.
Two ways to name the same tool
Here is the part worth reading. The registry's tool names are not always the labels on the tab strip. I read the tab labels off the seven live studio pages in a signed-out Chrome session today and compared them with the registry, tool by tool.
- Image, Audio, Files, Text and Icons: identical, 34 names in both lists.
- Data Studio: 9 of the 11 names differ. The registry says "CSV viewer", "Remove duplicates", "Merge CSV", "Split CSV", "CSV to JSON", "JSON formatter", "JSON validator", "JSON to CSV" and "JSON and YAML"; the tabs a visitor clicks read "Viewer", "Duplicates", "Merge", "Split", "To JSON", "Formatter", "Validator", "To CSV" and "YAML". Only "Sort / filter" and "Columns" match.
- Colour Studio: 3 of the 4 names differ. The registry says "Picker & converter", "Contrast & gradient" and "Image sampler"; the tabs read "Picker", "Contrast" and "Image". Only "Palettes" matches.
So the build keeps a full name for every tool and a separate short name for its tab, and for the Data Studio and the Colour Studio the two are almost entirely different strings. If you write automation that drives the tabs by label, the registry names will not match what you have to click.
The app behind the studio id
The registry is not the only place the build names our apps. Two helpers in the same chunk map the NewsFlow app between an internal id and its public path:
function hh(e){return e===`newsflow`||e===`signaldesk`?`signaldesk`:e}
function gh(e){return`/guides/${encodeURIComponent(e===`signaldesk`?`newsflow`:e)}
Read together they mean: internally the app is signaldesk; its guide page lives at /guides/newsflow; and a guide link built from either name resolves to the same public path. The app's public name and its internal id are not the same string.
The same chunk also carries an alias table for the site's legal and pricing pages:
mh=[[`/refunds`,`/terms#payments`],[`/refund-policy`,`/terms#payments`],[`/cancellation`,`/terms#payments`],[`/privacy-policy`,`/terms#privacy`],[`/terms-of-service`,`/terms`],[`/pricing`,`/plans`],[`/contact`,`/terms#law-and-contact`]]
So /terms-of-service and /terms are the same page, /pricing and /plans are the same page, and /contact resolves to /terms#law-and-contact. The alias table sits in the same chunk as the studio registry, one variable away, so the same bundle carries both the site's route aliases and its studio names.
Where the summaries do and do not appear
The home page's own served HTML (HTTP 200, 18592 bytes) contains all seven of those sentences - the registry is not only in the JavaScript, it is also printed into the home document. The /studios index answers HTTP 301 with a 29-byte body (a redirect), so there was nothing in that response to read.
What I did not do
- One build, one day, signed out. The registry was read from the public asset we serve, not from a source repository.
- I read the tab labels from the rendered pages today, but I did not run any of the 49 tools, so nothing here claims how a tool behaves.
- I checked whether the summary sentences appear in the served HTML of two pages; I did not trace every place they are rendered at runtime.
- I did not look for other places the app is named, so "signaldesk" is what this bundle uses and I am not claiming it is the only internal name in the build.
Links
The Image Studio, if you want to read the tab labels yourself: https://app.onepassapps.com/studios/image?utm_source=devto&utm_medium=post&utm_campaign=studio-registry&utm_content=studio-link
The app guides: https://app.onepassapps.com/guides?utm_source=devto&utm_medium=post&utm_campaign=studio-registry&utm_content=guides-link
Disclosure: I work on OnePassApps - we build these studios, and everything above is a measurement of our own build.
Top comments (0)