diff --git a/packages/web/custom.d.ts b/packages/web/custom.d.ts index 16fa1895c..260049da6 100644 --- a/packages/web/custom.d.ts +++ b/packages/web/custom.d.ts @@ -10,6 +10,11 @@ declare module "*.png" { export default src; } +declare module "*.jpg" { + const src: string; + export default src; +} + declare module "*.css" { const classes: { [key: string]: string }; export default classes; diff --git a/packages/web/src/components/UserGuide/assets/grouping-hierarchy.png b/packages/web/src/components/UserGuide/assets/grouping-hierarchy.png new file mode 100644 index 000000000..855e33fff Binary files /dev/null and b/packages/web/src/components/UserGuide/assets/grouping-hierarchy.png differ diff --git a/packages/web/src/components/UserGuide/assets/grouping-panel.png b/packages/web/src/components/UserGuide/assets/grouping-panel.png new file mode 100644 index 000000000..882b08671 Binary files /dev/null and b/packages/web/src/components/UserGuide/assets/grouping-panel.png differ diff --git a/packages/web/src/components/UserGuide/assets/querying-filters.png b/packages/web/src/components/UserGuide/assets/querying-filters.png new file mode 100644 index 000000000..bacd46c09 Binary files /dev/null and b/packages/web/src/components/UserGuide/assets/querying-filters.png differ diff --git a/packages/web/src/components/UserGuide/assets/querying-results.png b/packages/web/src/components/UserGuide/assets/querying-results.png new file mode 100644 index 000000000..5bbf5c785 Binary files /dev/null and b/packages/web/src/components/UserGuide/assets/querying-results.png differ diff --git a/packages/web/src/components/UserGuide/assets/sharing-url.png b/packages/web/src/components/UserGuide/assets/sharing-url.png new file mode 100644 index 000000000..b65cf5d1d Binary files /dev/null and b/packages/web/src/components/UserGuide/assets/sharing-url.png differ diff --git a/packages/web/src/components/UserGuide/assets/thumbnails.jpg b/packages/web/src/components/UserGuide/assets/thumbnails.jpg new file mode 100644 index 000000000..f8711d1f4 Binary files /dev/null and b/packages/web/src/components/UserGuide/assets/thumbnails.jpg differ diff --git a/packages/web/src/components/UserGuide/content/about.tsx b/packages/web/src/components/UserGuide/content/about.tsx new file mode 100644 index 000000000..1b2c14abe --- /dev/null +++ b/packages/web/src/components/UserGuide/content/about.tsx @@ -0,0 +1,645 @@ +import { Icon } from "@fluentui/react"; +import { kebabCase } from "lodash"; +import * as React from "react"; + +import { GroupSlug, Page, PageSlug, SectionHeading } from "./types"; +import GroupingHierarchy from "../assets/grouping-hierarchy.png"; +import GroupingPanel from "../assets/grouping-panel.png"; +import QueryingFilters from "../assets/querying-filters.png"; +import QueryingResults from "../assets/querying-results.png"; +import SharingUrl from "../assets/sharing-url.png"; +import Thumbnails from "../assets/thumbnails.jpg"; + +export const ABOUT_CONTENT: Page[] = [ + { + slug: PageSlug.Overview, + title: "Overview", + sections: [ + { + heading: "", + body: ( + <> +

+ BioFile Finder (BFF) is a web-based application + designed to enable researchers to explore and manage large-scale + biological imaging datasets and associated files in a consistent and + streamlined way. It enables users to query structured metadata and + seamlessly connect results to associated image assets. +

+

+ Built to handle complex, high-volume data, BioFile Finder supports + advanced search, filtering, and sorting—making it easier to access, + curate, collaborate on, and share datasets. The intuitive interface + requires no coding, allowing users to quickly preview data through + thumbnails, open files in common industry tools, or visualize them in + the companion web-based 3D volume viewer, Vol-E. +

+ + ), + }, + { + heading: "Publication & citation", + body: ( + <> +

+ + Read the BFF publication in Nature Methods. + +

+

+ Meharry, S.L., Borensztejn, A., Gaudreault, N. et al. Search, organize, + aggregate and share image data with BioFile Finder (BFF). Nat Methods + (2026). +
+ https://doi.org/10.1038/s41592-026-03130-w +

+ + ), + }, + { + heading: "Who is BFF for?", + body: ( + <> +

+ BFF is designed for anyone who needs to explore and manage large + collections of biological files, especially those associated with + imaging datasets. It is particularly useful for: +

+ +

+ + Read detailed scenarios and use cases + +

+ + ), + }, + { + heading: "What makes BFF unique?", + body: ( + <> +

+ A number of thoughtful features set BFF apart from other similar tools. + Key differentiators include: +

+
+
+ No infrastructure +
BFF works entirely without a server, enabling users to + explore and share datasets instantly without setup, deployment, or + IT support. +
+
+ Querying power +
BFF's in-browser query system gives full SQL control + over arbitrary user-supplied metadata. No other tool in this space + does that client-side, without a backend. +
+
+ Format agnostic +
BFF treats metadata as data (Parquet/CSV), not tied to any + specific image format. By contrast, OMERO is deeply tied to + Bio-Formats, and tools like SSBD and Zarrcade are tied to specific + formats like OME-Zarr. +
+
+ Sharing +
BFF's URL-encoded query state is unique. Most tools + either require server access or only share static links to datasets + — BFF shares the exact filtered and sorted view as a URL anyone can + open instantly. +
+
+ + ), + }, + { + heading: "BFF and related tools", + body: ( + <> +

+ BioFile Finder is interoperable with many different tools and data + repositories. The following table compares BFF amongst some data + repositories, but is intended to be used as a companion to these rather + than outright replacement. For more information on how BFF can be used + with a data repository, see{" "} + + Cloud storage examples + + . +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureBioFile Finder (BFF)OMEROIDRSSBDZarrcadeBioImage Archive (BIA)QuiltCytomineBisQue
+ Cost + FreeFree, but deployment may costFreeFreeFreeFreeFree, but deployment may costFreeFree
+ Deployment + + Available at bff.allencell.org or can be self-hosted + Self-hostedAvailable at idr.openmicroscopy.orgAvailable at ssbd.riken.jpSelf-hostedAvailable at ebi.ac.uk/bioimage-archive + Available at quiltdata.com or can be self-hosted + Self-hostedSelf-hosted
+ File Format Support + Any file type; Parquet, CSV, JSON metadata150+ microscopy formats via Bio-FormatsSame as OMEROOME-Zarr, BD5/HDF5OME-Zarr onlyAny bioimaging formatAny file typeTIFF, whole-slide imagesMany image formats
+ Metadata Source + User-supplied files (Parquet/CSV)Separately managed databaseSeparately managed databaseSeparately managed databaseUser-supplied files (Parquet/CSV)Separately managed databaseUser-supplied files (Parquet/CSV)Separately managed databaseSeparately managed database
+ File Source + Local, network, cloud, or public repositoriesInternal data storeInternal data storeInternal data storeInternal data storeInternal data storeS3Internal data storeInternal data store
+ Dynamic Querying / Filtering + + Yes — in-browser SQL via DuckDB; filter, sort, group + by any column + Yes — HQL/API queries; filter by tag/key-valueLimited — browse by study, screen, geneLimited — browse by organism/studyNo — browse/list onlyLimited — search by study/accessionLimited — search by package nameYes — ontology-based spatial queriesYes — tag-based queries
+ Annotation Hierarchy / Grouping + + Yes — user-defined nested grouping by any annotation + Partial — tag groups, datasets, projectsNoNoNoNoNoPartial — project/folder hierarchyPartial — tag hierarchy
+ Shareable URLs / Copy-Paste Sharing + Yes — query state encoded in URL + Partial — links to images/datasets, requires server + access + Yes — public stable URLs per studyYes — public DOI-based URLsYes — public URLs to Zarr storesYes — accession-based URLsYes — versioned package URLsPartial — project links, requires loginPartial — resource links, requires server
+ Works Without a Server + + Yes — runs entirely in-browser or as desktop app + No — requires OMERO.serverN/A (hosted service)N/A (hosted service)Yes — static siteN/A (hosted service)No (SaaS)No — requires serverNo — requires server
+ Cloud / Remote Data + Yes — S3, HTTP/HTTPS URLsYes — via OMERO.server with S3 backendN/AN/AYes — any HTTP-hosted ZarrN/AYes — S3-backedLimitedLimited
+ Data Scale + Tested to 10M+ rows; limited by browser memoryMillions of images (server-dependent)~50 TB across studiesModerate (curated datasets)Unlimited (just a catalog)Petabyte-scale archivePackage-size dependentLarge histopathology imagesModerate
+ Image Viewing + Thumbnails; delegates to external viewers + Built-in multi-dimensional viewer (OMERO.web, + OMERO.figure) + Built-in viewer (idr.openmicroscopy.org)Built-in 3D/4D viewerLinks to external Zarr viewers (e.g. Vizarr)Links to BioStudies viewerBuilt-in preview for some typesBuilt-in annotation/viewerBuilt-in multi-dim viewer
+ User Annotations / Editing + Yes — add/edit metadata columns in-browserYes — key-value pairs, tags, ratings, ROIsNo (read-only)No (read-only)No (read-only)No (submission-based)Yes — package metadataYes — spatial annotations, ontology termsYes — tags, gobjects
+ Programmatic API + DuckDB SQL in-browser; no REST API needed + Full REST + JSON API; Python (omero-py), Java, CLI + REST API (same as OMERO)REST APINone (static JSON)REST API (BioStudies)Python SDK, REST APIREST API, Python clientREST API, Python/MATLAB
+ Multi-User / Auth + No — single-user local toolYes — LDAP, groups, permissionsPublic (no auth)Public (no auth)Public (no auth)Submission requires loginYes — teams, RBACYes — LDAP, project rolesYes — user/group permissions
+ Primary Use Case + + Explore & filter large tabular file metadata; + share queries via URL + + Manage, view & annotate microscopy data for a + lab/institute + Publish & browse reference image datasetsShare quantitative bio-dynamics dataDiscover & link to OME-Zarr datasetsArchive & publish bioimaging dataVersion & share data packages + Collaborative image annotation (pathology, etc.) + Manage & analyze diverse bio-images
+ License + MITAGPL v3N/A (hosted)N/A (hosted)MITN/A (hosted)Apache 2.0Apache 2.0BSD
+
+
+ + ), + }, + ], + }, + + { + slug: PageSlug.FeatureHighlights, + title: "Feature highlights", + intro: + "BioFile Finder (BFF) packs a lot of capability into a serverless, browser-based tool. Here is an overview of its key features.", + sections: [ + { + heading: "Powerful in-browser querying", + body: ( + <> +

+ BFF uses{" "} + + DuckDB + {" "} + — a high-performance analytical SQL engine — to run queries entirely in + your browser. No server, no backend, no credentials required. Filter, + sort, and search across millions of rows of metadata instantly. +

+ +
+ Filter panel showing active filters: Drug Label equals Staurosporine, Structure equals Microtubules, Treatment Group equals Drug, with Treatment Group sorted ascending + File list showing Microtubules folder with two files visible, Treatment Group column sorted ascending +
+ + ), + }, + { + heading: "Dynamic grouping & hierarchy", + body: ( + <> +

+ Group files by any combination of metadata columns to create a navigable + folder-like hierarchy — without moving or reorganizing your actual + files. Switch grouping strategies instantly to explore different + dimensions of your dataset. +

+ +
+ Group by panel showing four nested grouping levels: Structure, Drug Label, Drug Concentration, and Timepoint + File list showing a multi-level folder hierarchy expanded under Microtubules > Staurosporine > 0.5 > 2, revealing individual files +
+ + ), + }, + { + heading: "Sharing", + body: ( + <> +

+ Sharing is one of BFF's most powerful and distinctive features. + Every filter, sort, grouping, and column layout you configure is encoded + directly into the URL. Copy the link and share it — anyone who opens it + sees exactly the same view of the data, without re-running any queries, + sending files, or setting anything up. +

+

+ This makes BFF uniquely suited for collaborative research and open + science: +

+ +

+ Most tools in this space either require server access to share data or + only link to a static dataset. BFF shares the exact filtered, sorted, + grouped view — making it a powerful tool for transparent and + reproducible science. +

+ Browser URL bar showing a BFF link with filters, groupings, and query state encoded as URL parameters + + ), + }, + { + heading: "Thumbnail previews", + body: ( + <> +

+ BFF renders thumbnail previews for files in your dataset so you can + visually scan your data without opening each file individually. + Thumbnails appear inline in the file list and update dynamically as you + filter and group. +

+ + Thumbnail grid view showing a Golgi folder with 72 files, each displaying a rendered microscopy image thumbnail + + ), + }, + { + heading: "Viewer integrations", + body: ( + <> +

+ BFF connects directly to a variety of image viewers — web-based and + desktop. Select any file and open it in the viewer best suited for its + format and your workflow. +

+ +

+ + See the image viewer comparison table + +

+ + ), + }, + ], + }, +]; diff --git a/packages/web/src/components/UserGuide/content/app-information.tsx b/packages/web/src/components/UserGuide/content/app-information.tsx new file mode 100644 index 000000000..b487acded --- /dev/null +++ b/packages/web/src/components/UserGuide/content/app-information.tsx @@ -0,0 +1,391 @@ +import { Icon } from "@fluentui/react"; +import * as React from "react"; + +import { Page, PageSlug, SectionHeading } from "./types"; + +export const APP_INFORMATION_CONTENT: Page[] = [ + { + slug: PageSlug.Specifications, + title: "Specifications", + intro: "Technical specifications for BioFile Finder (BFF).", + sections: [ + { + heading: "File size and format compatibility", + body: ( + <> +

+ BFF ingests metadata about biological files (a dataset), not the files + themselves. This metadata is intended to be tabular and can be stored as + the following formats: +

+ +

+ Information on file size limitations coming soon. +

+

Files referenced by dataset

+

+ Limitations around the files tracked within BFF are imposed by the + applications BFF links to for that given file. For example, FIJI will + only work with the files that it supports. BFF itself is agnostic to the + file types and sizes referenced in a dataset. +

+ + ), + }, + { + heading: "Browser and device compatibility", + body: ( + <> +

+ For best performance and compatibility, we recommend using the latest + versions of the following browsers: +

+ +

+ BFF is optimized for desktop use and is not currently designed for + mobile devices. +

+ + ), + }, + { + heading: "Open source", + body: ( +

+ BioFile Finder is open-source and free to use. You can find the code, report + issues, and contribute on{" "} + + GitHub + + . +

+ ), + }, + ], + }, + + { + slug: PageSlug.SupportedViewers, + title: "Supported viewers", + intro: + "BioFile Finder (BFF) links out to a variety of image viewers. Use the information below to choose the right one for your work.", + sections: [ + { + heading: "Decision guide", + body: ( + <> +

+ File format will heavily limit viewer options, but when multiple options + are feasible, the following information may help guide your decision. +

+ + + ), + }, + { + heading: SectionHeading.ViewerTable, + body: ( + <> +

+ The following table offers comparisons between various supported + viewers. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureVol-EAGAVEFIJI / ImageJNeuroglancerOME NGFF ValidatorBrowser (web)SimulariumVolView
+ Type + Web-based 3D volume viewerDesktop GPU-accelerated volume rendererDesktop image analysis suiteWeb-based volumetric viewerWeb-based validation toolNative file previewWeb-based simulation viewerWeb-based 3D volume viewer
+ Platform + Web app (browser)Desktop (Windows, macOS, Linux)Desktop (Windows, macOS, Linux)Web app (browser)Web app (browser)Desktop (OS-native)Web app (browser)Web app (browser)
+ Installation required + NoYes (standalone app)Yes (Java-based)NoNoNo (built into OS)NoNo
+ Cost + Free / open-sourceFree / open-sourceFree / open-sourceFree / open-sourceFree / open-sourceFree (bundled with OS)Free / open-sourceFree / open-source
+ Primary use case + + Interactive 3D volume rendering of microscopy data + + High-quality cinematic 3D rendering and path tracing + + General-purpose image analysis, measurement, and + processing + + Explore large-scale connectomics / volumetric neuro + datasets + + Validate OME-Zarr/NGFF file structure and metadata + compliance + Quick preview of standard image/video files + Visualize agent-based biological simulations over + time + + Clinical and research DICOM/volume visualization +
+ Supported formats + OME-Zarr, TIFF, OME-TIFF + OME-TIFF, TIFF, CZI, LIF, and other microscopy + formats + 100+ formats via Bio-FormatsPrecomputed, N5, Zarr, NIFTIOME-Zarr (NGFF) onlyJPEG, PNG, TIFF, MP4, PDF (OS-dependent)Simularium, CytoSim, ReaDDy, SmoldynDICOM, NIFTI, MHA, VTI, NRRD, Zarr
+ 3D volume rendering + Yes — real-time ray marchingYes — GPU path tracing, cinematic qualityLimited — 3D Viewer pluginYes — multi-scale, GPU-acceleratedNoNoYes — 3D agent trajectories and meshesYes — GPU-accelerated ray casting
+ Multi-channel support + YesYesYesYesValidates channel metadataNoN/AYes
+ Time series / 4D + YesYesYesLimitedValidates time dimension metadataNoYes — primary featureLimited
+ Large data / streaming + Yes — streams OME-Zarr from cloud/HTTPNo — loads full volume into GPU memoryLimitedYes — designed for petascaleValidates metadata onlyNoStreams from URLYes — progressive loading
+ Cloud / remote data + Yes — HTTP/S3 URLsNo — local files onlyLimitedYes — GCS, S3, HTTPYes — validates remote URLsNoYesYes
+ Collaborative / sharing + Shareable URL with view stateNoNoYes — URL encodes full view stateShareable validation URLNoShareable URLShareable URL via hosted instance
+ Best for + + Quick interactive exploration of cloud-hosted + OME-Zarr volumes + + High-quality figures and movies of 3D microscopy + data + Comprehensive image analysis and scripting + Browsing terabyte+ volumetric datasets in the cloud + Checking OME-Zarr files before sharingQuickly previewing a standard image file + Viewing and sharing spatiotemporal biological + simulations + + Medical/research volumes with clinical-style tools +
+ Limitations + No analysis tools; limited format supportRequires dedicated GPU; local files only + Basic 3D rendering; struggles with very large + datasets + + Steep learning curve; specific pre-tiled formats + only + Validation only; OME-Zarr onlyNo scientific image capabilitiesSimulation data onlyLimited microscopy format support
+
+
+ + ), + }, + ], + }, +]; diff --git a/packages/web/src/components/UserGuide/content/getting-started.tsx b/packages/web/src/components/UserGuide/content/getting-started.tsx new file mode 100644 index 000000000..7c5708cbb --- /dev/null +++ b/packages/web/src/components/UserGuide/content/getting-started.tsx @@ -0,0 +1,1073 @@ +import { Icon } from "@fluentui/react"; +import { kebabCase } from "lodash"; +import * as React from "react"; + +import { GroupSlug, Page, PageSlug, SectionHeading } from "./types"; + +type CsvValue = string | number | boolean | null | undefined; + +const quoteCsvValue = (value: CsvValue): string => { + const normalized = value == null ? "" : String(value); + const escaped = normalized.replace(/"/g, '""'); + return /[",\n\r]/.test(escaped) ? `"${escaped}"` : escaped; +}; + +const createCsvDataUri = (rows: CsvValue[][]): string => { + const csv = rows.map((row) => row.map(quoteCsvValue).join(",")).join("\n"); + return `data:text/csv;charset=utf-8,${encodeURIComponent(csv)}`; +}; + +const renderUgTable = (rows: CsvValue[][]): React.ReactElement | null => { + if (rows.length === 0) { + return null; + } + + const [headerRow, ...bodyRows] = rows; + + return ( + + + + {headerRow.map((headerCell, index) => ( + + ))} + + + + {bodyRows.map((row, rowIndex) => ( + + {row.map((cell, cellIndex) => ( + + ))} + + ))} + +
+ {headerCell == null ? "" : String(headerCell)} +
+ {cell == null ? "" : String(cell)} +
+ ); +}; + +const BASIC_METADATA_EXAMPLE_ROWS: CsvValue[][] = [ + ["File Path", "Well", "Gene", "Fluorophore"], + ["Abc123.txt", "B3", "CDH2", "EGFP"], + ["Def456.txt", "G9", "VIM", "Alexa Fluor 405"], +]; + +const REMBI_TEMPLATE_ROWS: CsvValue[][] = [ + [ + "Study type", + "Study description", + "General dataset info", + "Imaging method", + "Study component description", + "Identity", + "Biological entity", + "Organism", + "Intrinsic variable", + "Extrinsic variable", + "Experimental variables", + "Experimental status", + "Location within Biosample", + "Preparation method", + "Signal/contrast mechanism", + "Channel - content", + "Channel - biological entity", + "Instrument attributes", + "Image acquisition parameters", + "Type", + "Format & compression", + "Dimension extents", + "Size description", + "Pixel/voxel size description", + "Channel information", + "Image processing method", + "Contrast inversion to TEM", + "QC info", + "Spatial and temporal alignment", + "Fiducials used", + "Transformation matrix/other info", + "Related images and relationship", + "Analysis result type", + "Data used for analysis", + "Analysis method and details", + ], +]; + +const FOUNDING_GIDE_TEMPLATE_ROWS: CsvValue[][] = [ + [ + "Metadata Field", + "Study Description", + "Authors", + "Organization", + "Publication", + "License", + "Release Date", + "Imaging Method", + "Cell Line", + "Organism", + "Gene", + "Compound", + "Antibody", + "Channel - Content", + "Channel - Biological Entity", + "Instrument", + "Dimension", + "Pixel/Voxel Size / Time resolution", + "Study Unique ID", + "Dataset Unique ID", + "Pathology/Disease (Biological Entity)", + "Phenotype (Analysis Data)", + "Organ", + "Analyzed Data", + ], +]; + +const COLUMN_DESCRIPTIONS_EXAMPLE_ROWS: CsvValue[][] = [ + ["Column Name", "Description", "Type"], + ["Metadata Field", "Name of the metadata attribute being described", ""], + ["Study Description", "Summary of the study's purpose, design, and scope", ""], + ["Publication", "Associated publication or DOI describing the dataset", "Open file link"], + [ + "Analyzed Data", + "Link to derived or processed data (e.g., segmentation, features)", + "Open file link", + ], + ["Authors", "List of contributors to the dataset or study", ""], + ["Organization", "Institution or organization responsible for the dataset", ""], + ["License", "Usage license governing the dataset (e.g., CC-BY)", ""], + ["Release Date", "Date the dataset was made publicly available", ""], + ["Imaging Method", "Microscopy or imaging modality used (e.g., confocal, light-sheet)", ""], + ["Cell Line", "Cell line used in the experiment", ""], + ["Organism", "Species from which the sample was derived", ""], + ["Gene", "Gene(s) of interest or manipulated in the experiment", ""], + ["Compound", "Chemical compound or treatment applied", ""], + ["Antibody", "Antibody used for staining or detection", ""], + ["Channel - Content", "Imaging channel identifier or label (e.g., Channel 1, GFP)", ""], + [ + "Channel - Biological Entity", + "Biological structure or molecule represented in the channel", + "", + ], + ["Instrument", "Microscope or imaging instrument used", ""], + ["Dimension", "Dimensionality of the dataset (e.g., 2D, 3D, time series)", ""], + [ + "Pixel/Voxel Size / Time resolution", + "Spatial or temporal resolution of the imaging data", + "", + ], + ["Study Unique ID", "Unique identifier for the overall study", ""], + ["Dataset Unique ID", "Unique identifier for a specific dataset within the study", ""], + ["Pathology/Disease", "Disease or pathological condition represented", ""], + ["Phenotype", "Observed or computed phenotype from analysis", ""], + ["Organ", "Organ or tissue source of the sample", ""], +]; + +const PROVENANCE_SIMPLE_EXAMPLE_ROWS: CsvValue[][] = [ + ["Child", "Relationship", "Parent", "Child Type", "Parent Type", "Relationship Type"], + ["WellID", "is well in", "PlateID", "entity", "entity", ""], + ["ColonyImage", "is image acquired from", "WellID", "file", "entity", ""], + ["SegmentationImage", "segmentation_algorithm_v1", "ColonyImage", "file", "file", "pointer"], +]; + +export const GETTING_STARTED_CONTENT: Page[] = [ + { + slug: PageSlug.SetupOverview, + title: "Setup overview", + intro: + "BioFile Finder (BFF) works by connecting a metadata file that you provide to the files you want to explore. Rather than ingesting image data directly, BFF reads this metadata file that describes your dataset and references the files you want to access (image files, commonly). Once loaded, BFF turns that metadata into an interactive interface for filtering, grouping, searching, previewing, and sharing files.", + sections: [ + { + heading: "Basic setup", + body: ( + <> +

1. Create a metadata file

+

+ Prepare a metadata file describing the files in your dataset. The + metadata file can be provided as CSV, Parquet, or JSON. Each row + typically represents a file, while columns contain metadata such as: +

+ +

+ See:{" "} + + Creating a metadata file + + ,{" "} + + Metadata guidance + +

+ +

2. Reference your files

+

+ Your metadata file must include file paths or URLs pointing to the files + you want BFF to access. Those files can live: +

+ +

+ BFF is storage agnostic and does not require files to be moved into a + proprietary system. +

+

+ See:{" "} + + Storage options + + ,{" "} + + Viewer compatibility + +

+ +

3. Load the metadata file into BFF

+

Open BFF and either:

+ +

+ Once loaded, BFF allows you to filter and search metadata, group files + dynamically, preview and open files in compatible viewers, and share + exact dataset views via URL. +

+ + ), + }, + { + heading: "Minimum requirements", + body: ( + <> +

To use BFF, you only need:

+ +

No backend, database, or server infrastructure is required.

+ + ), + }, + { + heading: "Common workflows", + body: ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GoalTypical setup
Personal / local explorationLocal dataset + local files
Shared lab datasetHosted dataset + shared storage
Public publication companionHosted dataset + public cloud storage
Large-scale datasetsParquet + cloud storage
Metadata validation / QCDataset + metadata descriptor file
File lineage / relationship trackingDataset + provenance file
+ ), + }, + { + heading: "Recommended setup", + body: ( + <> +

Sharing data publicly

+

+ If data is intended to be publicly shared — like in a publication — + store the dataset and files referenced in the dataset in{" "} + + cloud storage + {" "} + to enable readers to explore the dataset and its files via a sharable + BFF link (URL). +

+

+ Note: You can use BFF as a way to circumvent having to publish all files + by publishing only the metadata file and instructing readers to request + files directly. This allows viewers to see metadata about every file in + the dataset without you paying for full cloud storage of each file. + Building on this approach, you can host thumbnails of each file so + readers can get a preview without you paying for full-resolution images + to live in the cloud. +

+ +

Dataset best practices

+ + + ), + }, + ], + }, + + { + slug: PageSlug.CreatingADatasetMetadataFile, + title: "Creating a metadata file", + intro: + "A metadata file is a structured file that describes your dataset and tells BioFile Finder where to find the files you want to explore. Metadata files can be provided in CSV, Parquet, or JSON format.", + sections: [ + { + heading: "Structure of a metadata file", + body: ( + <> +

+ A metadata file is organized as a table where each row typically + represents a file in your dataset and each column represents a metadata + field describing that file, such as a file path, experimental condition, + sample identifier, or other annotation. The structure is flexible—aside + from the required columns, you can define metadata fields that best + support your workflow. +

+

+ + See Specifications + {" "} + for more details. +

+ + ), + }, + { + heading: "Rows and columns", + body: ( + <> +

Rows

+

+ Each row typically represents a file you want BioFile Finder to explore. + Files can be stored locally, on network-attached storage, in cloud + storage, or in public repositories. +

+

+ Advanced workflows may reference multiple files from a single row or + reference the same file across multiple rows. +

+

Columns

+

+ Columns can be anything that describes metadata fields relevant to your + workflow. The only exceptions are the required column described below, + and a few special optional columns that, if provided, enable special + features in BFF. +

+ + ), + }, + { + heading: "Required columns", + body: ( + <> +

This column is required for BFF to locate and open your files.

+ + + ), + }, + { + heading: "Optional special columns", + body: ( + <> +

These optional columns enable specific features in BFF when provided.

+ + + ), + }, + { + heading: SectionHeading.MetadataFileExamples, + body: ( + <> +

Basic example

+

+ Each row is a file. Columns can be anything meaningful to your workflow + — here a well position, gene target, and fluorophore. +

+ {renderUgTable(BASIC_METADATA_EXAMPLE_ROWS)} +

+ + Download this example as CSV{" "} + + +

+

+ Browse open-source datasets +

+

Full metadata guidance

+

+ Visit{" "} + + Metadata guidance + {" "} + for a full description of recommended metadata practices, including more + CSV examples and templates. +

+ + ), + }, + { + heading: "Advanced capabilities (optional)", + body: ( + <> +

BFF supports:

+ + + ), + }, + ], + }, + + { + slug: PageSlug.MetadataGuidance, + title: "Metadata guidance", + intro: + "Clear, consistent metadata is what turns microscopy data from a static file into something others can actually find, interpret, and reuse. This section outlines recommended metadata practices that support sharing datasets in a way that is both accessible and meaningful to a broad audience — from collaborators to future researchers. Rather than prescribing a rigid standard, the guidance focuses on capturing the essential context needed to understand how the data was generated, how it is structured, and how it can be used. Our hope is that by following these suggestions, you can make your data easier to explore, visualize, and integrate into downstream analyses, while reducing ambiguity and the need for follow-up clarification.", + sections: [ + { + heading: "Recommendations", + body: ( + <> +

REMBI

+

+ REMBI (Recommended Metadata for Biological Images), published in{" "} + + Nature Methods in 2021{" "} + + + , was among the first community-driven efforts to establish a practical + and modality-independent framework for describing biological imaging + experiments. Rather than prescribing a rigid file format, REMBI defines + a structured metadata model organized into a series of logical modules + that capture the complete context of an imaging study, including + study-level information, biological samples, specimen preparation, image + acquisition parameters, image data, image correlations, and image + analysis outputs. The framework was designed to support both light and + electron microscopy and to align with FAIR data principles by ensuring + that image datasets remain interpretable, reproducible, and reusable + long after their original publication. +

+

+ + Download REMBI-based template{" "} + + +

+

FoundingGIDE

+

+ The following interpretation of the{" "} + + FoundingGIDE{" "} + + {" "} + metadata guidelines is a CSV template created to operationalize a + minimal, harmonized metadata schema that enables interoperability across + bioimaging data resources. Because imaging datasets are generated and + stored using diverse, often incompatible metadata models, they are + difficult to integrate with other datasets and reuse across + repositories. FoundingGIDE addressed this by defining a shared set of + metadata fields, grounded in common ontologies, that can be consistently + applied across studies. This template translates those recommendations + into a simple, spreadsheet-based format supporting cross-repository + discovery, FAIR data principles, and integration of datasets into a + broader global image data ecosystem. +

+

+ Fields included: Metadata Field, Study Description, Authors, + Organization, Publication, License, Release Date, Imaging Method, Cell + Line, Organism, Gene, Compound, Antibody, Channel — Content, Channel — + Biological Entity, Instrument, Dimension, Pixel/Voxel Size / Time + resolution, Study Unique ID, Dataset Unique ID, Pathology/Disease, + Phenotype, Organ, Analyzed Data. +

+

+ + Download FoundingGIDE template CSV{" "} + + +

+

+ See example descriptions for these fields in{" "} + + Describing columns in your dataset + + . +

+ + ), + }, + ], + }, + + { + slug: PageSlug.DescribingColumns, + title: "Describing columns in your dataset", + intro: + "Providing descriptions for columns in your datasets helps collaborators and readers understand the meaning of each column, especially when column names are abbreviated or use internal lab terminology.", + sections: [ + { + heading: "Providing column descriptions", + body: ( + <> +

+ BFF can display tooltips that describe the columns in your dataset if + provided an additional file, referenced as a{" "} + “metadata descriptor file” in the app. This + file must contain three columns: +

+ +

Example

+ {renderUgTable(COLUMN_DESCRIPTIONS_EXAMPLE_ROWS)} +

+ + Download this example as CSV{" "} + + +

+ + ), + }, + ], + }, + + { + slug: PageSlug.NestingMetadataColumns, + title: "Nesting metadata columns", + intro: + "BFF supports nested metadata columns — columns that contain structured or repeated sub-fields within each row. This is useful when a single file has multiple related attributes grouped together, such as multiple treatment conditions, multiple imaging channels, or multiple wells associated with one image.", + sections: [ + { + heading: "Why use nested metadata?", + body: ( + <> +

+ Traditional flat metadata tables work well when each file has a single + value for each attribute. But many experiments produce files associated + with several related values — for example, a plate image taken under + multiple drug doses, or a segmentation file linked to multiple cell + lines. Repeating those values across separate rows (one row per + condition) means losing the file-level grouping. Putting all values in a + single comma-separated string in one column makes filtering and sorting + unreliable. +

+

Nested metadata columns solve both problems by letting you:

+ + + ), + }, + { + heading: "Supported nesting types", + body: ( + <> +

BFF supports two kinds of nested columns:

+ +

+ Sub-fields appear in BFF as dotted annotation names —{" "} + Well.Dose or Microscope.Objective. You can + filter, sort, and group on any sub-field, and the full nested structure + is preserved when you download a metadata manifest. +

+ + ), + }, + { + heading: "Formatting nested metadata in Parquet", + body: ( + <> +

+ Parquet is the recommended format for nested metadata because it + natively stores STRUCT and STRUCT[] columns with full type information. + No additional configuration is needed — BFF reads the schema + automatically. +

+

+ The following Python example (using{" "} + + pandas + {" "} + and{" "} + + pyarrow + + ) creates a dataset with a STRUCT column (Microscope) and a + STRUCT[] column (Well): +

+
+                            {`import pandas as pd
+import pyarrow as pa
+import pyarrow.parquet as pq
+
+# Each row is a file.
+# "Microscope" is a plain STRUCT (one value per row).
+# "Well" is a STRUCT[] (multiple wells per row).
+data = [
+    {
+        "File Path": "/data/img_001.tif",
+        "Microscope": {"Model": "Zeiss LSM 980", "Objective": "40x"},
+        "Well": [
+            {"Position": "B3", "Dose": 0.5, "Cell Line": "HeLa"},
+            {"Position": "B4", "Dose": 1.0, "Cell Line": "HeLa"},
+        ],
+    },
+    {
+        "File Path": "/data/img_002.tif",
+        "Microscope": {"Model": "Leica SP8", "Objective": "63x"},
+        "Well": [
+            {"Position": "G9", "Dose": 2.0, "Cell Line": "U2OS"},
+        ],
+    },
+]
+
+# Define the explicit Parquet schema
+schema = pa.schema([
+    pa.field("File Path", pa.string()),
+    pa.field("Microscope", pa.struct([
+        pa.field("Model", pa.string()),
+        pa.field("Objective", pa.string()),
+    ])),
+    pa.field("Well", pa.list_(pa.struct([
+        pa.field("Position", pa.string()),
+        pa.field("Dose", pa.float64()),
+        pa.field("Cell Line", pa.string()),
+    ]))),
+])
+
+table = pa.Table.from_pylist(data, schema=schema)
+pq.write_table(table, "dataset.parquet")`}
+                        
+

+ Once loaded into BFF, annotations like Well.Position,{" "} + Well.Dose, and Microscope.Objective will + appear in the annotation picker and can be used for filtering, grouping, + and sorting. +

+ + ), + }, + { + heading: "Formatting nested metadata in JSON", + body: ( + <> +

+ In JSON, nested columns are expressed as objects (for STRUCT) or arrays + of objects (for STRUCT[]) within each row. The structure of the example + above expressed in JSON: +

+
+                            {`[
+  {
+    "File Path": "/data/img_001.tif",
+    "Microscope": { "Model": "Zeiss LSM 980", "Objective": "40x" },
+    "Well": [
+      { "Position": "B3", "Dose": 0.5, "Cell Line": "HeLa" },
+      { "Position": "B4", "Dose": 1.0, "Cell Line": "HeLa" }
+    ]
+  },
+  {
+    "File Path": "/data/img_002.tif",
+    "Microscope": { "Model": "Leica SP8", "Objective": "63x" },
+    "Well": [
+      { "Position": "G9", "Dose": 2.0, "Cell Line": "U2OS" }
+    ]
+  }
+]`}
+                        
+

+ BFF infers the schema from the JSON structure. Rows where a nested field + is absent or null will have no value for that annotation. +

+ + ), + }, + { + heading: "Nested metadata in CSV", + body: ( + <> +

+ CSV does not natively support nested or repeated values. If your source + data is in CSV and you need nested metadata, convert it to Parquet or + JSON first (for example, using pandas as shown above). +

+

+ If you load a CSV that was originally exported from BFF with nested + columns, the nested values will be serialized as strings. BFF will treat + those as plain text and will not reconstruct the nested structure. +

+ + ), + }, + { + heading: "Date and datetime sub-fields", + body: ( +

+ Date and datetime values inside nested columns are fully supported. Store + them as pa.date32() or{" "} + pa.timestamp("ms") in Parquet, or as ISO 8601 strings + (e.g., "2025-01-10") in JSON. BFF will recognize the + type from the schema and enable date-range filters on those sub-fields. +

+ ), + }, + { + heading: "Tips", + body: ( + + ), + }, + ], + }, + + { + slug: PageSlug.FileAndMetadataProvenance, + title: "Describing file and metadata relationships", + intro: + 'Information about how files relate to each other or to different pieces of metadata can be provided via an additional file called a "Provenance file". Provenance in BioFile Finder (BFF) can describe relationships between files, between a file and a piece of metadata, and between two pieces of metadata.', + sections: [ + { + heading: "Where to provide the provenance file", + body: ( +

+ In BFF, open the data source panel by clicking the dataset name at the top + of the app. At the bottom of that panel you will find an optional field + labeled "Provenance file". Paste the URL or drag + in the file there to load it alongside your dataset. +

+ ), + }, + { + heading: "Provenance file format", + body: ( + <> +

The provenance file should contain 6 columns:

+ +

Simple example

+ {renderUgTable(PROVENANCE_SIMPLE_EXAMPLE_ROWS)} + +

+ + Download this example{" "} + + +

+ + ), + }, + { + heading: "Why provenance matters", + body: ( + <> +

+ Provenance is especially important in microscopy workflows that span + multiple levels of biological organization, such as plates, wells, and + individual image files. Without clear provenance linking each + segmentation file back to its original image, well, and plate context, + it becomes difficult to trace results back to the experimental setup. + Capturing these relationships ensures that derived data products remain + connected to their biological source, enabling validation, + troubleshooting, and reproducibility. +

+

+ In BFF, once a provenance file is loaded, each file row in the file list + will show a relationship indicator. Expanding a row reveals its linked + parent or child entities — for example, given the provenance schema + defined above, clicking a segmentation image will show the colony image + it was derived from and the well it originated in. +

+

+ Provenance is also critical when a single publication draws on images + from multiple datasets. If the origin of each image is not clearly + documented — which dataset it came from, how it was selected, whether it + was processed consistently — readers and collaborators may struggle to + interpret how comparable those images truly are. By maintaining + provenance across datasets, researchers can clearly communicate how + figures were constructed and allow others to navigate back to the full + underlying data for verification or reuse. +

+ + ), + }, + ], + }, +]; diff --git a/packages/web/src/components/UserGuide/content/index.ts b/packages/web/src/components/UserGuide/content/index.ts index e4ea9d777..f1f7bbecf 100644 --- a/packages/web/src/components/UserGuide/content/index.ts +++ b/packages/web/src/components/UserGuide/content/index.ts @@ -1,9 +1,36 @@ +// Content is split into per-section files to keep each file focused and reviewable. +// To add a new page: add its entry to the relevant section file. + export type { NavigationGroup, Page } from "./types"; +import { ABOUT_CONTENT } from "./about"; +import { APP_INFORMATION_CONTENT } from "./app-information"; +import { GETTING_STARTED_CONTENT } from "./getting-started"; import { OTHER_RESOURCES_CONTENT } from "./other-resources"; +import { REAL_WORLD_USE_CASES_CONTENT } from "./real-world-use-cases"; import { GroupSlug, NavigationGroup } from "./types"; export const CONTENT: NavigationGroup[] = [ + { + slug: GroupSlug.About, + title: "About", + pages: ABOUT_CONTENT, + }, + { + slug: GroupSlug.RealWorldUseCases, + title: "Real world use", + pages: REAL_WORLD_USE_CASES_CONTENT, + }, + { + slug: GroupSlug.AppInformation, + title: "App information", + pages: APP_INFORMATION_CONTENT, + }, + { + slug: GroupSlug.GettingStarted, + title: "Getting started", + pages: GETTING_STARTED_CONTENT, + }, { slug: GroupSlug.OtherResources, title: "Other resources", diff --git a/packages/web/src/components/UserGuide/content/real-world-use-cases.tsx b/packages/web/src/components/UserGuide/content/real-world-use-cases.tsx new file mode 100644 index 000000000..d0f0b7e7c --- /dev/null +++ b/packages/web/src/components/UserGuide/content/real-world-use-cases.tsx @@ -0,0 +1,634 @@ +import { Icon } from "@fluentui/react"; +import { kebabCase } from "lodash"; +import * as React from "react"; + +import { Page, PageSlug, SectionHeading } from "./types"; + +export const REAL_WORLD_USE_CASES_CONTENT: Page[] = [ + { + slug: PageSlug.UseCasesAndScenarios, + title: "Use cases & scenarios", + intro: + "BioFile Finder (BFF) is flexible enough to fit many different workflows and contexts. This page highlights common use cases observed across research labs, core facilities, and data teams — along with real-world scenarios showing how different types of users leverage BFF in their work.", + sections: [ + { + heading: "How people use BFF", + body: ( + <> +

