A browser-native metadata management workspace for the OpenGeoMetadata Aardvark standard.
Aardvark Metadata Studio enables libraries and researchers to manage geospatial metadata repositories (like OpenGeoMetadata) entirely in the browser. It combines the speed of a local database engine with the persistence of standard Git workflows.
Built with React, Vite, DuckDB-WASM, and GitHub REST API.
- Browser-Native SQL Engine: Uses DuckDB-WASM to perform sub-millisecond queries, filtering, and aggregation on thousands of records directly in the client. No backend server required.
- Git-Backed Persistence: "Database" changes are actually local state changes that can be synced back to GitHub as
git commitactions. Your metadata remains in standard JSON files, version-controlled and forkable. - Faceted Search & Discovery: Powerful faceted search UI (similar to GeoBlacklight) for exploring your metadata collection, powered by SQL
GROUP BYandILIKElogic. - Interactive Mapping: Integrated Leaflet maps to visual bounding boxes (
dcat_bbox) and spatial footprints. - Data Ingestion: Import data from CSV or JSON sources, with automatic validation against the Aardvark schema constants.
- Frontend: React + TypeScript + Vite
- Database: DuckDB WASM (Persistent
records.duckdbstored in IndexedDB) - Testing: Vitest + React Testing Library + JSDOM
- Styling: Tailwind CSS
- API: Direct GitHub REST API calls (no intermediate auth server)
- Node.js (v18+)
-
Clone the repository:
git clone https://github.com/ewlarson/ogm-metadata-studio.git cd ogm-metadata-studio/web -
Install dependencies:
npm install
-
Run the Development Server:
npm run dev
The app will start at
http://localhost:5173.
This project maintains a high standard of test coverage using Vitest.
Run the full unit and integration test suite:
npm testGenerate a coverage report (check coverage/ directory for HTML output):
npm run coverageNote: Due to source-mapping limitations in the JSDOM+Vite environment, console coverage reports may show 0% despite tests passing. This is a known tooling artifact; rely on the pass/fail status.
- Connect: Provide your GitHub Owner/Repo/Branch/Token to pull the latest
metadata/*.jsonfiles. - Ingest: The app loads these JSONs into
records.duckdb(client-side). - Edit/Search: Use the dashboard to filter, search, and edit records.
- Sync: (In Progress) Edits are committed back to your GitHub repository as new JSON versions.
Contributions are welcome! Please ensure any new features are accompanied by tests in src/duckdb/ or src/ui/.