[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82279":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":21,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":28,"readmeContent":29,"aiSummary":30,"trendingCount":16,"starSnapshotCount":16,"syncStatus":31,"lastSyncTime":32,"discoverSource":33},82279,"GeoLibre","opengeos\u002FGeoLibre","opengeos","A lightweight, cloud-native GIS platform for visualizing, exploring, and analyzing geospatial data. It runs in the web browser, on the desktop, on mobile, and inside Jupyter notebooks.","https:\u002F\u002Fgeolibre.app",null,"TypeScript",1486,209,15,3,0,176,61.97,false,"main",true,[23,24,25,26,27],"data-science","geospatial","maplibre","maplibre-gl-js","tauri-app","2026-07-30 04:01:38","# GeoLibre Desktop\n\nLightweight, cloud-native desktop GIS prototype built with **Tauri v2**, **React**, **TypeScript**, **MapLibre GL JS**, **DuckDB-WASM Spatial**, and **deck.gl**.\n\n[![](https:\u002F\u002Ffiles.opengeos.org\u002FGeoLibre-OPERA-demo.webp)](https:\u002F\u002Fgeolibre.app\u002Fdemo\u002F?url=https:\u002F\u002Fdata.geolibre.app\u002Fopera-dswx.geolibre.json)\n\n## Features (v0.6.0)\n\n- MapLibre map workspace with OpenFreeMap basemaps, blank background support, and toggleable navigation, fullscreen, geolocation, globe, terrain, scale, attribution, and logo controls\n- Load local vector layers supported by DuckDB-WASM Spatial, including common formats such as GeoJSON, GeoParquet, GeoPackage, Shapefile, FlatGeobuf, KML\u002FKMZ, and GML\n- Add Data menu for XYZ tiles, WMS, GeoJSON URLs, vector tiles, COG and GeoTIFF rasters, MBTiles, ArcGIS FeatureServer and VectorTileServer layers, PMTiles, Zarr, LiDAR, and Gaussian splats\n- Layer panel for visibility, opacity, reordering, zoom-to-layer, identify, and remove actions\n- Live style panel (fill, stroke, opacity, circle radius)\n- Attribute table with filtering, sorting, resize controls, feature highlighting, and optional zoom to selected features\n- Save\u002Fopen `.geolibre.json` projects\n- Processing toolbox with local bounds and feature count algorithms\n- Plugin system with basemap, layer control, MapLibre components, swipe, street view, LiDAR, GeoAgent, and GeoEditor integrations, including configurable control positions\n- Optional Python FastAPI sidecar for heavier processing workflows\n\n## Prerequisites\n\n- **Node.js** 22+\n- **Rust** toolchain ([rustup](https:\u002F\u002Frustup.rs\u002F)) for Tauri desktop builds\n- Linux: `webkit2gtk`, `libayatana-appindicator` (see [Tauri prerequisites](https:\u002F\u002Fv2.tauri.app\u002Fstart\u002Fprerequisites\u002F))\n\n## Install\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fopengeos\u002FGeoLibre.git\ncd GeoLibre\nnpm install\n```\n\nBun users can run `bun install`. The root `trustedDependencies` list allows the known install scripts for `core-js`, `@google\u002Fgenai`, and `protobufjs`.\n\n## Run (web dev, map in browser)\n\n```bash\nnpm run dev\n```\n\nOpen http:\u002F\u002Flocalhost:5173. The map and browser vector import support local vector files that DuckDB-WASM Spatial can read, including common formats such as GeoJSON, GeoParquet, GeoPackage, Shapefile, FlatGeobuf, KML\u002FKMZ, and GML, with direct handling for GeoJSON, zipped Shapefiles, and KMZ archives. You can choose files from Add Vector Layer or drag them onto the app. Desktop filesystem dialogs, local MBTiles, and local raster file reads require Tauri.\n\n## Embed the demo\n\nThe browser demo supports URL parameters for iframe-friendly layouts.\n\nOpen a project by URL:\n\n\u003Chttps:\u002F\u002Fgeolibre.app\u002Fdemo\u002F?url=https:\u002F\u002Fdata.geolibre.app\u002Fopera-dswx.geolibre.json>\n\nSupported query parameters:\n\n| Parameter | Example | Description |\n| --- | --- | --- |\n| `url` | `url=https:\u002F\u002Fdata.geolibre.app\u002Fopera-dswx.geolibre.json` | Loads a `.geolibre.json` project from a public URL. |\n| `layout` | `layout=compact` | Uses the compact embed layout with icon-only toolbar buttons and hidden project metadata. `embed` and `iframe` are aliases. |\n| `toolbar` | `toolbar=icons` | Shows icon-only toolbar buttons without enabling the full compact layout. |\n| `panels` | `panels=none` | Hides the Layers, Style, and Attribute table panels. `hidden`, `hide`, and `off` are aliases. |\n| `hidePanels` | `hidePanels=true` | Alternative way to hide the Layers, Style, and Attribute table panels. |\n\nUse compact mode for narrow embeds. This shows icon-only toolbar buttons and hides project metadata:\n\n```text\nhttps:\u002F\u002Fgeolibre.app\u002Fdemo\u002F?url=https:\u002F\u002Fdata.geolibre.app\u002Fopera-dswx.geolibre.json&layout=compact\n```\n\nHide the Layers, Style, and Attribute table panels for map-focused embeds:\n\n```text\nhttps:\u002F\u002Fgeolibre.app\u002Fdemo\u002F?url=https:\u002F\u002Fdata.geolibre.app\u002Fopera-dswx.geolibre.json&layout=compact&panels=none\n```\n\nUse `toolbar=icons` when you only want icon-only toolbar buttons. `panels=hidden`, `panels=hide`, `panels=off`, and `hidePanels=true` are accepted aliases for hiding panels.\n\n## Environment variables\n\nThe Street View plugin can use Google Street View and Mapillary imagery. Create `apps\u002Fgeolibre-desktop\u002F.env.local` and set one or both provider credentials:\n\n```env\nVITE_GOOGLE_MAPS_API_KEY=your_google_maps_api_key\nVITE_MAPILLARY_ACCESS_TOKEN=your_mapillary_access_token\n```\n\nFor Google Street View, enable the Maps Embed API for the key in Google Cloud. For Mapillary, create an app in the Mapillary developer dashboard and use its client access token.\n\nRestart `npm run dev` or `npm run tauri:dev` after changing these values. Vite only exposes variables with the `VITE_` prefix to the frontend.\n\n## Run (desktop)\n\n```bash\nnpm run tauri:dev\n```\n\n## Build\n\n```bash\nnpm run build\nnpm run tauri:build\n```\n\n## Optional Python sidecar\n\n```bash\ncd backend\u002Fgeolibre_server\npython -m venv .venv && source .venv\u002Fbin\u002Factivate\npip install -e .\nuvicorn geolibre_server.app.main:app --host 127.0.0.1 --port 8765\n```\n\n## Repository layout\n\n```\napps\u002Fgeolibre-desktop   # Tauri + React app\npackages\u002Fcore           # Types, store, project format\npackages\u002Fmap            # MapLibre integration\npackages\u002Fui             # Tailwind + shadcn\u002Fui\npackages\u002Fplugins        # Plugin API\npackages\u002Fprocessing     # Algorithm registry\nbackend\u002Fgeolibre_server # FastAPI sidecar\nsample-data\u002F            # Sample GeoJSON & project\ndocs\u002F                   # Architecture & API docs\n```\n\n## Add a plugin\n\nBuilt-in plugins live in `packages\u002Fplugins\u002Fsrc\u002Fplugins\u002F` and are registered by the desktop app in `apps\u002Fgeolibre-desktop\u002Fsrc\u002Fhooks\u002FusePlugins.ts`. Map control plugins can expose a control position through `getMapControlPosition()` and `setMapControlPosition()` so the Plugins menu can move them between map corners.\n\n1. Create a plugin file in `packages\u002Fplugins\u002Fsrc\u002Fplugins\u002F`.\n\n```typescript\nimport type { GeoLibreAppAPI, GeoLibrePlugin } from \"..\u002Ftypes\";\n\nexport const myPlugin: GeoLibrePlugin = {\n  id: \"my-plugin\",\n  name: \"My Plugin\",\n  version: \"0.1.0\",\n  activate: (app: GeoLibreAppAPI) => {\n    app.setBasemap(\"https:\u002F\u002Fexample.com\u002Fstyle.json\");\n  },\n  deactivate: () => {},\n};\n```\n\n2. Export it from `packages\u002Fplugins\u002Fsrc\u002Findex.ts`.\n\n```typescript\nexport { myPlugin } from \".\u002Fplugins\u002Fmy-plugin\";\n```\n\n3. Register it in `apps\u002Fgeolibre-desktop\u002Fsrc\u002Fhooks\u002FusePlugins.ts`.\n\n```typescript\nimport { myPlugin } from \"@geolibre\u002Fplugins\";\n\nmanager.registerAll([\n  maplibreLayerControlPlugin,\n  maplibreGeoAgentPlugin,\n  maplibreGeoEditorPlugin,\n  myPlugin,\n]);\n```\n\nPlugins can use the app API to change basemaps, add GeoJSON layers, or attach MapLibre controls. For a MapLibre control plugin, add the package dependency, import its CSS in `apps\u002Fgeolibre-desktop\u002Fsrc\u002Fmain.tsx`, then call `app.addMapControl(control, \"top-left\")` in `activate()` and `app.removeMapControl(control)` in `deactivate()`.\n\nBuilt-in MapLibre controls such as Navigation, Fullscreen, Geolocate, Globe, Terrain, Scale, Attribution, and Logo are toggled from the desktop app's Controls menu. The same menu also opens Search, a standalone place search panel backed by the Components plugin. Keep project-specific controls such as Layer Control and Components in the plugin menu when they use the plugin API or need plugin lifecycle behavior.\n\nThe v0.6.0 Components plugin wraps `maplibre-gl-components` controls and wires their layer events into the GeoLibre store. It provides Add Data shortcuts for FlatGeobuf, PMTiles, Zarr, LiDAR, and Gaussian splats, while raster COG and GeoTIFF layers can also be added through the standard Add Raster Layer dialog.\n\nIf a third-party MapLibre control needs app-specific styling fixes, add scoped overrides in `apps\u002Fgeolibre-desktop\u002Fsrc\u002Findex.css` instead of editing files in `node_modules`. Keep selectors limited to the plugin control class. For example, GeoEditor toolbar buttons need a local override because MapLibre's default control button CSS can override their flex centering:\n\n```css\n.geo-editor-control .geo-editor-tool-button {\n  align-items: center;\n  display: flex !important;\n  justify-content: center;\n  line-height: 0;\n  padding: 0;\n}\n\n.geo-editor-control .geo-editor-tool-button svg {\n  display: block;\n  flex: 0 0 auto;\n  margin: 0;\n}\n```\n\nRun checks before submitting changes:\n\n```bash\nnpm run build\npre-commit run --all-files\n```\n\n## Documentation\n\n- [Architecture](docs\u002Farchitecture.md)\n- [Project format](docs\u002Fproject-format.md)\n- [Plugin API](docs\u002Fplugin-api.md)\n- [Roadmap](docs\u002Froadmap.md)\n\n## License\n\nMIT\n","GeoLibre 是一个轻量级、云原生的跨平台地理信息系统（GIS）平台，支持在浏览器、桌面、移动设备及 Jupyter Notebook 中可视化、探索与分析空间数据。核心功能包括基于 MapLibre GL JS 的交互式地图工作区、DuckDB-WASM Spatial 驱动的本地矢量\u002F栅格格式加载（如 GeoJSON、GeoPackage、Shapefile、COG、GeoTIFF、LiDAR 等）、实时样式编辑、属性表操作、项目持久化（.geolibre.json）及插件化扩展能力；采用 Tauri 构建桌面端，兼顾性能与安全性。适用于科研教育、野外调查、开源 GIS 教学、轻量级空间数据分析等对部署便捷性与多端一致性要求较高的场景。",2,"2026-07-08 04:07:24","CREATED_QUERY"]