+ This table is a summary of known use cases. Read detailed descriptions + below. +

+ + + + + + + + + + + + + + + {/* "Validate metadata" row — temporarily hidden + + + + + + */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Use caseKey BFF actionsProblem BFF solves
+ + + {SectionHeading.ExploreScreeningResults} + + + + Group by plate/treatment; filter by phenotype; share URL + Hours of scripting per query
+ + {SectionHeading.ValidateMetadata} + + + Filter for blanks/duplicates; group to check counts; export + errors + Days of spreadsheet auditing
+ + {SectionHeading.InspectSubsetsOfImages} + + + Multi-filter to exact subset; open in viewer; arrow-key + navigation + Hunting through folders by hand
+ + {SectionHeading.PerformQCOnDatasets} + + + Aggregate counts per group; filter for anomalies; + cross-validate columns + Custom scripts per dataset
+ + {SectionHeading.ManageImageInventory} + + + Host metadata file; browse by any column; shareable filtered + URLs + Building and maintaining a web portal
+ Compare across experimental dimensions + + Pivot/group across multiple metadata axes (e.g., cell line × + staining × condition); rapidly switch views + Rewriting analysis scripts per comparison
+ Collaborative data exploration + + Share filtered views; maintain consistent dataset state + across users; parallel exploration + Back-and-forth file exchange and re-alignment
+ Publish interactive datasets + + Share public BFF links tied to figures; enable readers to + explore full datasets in-browser + Building custom portals or static supplements
+ + ), + }, + { + heading: SectionHeading.ExploreScreeningResults, + level: 3, + body: ( + <> +

+ A high-content screening run produces tens of thousands of images across + hundreds of wells, multiple plates, and several time points. The + pipeline outputs a Parquet or CSV manifest linking each image file to + its well position, compound treatment, concentration, cell line, and + measured phenotype scores. +

+

How BFF helps

+

+ Load the manifest into BFF and immediately group files by Plate > + Treatment > Concentration to see how many images exist at each + condition. Filter to a specific compound and sort by phenotype score to + surface the most interesting wells. Click into a well to see thumbnails + of every image at that position. Share the filtered view with a + colleague by copying the URL — they see exactly the same subset without + re-running any queries. +

+

Alternative use case

+

+ A genomics core runs CRISPR screens and outputs per-guide results as a + CSV. Researchers load it into BFF to filter by gene target, sort by + effect size, and quickly identify which guides to follow up on — without + writing R or Python code. +

+ + ), + }, + /* "Validate metadata" section — temporarily hidden + { + heading: SectionHeading.ValidateMetadata, + level: 3, + body: ( + <> +

+ Before publishing a dataset or submitting to a repository, you need to + confirm that every file has complete, consistent metadata — no missing + cell lines, no mislabeled plates, no blank file paths. +

+

How BFF helps

+

+ Load your metadata file and use BFF's filters to find gaps. Group + by "Cell Line" and look for a blank or "(No value)" + group — those are your missing entries. Sort by "File Path" to + spot duplicates or malformed paths. Filter for rows where + "Treatment" is empty to find unlabeled conditions. Use the + aggregate count at each folder level to verify expected file counts per + condition (e.g., "I should have 96 images per plate — any plate + with fewer has missing data"). Export the problematic subset as a + CSV for correction. +

+

Alternative use case

+

+ A museum digitization team loads their specimen catalog CSV into BFF to + check for records missing accession numbers, blank taxonomic + classifications, or broken file paths to scans — catching errors before + ingesting into their collection management system. +

+ + ), + }, + */ + { + heading: SectionHeading.InspectSubsetsOfImages, + level: 3, + body: ( + <> +

+ You don't want to look at all 50,000 images. You want to look at a + very specific slice — maybe failed QC images, or images from a + particular experimental condition, or everything captured on a specific + date. +

+

How BFF helps

+

+ Apply filters to narrow down to exactly the subset you care about: + "Cell Line = iPSC" AND "Plate = 007" AND "QC + Status = Failed". The file list updates instantly to show only + matching files. Click any file to see its full metadata in the detail + panel. Open the image directly in your preferred viewer (FIJI, AGAVE, + Neuroglancer, or the browser) to visually inspect it. Navigate through + the filtered list with arrow keys to quickly scan through the subset + one-by-one. +

+

Alternative use case

+

+ A pathology lab filters their slide inventory to all H&E-stained + tissue sections from a specific patient cohort and date range, then + opens each in their whole-slide viewer to confirm stain quality before + analysis. +

+ + ), + }, + { + heading: SectionHeading.PerformQCOnDatasets, + level: 3, + body: ( + <> +

+ Quality control means checking that your data is complete and correct + before you build on it — the right number of files, sensible values, + nothing blank, corrupted, or mislabeled. If you've tried to do this + by scrolling through a huge spreadsheet, you know it gets unmanageable + fast — and you shouldn't have to write code or formulas to catch + these problems. +

+

How BFF helps

+

+ Drop your metadata file into BFF and let it do the checking for you — no + scripts, no coding. The aggregate info bar shows your total file count + at a glance. Group by "Plate," then "Well," to see + how many images are in each — any group with fewer than expected jumps + right out. Filter for files where "File Size" is 0 to find + empty or broken files. Sort by "Date Acquired" to make sure + nothing's out of sequence. Group by "Instrument" to + confirm everything came from the microscope you expected. You can even + stack filters to catch labeling mistakes — for example, show only + "Control" plates that aren't labeled "DMSO" — + all by pointing and clicking instead of programming. +

+

Alternative use case

+

+ A lab manager preparing a dataset for publication receives images and a + metadata spreadsheet from a student. Rather than asking a programmer to + write a validation script, they open it in BFF to look for duplicate + sample names, spot rows missing a file path or a label, and confirm + every expected experiment is present — finding and fixing the mistakes + themselves before the data goes out. +

+ + ), + }, + { + heading: SectionHeading.ManageImageInventory, + level: 3, + body: ( + <> +

+ You or your team have accumulated a large collection of files over + months or years. They live across local drives, shared network storage, + or cloud buckets. You have metadata about them — maybe a database + export, maybe a painstakingly maintained spreadsheet — and you need an + easy way to browse, search, and share access to this inventory without + maintaining a server. +

+

How BFF helps

+

+ Export your inventory as a Parquet file (or maintain it as a CSV) with + columns for file path, file name, and any annotations that matter to + your team (project, investigator, organism, imaging modality, date, + etc.). Host the file on a web server, S3 bucket, or just keep it local. + Point BFF at it. Your entire team can now browse the inventory by any + column, search for specific files, and open them directly. Add a source + metadata file to provide human-readable descriptions for each column. + When someone asks "do we have any confocal images of iPSC-derived + cardiomyocytes from 2024?", the answer is three clicks away instead + of a Slack thread. +

+

Alternative use case

+

+ A natural history museum has 200,000 digitized specimen records in a CSV + exported from their collection database. They host a BFF instance on + their website so visiting researchers can browse specimens by taxonomy, + collection site, and date — filtering to exactly the subset relevant to + their study and downloading a manifest of matching file paths. +

+ + ), + }, + { + heading: "Real-world scenarios", + body: ( + <> +

Imaging scientists

+

+ + I have thousands of images and I just want to find the right ones. + +

+

+ You ran a plate screen last week and now need to find every image from + Well A3 treated with Drug X. Your files are scattered across folders, + drives, or cloud storage, with no easy way to search by experimental + conditions. BFF lets you load a spreadsheet of your file metadata and + instantly filter, sort, and group by any column—cell line, treatment, + plate, date, or anything else you need. No coding, no databases, no IT + tickets. Just drag, drop, and find your files. +

+

Computational biologists

+

+ + I want to query millions of files without writing a pipeline to do + it. + +

+

+ You have a Parquet manifest with 10 million rows of imaging metadata. + You need to pull a specific subset for your next analysis run. BFF runs + full SQL queries in your browser via DuckDB—no server, no cluster, no + credentials. Filter by any combination of annotations, copy out the file + paths you need, and get back to your actual work. Share your exact query + with a collaborator by copying the URL. +

+

Data engineers & platform teams

+

+ + I want to give users self-service data access without building a + portal. + +

+

+ Your team maintains the imaging pipeline. Scientists keep asking you to + "just pull all the files where..." and it turns into a JIRA + ticket every time. BFF is a zero-infrastructure frontend: point it at a + Parquet file on S3 or a CSV on a web server and your users can explore, + filter, and export on their own. No backend to deploy, no API to + maintain, no accounts to manage. Host a static web page and you're + done. +

+

Academic facility managers & PIs

+

+ I need to make my shared data actually usable. +

+

+ You run a core imaging facility or oversee a lab generating terabytes of + data. Your shared drive has 50,000 files and a naming convention that + made sense two years ago. BFF turns any metadata spreadsheet into a + searchable, filterable, shareable interface. Publish a dataset with a + BFF link and reviewers, collaborators, or new lab members can explore it + immediately—no software to install, no accounts to create. +

+

GLAM & museum professionals

+

+ I want to make my collection metadata interactive. +

+

+ You have a CSV with 200,000 digitized specimens, each with accession + numbers, taxonomic classifications, collection dates, and file paths to + high-resolution scans. BFF turns that spreadsheet into a browsable, + filterable, groupable interface—right in the browser. Let researchers + explore your collection by species, date range, or geographic origin. + Share a filtered view as a URL. No web developer needed. +

+ + ), + }, + ], + }, + + { + slug: PageSlug.ExampleAICS, + title: "The cell science accelerator at Allen Institute", + intro: + "BioFile Finder (BFF) was used in publication by the cell science accelerator at Allen Institute.", + sections: [ + { + heading: "", + body: ( + <> +

+ + Open publication{" "} + + +
+ + View dataset in BFF{" "} + + +

+

+ In this study on epithelial-to-mesenchymal transition (EMT), the authors + generated a large-scale microscopy dataset consisting of 3,538 3D + Z-stack datasets across 37 experimental conditions, 8 cell lines, and 9 + antibody stainings. BioFile Finder (BFF) was used to organize and + explore this complex dataset without relying on a fixed folder + hierarchy. Instead, BFF enabled dynamic filtering, grouping, and + navigation based on metadata, allowing users to analyze the data across + multiple dimensions (e.g., comparing stainings across cell lines) + without duplicating files. This approach improved collaboration between + experimental and computational researchers, supported parallel analysis + workflows, and reduced friction in large-scale data exploration. + Additionally, BFF was used to share the dataset publicly, enabling + readers to directly access figure-associated data, explore full 3D + timelapse datasets in the browser, and interact with the dataset using + the same flexible metadata-driven framework. +

+

Key takeaways

+
+

+ “Every organizational choice comes at the cost of another. In + other words, every choice is a bad choice.” — Antoine + Borensztejn, author +

+

+ “BioFile Finder (BFF) allowed us to break away from this + constraint entirely.” — Antoine Borensztejn,{" "} + author +

+

+ “We believe this approach sets a new standard for FAIR data + sharing, and will significantly improve the accessibility, + transparency, and reuse of complex biological datasets.” + — Antoine Borensztejn, author +

+
+ + ), + }, + ], + }, + + { + slug: PageSlug.ExampleAIBS, + title: "The brain science accelerator at Allen Institute", + intro: + "BioFile Finder (BFF) was used in publication by the brain science accelerator at Allen Institute.", + sections: [ + { + heading: "", + body: ( + <> +

+ + Open publication{" "} + + +
{" "} + + View dataset in BFF{" "} + + +

+

+ Yoav Ben-Simon from the Allen Institute for Brain Science describes + using BioFile Finder (BFF) as a flexible data management and sharing + platform for imaging datasets related to viral vector targeting in the + brain. BFF was used to organize datasets in a spreadsheet-like + interface, enabling intuitive querying, filtering, and restructuring of + data without requiring custom software development. The tool allowed + users to quickly create and curate datasets, organize them + hierarchically based on relevant features, and visualize grouped image + sets with thumbnails. This significantly lowered the barrier to entry + for data management and sharing, enabling non-engineers to deploy and + share datasets via simple links rather than building dedicated web + interfaces. Additionally, BFF facilitated collaboration by allowing + teams to interact with shared datasets dynamically and supported reuse + across different domains, extending from cell imaging to brain section + and genomic data visualization. +

+

Key takeaways

+
+

+ “BioFile Finder is a data management tool… like a fancy + spreadsheet so that you can interact with it in multiple different + ways.” — Yoav Ben-Simon, author +

+

+ “I can create and curate data sets in two or three clicks of a + button.” +

+

+ “It doesn't require exchanging of files—it just + requires exchanging of links.” — Yoav Ben-Simon,{" "} + author +

+

+ “It was really easy for us to repurpose it… from + looking at individual cells to looking at images of brain sections + and genomic data.” — Yoav Ben-Simon, author +

+
+ + ), + }, + { + heading: "Video", + body: ( + <> +

+ Check out this short video from the Allen Institute on how they and + AMBIOM at ISAS used BFF to organize and share their datasets. +

+ + + ), + }, + ], + }, + + { + slug: PageSlug.ExampleAMBIOM, + title: "AMBIOM at ISAS", + sections: [ + { + heading: "", + body: ( + <> +

+ AMBIOM develops AI methods for very large microscopy datasets. Copying + petabyte-scale image collections into another repository is often + impractical. BioFile Finder (BFF) instead indexes metadata while leaving + pixel data where it already resides—on institutional servers, cloud + object storage, or local storage. Researchers continue using their + existing storage infrastructure and permissions while gaining a unified + interface for discovery and curation. +

+ + ), + }, + { + heading: "BFF - an extensible ecosystem", + body: ( + <> +

+ AMBIOM developed an "Uploader" tool that is compatible with + BFF. The BFF Uploader demonstrates the extensibility of the BFF + ecosystem. Rather than modifying BFF's core approach of operating + on metadata catalogs, ISAS built an external ingestion layer that + automates metadata generation and standardization. This extension + enables researchers to move from raw microscopy files to searchable BFF + datasets with minimal manual effort while preserving BFF's + decentralized architecture, where image data remains in its original + storage locations and only metadata is indexed for discovery and reuse. +

+

+ + Watch a video about the ISAS BFF Uploader{" "} + + +

+ + ), + }, + { + heading: "Video", + body: ( + <> +

+ Check out this short video from the Allen Institute on how they and + AMBIOM at ISAS used BFF to organize and share their datasets. +

+ + + ), + }, + ], + }, +]; diff --git a/packages/web/webpack/webpack.config.js b/packages/web/webpack/webpack.config.js index 53976a64d..87bc9a3bd 100644 --- a/packages/web/webpack/webpack.config.js +++ b/packages/web/webpack/webpack.config.js @@ -87,7 +87,7 @@ module.exports = ({ analyze, production } = {}) => ({ ], }, { - test: /\.png/, + test: /\.(png|jpe?g)/, type: "asset/resource", }, ],