Live guide: https://marcs-singapore.val.run/
A personal collection of Singapore recommendations, with an interactive map, friends’ original advice, a private notebook and shared comments.
The guide is publicly readable and requests no search-engine indexing, matching the existing launcher’s approach. Noindex is not an access restriction.
Val Town project: marc1/in-good-company
HTTP entry: index.ts. Frontend assets use Val Town’s immutable versioned URLs. The /source route opens the project source. The Sites launcher’s Singapore card now opens the live guide; its other links remain as before.
The UI uses React 18.2, Twind, and Leaflet 1.9.4. SVG illustrations are decorative original drawings rather than venue photography. The map uses OpenStreetMap tiles with visible attribution. Account sessions use Val Town’s OAuth middleware; tokens never reach the client response.
The map now has a definite responsive height, waits for layout before initializing and refreshes after resizing. This fixes the original zero-height container bug. Pins follow active filters and open the corresponding recommendation.
Locations are approximate building, venue, park or destination points. Chains without a selected branch, online services, and ambiguous locations are left without guessed pins. The location note on each entry explains this; directions and venue websites remain available. Prices and planning tips are attributed to the original email, not presented as live menus or opening hours.
A one-time, cached OpenStreetMap location lookup was performed using an identified client at no more than one request every 1.2 seconds. Geocoding is not called by website visitors. Any future use of the public Nominatim service must follow its usage policy: identify the app, cache responses, stay within the shared request limit, and do not use it for autocomplete.
Run the local preview with node preview-server.cjs and open http://127.0.0.1:4317/. It is read-only and uses the local content/seed.json snapshot. Production user data is never written by this preview.
Run node check-source.cjs for syntax checks and node check-backend.cjs for the integration checks described above. Both run locally; the latter uses a disposable in-memory database.
The content directory is a local import snapshot with private source references; do not upload it as a public asset or commit it to a public repository. The one-time build/refinement scripts document the import work and are not the production data store. Make future content changes through the app or explicitly scoped SQLite updates; do not rerun the initial seed over newer content.