3.3 KiB
3.3 KiB
Project Status: Marco
Last Updated: Fri Jan 16 2026
Project Context
We are building Marco, a decentralized maps application using Ember.js (Octane/Polaris edition with GJS/GLIMMER), Vite, and OpenLayers. The core feature is storing place bookmarks in RemoteStorage.js, using a custom module structure.
What We Have Done
1. Map Integration
- Set up OpenLayers in
app/components/map.gjs(class-based component). - Switched tiles to OpenFreeMap Liberty style (supports vector POIs).
- Implemented a hybrid click handler:
- Detects clicks on visual vector tiles.
- Falls back to fetching authoritative data from an Overpass API service.
- Uses a heuristic (distance + type matching) to link visual clicks to API results (handling data desynchronization).
2. RemoteStorage Module (@remotestorage/module-places)
- Created a custom TypeScript module in
vendor/remotestorage-module-places/. - Schema:
placeobject containingid(ULID),title,lat,lon,geohash,osmId,url, etc. - Storage Path: Nested
<2-char>/<2-char>/<id>(based on geohash) for scalability. - API:
getPlaces(prefixes?): efficient partial loading of specific sectors (or full recursive scan if no prefixes provided).- Uses
getListingfor directory traversal andgetAllfor object retrieval. - configured with
maxAge: falseto ensure data freshness.
- Dependencies: Uses
ulidandlatlon-geohashinternally.
3. App Infrastructure
- Services:
storage.js: Initializes RemoteStorage, claims access, enables caching, and sets up the widget. Consumes the newgetPlacesAPI.osm.js: Fetches nearby POIs from Overpass API.
- UI Components:
places-sidebar.gjs: Displays a list of nearby POIs. Allows selecting a place to view details and saving it as a bookmark. Links to the OSM website via the node ID.
- Geo Utils: Added
app/utils/geo.jsfor Haversine distance calculations.
Current State
- Repo: The app runs via
pnpm start. - Workflow:
- User clicks map -> Sidebar opens.
- If a POI is matched heuristically, it opens "Details" directly.
- Otherwise, it lists nearby places.
- User clicks "Save Bookmark" -> Stores JSON in RemoteStorage.
- Recent Fixes:
- Refactored RemoteStorage module to use nested directory structures.
- Fixed
getListingusage to correctly parse theitemsobject from the RemoteStorage spec.
Files Currently in Focus
app/services/osm.js: NEXT TARGET. Needs optimization to handle timeouts.vendor/remotestorage-module-places/src/places.ts: Recently refactored.app/components/map.gjs: Map rendering and bookmark loading.
Next Steps & Pending Tasks
- Optimize Overpass API: The current implementation is timing out frequently. We need to optimize the query or fetch strategy.
- Viewport-based Loading: Implement logic in the map component to calculate visible geohash prefixes and pass them to
storage.getPlaces()for efficient partial loading. - UI Feedback: Verify the "Save" action gives better visual feedback than
alert().
Technical Constraints
- Template Style: Strict Mode GJS (
<template>). - Package Manager:
pnpmfor the main app,npmfor the vendor module. - Visuals: No Tailwind/Bootstrap; using custom CSS in
app/styles/app.css.